本文僅作爲我當前需求解決的一個經歷記錄,本人能力有限,菜鳥級別;若有幸被閱讀到且提供了有效幫助,我深感榮幸;若對您無用或大佬有更好的方法,還望輕噴賜教,我將虛心請教拜讀,謝謝~
1、需求與方向
1.1 問題產生
在使用Rest-assured集合Allure運行完用例之後,查看生成的報告信息如下:
我們可以看到在生成的報告中只有斷言信息,而沒有請求的日誌信息,而當我們的用例失敗時,特別是接口失敗時,請求日誌是分析原因的第一手資源;
1.2 需求產生
其實Rest-assured是有請求日誌的,可以通過在given()
和then()
後面加上.log().all()
來打印全部的日誌信息:
這塊不是本文想介紹的重點,所以想了解的可以參考以往的文章或直接閱讀官方文檔
那麼問題來了,如何將這打印出來的日誌信息都"轉移"到allure報告中呢?並且能和用例一一對應起來,然後就開始了探索之路~
1.3 思路產生
下面的解決方案都是在我現階段研究restassured及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:通過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 結果展示
從結果可以看到請求和響應報文已經成功展示,說明這種實現的思路的可行性,只是展示的日誌信息還不滿意,還是先想要全部的請求和響應信息且是格式化後的,不僅僅只有報文,繼續探索~
3.2 RestAssured.config().logConfig
3.2.1 方法實現
在研究過程中發現RestAssured
提供了logConfig
方法,可以將原本在Console中打印的信息指定格式化輸出到文件中,具體用法如下(這裏指演示重點實現原理部分,其餘封裝細節太冗餘就不展示了):
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(); } }
3.2.2 結果展示
在下面展示的用例中有2個接口請求,可以看到分別記錄展示了,且格式與Console中格式化打印的保持一致
3.3 RestAssured.filters
3.2.1 方法實現
RestAssured
提供了過濾器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 結果展示
結果依然實現了我們的需求