返回文章列表

Karate測試除錯執行與環境組態

本文探討 Karate 測試框架的除錯技巧、Maven 整合與多環境設定。文章涵蓋了 Karate 除錯工具的使用、Maven 執行器的組態、karate-config.js 的設定,以及如何在不同環境下執行特定測試。

Web 開發 測試

Karate 測試框架提供完整的 API 測試解決方案,從除錯到執行,再到多環境設定,都能有效提升測試效率。本文將詳細介紹如何在 VS Code 中使用 Karate 的除錯功能,如何利用 Maven 執行測試,以及如何透過 karate-config.js 設定不同測試環境。瞭解這些技術細節,能幫助開發者更好地掌握 Karate 測試框架,建構更穩固的 API 測試流程。

使用Karate進行測試除錯與執行

Karate測試除錯功能詳解

Karate提供強大的除錯功能,讓開發者能夠有效定位與解決測試過程中的問題。主要除錯工具包括斷點設定、逐步執行以及變數監控等功能。

除錯工具欄按鈕功能說明

除錯工具欄從左至右各按鈕功能如下:

  • 繼續執行:繼續執行測試直到下一個斷點或測試結束
  • 單步跳過:逐行執行測試步驟,但不會進入外部方法內部
  • 單步進入:逐行執行測試步驟,包括進入外部方法內部
  • 單步離開:當位於外部方法中時,傳回至下一個測試步驟
  • 單步傳回:傳回至前一步驟並暫停
  • 反向執行:在Karate中與單步傳回功能相同
  • 重新啟動:在測試暫停時允許修改測試步驟並重新執行
  • 停止:終止除錯程式並關閉除錯伺服器

使用除錯控制檯

VS Code的除錯控制檯提供更深入的測試狀態檢視功能。當測試在斷點處暫停時,可在控制檯底部的命令列輸入Karate命令來檢視當前狀態。

// 在除錯控制檯輸入命令範例
print first

此命令將輸出當前first變數的值,方便開發者即時檢視與修改測試資料。

使用Maven執行Karate測試

Karate執行器(Runner)解析

Karate測試需要透過執行器類別來與Maven整合。主要涉及兩個範例類別:

  1. ExampleTests.java
  2. UsersRunner.java

這些執行器類別利用JUnit 5註解@Karate.Test來標記測試方法,並透過Karate.run()方法指定要執行的Feature檔案。

Maven設定詳解

Maven的pom.xml檔案中包含必要的Surefire外掛設定:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>${maven.surefire.version}</version>
    <configuration>
        <argLine>-Dfile.encoding=UTF-8</argLine>
    </configuration>
</plugin>

此設定確保Maven能夠正確執行Karate測試。

執行器類別實作分析

UsersRunner.java為例:

package examples.users;

import com.intuit.karate.junit5.Karate;

class UsersRunner {
    @Karate.Test
    Karate testUsers() {
        return Karate.run("users").relativeTo(getClass());
    }
}

此類別透過@Karate.Test註解標記測試方法,並使用Karate.run()指定要執行的Feature檔案。

內容解密:

  1. @Karate.Test註解用於標記Karate測試方法,使其能夠被Maven Surefire外掛偵測並執行。
  2. Karate.run("users")指定要執行的Feature檔案名稱。
  3. .relativeTo(getClass())表示Feature檔案位於與執行器類別相同的套件目錄下。
  4. 此設計模式允許開發者在IDE中直接執行測試,同時也支援透過Maven命令列執行測試。

技術深度解析

  1. Karate的除錯功能提供了細緻的測試控制能力,支援逐步執行、變數檢視與動態修改。
  2. Maven整合能力使得Karate能夠無縫融入現有的Java開發流程。
  3. 執行器類別的設計模式提高了測試的可維護性與可擴充套件性。

最佳實踐建議

  1. 在複雜測試場景中使用斷點除錯來定位問題。
  2. 結合除錯控制檯進行即時狀態檢視與除錯。
  3. 利用Maven整合實作自動化測試流程。

使用 Maven 執行 Karate 測試

在前面的章節中,我們已經瞭解如何使用不同的 Runner 方法來選擇要執行的測試。在本文中,我們將探討如何使用 Maven 命令列執行 Karate 測試。

透過 Maven 執行 UsersRunner

要使用 Maven 命令列執行 UsersRunner,我們可以使用 test 引數來指定要使用的 Runner。對於 UsersRunner,命令如下:

mvn test -Dtest=UsersRunner

在 Maven 中,引數是使用 -D 選項設定的。這個命令在 VS Code 的終端機視窗和作業系統命令提示字元中都可以使用。

程式碼解析:

mvn test -Dtest=UsersRunner

內容解密:

  1. mvn test:執行 Maven 的 test 生命週期階段。
  2. -Dtest=UsersRunner:指定要使用的測試 Runner 類別。

瞭解 ExampleTest.java

在範例專案的 examples 包中,我們可以找到 ExampleTest.java 類別。讓我們來看看它的不同部分:

package examples;

import com.intuit.karate.Results;
import com.intuit.karate.Runner;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;

class ExamplesTest {
    @Test
    void testParallel() {
        Results results = Runner.path("classpath:examples")
                // .outputCucumberJson(true)
                .parallel(5);
        assertEquals(0, results.getFailCount(), results.getErrorMessages());
    }
}

程式碼解析:

Results results = Runner.path("classpath:examples")
        .parallel(5);
assertEquals(0, results.getFailCount(), results.getErrorMessages());

內容解密:

  1. Runner.path("classpath:examples"):指定要執行的測試路徑。
  2. .parallel(5):設定平行執行的執行緒數量。
  3. assertEquals(0, results.getFailCount(), results.getErrorMessages()):驗證測試結果,確保沒有失敗的測試。

透過 Maven 執行 ExampleTest Runner

我們可以使用以下命令透過 Maven 執行 ExampleTest Runner:

mvn test -Dtest=ExamplesTest

這個命令會執行 ExampleTest 類別中的 testParallel() 方法,並輸出測試結果。

在 IDE 中執行 ExampleTest Runner

我們也可以在 IDE 中直接執行 ExampleTest Runner。只需點選旁邊的綠色執行按鈕即可。

使用 Maven Karate Runner 執行特定場景

如果 Karate Cli: Override Karate Runner 設定仍然啟用,我們需要停用它。然後,我們可以透過 Karate: Run in CodeLens 執行特定場景,並指定要使用的 Karate Runner。

Karate 測試執行流程

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 使用 Maven Karate Runner 執行特定場景

rectangle "mvn test -Dtest=UsersRunner" as node1
rectangle "mvn test -Dtest=ExamplesTest" as node2
rectangle "平行執行測試" as node3

node1 --> node2
node2 --> node3

@enduml

此圖示展示了使用 Maven 命令列執行 Karate 測試的流程。

針對不同環境執行測試

現在我們已經瞭解了一些不同的測試執行方法,接下來讓我們看看如何在不同環境下執行測試。

不同環境下的測試執行

許多公司在軟體交付生命週期中使用不同的環境。首先是開發人員在其本地機器上開發應用程式的環境。接著通常是預生產環境(staging),理想情況下,該環境應盡可能接近生產環境。在預生產環境和生產環境之間,可能還存在其他階段,例如用於使用者驗收測試(UAT)的環境。

問題在於每個環境都有不同的基礎URL,有時甚至是不同的端點,乃至於完全不同的存取方法和組態。

使用自定義屬性

圖 4.25 – 環境演示專案設定

在功能檔案中使用自定義屬性

此功能檔案演示瞭如何使用自定義的 baseUrl 屬性,該屬性並未在場景本身中設定。相反,它將根據傳遞的環境字串從 karate-config.js 中取得。為了演示這個概念,它只是列印出 baseUrl 的當前值:

Feature: 功能 1
Scenario: 選擇環境
* print "基礎 URL", baseUrl

內容解密:

  • 此範例展示瞭如何在不直接在測試場景中設定的情況下,使用來自 karate-config.js 的自定義屬性 baseUrl
  • baseUrl 的值取決於所選的環境,這些環境在 karate-config.js 中定義。

使用 Karate 的環境屬性

Karate 有一個特殊的屬性叫做 karate.env,用於選擇環境。可以在執行器(runner)中設定此屬性,以便為不同的環境使用不同的執行器方法,也可以在測試執行時將其作為系統屬性傳遞。

執行器方法可能如下所示(這是從 environments 範例專案中的 Runner.java 類別中擷取的):

@Karate.Test
Karate dev() {
    // 使用 dev 環境執行場景
    return Karate.run("env-demo").karateEnv("dev").relativeTo(getClass());
}

@Karate.Test
Karate prod() {
    // 使用 prod 環境執行場景
    return Karate.run("env-demo").karateEnv("prod").relativeTo(getClass());
}

您也可以在純 JUnit 執行器中執行相同的操作:

@Test
void testProd() {
    Results results = Runner.path("classpath:tests").karateEnv("prod").parallel(1);
    assertEquals(0, results.getFailCount(), results.getErrorMessages());
}

要透過 Maven 執行這些方法中的任意一個,可以指定執行器類別和方法名稱,在 # 字元之後:

mvn test -Dtest=Runner#dev

mvn test -Dtest=Runner#prod

如果未在執行器方法中使用 .karateEnv() 選項,也可以透過 karate.env 屬性傳遞:

mvn test -Dtest=Runner#runnerMethod -D"karate.env"=prod

請注意,karate.env 必須用引號包圍,否則 Maven 可能難以接受包含點的屬性。

設定 karate-config.js

可選的組態檔案 karate-config.js 位於 src/test/java 目錄中。它可以包含集中管理的變數和功能,供所有測試場景使用。每當您需要一個集中管理的真理來源來儲存所有測試所需的變數時,這是一種非常方便的解決方案。

karate-config.js 組態範例

function fn() {
    var env = karate.env;
    karate.log('karate.env 系統屬性為:', env);
    if (!env) env = 'dev';
    var config = { env: env };
    if (env == 'dev') {
        config.baseUrl = "devBaseUrl";
    } else if (env == 'prod') {
        config.baseUrl = "prodBaseUrl";
    }
    return config;
}

內容解密:

  1. 建立一個 env 變數並將其設定為特殊的 karate.env 屬性。
  2. 如果未傳遞 karate.env,則將其預設為 dev
  3. 建立一個 config 物件並新增一個 env 屬性,其值為 env 變數的值,以便稍後存取。
  4. 根據 env 的值,將正確的 baseUrl 新增至 config 物件。
  5. 最後,傳回 config 物件。此時,此物件中包含的所有屬性都將自動對所有測試場景可用。

執行 mvn test -D"karate.env"=prod 將輸出:

22:29:27.236 [main] INFO com.intuit.karate.Runner - 使用系統屬性 'karate.env': prod
...
22:29:29.497 [main] INFO com.intuit.karate - karate.env 系統屬性為: prod
22:29:29.563 [main] INFO com.intuit.karate - [print] 基礎 URL prodBaseUrl

如果使用 -D"karate.env"=dev 執行,則正確看到:

22:29:27.236 [main] INFO com.intuit.karate.Runner - 使用系統屬性 'karate.env': dev
...
22:29:29.497 [main] INFO com.intuit.karate - karate.env 系統屬性為: dev
22:29:29.563 [main] INFO com.intuit.karate - [print] 基礎 URL devBaseUrl

既然我們已經瞭解瞭如何在不同環境下執行測試,接下來讓我們學習如何執行選定的測試,以簡化我們的測試套件並根據專案需求進行調整。

執行特定測試

在軟體開發生命週期中,很少有情況下需要在 Karate 專案中執行所有現有的測試;例如,在佈署至生產環境之前的最後一個環境中進行完整的迴歸測試。大多數情況下,只需執行適合當前使用案例的較小測試集就足夠了。