使用 rest-assured 框架, 发送 HTTP 请求. 官网地址: http://rest-assured.io/
RequestSpecBuilder 方法可以把各种请求参数放进去
文本:
pom:
代码: yaml 格式转换成 java 格式
ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
try {
//1. YAML文件和Java代码文件名一样, 文件路径也要一样, 但是Java代码在test中, yaml文件在Java的resource中
//2. 想要转换成什么class, 只要把class传入方法就行
model = mapper.readValue(
Thread.currentThread().getStackTrace().getClass().getResourceAsStream(path.path()),
HttpModel.class);
} catch (IOException e) {
e.printStackTrace();
}
//1. Thread方法可以得到当前文件的路径-path from source Root
//2. getStackTrace()[index], 可以通过debug方法来确定. 一般可以数离当前方法由多远.
public String path(){
return "/"+Thread.currentThread().getStackTrace()[2].getClassName().replace('.', '/') + ".yaml";
}
HTTP 请求参数使用 yaml 文件传入, 如上图:
以 Get 请求为例, HTTP 请求可以分为, 请求 method, url, 请求参数 (请求头, query), 这些值都写在 YAML 文件中, 转化为 HttpModel 格式传入
public Response run(HashMap<String, Object> replaceParams){
if(null != replaceParams) {
if(null != headers){
replace(headers, replaceParams);
}
if(null != queryParams) {
replace(queryParams, replaceParams);
}
}
final RequestSpecBuilder builder = new RequestSpecBuilder();
if(null != headers){
headers.entrySet().forEach(entry -> {
if(null != entry.getValue()){
builder.addHeader(entry.getKey(), String.valueOf(entry.getValue()));
}
});
}
if(null != queryParams){
queryParams.entrySet().forEach(entry ->{
if(null != entry.getValue()){
builder.addQueryParam(entry.getKey(), entry.getValue());
}
});
}
RequestSpecification requestSpec = builder.build();
return given()
.contentType("application/json")
.spec(requestSpec).
when().request(method, url);
// then().log().all().extract().response();
}
我们以接口 open/v4/intelNews/list 接口为例, 这个接口的数据分三块
{
"header":{
"userId":241560789, (单个接口共用)
"Authorization":"Basic ************" (服务共用)
},
"query":{
"category":"${category}", (单个用例共用)
"page":"${page}"
}
}
这个服务的公用参数, 其他的接口也要使用, 比如 header 中的 Authorization, host, port
服务共用的, 我写了一个常量类, 定义了使用常量的 get 方法, 在单个接口的测试方法中传入
单个接口的公用参数, 比如 userID, 接口格式, URL, 在接口共用的 YAML 文件中, 写死.
单个测试用例的参数, 结合 Junit5 的@ParameterizedTest 方法, 参数化传入.
这个用例中, 参数 page 是固定的, category 是需要参数化的. 所以 category 写入 yaml 文件, page 写死在用例里
Junit5 的参数化代码接口如下, 数据 template 就是使用上面的 yaml 抽取
使用 rest-assured 拿到结果,hamcrest 进行断言
pom 文件
使用 allure 进行报表输出, Junit5 + allure
allure 官网: https://docs.qameta.io/allure/
pom 文件