接口测试框架搭建笔记 (Rest-Assured + Junit5 + Allure)

框架流程图

发送HTTP请求

使用rest-assured框架, 发送HTTP请求. 官网地址: http://rest-assured.io/
RequestSpecBuilder 方法可以把各种请求参数放进去

数据驱动

YAML

官网

官网:https://yaml.org/

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进行断言

官网

官网: http://hamcrest.org/

pom

pom文件

报表输出

使用allure进行报表输出, Junit5 + allure

官网

allure官网: https://docs.qameta.io/allure/

pom

pom文件