2 . 11 接口自动化 --- 接口依赖 &用例参数化
程序员文章站
2024-02-19 22:50:43
...
一、 接口文档说明
综上: 充值接口 依赖登录接口返回的用户id信息
二 、 接口依赖处理 & 用例参数化处理
1. 思路:
1) 接口依赖:
登录接口请求成功后,从响应体中提取用户id信息保存下来,充值接口传参时member_id传 登录接口提取的用户id
2) 用例参数化:
a. 用例数据动态数据,如: 用户数据,用变量替代
b. 测试用例方法中: 获取接口传参数据,先提取变量,再替换成对应数据
2. 用例设计如下:
3. 代码实战:
1) 登录接口: 提取用户id并存储
public class RLoginTest extends BaseCase {
public static String apiNo="2";
public static int caseSheetNum=2;
public static boolean isNeedToken = false;
/**
* 登录用例测试方法
* @param url 接口请求地址
* @param method 接口请求方法
* @param params 接口请求传参
* @param Type 接口请求类型
* @param title 用例说明
*/
@Test(dataProvider="casesExcel")
public void test_login(API api,Case c ) {
setDefaultHeaders(isNeedToken);
// 1. 参数化替换
c.setParams(afterReplaceString(c.getParams()));
// 2. 数据库前置查询结果
// 3. 调用接口
String body = HttpUtils.request(api.getUrl(),api.getMethod(),api.getContentType(),c.getParams(),headers);
String flag="FAIL";
String expect = c.getExepect();
if (expect.equals(returnAssertResult(body,c))) {
flag="PASS";
};
int case_row = Integer.parseInt(c.getId().split("_")[1]); // 用例所在行
addWriteBackData(caseSheetNum, case_row,Constants.ACTUAL_RESPONSE_COLUMNNUM,body,Constants.RESULT_COLUMNNUM,flag);
System.out.println("最终测试结果:"+flag);
// 提取对应内容并设置全局变量
setVariableToEnv(body,"$.data.token_info.token",Constants.TOKEN);
setVariableToEnv(body,"$.data.token_info.token_type",Constants.TOKEN_TYPE);
setVariableToEnv(body,"$.data.id",Constants.MEMBER_ID);
}
/**
* 从Excel中读取用例数据
* @return 用例数据,类型,二维数组
*/
@DataProvider
public Object[][] casesExcel(){
Object[][] cases = ExcelUtils.getAPIAndCaseByApiId(apiNo,caseSheetNum);
return cases;
}
@BeforeClass
public void init_class(){
ExcelUtils.cases = ExcelUtils.read(caseSheetNum,1,Case.class);
}
@AfterClass
public void clear_class(){
ExcelUtils.cases=null;
}
}
2) 充值接口
public class SRechargeTest extends BaseCase {
public static String apiNo="3";
public static int caseSheetNum=3;
public static boolean isNeedToken = true;
/**
* 充值用例测试方法
* @param url 接口请求地址
* @param method 接口请求方法
* @param params 接口请求传参
* @param Type 接口请求类型
* @param title 用例说明
*/
@Test(dataProvider="casesExcel")
public void test_recharge(API api,Case c ) {
// 1. 参数化替换
c.setParams(afterReplaceString(c.getParams()));
// 2. 数据库前置查询结果
// 3. 调用接口
// 环境变量中存在token与token_type,那么就获取并设置键
setDefaultHeaders(isNeedToken);
String body=null;
String flag="FAIL";
String sql = c.getSql();
String expect = c.getExepect();
if (StringUtils.isNotBlank(sql)) {
c.setSql(afterReplaceString(sql));
Object sql_before = SQLUtils.getSQLSingleResult(sql);
System.out.println("充值前,数据库查询余额:"+sql_before);
body = HttpUtils.request(api.getUrl(),api.getMethod(),api.getContentType(),c.getParams(),headers);
Object sql_after = SQLUtils.getSQLSingleResult(sql);
System.out.println("充值后,数据库查询余额:"+sql_after);
if (expect.equals(returnAssertResult(body,c)) && sqlAssert(sql_before,sql_after,c) ) {
flag="PASS";
}
}else {
body = HttpUtils.request(api.getUrl(),api.getMethod(),api.getContentType(),c.getParams(),headers);
if (expect.equals(returnAssertResult(body,c))) {
flag="PASS";
}
}
int case_row = Integer.parseInt(c.getId().split("_")[1]); // 用例所在行
addWriteBackData(caseSheetNum, case_row,Constants.ACTUAL_RESPONSE_COLUMNNUM,body,Constants.RESULT_COLUMNNUM,flag);
System.out.println("最终测试结果:"+flag);
}
/**
* 充值前后是否数据库信息正确显示
* @param sql_before:充值前,数据库查看余额结果
* @param sql_after: 充值后,数据库查看余额结果
* @return : 充值前后,数据库信息:充值前+充值金额=充值后
*/
public boolean sqlAssert(Object sql_before,Object sql_after,Case c) {
// 1. 前后充值数据库余额
BigDecimal before_value = (BigDecimal) sql_before;
BigDecimal after_value = (BigDecimal) sql_after;
// 2. 获取充值金额
String params = c.getParams();
String amountStr = JSONPath.read(params, "$.amount").toString();
BigDecimal amount = new BigDecimal(amountStr);
// 3. 判断:充值前+充值金额=充值后?
BigDecimal divAmount = after_value.subtract(before_value);
if(divAmount.compareTo(amount)==0){
return true;
}else {
return false;}
}
/**
* 从Excel中读取用例数据
* @return 用例数据,类型,二维数组
*/
@DataProvider
public Object[][] casesExcel(){
Object[][] cases = ExcelUtils.getAPIAndCaseByApiId(apiNo,caseSheetNum);
return cases;
}
@BeforeClass
public void init_class(){
ExcelUtils.cases = ExcelUtils.read(caseSheetNum,1,Case.class);
}
@AfterClass
public void clear_class(){
ExcelUtils.cases=null;
}
}
3) 用例参数第一步替换代码实现如下:
/**
* 用例数据参数化
* @param str : 需要处理的数据
* @return 替换后的字符串
*/
public static String afterReplaceString(String str) {
if(str.contains("$")) {
Set<String> keys = EnvUtils.env.keySet();
for(String key:keys) {
String value = EnvUtils.env.get(key);
str = str.replace(key, value);
}
System.out.println("替换后字符串结果是:" + str);
}
return str;
}
4) 结果截图
上一篇: 一张图带我们入门Python基础教程