框架流程图
发送HTTP请求
使用rest-assured框架, 发送HTTP请求. 官网地址: http://rest-assured.io/
RequestSpecBuilder 方法可以把各种请求参数放进去
数据驱动
YAML
官网
yaml文本格式
文本:
pom
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
pom文件
报表输出
使用allure进行报表输出, Junit5 + allure
官网
allure官网: https://docs.qameta.io/allure/
pom
pom文件