REST-assured 獲取日誌到檔案並結合 Allure 報告進行展示
使用 Rest-assured 集合 Allure
執行完用例之後,在生成的報告中只有斷言資訊,沒有請求的日誌資訊。而當我們的用例失敗時,特別是介面失敗時,請求日誌是分析原因的第一手資源。那如何將 Rest-
assured 產生的日誌存入 Allure 裡,並且能和用例一一對應起來呢?
** 1. 需求與方向**
1.1 問題產生
在使用 Rest-assured 集合 Allure 執行完用例之後,檢視生成的報告資訊如下:
我們可以看到在生成的報告中只有斷言資訊,而沒有請求的日誌資訊,而當我們的用例失敗時,特別是介面失敗時,請求日誌是分析原因的第一手資源;
1.2 需求產生
其實Rest-assured是有請求日誌的,可以通過在given()
then()
後面加上.log().all()
來列印全部的日誌資訊:
這塊不是本文想介紹的重點,所以想了解的可以參考以往的文章或直接閱讀官方文件
那麼問題來了,如何將這打印出來的日誌資訊都"轉移"到 Allure 報告中呢?並且能和用例一一對應起來,然後就開始了探索之路~
1.3 思路產生
下面的解決方案都是在我現階段研究 Rest-assured 及 Allure
的基礎上實現的,可能研究並不透徹不全面,也許有更好的方法使用,請大家多提反饋意見。
首先來看一下 Allure
報告可以如何展示日誌,在學習 Allure
的過程中發現
Allure有新增附件展示的功能,那麼我就直接想到將日誌能存入檔案然後新增到報告附件不就可以了嗎?由此,Allure
接下來就是要想法辦將 Rest-assured 產生的日誌存入檔案了;
整體思路:
【Rest-assured列印日誌】- 【Rest-assured日誌存入檔案】- 【檔案以附件形式傳入Allure】- 【Allure展示附件日誌】
** 2. Allure附件**
先看一下Allure 新增附件的兩種方法:
@Attachment :在方法上添加註解@Attachment
,方法的返回值就會作為附件上傳,可新增展示文字和附件型別
@Attachment(value = "Page screenshot", type = "image/png")
Allure.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 Stringresponse.asString();
// Get all headersHeaders allHeaders = response.getHeaders();// Get a single header value:String headerName = response.getHeader("headerName");
// Get all cookies as simple name-value pairsMap<String, String> allCookies = response.getCookies();// Get a single cookie value:String cookieValue = response.getCookie("cookieName");
// Get status lineString statusLine = response.getStatusLine();// Get status codeint statusCode = response.getStatusCode();
- 先建立方法,用於接收 response 獲取資訊
@Attachment("響應報文")public static String respondBody(Response response) {
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;
@Datapublic 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 結果展示
從結果可以看到請求和響應報文已經成功展示,說明這種實現的思路的可行性,只是展示的日誌資訊還不滿意,還是先想要全部的請求和響應資訊且是格式化後的,不僅僅只有報文,繼續探索~
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(); }}
- 整體的流程思路就是:
@Testvoid testAllureReport(){ addLogToFile(); addHttpLogToAllure();}
3.2.2 結果展示
在下面展示的用例中有2個介面請求,可以看到分別記錄展示了,且格式與 Console 中格式化列印的保持一致。
3.3 RestAssured.filters
3.3.1 方法實現
Rest-assured
提供了過濾器 Filters
,利用它可以串改請求,設定鑑權資訊,過濾 log
等,具體的可在官網中進行學習研究,這裡主要用到 RequestLoggingFilter()
和 ResponseLoggingFilter()
來實現我們的需求。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));
附件新增複用上述的方法:
AllureAttachment.addHttpLogToAllure();
3.3.2 結果展示
結果依然實現了我們的需求
** _4.
來霍格沃茲測試開發學社,學習更多軟體測試與測試開發的進階技術,知識點涵蓋web自動化測試 app自動化測試、介面自動化測試、測試框架、效能測試、安全測試、持續整合/持續交付/DevOps,測試左移、測試右移、精準測試、測試平臺開發、測試管理等內容,課程技術涵蓋bash、pytest、junit、selenium、appium、postman、requests、httprunner、jmeter、jenkins、docker、k8s、elk、sonarqube、jacoco、jvm-sandbox等相關技術,全面提升測試開發工程師的技術實力