美文网首页
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