美文网首页
Java接口自动化框架系列07:Web接口自动化测试框架设计思路

Java接口自动化框架系列07:Web接口自动化测试框架设计思路

作者: 马小瑄 | 来源:发表于2021-12-29 13:34 被阅读0次

    1.Java web接口自动化框架

    框架名称:Java+Maven+httpClients+TestNg+Allure

    (因本次只讲解java部分,未包括git和jenkins,如果是包括git和jenkins可参考Java自动化框架总篇)

    框架图:

    框架思路:

    2.分析接口

    CASB接口参考:

    https://10.1.1.104/uim/doc.html

    https://10.1.1.104/sem/doc.html

    https://10.1.1.104/kms/doc.html

    2.1.Post方法(例如查询角色)

    这里需要多收集和了解一些接口,可以通过Chrome工具或MeterSphere去调用。

    获取到多个接口进行对比,例如把所有的用户权限的接口执行一遍,拿到入参和回参进行分析。

    以下举例:

    查询角色和登录,都是POST接口。

    1.登录接口地址:/uim/v1/login请求方式:POST请求示例:    {"username":"","password":"","ukeySn":"","serverRandom":"","ukeySign":""}返回结果:{"code":0,"data": {"accessToken":"","expiresDate":"","expiresIn":0,"refreshExpiresDate":"","refreshExpiresIn":0,"refreshToken":"","scope":"","tokenType":""},"msg":"成功"}2.查询角色:接口地址:/uim/v1/role/list请求方式:POST请求示例:{"page":1,"limit":10,"sidx":"","order":""}响应示例:{"code":0,"data": {"currPage":0,"list": [            {"createTime":"","permissionIdList": [],"permissionList": [                    {"childPermissionList": [                            {"childPermissionList": [                                    {}                                ],"createTime":"","parentId":"","parentPermission": {},"permissionId":"","resourceDescribe":"","resourceIcon":"","resourceName":"","resourceOrder":0,"resourceRouter":"","resourceType":0,"resourceUrls":""}                        ],"createTime":"","parentId":"","parentPermission": {},"permissionId":"","resourceDescribe":"","resourceIcon":"","resourceName":"","resourceOrder":0,"resourceRouter":"","resourceType":0,"resourceUrls":""}                ],"roleDescribe":"","roleId":"","roleName":""}        ],"pageSize":0,"totalCount":0,"totalPage":0},"msg":"成功"}

    2.2.Get方法(例如删除角色)

    请求地址:/uim/v1/role/delete

    请求方式:GET

    请求参数:id=      

    响应示例:

    {

    "code": 0,

    "data": {},

    "msg": "成功"

    }

    接口都有请求头信息,输入参数,接口请求,输出参数

    1、输入参数:POST接口,这里全部都是JSON格式

    GET接口,都是参数入参

    2、发送和处理请求

    3、输出参数:所有CASB的接口,都是JSON格式

    3.选择工具/语言

    这里用到的工具类:可参考0.CASB2.0接口自动化培训计划.md文档中的《框架工具类用到的Java基础知识》。

    3.1.语言选择

    这里选择Java语言是因为加解密的缘故,过插件需要通过java语言+插件jar包对数据库插入数据加密和查询数据解密。

    单纯的web接口自动化,其实用python或meterSphere学习成本更低些。

    Python语言支持testng和allure报告也更友好一些。

    3.2.针对接口的工具选取

    3.2.1. 发送请求(HttpClient)

    该框架使用的是CloseableHttpClient。

    工具类:HttpsClientUtils

    这里是我写的HttpClient工具类,举例的Get和Post方法

    /**

    * 发送HttpGet请求,不带请求头和请求参数

    * @param url 请求地址

    * @return doGet(url,null,null)

    */

    public  HttpClientResult doGet(String url) throws Exception {

    }

    /**

    * 发送HttpGet请求,带请求头和请求参数

    * @param url 请求地址

    * @param headers ,params

    */

    public  HttpClientResult doGet(String url,Map<String, String> headers,Map<String,String> params) throws Exception{}

    /**

    * 发送POST请求,不带请求参数

    * @param url 请求地址

    * @return doPost(url,headers,null)

    */

    public  HttpClientResult doPost(String url,Map<String, String> headers) throws Exception {

    }

    /**

    * 发送POST请求,带请求参数

    * @param url 请求地址

    * @param headers 请求头

    * @param jsonStr 请求json

    */

    public  HttpClientResult doPost(String url, Map<String, String> headers,String jsonStr) throws Exception {}

    3.2.2.接口的入参

    3.2.2.1.如果入参直接写在代码里,那么就不需2

    3.2.2.2.通过Excel获取接口的入参并传参

    那么这里就需要学习读取Excel的工具,本次框架里介绍的是:阿里的easyexcel

    工具类:ExcelUtil

    写入Excel的方法:

    /**

    * 写excel

    * @param fileName 写入excel的文件名称

    * @param sheetName

    * @param dataList 数据

    */

    public static void writeExcel(String fileName, String sheetName, List<ApiDataBean> dataList) {}

    读取excel的方法:

    /**

    * 读取excel,放入caseDataBean

    * @param fileName 读取excel的文件名称

    * @return datalist

    */

    public static List<ApiDataBean> readExcel(String fileName, String sheetName){}

    3.2.2.3.入参使用变量需要公共参数替换变量

    工具类:ParamUtil

    调用:String reqUrl = host + url;

    Map<String, String> headers=getHeader(token);

    String reqData=paramUtil.getCommonParam(data.getParam());

    //发送请求

    HttpsClientUtils httpUtil = new HttpsClientUtils();

    HttpClientResult httpResult = httpUtil.doPost(reqUrl, headers,reqData);

    /**

    * 取公共参数 并替换参数,处理${}

    * @param param @description 参数

    * @return param

    */

    public String getCommonParam(String param) {}

    3.2.3.接口的出参解析

    3.2.3.1.接口简单回参解析,可以直接用Java的JsonPath

    参考: GitHub - json-path/JsonPath: Java JsonPath implementation

    3,2.3.2.接口复杂的回参解析

    需要自己编写(Json解析有4种方法,我这里选取使用的Gson)

    调用例如:StringroleId = JsonUtil.getTargetValue(resultContent, roleName,"roleName","roleId");/**

        * 解析一层json树结构,只有JsonObject,获取第1层json中某个key的值

        * @param jsonString json字符串

        * @param dataKey key

        */publicstaticStringgsonParserString(StringjsonString,StringdataKey){}/**

        * 解析二层json树结构,只有JsonObject,获取第2层json中某个key的值

        * @param jsonString  json字符串

        * @param dataKey key

        */publicstaticStringgsonParserString_2(StringjsonString,StringdataKey){}/**

        * 解析三层树结构并带有1个JsonArray(list),获取第3层json中列表中第1个json指定key的值

        * @param jsonString json字符串

        * @param dataKey (获取data中list的里String类型)

        */publicstaticStringgsonParserString_3l(StringjsonString,StringdataKey){}/**

        * 解析四层树结构并带有2个JsonArray,获取第4层json列表中指定key的所有值

        * @param jsonString json字符串

        * @param dataKey (获取data中list的里String类型)

        *///for (JsonElement element : jsonArray) 遍历数据publicstaticList gsonParserString_4l(StringjsonString,Stringlist1,Stringlist2,StringdataKey){}/**

        * 解析三层树结构并带有1个JsonArray(list),第3层json中找到符合key1值的同json中的key2的值

        * @param jsonString json字符串

        * @param targetKey (获取data中list的里String类型)

        */publicstaticStringgetTargetValue(StringjsonString,StringsourceName,StringsourceKey,StringtargetKey){}

    其他的3种Json处理可参考: JAVA中的四种JSON解析方式详解 - 道理我都懂Zz - 博客园

    3.3.单一接口调工具类

    3.3.1.POST接口

    例如:login

    StringloginUrl ="https://10.1.1.104/uim/v1/login";StringjsonStr ="{\"username\":\"YWRtaW4=\",\"password\":\"bGlhblNoaTIwMjA=\"}";//请求头Map headers=newHashMap<>();    headers.put("Content-Type","application/json;charset=UTF-8");//发送请求HttpsClientUtils httpUtils =newHttpsClientUtils();    HttpClientResult result=httpUtils.doPost(loginUrl,headers, jsonStr);

    全部代码:

    package com.ciphergateway.server;importcom.ciphergateway.bean.HttpClientResult;importcom.ciphergateway.utils.Base64Util;importcom.ciphergateway.utils.HttpsClientUtils;importcom.ciphergateway.utils.JsonUtil;importcom.ciphergateway.utils.PropertiesUtil;importorg.apache.logging.log4j.LogManager;importorg.apache.logging.log4j.Logger;//import java.util.Base64;importjava.util.HashMap;importjava.util.Map;importjava.util.Properties;publicclassLogin{    privatestaticfinalLogger log= LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);/**    * 获取login的token    */publicStringgetToken() throws Exception{//获取配置文件Stringfilename="config.properties";        PropertiesUtil pro=newPropertiesUtil(filename);Stringhost=pro.readProperty("HOST");Stringusername=pro.readProperty("USER_NAME");Stringpassword=pro.readProperty("USER_SECRET");        Base64Util base64=newBase64Util();Stringuser_base64 = base64.getBase64(username);Stringpassword_base64 = base64.getBase64(password);//测试HTTPSHttpsClientUtils httpUtils =newHttpsClientUtils();StringloginUrl = host+"/uim/v1/login";StringjsonStr ="{\"username\":\""+ user_base64 +"\",\"password\":\""+ password_base64 +"\"}";//System.out.println(jsonStr);//请求头Map headers=newHashMap<>();        headers.put("Content-Type","application/json;charset=UTF-8");        HttpClientResult httpResult=null;try{            httpResult = httpUtils.doPost(loginUrl, headers,jsonStr);        }catch(Exception e) {            e.printStackTrace();            log.error(e);        }//System.out.println(httpResult.getCode());//System.out.println(httpResult.getContent());intcode=httpResult.getCode();StringresultContent=httpResult.getContent();        log.info(code+" "+resultContent);Stringtoken =JsonUtil.gsonParserString_2(resultContent,"accessToken");returntoken;    }/*    public static void main(String[] args) throws Exception {

            Login lo=new Login();

            String token=lo.getToken();

            System.out.println(token);

        }*/}

    3.3.2.GET方法(删除角色)

    StringreqUrl ="https://10.1.1.104/uim/v1/role/delete";Map map_delete =newHashMap<>();    map_delete.put("id","1234567890212222");Map headers=newHashMap<>();    headers.put("Content-Type","application/json;charset=UTF-8");    headers.put("Authorization",token);//发送请求HttpsClientUtils httpUtils =newHttpsClientUtils();    HttpClientResult httpResult = httpUtils.doGet(reqUrl, headers, map_delete);

    3.4.断言(TestNg单元测试框架)

    需要使用TestNg单元测试框架进行批量测试,断言和初始化数据和清理数据。3.

    批量测试:testng.xml初始化数据:@BeforeTest测试:@Test清理数据:@AfterTest断言:Assert例如:1、TestNg默认的断言:Assert.assertEquals(code, expectData,data.getDesc());2、为了异常场景新增的断言:Assertion.verifyEquals(code, expectData,data.getDesc());

    3.5。结果和报告展示

    3.5.1Excel测试结果

    备注:dataList_w是List参数//调用excel方法写入数据StringexcelFile_result="src/data/testcase/apiData_result.xlsx";        privateStringsheet1="用户权限接口用例";        ExcelUtil.writeExcel(excelFile_result,sheet1,dataList_w);

    3.5.2.Allure报告

    参考《 Web接口自动化Allure报告的配置和使用》

    https://blog.csdn.net/fen_fen/article/details/122020651

    4.总结

    4.1.web接口框架使用的工具/框架

    序号工具或框架名版本

    1Mavenapache-maven-3.8.1

    2httpClienthttpClient 4.5.3

    3TestNGTestng 6.11

    4Allure测试报告Allure 2.13.2

    5Git炼石 git

    4.2.框架的优点

    1、采用数据驱动方式来解决大量功能重复性接口的测试

    2、代码分层

    3、针对返回JSON字符串,采用JSONPath和Gson结合的模式来精准判定JSON的内容。

    4、可以生成比较直观的报告。

    5、后期可以跟Jenkins持续集成,执行结果生成测试报告并发送邮件告知相关人员

    相关文章

      网友评论

          本文标题:Java接口自动化框架系列07:Web接口自动化测试框架设计思路

          本文链接:https://www.haomeiwen.com/subject/jjpvqrtx.html