Karate 測試框架提供多種方式執行特定測試,例如透過 Runner 類別方法、命令列引數指定 Feature 檔案與行號,或使用標籤篩選。搭配 VS Code 整合外掛更能視覺化測試,提升開發效率。除了執行測試,Karate 也內建了強大的報告機制,自動產生 HTML 格式報告,包含總覽、場景、標籤與時間軸等頁面,方便開發者與團隊成員理解測試結果。此外,Karate 也支援客製化日誌級別與報告內容,例如隱藏 print 陳述式輸出或過濾不必要的請求回應資訊,讓報告更精簡易讀,更符合專案需求。

執行特定測試

在開發過程中,我們經常需要執行特定的測試,而不是執行整個測試套件。這種需求可能出現在以下情況:

  • 在功能開發期間,只執行與正在開發的功能相關的測試
  • 在測試開發期間,只執行目前正在開發的測試,以確保其正確性
  • 在佈署後,執行一些簡單的煙霧測試(smoke test)來驗證佈署是否成功
  • 為了監控目的,針對線上API例項執行一小部分涵蓋最重要流程的測試

該專案包含兩個場景:tests/Test1.featuretests/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>

內容解密:

  1. 此 XML 組態檔案定義了 Logback 的行為,包括日誌輸出格式和級別。
  2. STDOUTFILE appender 分別將日誌輸出到控制檯和 target/karate.log 檔案。
  3. <logger name="com.intuit" level="DEBUG"/> 設定 Karate 內部日誌級別為 DEBUG。
  4. <root level="info"> 設定根日誌級別為 INFO,並參照了 STDOUTFILE appender。

變更日誌級別

要變更日誌級別,可以修改 logback-test.xml 中的 <logger name="com.intuit" level="DEBUG"/> 為所需的級別,例如 INFO

<logger name="com.intuit" level="INFO"/>

隱藏 print 陳述式

可以根據測試環境或開發需求隱藏 print 陳述式的輸出。有兩種方法可以實作:

  1. 在特定場景中使用 * configure printEnabled = false
  2. karate-config.js 中設定 karate.configure("printEnabled", false); 以全域停用。
function fn() {
    karate.configure("printEnabled", false);
    var config = {
    }
    return config;
}

內容解密:

  1. 使用 configure printEnabled = false 可以在特定場景中隱藏 print 陳述式。
  2. 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

內容解密:

  1. Karate 自動生成的 HTML 報告提供了測試結果的詳細資訊。
  2. 可以透過瀏覽器開啟報告檔案來檢視測試結果。

使用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可以隱藏這些資訊。
  • 此組態可以提高報告的可讀性。