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

bobo · 2020年04月07日 · 最后由 未来已来 回复于 2020年04月18日 · 4383 次阅读

框架流程图

发送 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 文件


共收到 3 条回复 时间 点赞
仅楼主可见
bobo #2 · 2020年04月18日 Author
未来已来 回复

我有时间把它从工作代码里迁移到 gitHub, 暂时还没有写完, 还需要加数据库, 消息队列, mock 的模块

仅楼主可见
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册