使用 Rest-assured 集合 Allure 运行完用例之后,在生成的报告中只有断言信息,没有请求的日志信息。而当我们的用例失败时,特别是接口失败时,请求日志是分析原因的第一手资源。那如何将 Rest-assured 产生的日志存入 Allure 里,并且能和用例一一对应起来呢?

问题的产生

在使用 Rest-assured 集合 Allure 运行完用例之后,查看生成的报告信息如下:

image-20210111134833399

我们可以看到在生成的报告中只有断言信息,而没有请求的日志信息,而当我们的用例失败时,特别是接口失败时,请求日志是分析原因的第一手资源;

解决思路

其实Rest-assured是有请求日志的,可以通过在given()then()后面加上.log().all()来打印全部的日志信息:

image-20210111135028442

接下来如何将打印的日志信息“转义”到Allure报告中呢?

首先来看一下 Allure 报告可以如何展示日志,在学习 Allure 的过程中发现 Allure有添加附件展示的功能,那么我就直接想到将日志能存入文件然后添加到报告附件不就可以了吗?由此,Allure 端的解决方向确定。

接下来就是要想法办将 Rest-assured 产生的日志存入文件了;

整体思路:

【Rest-assured打印日志】- 【Rest-assured日志存入文件】- 【文件以附件形式传入Allure】- 【Allure展示附件日志】

Allure附件

先看一下Allure 添加附件的两种方法:

第一种

@Attachment:在方法上添加注解@Attachment,方法的返回值就会作为附件上传,可添加展示文本和附件类型

1
@Attachment(value = "Page screenshot", type = "image/png")

第二种

Allure.addAttachment:通过addAttachment方法指定要添加的附件和展示信息

1
2
3
4
5
6
7
public static void addHttpLogToAllure() {
try {
Allure.addAttachment("接口请求响应日志", new FileInputStream("src/main/resources/test.log"));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}

保存日志

方案一

由于在框架中,我已经进行了封装,每个接口请求后都会返回 response 信息。所以一开始我想着从拿到 response 信息进行存储,查阅官方文档,寻找 response 信息获取的相关 API,发现 response.asString();可以获取到 json body 的信息,就先尝试使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//// Get the response body as a String
response.asString();

// Get all headers
Headers allHeaders = response.getHeaders();
// Get a single header value:
String headerName = response.getHeader("headerName");

// Get all cookies as simple name-value pairs
Map<String, String> allCookies = response.getCookies();
// Get a single cookie value:
String cookieValue = response.getCookie("cookieName");

// Get status line
String statusLine = response.getStatusLine();
// Get status code
int statusCode = response.getStatusCode();
  1. 先创建方法,用于接收 response 获取信息

    1
    2
    3
    4
    5
    @Attachment("响应结果")
    public static String responseBody(Response response) {
    // 将response转为json并格式化输出
    return JSONUtil.toJsonPrettyStr(response.asString());
    }
  1. 再创建方法,用于接收请求信息,由于我的所有请求信息都传入了一个 Restful 对象中且未找到 Rest Assured 关于请求信息直接获取的 API,这里我就直接取 Restful对象

    Restful对象:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    package com.api.object.apimodel;

    import lombok.Data;

    import java.util.HashMap;

    /**
    * 接口请求参数实体
    *
    * @author jingLv
    * @date 2021/01/11
    */
    @Data
    public class Restful {
    /**
    * 请求接口url
    */
    public String url;
    /**
    * 请求接口方法
    */
    public String method;
    /**
    * 请求接口头信息
    */
    public HashMap<String, Object> header = new HashMap<>();
    /**
    * 请求接口参数:key-value
    */
    public HashMap<String, Object> query = new HashMap<>();
    /**
    * 请求接口参数:path中拼接参数
    */
    public HashMap<String, Object> pathQuery = new HashMap<>();
    /**
    * 请求接口参数:主体
    */
    public String body;
    }

接收请求信息方法:

1
2
3
4
5
@Attachment("请求信息")
public static String requestBody(Restful restful) {
//报告展现请求信息
return restful.toString();
}
  1. 最后创建一个总的接收方法加入请求流程中,在每个请求结束后获取日志信息进行附件添加

    1
    2
    3
    4
    public static void getRequestAndRespondBody(Restful restful, Response response) {
    requestBody(restful);
    responseBody(response);
    }

在testcase中使用定义的方法,并执行测试用例

image-20210111163636700

结果展示

从结果可以看到请求和响应报文已经成功展示,说明这种实现的思路的可行性,只是展示的日志信息还不满意,还是先想要全部的请求和响应信息且是格式化后的,不仅仅只有报文

image-20210111164017179

方案二

在研究过程中发现RestAssured提供了logConfig方法,可以将原本在Console中打印的信息指定格式化输出到文件中,具体用法如下:

  1. 需要使用文件流,引入Jar包

    1
    2
    3
    4
    5
    <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
    </dependency>
  1. 在请求中设置log打印方式和存储路径

  2. 创建附件添加方法加入请求流程中,在每个请求结束后获取日志信息进行附件添加

  3. 集成测试和附件添加,进行测试

方案三

Rest-assured 提供了过滤器 Filters,利用它可以串改请求,设置鉴权信息,过滤 log 等,主要用到 RequestLoggingFilter()ResponseLoggingFilter() 来实现我们的需求。