接口测试 rest assured 使用 AuthFilter 对请求进行预处理

白虹李李 · August 16, 2017 · Last by 白虹李李 replied at December 20, 2017 · 600 hits

很多接口都会有timestamp字段和sign字段(有的是auth字段),放在http请求的header里。

为了代码好看(好吧,就是为了好看而已),不想在每个用例里都写上类似如下的代码:

setTimestamp();
setSign();

given().when().then()

其中一种方法就是使用Filter,或者说AuthFilter。
Filter可以在request实际发送前,对request进行修改。也可以在response得到进一步的处理前,修改内容。

Filter可以指定顺序,也可以形成责任链。
使用AuthFilter的好处在于,如果不需要的时候,可以通过如下的代码将AuthFilter从责任链中去掉。

given().auth().none()

我们自己定义的Filter继承自AuthFilter

package com.szsharelink.test.filter;

import com.jayway.restassured.filter.FilterContext;
import com.jayway.restassured.response.Response;
import com.jayway.restassured.specification.FilterableRequestSpecification;
import com.jayway.restassured.specification.FilterableResponseSpecification;
import com.jayway.restassured.spi.AuthFilter;
import com.szsharelink.test.utils.DateTimeUtils;
import com.szsharelink.test.utils.HttpUtil;
import com.szsharelink.test.utils.SecurityUtils;

import java.util.Map;

/**
* Created by Liliangxi on 2017/8/15.
*/

public class SetTimeStampAndSignFilter implements AuthFilter{
private String appkey;
private String appsecret;

public SetTimeStampAndSignFilter(String appkey, String appsecret){
this.appkey = appkey;
this.appsecret = appsecret;
}

public Response filter(FilterableRequestSpecification filterableRequestSpecification, FilterableResponseSpecification filterableResponseSpecification, FilterContext filterContext) {

String timeStamp = DateTimeUtils.getUTCTimestamp("yyyyMMdd.HHmmss");
filterableRequestSpecification.header("timestamp", timeStamp);

switch (filterableRequestSpecification.getMethod()){
case POST:
String body = filterableRequestSpecification.getBody().toString();
filterableRequestSpecification.header("sign", SecurityUtils.calcSign(timeStamp, appkey, appsecret, body));
break;
case GET:
Map<String, String> parameterMap = filterableRequestSpecification.getQueryParams();
String sortedQueryString = HttpUtil.buildSortedQuery(parameterMap);
filterableRequestSpecification.header("sign", SecurityUtils.calcSign(timeStamp, appkey, appsecret, sortedQueryString));
break;
}
return filterContext.next(filterableRequestSpecification, filterableResponseSpecification);
}
}

这样,在编写测试用例时,就可以这样来写,来满足一个强迫症患者:

given()
.contentType("application/json;charset=UTF-8")
.headers(walletHeaders)
.filter(new SetTimeStampAndSignFilter(appkey, appsecret))
.when()
.get(UrlMapper.FundsUrl)
.then()
.log().ifError()
.body("code", equalTo("0000"))
.body(matchesJsonSchemaInClasspath("Funds.json"))
.body("content.fundList.size()",is(13))
共收到 2 条回复 时间 点赞

同样在尝试testNG+rest-assured写接口测试,不知楼主进展如何啦

cctodd 回复

这个目前正式在公司使用了,不过主要是做接口测试,也做接口自动化。
目前还是处于比较迷茫的阶段,因为没想好如何继续深入下去。

做监控还要有开发的支持才行,暂时不现实。

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up