Springboot+Jsonpath+fastJson+Testng之响应结果断言

前言
在做java接口自动化中,我们常常需要对接口响应的数据进行判断,用于检查测试中得到的响应数据等是否符合预期,这是必不可少的。那么怎么实现呢?下面就来介绍接口响应断言的代码思路。

思路
1、首先,需要创建一个实体类CaseInfo封装了一些属性,如下图所示
2、将预期结果转换成Map对象,遍历map,取出期望结果的值
3、用jsonpath技术, 对CommonResponse 中的响应值data取出来,判断实际结果和预期结果的value是否一致。

Excel用例格式
Springboot+Jsonpath+fastJson+Testng之响应结果断言_第1张图片
CaseInfo实体类

public class CaseInfo {
    @Excel(name = "序号(caseId)")
    private int caseId;

    @Excel(name = "接口模块(interface)")
    private String interfaceName;

    @Excel(name = "用例标题(title)")
    private String title;

    @Excel(name = "请求头(requestHeader)")
    private String requestHeader;

    @Excel(name = "请求方式(method)")
    private String method;

    @Excel(name = "接口地址(url)")
    private String url;

    @Excel(name = "参数输入(inputParams)")
    private String inputParams;

    @Excel(name = "期望返回结果(expected)")
    private String expected;

    @Excel(name = "数据库断言")
    private String dbAssert;

    @Excel(name="提取表达式(extractExper)")
    private String extractExper;

响应断言功能

 /**
     * 接口响应断言
     * @param res
     * @param caseInfo
     */
    public static void assertResponse(CommonResponse res , CaseInfo caseInfo) {
        String expected = caseInfo.getExpected();
        if (expected != null) {
         //转成map
            Map<String, Object> expectedMap = JSONObject.parseObject(expected);
            Set<String> allKeySet = expectedMap.keySet();
            for (String key : allKeySet){
                //获取期望结果
                Object expectedResult = expectedMap.get(key);
                String response = JSON.toJSONString(res);
                String  actualData= (String) res.getData();
                //获取实际响应结果
                Object document = Configuration.defaultConfiguration().jsonProvider().parse(response);
                Object actualResult = JsonPath.read(document,actualData);
                Assert.assertEquals(actualResult,expectedResult);
            }
        }
    }

正则替换功能

 /**
     * 正则替换功能,比如:
     * 原始字符串 {
     *   key=${key}
     * }
     * 替换为
     * {
     *   key=xxxx(自己账号生成的key)
     * }
     * xxxx 为环境变量中key变量名对应的变量值
     * @param orgStr 源字符串
     * @return
     */
    public String regexReplace(String orgStr){
        if(orgStr != null) {
            //匹配器
            Pattern pattern = Pattern.compile("\\$\\{(.*?)\\}");
            //匹配对象
            Matcher matcher = pattern.matcher(orgStr);
            String result = orgStr;
            //循环遍历匹配对象
            while (matcher.find()) {
                //获取整个匹配正则的字符串 ${key}
                String allFindStr = matcher.group(0);
                //找到${XXX}内部的匹配的字符串 key
                String innerStr = matcher.group(1);
                //找到key:xxxx
                //具体的要替换的值(从环境变量中去找到的)
                Object replaceValue = Environment.envMap.get(innerStr);
                //要替换${key} --> xxxx
                result = result.replace(allFindStr, replaceValue + "");
            }
            return result;
        }else{
            return orgStr;
        }
    }

参数化替换功能


    /**
     * 整条用例数据的参数化替换,
     * 只要在对应的用例数据里面有${}包裹起来的数据,
     * 那么就会从环境变量中找,如果找到的话就去替换,否则不会
     * @param caseInfo
     */
    public CaseInfo paramsReplace(CaseInfo caseInfo){
        //1、请求头
        String requestHeader =  caseInfo.getRequestHeader();
        caseInfo.setRequestHeader(regexReplace(requestHeader));
        //2、接口地址
        String url = caseInfo.getUrl();
        caseInfo.setUrl(regexReplace(url));
        //3、参数输入
        String inputParams = caseInfo.getInputParams();
        caseInfo.setInputParams(regexReplace(inputParams));
        //4、期望结果
        String expected = caseInfo.getExpected();
        caseInfo.setExpected(regexReplace(expected));
        return caseInfo;
    }

创建一个测试类CaseInfoTest调用上面封装好的方法

public class CaseInfoTest01 {

    @Test(dataProvider = "readCaseInfoCases")
    public void caseInfoTest01(CaseInfo caseInfo) {
        System.out.println(caseInfo);
    }

    @DataProvider
    public Object[] readCaseInfoCases() throws FileNotFoundException {
        List<CaseInfo> listCase0 = EasyPoiExcelUtil.readExcel(0);
        return listCase0.toArray();
    }

    @Test(dataProvider = "readCaseInfoCases")
    public void caseInfoTest02(CommonResponse res,CaseInfo caseInfo){
        //将测试用例做整体替换,只要遇到${}数据,就替换为环境变量中的实际数据
        AssertUtitl assertUtitl = new AssertUtitl();
        assertUtitl.paramsReplace(caseInfo);
        //断言请求
        assertUtitl.assertResponse(res,caseInfo);

    }
}

启动springboot,执行结果
Springboot+Jsonpath+fastJson+Testng之响应结果断言_第2张图片
我们可以看到,接口断言运行成功,根据我们的excel用例输出的结果

你可能感兴趣的:(Java测试开发,Java接口自动化,spring,boot,java,excel)