接口自动化测试的初步实现

写在前面:感谢慕课网的大周老师,借鉴了大周老师的接口测试的设计思路

一、接口自动化测试实施作用:

1、当服务端改动功能或者添加新功能时,新发布程序后,避免新开发功能导致其他关联功能存在问题,通过持续集成,服务端发布触发接口测试代码运行,尽早发现问题;

2、抽取部分接口测试用例,定时运行程序,对线上常用的业务操作进行监控,及时发现修复。

二、本次接口自动化实施思路:

主要使用了HttpClient模拟客户端的对接口发送post、get等请求,通过mybatis框架对mysql数据库操作,使用mysql数据库存储请求参数、预期结果等信息,引入测试框架TestNG对测试用例进行分组、和逻辑控制,并使用TestNG 的断言对测试用例的结果判断,同时生成对结果的统计分析,最终使用extentreports对TestNG的测试报告展示优化,展示给使用者。

三、实例

代码结构:主要分了四层,cases主要是编写测试用例,config层主要项目的配置,监听和接口信息,model层主要是字段与数据库中的对应的表的各个字段对应,相当于数据承载bean,utils层主要是工具层,放一些工具类,比如后续封装的创建sqlsession的、获取httpclient对象的、获取httppost对象和httpget对象的的等等工具类,分层主要是结构清晰,便于维护,后续优化可以考虑引入spring框架,对各层解耦。

主要是以牛股王的智能诊股和登录部分接口为例做演示

1、登录部分:

表设计:主要用于存储请求参数的数据,

2、请求部分:登录的操作是相同的因此登录的部分可以写一个方法模拟登录,获取请求结果。在请求部分可以设置请求头信息等信息,返回结果为json格式,对json格式转换

 private String getResult(LoginCase loginCase) throws IOException {

        //新建post请求对象

        HttpPost post = new HttpPost(TestConfig.loginUrl);

        //设置header信息

        post.setHeader("content-type","application/x-www-form-urlencoded; charset=utf-8");

        post.setHeader("packtype","1");

        post.setHeader("s","_test");

        post.setHeader("version","3.9.1");

        post.setHeader("night","1");

        

       /*json格式发送请求

        * JSONObject param = new JSONObject();

        param.put("userName", loginCase.getUsername());

        param.put("password",loginCase.getPassword());

        param.put("loginType",loginCase.getLoginTyte());

        param.put("deviceid",loginCase.getDeviceid());

        param.put("company",loginCase.getCompany());

        //设置编码格式,发送post请求

        StringEntity entity = new StringEntity(param.toString(),"utf-8");

        post.setEntity(entity);*/

        

        

        ArrayList<NameValuePair> pairs = new ArrayList<NameValuePair>();  

        

        NameValuePair pair1 = new BasicNameValuePair("userName", loginCase.getUsername());  

        NameValuePair pair2 = new BasicNameValuePair("password",loginCase.getPassword());  

        NameValuePair pair3 = new BasicNameValuePair("deviceid",loginCase.getDeviceid());  

        NameValuePair pair4 = new BasicNameValuePair("loginType",loginCase.getLoginTyte());  

        NameValuePair pair5 = new BasicNameValuePair("company",loginCase.getCompany());  

          

        pairs.add(pair1);  

        pairs.add(pair2);  

        pairs.add(pair3);

        pairs.add(pair4);

        pairs.add(pair5);

          

       post.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));

        

        String result;

        //获取请求返回结果

        HttpResponse response = TestConfig.defaultHttpClient.execute(post);

        //请求返回结果转换为字符串

        result = EntityUtils.toString(response.getEntity(),"utf-8");

        System.out.println("测试返回结果为"+result);

        TestConfig.store = TestConfig.defaultHttpClient.getCookieStore();

        return result;

    }

3、从数据库中读取参数,传给上面的方法,并使用TestNG的注解控制测试用例。读取数据主要是

使用mybatis框架

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

SqlSession session = factory.openSession(true);

创建sqlsession,从数据库中读取数据,sqlsession可以对数据库增删读写操作。当单一接口,没有数据依赖的情况下,直接从数据库中取数据,拼接为请求参数,对接口进行请求,而如果接口数据有依赖,则对对应的接口的表进行插入或者更改操作,比如,在用户登录后,会登录用户的usertoken,这usertoken恰好是其他接口使用的,所以会取出该

usertoken,并将该usertoekn存储到对应的接口的对应的参数表中。其他接口再使用时也直接在表中取出就可以直接使用,但是注意相关联接口执行顺序,TestNG进行控制。

 

4、执行测试用例

执行测试用例也是通过TestNG来控制的,对测试用例的先后执行顺序,优先级、分组、依赖等设置

5、测试报告分析

执行结束后对测试结果统计,该结果是一个html文件,可以将html拷贝到任何一个地方都可以查看,比如搭建一个web服务器将html放到这个服务器上都可以查看。

对于执行结果也可以写一个封装邮件的工具类,将如果有问题进行邮件通知等方式发送给开发人员。

同时报告中会包含接口信息,参数信息和错误信息,便于开发查看问题

四、后续优化

1、代码优化;

2、设计思路优化,现有结构如果后续做测试平台会有一定难度,而且代码量也很大;

3、持续集成搭建

4、丰富接口类型

五、优缺点

主要是从设计思路上分析优缺点

优点:1、实现接口测试数据和脚本的分离;2、数据便于维护,思路比较清晰,编写比较容易

缺点:1、缺点新增加接口时,还需要新建表、创建数据承载bean,开发量较大 ;2、耦合度较高 ;3、如果考虑给手工测试人员提供接口测试平台,不容易实施

综上考虑,暂时先打算放弃掉该自动化测试框架。

猜你喜欢

转载自blog.csdn.net/qq_24126893/article/details/81303028