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整合。主要涉及兩個範例類別:
ExampleTests.javaUsersRunner.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檔案。
內容解密:
@Karate.Test註解用於標記Karate測試方法,使其能夠被Maven Surefire外掛偵測並執行。Karate.run("users")指定要執行的Feature檔案名稱。.relativeTo(getClass())表示Feature檔案位於與執行器類別相同的套件目錄下。- 此設計模式允許開發者在IDE中直接執行測試,同時也支援透過Maven命令列執行測試。
技術深度解析
- Karate的除錯功能提供了細緻的測試控制能力,支援逐步執行、變數檢視與動態修改。
- Maven整合能力使得Karate能夠無縫融入現有的Java開發流程。
- 執行器類別的設計模式提高了測試的可維護性與可擴充套件性。
最佳實踐建議
- 在複雜測試場景中使用斷點除錯來定位問題。
- 結合除錯控制檯進行即時狀態檢視與除錯。
- 利用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
內容解密:
mvn test:執行 Maven 的test生命週期階段。-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());
內容解密:
Runner.path("classpath:examples"):指定要執行的測試路徑。.parallel(5):設定平行執行的執行緒數量。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;
}
內容解密:
- 建立一個
env變數並將其設定為特殊的karate.env屬性。 - 如果未傳遞
karate.env,則將其預設為dev。 - 建立一個
config物件並新增一個env屬性,其值為env變數的值,以便稍後存取。 - 根據
env的值,將正確的baseUrl新增至config物件。 - 最後,傳回
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 專案中執行所有現有的測試;例如,在佈署至生產環境之前的最後一個環境中進行完整的迴歸測試。大多數情況下,只需執行適合當前使用案例的較小測試集就足夠了。