美文网首页
2020-05-10Api数据库断言-回写【是否通过验证】

2020-05-10Api数据库断言-回写【是否通过验证】

作者: testerPM | 来源:发表于2020-05-10 12:55 被阅读0次

思路: 1. 实际响应数据和期望响应数据断言结果---true或者 false
2.sql响应断言--------true或者 false
1 和 2取并集--》结果:true或者false->回写到列【是否通过验证】

(1) 优化回写方法: 不直接传入case,而将回写行号,列号当参数传进去

BaseCase.java


    /**
     * 添加回写对象到集合中
     * 
     * @param cases
     * @param ActualResponseBody
     */
    
    public static void addWriteBackData(Cases cases, String ActualResponseBody) {
        // 获取用例编号作为回写行号
        String caseId = cases.getCaseId();
        // 返回值值类型是String,所以需要转换成int
        // double d=Double.parseDouble("0.0")
        int rowNum = Integer.parseInt(caseId);// 基本数据类型int对应的包装类型Integer提供的静态方法parseInt()进行转化
        // 获取回写列号
        int cellNum = Constant.ACTUAL_RESPONSE_DATA_CELLNUM;
        WriteBackData wbd = new WriteBackData(rowNum, cellNum, ActualResponseBody);
        // ExcelUtils.WriteBackResponseBody(Constant.EXCEL_PATH, 1, wbd);
        // 添加到回写集合中--ArryList提供的add()方法添加元素
        ExcelUtils.wbdList.add(wbd);
        
    }

优化结果如下:不直接传入case,而将回写行号,列号当参数传进去


    /**
     * 添加回写对象到集合中
     * 上面被注释的代码,是因为这里需要回写断言响应结果,上面方法就不通用了
     * 而且上面String caseId = cases.getCaseId();caseId定义的是String类型,case.java改成了int类型,不需要类型转换了
     * @param cases
     * @param ActualResponseBody
     */
    public static void addWriteBackData(int rowNum, int cellNum,String content) {
        WriteBackData wbd = new WriteBackData(rowNum, cellNum, content );
        ExcelUtils.wbdList.add(wbd);
        
    }
    

(2)回写列号加入到常量类

Constant.java


public class Constant {
    // 断言结果回写 列号
    public static final  int  ASSERT__RESPONSE_DATA_CELLNUM=6;
}


(3) 优化 响应体回写方法

原来的:
addWriteBackData(cases,actualResponseBody);
优化后的:
addWriteBackData(cases.getCaseId(), Constant.ACTUAL_RESPONSE_DATA_CELLNUM,actualResponseBody);


(4)添加 断言结果回写

登录接口:LoginCase.java

       @Test(dataProvider = "datas")
    public void testLogin   ( Api api,Cases cases ) {
        //1. 获取响应体数据
        String actualResponseBody = ActualResponseBody(api, cases);// 子类调用父类方法
        //2. 添加回写响应体---原生poi+list
        addWriteBackData(cases.getCaseId(), Constant.ACTUAL_RESPONSE_DATA_CELLNUM,actualResponseBody);
        //3.响应体断言
         boolean assertResponseData = AssertResponseData(cases, actualResponseBody);
        System.out.println("断言结果:"+assertResponseData);
        //4.数据库断言:(登录接口没有sql,所以asserLoginSql默认等于true
        boolean asserLoginSql=true;
        String passContent=(assertResponseData &&asserLoginSql)? "pass" : "fail";
        //5.添加回写断言结果
        addWriteBackData(cases.getCaseId(), Constant.ASSERT__RESPONSE_DATA_CELLNUM,passContent);
        
        
    }

注册接口:RegisterCase.java

        @Test(dataProvider = "datas")
    public void testRegister(Api api, Cases cases) {
        //1.数据库前置查询结果
        String sql = cases.getSql();// 获取到sql
        Object BeforeSqlResult = SQLUtils.Query(sql);// 接口执行前执行sql

        //2.获取响应体数据
        String actualResponseBody = ActualResponseBody(api, cases);// 子类调用父类方法
        //3.添加响应体数据的回写
        addWriteBackData(cases.getCaseId(),Constant.ACTUAL_RESPONSE_DATA_CELLNUM ,actualResponseBody);
        //4.响应体数据断言
        boolean assertResponseData = AssertResponseData(cases, actualResponseBody);
        System.out.println("响应体数据断言结果:" + assertResponseData);
        //5.数据库后置查询
        Object AfterSqlResult = SQLUtils.Query(sql);// 接口执行后执行sql
        // sql不为空进行断言:导包import
        // org.apache.commons.lang3.StringUtils;导错包会找不到isNoneBlank()方法
        boolean assertSqlResult = true;
        //6.数据库断言
        if (StringUtils.isNoneBlank(sql)) {
            assertSqlResult = assertSql(BeforeSqlResult, AfterSqlResult);
            System.out.println("数据库断言结果:" + assertSqlResult);
        }
        
        //7. 响应数据断言和sql断言结果
        String passContent=(assertResponseData &&assertSqlResult)? "pass" : "fail";
        //8.添加断言结果的回写
        //cases.getCaseId()是回写行号,Constant.ASSERT__RESPONSE_DATA_CELLNUM是回写列号
        addWriteBackData(cases.getCaseId(), Constant.ASSERT__RESPONSE_DATA_CELLNUM,passContent);
        

    }



充值接口: RechargeCase.java
       @Test(dataProvider = "datas")
    public void testRecharge(Api api, Cases cases) {
        //1.数据库前置查询结果
        String  sql=cases.getSql();
        Object BeforeMoney=SQLUtils.Query(sql);
        
        //2.获取响应体数据
        String actualResponseBody = ActualResponseBody(api, cases);// 子类调用父类方法
        //3.添加回写响应体
        addWriteBackData(cases.getCaseId(), Constant.ACTUAL_RESPONSE_DATA_CELLNUM,actualResponseBody);
        //4.响应体断言
        boolean assertResponseData = AssertResponseData(cases, actualResponseBody);
        System.out.println("响应数据断言结果:"+assertResponseData);
        //5.数据库后置查询结果
        Object  AfterMoney=SQLUtils.Query(sql);
        //6.数据库断言
        boolean assertMoneySql=true;
        if(StringUtils.isNoneBlank(sql)){
            //数据库断言
             assertMoneySql = assertSql( BeforeMoney,   AfterMoney,cases);
            System.out.println("数据库断言结果:"+assertMoneySql);
        }
        //7.添加断言结果回写
        String passContent=(assertResponseData &&assertMoneySql)? "pass" : "fail";
        addWriteBackData(cases.getCaseId(), Constant.ASSERT__RESPONSE_DATA_CELLNUM,passContent);
        
    }


执行testNG.xml->Run as -》testNG Suit

image.png

疑问:注册和充值接口单独执行没有回写响应体和断言结果
登录接口单独执行可以回写
三个接口一起执行,三个接口响应体数据和断言结果都进行了回写

原因查找:
(1)先判断回写的行,列是否正确-----方法:打断点,debug,断点打在哪里????
断点为什么不打在下图位置???因为:此接口执行时已经打印出响应体,说明此方法肯定调用了,我们要看的是参数属性,所以打断点的地方应该是方法内部的实现


image.png

下图便是打断点的地方:debug as ->testNG suit


image.png

程序如果能执行到打断点的地方,执行到打断点的代码处会自动停下来,且断点处的代码会绿色高亮显示


image.png

鼠标放到参数上,可以看到当前传进来的参数值是多少,按键盘上的f8会进入下一步,如果下一步又存在调用此方法的,又会停下来,鼠标放上去可以看到第二次执行到此断点处,传进来的参数值是多少,这里我们发现传进来的参数值是正确的,问题不是出在这里,此时想释放断点,怎么办呢????-》 再点击断点处,然后按f8,程序会自动执行完毕(为什么去掉断点,还要按F8,因为你只是去掉了断点,但程序却执行到了断点处,f8自动执行后续未执行的代码,如果不按F8,程序就会卡在断点处

(2)既然参数值是对的,说明excel回写是有问题的,没有写入进去----》那么就要检查一下回写方法
鼠标放到此方法上 WriteBackResponseBody-》右键-》open call Hierarchy (查看哪些类调用了此方法)
如下图:我们只看到只有LoginCase类中的finish()方法调用了此方法----》原因找到了,因为注册,充值没有调用回写方法

image.png

又有疑问了????注册,充值,既然没有回写方法,为什么执行testNG.xml(有三个接口),会回写呢????
因为: 回写方法的是要套件执行完毕,统一回写的(三个接口类中只要有一个类有finish()方法就可以了)


image.png

如果三个类中都加finish()方法,testNG.xml执行时,相当于回写了三遍,所以我们这里就只在登录类里用finish()方法就可以了

    @AfterSuite
    public void finish() {
        //套件执行完毕之后,执行批量回写
        ExcelUtils.WriteBackResponseBody(Constant.EXCEL_PATH, 1);
    }

相关文章

网友评论

      本文标题:2020-05-10Api数据库断言-回写【是否通过验证】

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