【项目二】Mybatis+MySQL实现用例管理(1)

  • 项目描述:

    • 模拟用户管理系统场景对接口测试用例数据进行表结构设计;
    • 学会使用TestNG+MySQL+MyBatis实现对用例数据的读取;
    • 代码层次结构设计:cases、config、model、utils以及配置文件如何分工
    • 开发用户管理系统五类接口(登陆、查看用户信息、获取用户列表、添加用户、更新与删除用户)。
    • 完善自动化测试代码,实现使用HttpClient对接口进行测试,对响应数据及数据库用户数据进行校验。
    • 使用Maven框架结合TestNG进行打包测试,最终产出测试报告
  1. Case与系统的表结构设计

  • 设计好的表结构——用户管理系统
  • 用户管理系统的功能:添加用户,获取用户信息,获取用户列表,登录,更新删除用户信息
  • 五大接口:登陆、查看用户信息、获取用户列表、添加用户、更新与删除用户
  • 每一个表保存的是每一个接口的case
  • 接口中要用到用户User
  • 2.用户管理系统接口测试代码开发

  • 2.1 基础配置文件的设计

  •     <artifactId>httpclient</artifactId>
    
        <artifactId>testng</artifactId>
    
        <artifactId>json</artifactId>
    
        <artifactId>mybatis</artifactId>
    
        <artifactId>mysql-connector-java</artifactId>
    
        <artifactId>lombok</artifactId>
    
        <artifactId>extentreports</artifactId>
    
        <artifactId>testng-extentsreport</artifactId>
  • 2.2  配置mybatis.Config:【连接数据库服务的主配置文件】

  • <configuration>
        <!-- 注册对象的空间命名 -->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <!-- 1.加载数据库驱动 -->
                    <property name="driver" value="com.mysql.jdbc.Driver"/>
                    <!-- 2.数据库连接地址 -->
                    <property name="url" value="jdbc:mysql://192.168.1.7:3306/course"/>
                    <!-- 数据库用户... -->
                    <property name="username" value="admin"/>
                    <!-- 数据库密码... -->
                    <property name="password" value="123456"/>
                </dataSource>
            </environment>
        </environments>
        <!-- 注册映射文件:java对象与数据库之间的xml文件路径! -->
    <mappers>
        <mapper resource="mapper/SQLMapper.xml"/>
    </mappers>
    </configuration>

    2.3 配置操作数据库的文件SQLMapper.xml 【映射位置文件】

  • <mapper namespace="com.tester.model">
        <!--获取登陆接口case-->
        <select id="loginCase" parameterType="Integer" resultType="com.tester.model.LoginCase">
            <!--resultType="com.tester.model.LoginCase 非常重要,指明select操作得到的记过封装到哪里去-->
            select * from loginCase
            where id = #{id};
        </select>
        <!--添加用户接口case-->
        <select id="addUserCase" parameterType="Integer" resultType="com.tester.model.AddUserCase">
            select * from addUserCase where id=#{id};
        </select>
        <!--获取用户信息case-->
        <select id="getUserInfoCase" parameterType="Integer" resultType="com.tester.model.GetUserInfoCase">
            <!-- SQL语句 -->
            select * from getUserInfoCase where id=#{id};
        </select>
        <!--获取用户列表case-->
        <select id="getUserListCase" parameterType="Integer" resultType="com.tester.model.GetUserListCase">
            <!-- SQL语句 -->
            select * from getUserListCase where id=#{id};
        </select>
    </mapper>
  • 2.4、配置TestNG.xml文件

    <suite name="用户管理系统测试套件">
        <test name="用户管理系统测试用例">
            <classes>
                <class name="com.tester.cases.LoginTest">
                    <methods>
                        <include name="loginTrue"/>
                        <include name="loginFalse"/>
                    </methods>
                </class>
                <class name="com.tester.cases.GetUserInfoListTest">
                    <methods>
                        <include name="getUserListInfo"/>
                    </methods>
                </class>
            </classes>
        </test>
        <listeners>
            <listener class-name="com.tester.config.ExtentTestNGIReporterListener" />
        </listeners>
    </suite>

    2.5、配置application.properties文件

  • test.url=http://localhost:8888
    #登陆接口uri
    login.uri=/v1/login
    #更新用户信息接口uri
    updateUserInfo.uri=/v1/updateUserInfo
    #获取用户列表接口uri
    getUserList.uri=/v1/getUserInfo
    #获取用户信息接口uri
    getUserInfo.uri=/v1/getUserInfo
    #添加用户接口uri
    addUser.uri=/v1/addUser

    3、接口测试框架的代码开发

  • 代码逻辑分为四层:

    • cases

    • model层

    • config层

    • 加载配置文件层

    • 3.1、model层

    • 创建User表的实体类,跟数据库中的表一一对应:
    • //User用户的具体代码如下:
      public class User {
              private int id;
              private String userName;
              private String password;
              private String age;
              private String sex;
              private String permission;//权限
              private String isDelete;//是否删除
              @Override
              //复写toString的方法,处理json文件
              //把上面的用户信息用toString处理,变成json格式
              public String toString(){
                    return (
                    "id:"+id+","+
                    "userName:"+userName+","+
                    "password:"+password+","+
                    "age:"+age+","+
                    "sex:"+sex+","+
                    "permission:"+permission+","+
                    "isDelete:"+isDelete+"}"
                    );
              }
      }

      3.2 写自动生成测试报告的代码:

    • 这里是固定写法(略过)

    • 3.3 写TestConfig的配置文件

    • 获取用户基础信息的配置对应上接口的名称,设置变量,getUserListUrl是工具类拼接后的变量
    • //application/properties配置文件
      
          test.url=http://localhost:8888
          #登陆接口uri
          login.uri=/v1/login
          #更新用户信息接口uri
          updateUserInfo.uri=/v1/updateUserInfo
          #获取用户列表接口uri
          getUserList.uri=/v1/getUserInfo
          #获取用户信息接口uri
          getUserInfo.uri=/v1/getUserInfo
          #添加用户接口uri
          addUser.uri=/v1/addUser
      
      @Data
      public class TestConfig {
          //登陆接口uri
          public static String loginUrl;
          //更新用户信息接口uri
          public static String updateUserInfoUrl;
          //获取用户列表接口uri
          public static String getUserListUrl;
          //获取用户信息接口uri
          public static String getUserInfoUrl;
          //添加用户信息接口
          public static String addUserUrl;
          //用来存储cookies信息的变量
          public static CookieStore store;
          //声明http客户端
          public static DefaultHttpClient defaultHttpClient;
      }
      

      3.4 ConfigFile配置文件:为了得到拼接后的URL

    • public class ConfigFile {
         private static ResourceBundle bundle= ResourceBundle.getBundle("application", Locale.CHINA);;
          //工具类直接用静态方法,下面这个工具类用来实现URL链接的拼接
          public static String getUrl(InterfaceName name){
              //枚举类限制,只有自己定义的类才能穿进来
              String address = bundle.getString("test.url");//test.url=http://localhost:8888
              String uri = ""; //这个uri用来判断依次赋值
              String testUrl; //最终的测试地址
              if(name == InterfaceName.GETUSERLIST){
                  uri = bundle.getString("getUserList.uri");
                  //getUserList.uri=/v1/getUserInfo 从application.properties文件中获取
                  //testUrl = address + uri;
                  //testUrl = http://localhost:8888/v1/getUserInfo
              }
              if(name == InterfaceName.LOGIN){
                  uri = bundle.getString("login.uri");
              }
              if(name == InterfaceName.UPDATEUSERINFO){
                  uri = bundle.getString("updateUserInfo.uri");
              }
              if(name == InterfaceName.GETUSERINFO){
                  uri = bundle.getString("getUserInfo.uri");
              }
              if(name == InterfaceName.ADDUSERINFO){
                  uri = bundle.getString("addUser.uri");
              }
              testUrl = address + uri;
              return testUrl;
          }
      }

      3.5 获取能够读取SQL语句的对象:DtabaseUtil

      创建SqlSeesionFactory工厂,使用工厂生产SqlSeesion对象,使用SqlSeesion创建Dao接口的代理对象
    • public class DatabaseUtil {
          public static SqlSession getSqlSession() throws IOException {
              //获取配置的资源文件
              Reader reader = Resources.getResourceAsReader("databaseConfig.xml");//读文件
              //得到SqlSessionFactory,使用类加载器加载databaseConfig.xml文件
              SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
              //得到sqlsession对象,这个对象就能执行配置文件中的sql语句啦
              //SqlSession能够执行配置文件中的sql语句
              SqlSession session = factory.openSession();
              return session;
          }
      }

      3.6 开始写测试用例的代码

    • 以LoginTest为例:

    • /*
      * 登录接口
      * */
      public class LoginTest {
          //测试之前获取链接
          @BeforeTest(groups = "loginTrue",description = "测试准备工作,获取HttpClient对象")
          public void beforeTest(){
             
              TestConfig.defaultHttpClient = new DefaultHttpClient();
              TestConfig.getUserInfoUrl = ConfigFile.getUrl(InterfaceName.GETUSERINFO);
              TestConfig.getUserListUrl = ConfigFile.getUrl(InterfaceName.GETUSERLIST);
              TestConfig.loginUrl = ConfigFile.getUrl(InterfaceName.LOGIN);
              TestConfig.updateUserInfoUrl = ConfigFile.getUrl(InterfaceName.UPDATEUSERINFO);
              TestConfig.addUserUrl = ConfigFile.getUrl(InterfaceName.ADDUSERINFO);
          }
          @Test(groups = "loginTrue",description = "用户成功登陆接口")
          public void loginTrue() throws IOException {
              /*
              * DatabaseUtil文件加载databaseConfig.xml数据库配置文件
              * databaseConfig.xml加载操作数据库的SQLMapper.xml文件
              * DatabaseUtil生成SqlSession对象,
              * SqlSession创建代理对象session
              * session.selectOne选择一个用户进行登录
              * */
              SqlSession session = DatabaseUtil.getSqlSession();
              LoginCase loginCase = session.selectOne("loginCase",1);
              System.out.println(loginCase.toString());
              System.out.println(TestConfig.loginUrl);
              //下边的代码为写完接口的测试代码
              String result = getResult(loginCase);
              //处理结果,就是判断返回结果是否符合预期
              Assert.assertEquals(loginCase.getExpected(),result);
          }
          @Test(description = "用户登陆失败接口")
          public void loginFalse() throws IOException {
              SqlSession session = DatabaseUtil.getSqlSession();
              LoginCase loginCase = session.selectOne("loginCase",2);
              System.out.println(loginCase.toString());
              System.out.println(TestConfig.loginUrl);
              String result = getResult(loginCase);
              Assert.assertEquals(loginCase.getExpected(),result);
          }
          private String getResult(LoginCase loginCase) throws IOException {
              //下边的代码为写完接口的测试代码
              HttpPost post = new HttpPost(TestConfig.loginUrl);
              JSONObject param = new JSONObject();
              param.put("userName",loginCase.getUserName());
              param.put("password",loginCase.getPassword());
              //设置请求头信息 设置header
              post.setHeader("content-type","application/json");
              //将参数信息添加到方法中
              StringEntity entity = new StringEntity(param.toString(),"utf-8");
              post.setEntity(entity);
              //声明一个对象来进行响应结果的存储
              String result;
              //执行post方法
              HttpResponse response = TestConfig.defaultHttpClient.execute(post);
              //获取响应结果
              result = EntityUtils.toString(response.getEntity(),"utf-8");
              System.out.println(result);
              TestConfig.store = TestConfig.defaultHttpClient.getCookieStore();
              return result;
          }
      }

       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值