干貨 | REST-assured 獲取日志到文件并結合 Allure 報告進行展示
使用 Rest-assured 集合 Allure 運行完用例之后,在生成的報告中只有斷言信息,沒有請求的日志信息。而當我們的用例失敗時,特別是接口失敗時,請求日志是分析原因的第一手資源。那如何將 Rest-assured 產生的日志存入 Allure 里,并且能和用例一一對應起來呢?
在使用 Rest-assured 集合 Allure 運行完用例之后,查看生成的報告信息如下:
我們可以看到在生成的報告中只有斷言信息,而沒有請求的日志信息,而當我們的用例失敗時,特別是接口失敗時,請求日志是分析原因的第一手資源;
其實Rest-assured是有請求日志的,可以通過在given()和then()后面加上.log().all()來打印全部的日志信息:
那么問題來了,如何將這打印出來的日志信息都"轉移"到 Allure 報告中呢?并且能和用例一一對應起來,然后就開始了探索之路~
首先來看一下 Allure 報告可以如何展示日志,在學習 Allure 的過程中發現 Allure有添加附件展示的功能,那么我就直接想到將日志能存入文件然后添加到報告附件不就可以了嗎?由此,Allure 端的解決方向確定。
接下來就是要想法辦將 Rest-assured 產生的日志存入文件了;
整體思路:
【Rest-assured打印日志】- 【Rest-assured日志存入文件】- 【文件以附件形式傳入Allure】- 【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(); } }
由于在框架中,我已經進行了封裝,每個接口請求后都會返回 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
先創建方法,用于接收 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; @Data public class Restful { public String url; public String method; public HashMap
@Attachment("請求信息") public static String requestBody(Restful restful) { //報告展現請求信息 return restful.toString(); }
最后創建一個總的接收方法加入請求流程中,在每個請求結束后獲取日志信息進行附件添加
public static void getRequestAndRespondBody(Restful restful, Response response){ requestBody(restful); respondBody(response); }
從結果可以看到請求和響應報文已經成功展示,說明這種實現的思路的可行性,只是展示的日志信息還不滿意,還是先想要全部的請求和響應信息且是格式化后的,不僅僅只有報文,繼續探索~
在研究過程中發現RestAssured提供了logConfig方法,可以將原本在Console中打印的信息指定格式化輸出到文件中,具體用法如下(這里指演示重點實現原理部分,其余封裝細節太冗余就不展示了):
WriterOutputStream用到依賴如下:
在請求中設置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(); } }
創建附件添加方法加入請求流程中,在每個請求結束后獲取日志信息進行附件添加
public static void addHttpLogToAllure() { try { Allure.addAttachment("接口請求響應日志", new FileInputStream("src/main/resources/test.log")); } catch (FileNotFoundException e) { e.printStackTrace(); } }
整體的流程思路就是:
@Test void testAllureReport(){ addLogToFile(); addHttpLogToAllure(); }
在下面展示的用例中有2個接口請求,可以看到分別記錄展示了,且格式與 Console 中格式化打印的保持一致。
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();
結果依然實現了我們的需求
請點擊鏈接獲取更多技術文章,有驚喜喲:https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=hwyun×tamp=1651025761
API
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。