Karate 測試框架提供多種方式執行特定測試,例如透過 Runner 類別方法、命令列引數指定 Feature 檔案與行號,或使用標籤篩選。搭配 VS Code 整合外掛更能視覺化測試,提升開發效率。除了執行測試,Karate 也內建了強大的報告機制,自動產生 HTML 格式報告,包含總覽、場景、標籤與時間軸等頁面,方便開發者與團隊成員理解測試結果。此外,Karate 也支援客製化日誌級別與報告內容,例如隱藏 print 陳述式輸出或過濾不必要的請求回應資訊,讓報告更精簡易讀,更符合專案需求。
執行特定測試
在開發過程中,我們經常需要執行特定的測試,而不是執行整個測試套件。這種需求可能出現在以下情況:
- 在功能開發期間,只執行與正在開發的功能相關的測試
- 在測試開發期間,只執行目前正在開發的測試,以確保其正確性
- 在佈署後,執行一些簡單的煙霧測試(smoke test)來驗證佈署是否成功
- 為了監控目的,針對線上API例項執行一小部分涵蓋最重要流程的測試
該專案包含兩個場景:tests/Test1.feature和tests/Test2.feature。兩者的設定方式相同,每個檔案包含兩個場景,只是列印預出它們的名稱,以便我們更好地瞭解發生了什麼:
Feature: Feature 1
Scenario: Feature 1 Scenario 1
* print "Feature 1 Scenario 1"
Scenario: Feature 1 Scenario 2
* print "Feature 1 Scenario 2"
執行特定的Runner類別方法
我們已經看到,Runner類別可以用於執行特定的測試,甚至特定的環境。回顧一下,您可以在呼叫mvn test時選擇Runner類別和方法:
mvn test -Dtest=RunnerClass#runnerMethod
這使我們能夠建立具有適當名稱的單獨方法,並為特定目的執行一部分測試。
如果您考慮這些Runner類別,就會更加清楚:
public class Runner {
@Karate.Test
Karate test1() {
// 執行test1.feature中的所有場景
return Karate.run("test1").relativeTo(getClass());
}
@Karate.Test
Karate test2() {
// 執行test2.feature中的所有場景
return Karate.run("test2").relativeTo(getClass());
}
@Karate.Test
Karate test1and2() {
// 執行test1和test2.feature中的所有場景
return Karate.run("test1", "test2").relativeTo(getClass());
}
}
執行mvn clean test -Dtest=Runner#test2,例如,會給出以下輸出:
[INFO] Running tests.Runner
21:27:19.247 [main] INFO com.intuit.karate - [print] Feature 2 Scenario 1
21:27:19.307 [main] INFO com.intuit.karate - [print] Feature 2 Scenario 2
詳細說明:
- 使用
@Karate.Test註解標記測試方法。 Karate.run()方法用於指定要執行的Feature檔案。.relativeTo(getClass())確保路徑相對於Runner類別的位置。
執行特定的測試
另一個VS Code的好處是,我們可以在Testing檢視中看到哪些Feature屬於特定的執行方法,在IDE中執行一次後。這也可以用來重新執行特定的Runner和測試。
使用Plantuml圖表呈現測試選擇邏輯
圖表說明:
- 此圖表展示了選擇和執行特定測試的不同方法。
- 可以透過Runner類別或命令列進行選擇。
- 命令列選擇可以使用
--tags標籤進行過濾。
執行特定的場景
我們將看到如何選擇場景:
- 在Runner內部
- 從命令列
在Runner內部選擇場景
要在Feature檔案中執行特定的場景,只需在冒號(:)後面附加該場景的行號。如果要在Test1.feature中執行從第6行開始的第二個場景,可以這樣呼叫:
@Test
void testFeature1Scenario2() {
Results results = Runner.path("classpath:tests/Test1.feature:6").parallel(4);
assertEquals(0, results.getFailCount(), results.getErrorMessages());
}
從命令列選擇場景
如果要從命令列執行特定的Feature檔案,有一種方法我們已經隱含地使用了,透過VS Code執行測試時。這是使用特殊的karate.options屬性,可以用來設定要執行的場景。
例如,如果使用之前的平行Runner,可以使用以下命令:
mvn clean test -Dtest=ParallelTest#testAll "-Dkarate.options=src/test/java/tests/Test1.feature:6"
詳細說明:
- 使用
Runner.path()指定要執行的Feature檔案和行號。 karate.options屬性允許從命令列選擇特定的Feature或場景。
使用標籤過濾測試
標籤可以放置在場景或整個Feature檔案上,以選擇要執行或不執行的測試。標籤甚至可以用於將場景分組,無論它們位於哪個Feature中。
為了說明這一點,我們在現有的Test1.feature檔案中增加了一些標籤:
Feature: Feature 1
@smoke @important
Scenario: Feature 1 Scenario 1
* print "Feature 1 Scenario 1"
@ignore
Scenario: Feature 1 Scenario 2
* print "Feature 1 Scenario 2"
第一個場景有一個@smoke和一個@important標籤,而第二個場景有一個@ignore標籤。這個@ignore標籤很特別,因為這些被標記的測試不會被執行。VS Code外掛甚至完全停用了該場景的CodeLens選項,以說明這一點。
從命令列執行以下命令,將選擇所有具有@smoke標籤的場景:
mvn clean test -Dtest=ParallelTest#testAll "-Dkarate.options=classpath: --tags=@smoke"
詳細說明:
- 使用
--tags標籤指定要包含或排除的標籤。 classpath:表示在類別路徑中搜尋Feature檔案。- 可以使用波浪號(~)來排除特定的標籤,例如
~@important。
報告與日誌處理
在前一章中,我們學習了多種執行測試的方法,但並未以清晰易懂的方式檢視測試結果。雖然檢視日誌輸出有助於分析測試過程中的問題,但這並不適合讓非技術團隊成員閱讀。本章將探討如何增強日誌的可讀性,並介紹 Karate 的優秀報告功能,以幫助測試開發者和其他利益相關者更好地理解測試結果。
本章主要涵蓋以下主題:
- 組態日誌選項
- 使用 Karate 內建報告
- 組態第三方報告函式庫
- 生成 Surefire 報告
- 使用 JUnit 報告
技術需求
您需要完成第2章「設定您的 Karate 專案」中的系統和 IDE 設定。
組態日誌選項
在開發新測試或除錯現有測試時,日誌通常是瞭解測試執行過程和錯誤發生的重要依據。執行測試時,日誌會顯示在命令列中,同時也會儲存在 Maven 專案的目標目錄中。
瞭解日誌級別
日誌級別決定了輸出中包含哪些型別的日誌。Karate 使用 Logback 記錄函式庫,支援多種日誌級別:TRACE、DEBUG、INFO、WARN 和 ERROR。這些級別從左到右逐漸減少詳細程度,並決定了每個日誌條目的範圍和目的。
此圖示展示了日誌級別的層級結構,從最詳細的 TRACE 到最嚴重的 ERROR。
檢查 Logback 組態
在 Maven 原型生成的專案中,通常在 src/test/java 目錄下有一個名為 logback-test.xml 的檔案。此檔案定義了兩個 appender 元素,分別負責將日誌寫入控制檯和檔案。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>target/karate.log</file>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<logger name="com.intuit" level="DEBUG"/>
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
內容解密:
- 此 XML 組態檔案定義了 Logback 的行為,包括日誌輸出格式和級別。
STDOUT和FILEappender 分別將日誌輸出到控制檯和target/karate.log檔案。<logger name="com.intuit" level="DEBUG"/>設定 Karate 內部日誌級別為 DEBUG。<root level="info">設定根日誌級別為 INFO,並參照了STDOUT和FILEappender。
變更日誌級別
要變更日誌級別,可以修改 logback-test.xml 中的 <logger name="com.intuit" level="DEBUG"/> 為所需的級別,例如 INFO。
<logger name="com.intuit" level="INFO"/>
隱藏 print 陳述式
可以根據測試環境或開發需求隱藏 print 陳述式的輸出。有兩種方法可以實作:
- 在特定場景中使用
* configure printEnabled = false。 - 在
karate-config.js中設定karate.configure("printEnabled", false);以全域停用。
function fn() {
karate.configure("printEnabled", false);
var config = {
}
return config;
}
內容解密:
- 使用
configure printEnabled = false可以在特定場景中隱藏print陳述式。 - 在
karate-config.js中設定,可以全域控制print陳述式的輸出。
使用 Karate 的內建報告
Karate 提供了一套優秀的報告功能,可以顯示測試執行結果、執行的步驟以及相關資訊。執行測試套件後,Karate 會自動生成報告,並在控制檯輸出報告的路徑。
HTML report: (paste into browser to view) | Karate version: 1.2.0
file:///C:/Users/bbischoff/Desktop/github/Writing-API-Tests-with-Karate/chapter05/karate-reports/target/karate-reports/karate-summary.html
內容解密:
- Karate 自動生成的 HTML 報告提供了測試結果的詳細資訊。
- 可以透過瀏覽器開啟報告檔案來檢視測試結果。
使用Karate內建報告功能
Karate的內建報告功能能夠在測試執行後自動生成詳細的報告,幫助開發者快速定位問題。報告生成於Maven的target目錄下的一個名為karate-reports的新資料夾中。
檢視報告
要檢視報告,可以將報告路徑複製並貼上到網頁瀏覽器中,或是切換到VS Code Karate外掛的Karate標籤頁。在REPORTS下方,可以找到直接在預設網頁瀏覽器中開啟不同報告頁面的連結。
報告頁面介紹
Karate的報告包含四個不同的頁面,以下是對這些頁面的簡要介紹:
總覽頁面(Summary)
此頁面顯示了功能概述,包括功能名稱、執行的場景數量以及透過和失敗的場景數量。點選某個功能名稱,可以在左側邊欄中檢視該功能包含的所有場景。
內容解密:
- 總覽頁面提供了測試執行的整體情況。
- 功能名稱連結到詳細的場景列表。
- 場景數量和透過/失敗數量幫助快速評估測試結果。
場景頁面(Scenario)
在場景頁面中,可以檢視每個場景的執行步驟。如果某個步驟失敗,則會顯示相關的異常資訊。點選執行請求或回應的步驟,可以檢視詳細的請求和回應資訊。
內容解密:
- 場景頁面列出了每個場景的執行步驟。
- 異常資訊幫助定位失敗原因。
- 請求和回應詳情對於介面測試尤其重要。
標籤頁面(Tags)
此頁面顯示了場景中使用的標籤分佈情況,以表格形式呈現。每個使用特定標籤的功能檔案在對應的欄位中會有一個X標記。
內容解密:
- 標籤頁面幫助瞭解標籤在不同場景中的使用情況。
- 表格形式便於快速概覽標籤分佈。
- X標記直觀地表示了哪些功能檔案使用了特定的標籤。
時間線頁面(Timeline)
時間線頁面展示了平行執行測試時的內部運作情況,包括使用的不同執行緒以及每個執行緒執行的場景。
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Karate 測試精選執行與報告
package "軟體測試架構" {
package "測試層級" {
component [單元測試
Unit Test] as unit
component [整合測試
Integration Test] as integration
component [端對端測試
E2E Test] as e2e
}
package "測試類型" {
component [功能測試] as functional
component [效能測試] as performance
component [安全測試] as security
}
package "工具框架" {
component [pytest] as pytest
component [unittest] as unittest
component [Selenium] as selenium
component [JMeter] as jmeter
}
}
unit --> pytest : 撰寫測試
unit --> integration : 組合模組
integration --> e2e : 完整流程
functional --> selenium : UI 自動化
performance --> jmeter : 負載測試
note right of unit
測試金字塔基礎
快速回饋
高覆蓋率
end note
@enduml內容解密:
- 時間線頁面對於理解平行測試的執行流程很有幫助。
- 執行緒資訊和場景執行詳情便於分析平行執行的情況。
- 執行時間資料有助於最佳化測試效能。
組態內建報告
保留舊報告
Karate預設會將新的報告儲存於karate-reports資料夾中,並將已存在的報告移至以karate_reports開頭並加上時間戳的新資料夾中。如果需要更改此行為,可以透過設定backupReportDir屬性為false來實作。
Results results = Runner.path("classpath:reporting")
.backupReportDir(false)
.parallel(2);
內容解密:
- backupReportDir屬性控制是否保留舊報告。
- 設定為false可以關閉保留舊報告的功能。
- 此設定需要在測試執行器中進行。
自定義報告內容
在生產環境中,可能只需要顯示相關資訊以便於測試分析。可以透過組態來隱藏不必要的資訊,如請求和回應的顯示。
* configure report = { showLog: false }
或者在karate-config.js檔案中進行組態:
karate.configure("report", { showLog: false });
內容解密:
- showLog選項控制是否在報告中顯示請求和回應。
- 設定為false可以隱藏這些資訊。
- 此組態可以提高報告的可讀性。