3种常见的鉴权方式
1、cookie
2、session
3、token
3者的原理和区别需要查询网络资料好好理解下
HttpUtils类修改抽取请求头和返回响应body
前面的注册和登录接口都是不需要有鉴权信息就可以完成的接口测试,但是想充值、投资等需要有对应用户登录成功前提下才能测试的接口,就需要考虑鉴权的处理。
示例背景以token为例子,token生成在登录响应报文中,以及充值接口请求头需增加token值
产生2个问题:
1、需要获取到登录响应报文中的token值
2、充值请求报文中报文头增加token值
为解决以上2个问题,需要改造HttpUtils类,把请求头从自定义的get、post方法中抽取出来,并且需要得到把请求的响应报文存储起来
// 设置请求头
public static void setHeaders(HttpRequest request,Map<String,String> headers) {
//得到所有的请求头键值
Set<String> keys = headers.keySet();
//循环遍历得到键值对应的values值
for (String key : keys) {
String value = headers.get(key);
request.setHeader(key,value);
}
}
自定义的get、post、call方法修改入参,把请求头作为入参传入,并把返回值从void改为String类型,示例为get方法的代码修改,post和call方法类似
// 发送get请求方法,修改返回值为String和增加入参headers
public static String get(String url,Map<String,String> headers) throws Exception {
HttpGet get = new HttpGet(url);
// 修改代码:调用新写的setHeaders方法吧请求头传入
setHeaders(get, headers);
HttpClient httpClient = HttpClients.createDefault();
HttpResponse httpResponse = httpClient.execute(get);
//修改代码:获取响应体作为返回值
return returnResponseBody(httpResponse);
}
新建EnvUtils类用来保存环境变量
可以理解成一样做接口测试的工具:postman里的环境变量,设置成键值对的形式
public class EnvUtils {
public static Map<String, String> env = new HashMap<String, String>();
}
case类修改
原有的登录和注册案例类均需要修改@Test里的代码,以LoginCase为例子
@Test(dataProvider = "Datas")
public void test(ApiInfo api, CaseInfo c) {
//因为post方法中设置请求头值的方法被抽取出来了,所以根据接口需要的情况设置,以Content-Type为例子
Map<String, String> headers = new HashedMap<String, String>();
headers.put("Content-Type", "application/json");
//call方法改造增加了返回值和请求头入参
String body = HttpUtils.call(api.getApiUrl(), api.getApiMethod(), c.getParams(), headers);
// fastjson里的jsonpath从响应报文中提取token字段值
Object token = JSONPath.read(body, "$.data.token_info.token");
if (token != null) {
//如果token不为空,则把token值保存到环境变量中,环境变量名为token
EnvUtils.env.put("${token}", token.toString());
//同时从登录响应报文中获取充值接口需要的id值,代码写法和token获取一致省略代码
}
}
}
新增RechargeCase类
public class RechargeCase {
@Test(dataProvider = "Datas")
public void test(ApiInfo api,CaseInfo c) {
Map<String, String> headers = new HashedMap<String, String>();
headers.put("Content-Type", "application/json");
//从环境变量中获取到登录接口保存的token值
String token = EnvUtils.env.get("${token}");
//如果token不为空,则把token值放入请求头的Authorization
if(StringUtils.isNotBlank(token)) {
headers.put("Authorization", "Bearer " + token);
}
String body = HttpUtils.call(api.getApiUrl(),api.getApiMethod(),c.getParams(),headers);
}
@DataProvider
public Object[][] Datas(){
//充值接口的在接口信息excel里的ApiId=3
Object[][] datas = ExcelUtils.getApiAndCaseByApiId("3");
return datas;
}
}
修改excel,添加充值接口测试案例参数后,以testng运行检查下是否可以充值成功
遗留问题:多用户登录后充值失败问题(待解决)
testng执行时是按配置的class类顺序执行的,会把所有的登录接口执行完,在执行注册接口类,这样当多个用户登录完成后,环境变量中的token值只会保留最后一个登录用户的,所以前面登录过的用户在跑充值接口时,只有最后一个登录用户可以充值成功,前面登录过的均会失败
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="接口自动化" parallel="false">
<test name="用户模块">
<classes>
<class name="testcase.RegisterCase"/>
<class name="testcase.LoginCase"/>
<class name="testcase.RechargeCase"/>
</classes>
</test>
</suite>