天天看點

Rest-assured擷取日志到檔案并結合Allure報告進行展示

本文僅作為我目前需求解決的一個經曆記錄,本人能力有限,菜鳥級别;若有幸被閱讀到且提供了有效幫助,我深感榮幸;若對您無用或大佬有更好的方法,還望輕噴賜教,我将虛心請教拜讀,謝謝~

1、需求與方向

1.1 問題産生

在使用Rest-assured集合Allure運作完用例之後,檢視生成的報告資訊如下:

Rest-assured擷取日志到檔案并結合Allure報告進行展示

我們可以看到在生成的報告中隻有斷言資訊,而沒有請求的日志資訊,而當我們的用例失敗時,特别是接口失敗時,請求日志是分析原因的第一手資源;

1.2 需求産生

其實Rest-assured是有請求日志的,可以通過在

given()

then()

後面加上

.log().all()

來列印全部的日志資訊:

這塊不是本文想介紹的重點,是以想了解的可以參考以往的文章或直接閱讀官方文檔
Rest-assured擷取日志到檔案并結合Allure報告進行展示

那麼問題來了,如何将這列印出來的日志資訊都"轉移"到allure報告中呢?并且能和用例一一對應起來,然後就開始了探索之路~

1.3 思路産生

下面的解決方案都是在我現階段研究restassured及allure的基礎上實作的,可能研究不透測不全面,也許有更好的方法使用,待熟知的小夥伴賜教

首先來看一下

Allure

報告可以如何展示日志,在學習

Allure

的過程中發現Allure有添加附件展示的功能,那麼我就直接想到将日志能存入檔案然後添加到報告附件不就可以了嗎?由此,

Allure

端的解決方向确定。

接下來就是要想法辦将Rest-assured産生的日志存入檔案了;

  • 整體思路:

    【Rest-assured列印日志】- 【Rest-assured日志存入檔案】- 【檔案以附件形式傳入Allure】- 【Allure展示附件日志】

2、Allure附件

先看一下allure添加附件的兩種方法:

  • @Attachment:在方法上添加注解

    @Attachment

    ,方法的傳回值就會作為附件上傳,可添加展示文本和附件類型
  • Allure.addAttachment:通過addAttachment方法指定要添加的附件和展示資訊
    public static void addHttpLogToAllure() {
            try {
                Allure.addAttachment("接口請求響應日志",
                        new FileInputStream("src/main/resources/test.log"));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
               

3、儲存日志

如果是我們自己列印的日志資訊,可以任意儲存或直接使用log4j即可,但是請求的日志是由Rest-assured産生的,這可能就需要去查閱架構相關log方面的文檔資料

3.1 初始版

3.1.1 方案選擇

由于在架構中,我已經進行了封裝,每個接口請求後都會傳回response資訊,是以一開始我想着從拿到response資訊進行存儲,查閱官方文檔,尋找response資訊擷取的相關API,發現

response.asString();

可以擷取到

json body

的資訊,就先嘗試使用

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();
           
  • 先建立方法,用于接收response擷取資訊
    @Attachment("響應封包")
    public static String respondBody(Response response) {
    
        //格式化json串
        boolean prettyFormat = true; //格式化輸出
        JSONObject jsonObject = JSONObject.parseObject(response.asString());
        String responseBody = JSONObject.toJSONString(jsonObject,prettyFormat);
    
        //報告展現響應封包
        return responseBody;
    }
               
  • 再建立方法,用于接收請求資訊,由于我的所有請求資訊都傳入了一個Restful對象中且未找到Rest-assured關于請求資訊直接擷取的api,這裡我就直接取Restful對象

    Restful對象:

    import lombok.Data;
    import java.util.HashMap;
    
    @Data
    public class Restful {
    
        public String url;
        public String method;
        public HashMap<String,Object> header = new HashMap<>();
        public HashMap<String,Object> query = new HashMap<>();
        public HashMap<String,Object> pathQuery = new HashMap<>();
        public String body;
    }
               
    接收請求資訊方法
    @Attachment("請求資訊")
    public static String requestBody(Restful restful) {
        //報告展現請求資訊
        return restful.toString();
    }
               
  • 最後建立一個總的接收方法加入請求流程中,在每個請求結束後擷取日志資訊進行附件添加
    public static void getRequestAndRespondBody(Restful restful, Response response){
            requestBody(restful);
            respondBody(response);
        }
               
3.1.2 結果展示

從結果可以看到請求和響應封包已經成功展示,說明這種實作的思路的可行性,隻是展示的日志資訊還不滿意,還是先想要全部的請求和響應資訊且是格式化後的,不僅僅隻有封包,繼續探索~

Rest-assured擷取日志到檔案并結合Allure報告進行展示

3.2 RestAssured.config().logConfig

3.2.1 方法實作

在研究過程中發現

RestAssured

提供了

logConfig

方法,可以将原本在Console中列印的資訊指定格式化輸出到檔案中,具體用法如下(這裡指示範重點實作原理部分,其餘封裝細節太備援就不展示了):

  • WriterOutputStream

    用到依賴如下:
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>
           
  • 在請求中設定log列印方式和存儲路徑
public void addLogToFile(){
	try (FileWriter fileWriter = new FileWriter("src/main/resources/test.log");
	     PrintStream printStream = new PrintStream(new WriterOutputStream(fileWriter), true)) {
	     RestAssured.config = RestAssured.config().logConfig(LogConfig.logConfig().defaultStream(printStream));
	     given().XXX.log().all().
	     when().XXX
	     then().log().all();
	} catch (IOException e) {
	     e.printStackTrace();
	}
}
           

RestAssured

提供的

logConfig

方法目前發現隻能覆寫,無法append,不過這正好符合我們的需求,每個用例的接口請求都隻一一對應各自的日志資訊,這樣每執行一個接口,儲存一份日志資訊;下一個接口執行的時候就會覆寫成新的目前接口資訊儲存展示
  • 建立附件添加方法加入請求流程中,在每個請求結束後擷取日志資訊進行附件添加
    public static void addHttpLogToAllure() {
       try {
            Allure.addAttachment("接口請求響應日志",
                    new FileInputStream("src/main/resources/test.log"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
               
  • 整體的流程思路就是:
    @Test
    void testAllureReport(){
    	addLogToFile(); //每次請求将測試log輸出到檔案中
    	addHttpLogToAllure(); //每次請求後将log檔案以附件形式儲存到allure中
    }
               
3.2.2 結果展示

在下面展示的用例中有2個接口請求,可以看到分别記錄展示了,且格式與Console中格式化列印的保持一緻

Rest-assured擷取日志到檔案并結合Allure報告進行展示
Rest-assured擷取日志到檔案并結合Allure報告進行展示

3.3 RestAssured.filters

3.2.1 方法實作

RestAssured

提供了過濾器

Filters

,利用它可以串改請求,設定鑒權資訊,過濾log等,具體的可在官網中進行學習研究,這裡主要用到

RequestLoggingFilter()

ResponseLoggingFilter()

來實作我們的需求

Rest-assured擷取日志到檔案并結合Allure報告進行展示

RequestLoggingFilter()

ResponseLoggingFilter()

可以将所有的請求和響應的log進行列印,而我們想要的是将log存入檔案,是以還要借助方法

logRequestTo(PrintStream stream)

,指定log的格式化輸出到檔案中:

FileWriter fileWriter = null;
try {
    fileWriter = new FileWriter("src/main/resources/test.log");
} catch (IOException e) {
    e.printStackTrace();
}
PrintStream printStream = new PrintStream(new WriterOutputStream(fileWriter), true);
RestAssured.filters(new RequestLoggingFilter().logRequestTo(printStream),new ResponseLoggingFilter().logResponseTo(printStream));
           

附件添加複用上述的方法:

3.3.2 結果展示

結果依然實作了我們的需求

Rest-assured擷取日志到檔案并結合Allure報告進行展示
Rest-assured擷取日志到檔案并結合Allure報告進行展示

繼續閱讀