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