思路: 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()方法调用了此方法----》原因找到了,因为注册,充值没有调用回写方法
又有疑问了????注册,充值,既然没有回写方法,为什么执行testNG.xml(有三个接口),会回写呢????
因为: 回写方法的是要套件执行完毕,统一回写的(三个接口类中只要有一个类有finish()方法就可以了)
image.png
如果三个类中都加finish()方法,testNG.xml执行时,相当于回写了三遍,所以我们这里就只在登录类里用finish()方法就可以了
@AfterSuite
public void finish() {
//套件执行完毕之后,执行批量回写
ExcelUtils.WriteBackResponseBody(Constant.EXCEL_PATH, 1);
}
网友评论