返回文章列表

Karate Gatling 效能測試環境設定與分析

本文介紹如何使用 Karate Gatling 設定效能測試環境,包含 Maven Profile 設定、Gatling 模擬類別撰寫、執行測試與結果分析,並探討速率限制、流量控制等議題,以及 Gatling 報告解讀與效能調校策略。

Web 開發 測試

Karate 和 Gatling 的整合,讓開發者能以簡潔的方式進行 API 效能測試。透過在 Maven 中設定不同的 Profile,區分開發與測試環境,並藉由 Scala 編寫 Gatling 模擬類別,定義測試場景、使用者注入策略等引數,便能有效模擬真實世界的流量負載。測試執行後,Gatling 產出的報告提供詳盡的效能指標,例如回應時間、請求成功率等,輔助開發者找出效能瓶頸並進行調校。此外,理解 API 的速率限制和流量控制機制,對於設計穩健的效能測試案例至關重要,避免測試過程中觸發限制而影響結果準確性。

設定 Karate Gatling 效能測試環境

在進行效能測試之前,我們需要在 Maven 環境中設定 Karate Gatling。首先,我們需要在 pom.xml 檔案中定義兩個 Profile:defaultperformance

設定預設 Profile

<profiles>
    <profile>
        <id>default</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <build>
            <plugins>
                <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>
            </plugins>
        </build>
    </profile>
</profiles>

內容解密:

  1. <id>default</id>:定義 Profile 的 ID 為 default
  2. <activation>:設定該 Profile 在沒有其他 Profile 被啟用時自動啟用。
  3. <build>:定義建置設定,包含使用 maven-surefire-plugin 執行測試。

新增效能測試 Profile

<profile>
    <id>performance</id>
    <dependencies>
        <dependency>
            <groupId>com.intuit.karate</groupId>
            <artifactId>karate-gatling</artifactId>
            <version>${karate.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>net.alchim31.maven</groupId>
                <artifactId>scala-maven-plugin</artifactId>
                <version>4.8.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>testCompile</goal>
                        </goals>
                        <configuration>
                            <excludes>
                                <exclude>java</exclude>
                                <exclude>**/*.java</exclude>
                            </excludes>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>io.gatling</groupId>
                <artifactId>gatling-maven-plugin</artifactId>
                <version>4.3.0</version>
                <executions>
                    <execution>
                        <phase>test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</profile>

內容解密:

  1. <id>performance</id>:定義 Profile 的 ID 為 performance
  2. karate-gatling 依賴:加入 Karate Gatling 的依賴,讓 Karate 可以與 Gatling 整合。
  3. scala-maven-plugin:用於編譯 Scala 程式碼,這裡用於編譯 Gatling 的模擬類別。
  4. gatling-maven-plugin:讓 Gatling 測試可以在 Maven 的測試階段執行。

建立 Gatling 模擬類別

接下來,我們需要建立一個 Scala 檔案 MySimulation.scala,定義 Gatling 的模擬測試。

package examples.performance

import com.intuit.karate.gatling.PreDef._
import io.gatling.core.Predef._
import scala.concurrent.duration._

class MySimulation extends Simulation {
    val protocol = karateProtocol()
    protocol.nameResolver = (req, ctx) => req.getHeader("karate-name")
    protocol.runner.karateEnv("perf")

    val myScenario = scenario("My great Scenario")
        .exec(karateFeature("classpath:examples/performance/performance.feature"))

    setUp(
        myScenario.inject(rampUsers(10).during(10))
    ).protocols(protocol)
}

內容解密:

  1. karateProtocol():定義 Karate 的效能測試協定,讓 Gatling 可以執行 Karate 的測試案例。
  2. nameResolver:設定請求名稱的解析方式,從請求的 karate-name 標頭中取值。
  3. karateEnv("perf"):設定 Karate 的執行環境為 perf
  4. myScenario:定義一個 Gatling 的場景,執行指定的 Karate Feature 檔案。
  5. setUp:設定模擬測試的引數,這裡模擬在 10 秒內逐漸增加到 10 個使用者。

使用 Karate Gatling 進行效能測試

效能測試是確保 API 或系統在高負載下仍能保持穩定性和回應速度的重要步驟。Karate Gatling 結合了 Karate 的測試能力和 Gatling 的效能測試功能,提供了一個強大的工具來進行效能測試。

設定 Gatling

首先,我們需要在 Maven 專案中新增 Gatling 的依賴和設定。我們需要在 pom.xml 中加入 Gatling 的依賴和設定檔路徑。

<dependency>
    <groupId>io.gatling</groupId>
    <artifactId>gatling-maven-plugin</artifactId>
    <version>3.7.6</version>
</dependency>

設定檔內容解密:

  • groupIdartifactId 指定了 Gatling Maven 外掛的座標。
  • version 指定了使用的 Gatling 版本。

建立模擬類別

接下來,我們需要建立一個模擬類別(Simulation Class),這個類別將定義我們的效能測試場景。

class MySimulation extends Simulation {
  val protocol = karateProtocol(
    "/api/endpoint" -> Nil
  )
  val myScenario = scenario("My Scenario").exec(karateFeature("classpath:examples/performance/performance.feature"))
  
  setUp(
    myScenario.inject(rampUsers(10).during(10))
  ).protocols(protocol)
}

內容解密:

  • karateProtocol 定義了 Karate 的協定,這裡指定了要測試的 API 端點。
  • scenario 定義了一個場景,這裡使用 karateFeature 方法來執行 Karate 的測試指令碼。
  • setUp 方法設定了模擬的使用者數量和持續時間。rampUsers(10).during(10) 表示在 10 秒內逐漸增加到 10 個使用者。

更多 Gatling 選項

除了 rampUsers 方法外,Gatling 還提供了其他選項來建立虛擬使用者,例如 constantUsersPerSec,它可以在每秒內保持固定的使用者數量。

更多資訊可以參考 Gatling 的官方檔案:https://gatling.io/docs/gatling/reference/current/core/injection/#open-mode。

執行模擬

設定完成後,我們可以透過以下命令執行效能測試:

mvn clean test -Pperformance

內容解密:

  • -Pperformance 激活了我們在 Maven 中設定的效能測試 profile。

檢視測試結果

測試執行完成後,我們可以在日誌中看到統計資訊,例如請求數量、成功和失敗的請求數量、最小、最大和平均回應時間等。

---
- Global Information 
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
> request count 10 (OK=10 KO=0 )
> min response time 77 (OK=77 KO=- )
> max response time 94 (OK=94 KO=- )
> mean response time 81 (OK=81 KO=- )

內容解密:

  • request count 表示總共發出的請求數量。
  • OKKO 分別表示成功和失敗的請求數量。
  • min response timemax response timemean response time 分別表示最小、最大和平均回應時間。

使用標籤

我們可以使用標籤來篩選要執行的 Karate 場景。例如:

.exec(karateFeature("classpath:examples/performance/performance.feature@perf"))

內容解密:

  • @perf 是標籤名稱,只有被標記為 @perf 的場景才會被執行。

測試不同的模擬

為了準確地測出 API 在什麼情況下會開始表現異常,我們需要測試不同的模擬。例如,將使用者數量增加到 1000:

setUp(
  myScenario.inject(rampUsers(1000).during(10))
).protocols(protocol)

內容解密:

  • 這裡將使用者數量增加到 1000,並在 10 秒內逐漸增加。

執行時考量

需要注意的是,這種模擬可能會執行得比預期長,因為它取決於系統資源。如果系統無法在指定時間內產生足夠的使用者,執行時間就會增加。

效能測試中的Karate Gatling應用與深入分析

效能測試是確保API或應用程式在高負載下仍能保持穩定性和回應速度的關鍵步驟。Karate Gatling結合了Karate的API測試能力和Gatling的效能測試功能,為開發者提供了一個強大的工具來進行全面的效能測試。

使用Karate進行效能測試的優勢

Karate不僅支援API測試,也能與Gatling整合進行效能測試。這使得開發者能夠使用相同的測試指令碼進行功能測試和效能測試,大大提高了測試效率。

例項分析:Jikan API的效能測試

在對Jikan API進行效能測試時,我們使用了1000個使用者在10秒內進行請求。測試結果顯示,有952個請求失敗,錯誤率為100%。錯誤訊息指出狀態碼為429,表明API請求被速率限制。

程式碼範例:Jikan API效能測試指令碼
// 建立Gatling模擬測試
class JikanSimulation extends Simulation {
  val protocol = karateProtocol(
    "/v4/anime/{id}" -> Nil,
  )
  val myScenario = scenario("Get Anime").exec(karateFeature("classpath:performance/jikan.feature"))

  setUp(
    myScenario.inject(rampUsers(1000).during(10))
  ).protocols(protocol)
}

內容解密:

  1. class JikanSimulation extends Simulation:定義了一個名為JikanSimulation的Gatling模擬測試類別,繼承自Simulation
  2. val protocol = karateProtocol:設定Karate協定,指定API路徑。
  3. val myScenario = scenario("Get Anime"):建立一個名為"Get Anime"的場景,執行jikan.feature中的Karate測試。
  4. setUp:組態模擬測試的設定,包括使用者注入策略和使用的協定。

速率限制與流量控制

速率限制和流量控制是保護API免受過載的重要技術。速率限制設定了在特定時間內允許的最大請求數量,而流量控制則限制了請求的速度。

圖表說明:Jikan API速率限制資訊

此圖示展示了Jikan API的速率限制資訊,包括每分鐘60次請求和每秒3次請求的限制。

Gatling斷言

Gatling斷言允許在模擬測試中加入額外的效能相關斷言,例如最大回應時間和小於特定值的失敗請求數量。

程式碼範例:Gatling斷言

setUp(
  myScenario.inject(rampUsers(10).during(10))
).protocols(protocol)
.assertions(
  forAll.responseTime.max.lt(100),
  forAll.failedRequests.count.is(0)
)

內容解密:

  1. setUp:組態模擬測試的基本設定。
  2. .assertions:加入斷言區塊。
  3. forAll.responseTime.max.lt(100):斷言所有請求的最大回應時間小於100毫秒。
  4. forAll.failedRequests.count.is(0):斷言失敗請求的數量為0。

Gatling報表分析

Gatling生成詳細的報表,提供豐富的效能測試結果資訊,包括回應時間分佈、成功與失敗請求比例等。

圖表說明:Gatling報表全域模擬資料

此圖示展示了Gatling報表中的全域模擬資料,包括回應時間分佈和成功與失敗請求的比例。

效能測試與 Karate Gatling 的結合應用

深入理解 Gatling 報告

在效能測試的世界中,Gatling 提供的報告是評估系統效能的重要工具。圖 10.13 展示了 Gatling 報告中的一個關鍵圖表——回應時間百分位數隨時間的變化。

圖表解讀

這個圖表展示了在整個測試過程中,成功回應時間的百分比分佈情況。透過這個圖表,我們可以觀察到在特定的時間框架內,隨著使用者數量的增加,回應時間是否會變長。這有助於我們識別在長時間執行和高負載條件下可能逐漸出現的問題。

Karate 與 Gatling 的結合優勢

Karate 和 Gatling 的結合為我們提供了全面的測試解決方案。Karate 主要用於測試 API 的功能,而 Gatling 則專注於非功能性測試,如回應時間、彈性和資料傳輸等。這種結合不僅能幫助我們評估應用程式的效能,還能找出需要進行效能調整的系統部分。

軟體測試的重要性

軟體測試是一個持續演進的領域,隨著新技術的不斷湧現,其重要性只會越來越高。我們應該保持好奇心,不斷學習,並努力改進我們的測試實踐。

程式碼實踐與深度解析

使用 Karate 進行效能測試

// 建立一個簡單的 Karate 測試範例
Feature: 效能測試範例

  Background:
    * url 'https://example.com/api'

  Scenario: 取得使用者資料
    Given path 'users'
    When method get
    Then status 200

程式碼解密:

  1. Feature 定義:這裡定義了一個名為「效能測試範例」的測試特性。
  2. Background:設定了測試的基礎 URL。
  3. Scenario:定義了一個取得使用者資料的測試場景。
  4. Given, When, Then:使用 Karate 的 Gherkin 語法定義了測試步驟,分別對應於準備、執行和驗證。

結合 Gatling 進行負載測試

// 建立一個 Gatling 模擬範例
class KarateSimulation extends Simulation {
  val protocol = karateProtocol(
    baseUrl = "https://example.com/api"
  )

  val getUsers = scenario("取得使用者資料")
    .exec(karateFeature("classpath:features/users.feature"))

  setUp(
    getUsers.inject(rampUsers(10) over (10 seconds))
  ).protocols(protocol)
}

程式碼解密:

  1. Simulation 定義:這裡定義了一個名為 KarateSimulation 的 Gatling 模擬類別。
  2. karateProtocol:設定了 Karate 的協定,包括基礎 URL。
  3. scenario:定義了一個名為「取得使用者資料」的場景,執行了一個 Karate 特性檔。
  4. setUp:設定了模擬的執行引數,包括使用者注入策略和使用的協定。

Karate 測試框架

Karate 的核心特性

Karate 是一個強大的測試框架,支援 API 測試、效能測試和模擬測試。它提供了豐富的功能,包括自動生成測試報告、平行測試執行和對多種資料格式的原生支援。

設定 Karate 專案

要開始使用 Karate,首先需要設定開發環境。以下是基本步驟:

  1. 安裝 Java Development Kit (JDK) 並設定 JAVA_HOME 環境變數。
  2. 下載並安裝 Maven 或其他相容的建置工具。
  3. 使用 Maven archetype 建立新的 Karate 專案。
  4. 設定 IDE(例如 IntelliJ IDEA 或 Visual Studio Code)以支援 Karate。

設定 JAVA_HOME 環境變數

在不同作業系統上設定 JAVA_HOME 的方法如下:

  • Windows:右鍵點選「此電腦」 > 「內容」 > 「進階系統設定」 > 「環境變數」,新增 JAVA_HOME 變數並指向 JDK 安裝目錄。
  • macOS:編輯 ~/.bash_profile~/.zshrc 檔案,新增 export JAVA_HOME=$(/usr/libexec/java_home)
  • Linux:編輯 ~/.bashrc~/.profile 檔案,新增 export JAVA_HOME=/path/to/jdk

編寫 Karate 測試

Karate 使用簡單的 Gherkin 語法編寫測試案例。以下是一個基本的範例:

Feature: 使用者登入功能

  Scenario: 成功登入
    Given url 'https://example.com/login'
    And request { username: 'user', password: 'pass' }
    When method post
    Then status 200
    And match response contains { token: '#notnull' }

使用 Karate 的進階功能

Karate 提供了許多進階功能,例如:

  • 資料驅動測試:使用資料表格或外部檔案驅動測試案例。
  • 模擬測試:使用 Karate 的模擬伺服器模擬 API 回應。
  • 效能測試:與 Gatling 整合進行效能測試。

使用 JSON 和 XML 資料

Karate 支援 JSON 和 XML 資料格式,可以輕鬆地在測試中使用這些資料。

Scenario: 使用 JSON 資料
  Given def user = { name: 'John', age: 30 }
  When request user
  Then status 201

執行 Karate 測試

Karate 測試可以透過 IDE、Maven 或命令列執行。以下是使用 Maven 執行測試的範例:

mvn test

檢視測試報告

Karate 自動生成詳細的測試報告,包括每個場景的執行結果和詳細的請求/回應資訊。

Karate 測試框架索引

Karate 測試框架的全面索引

Karate 測試框架是一個強大的工具,用於進行 API 測試、自動化測試和效能測試。本提供了 Karate 相關內容的詳細索引,涵蓋了從基本設定到進階功能的各個方面。

核心功能與設定

  • Karate 專案設定:使用 Maven 或 Maven archetype 建立新的 Karate 專案。

    • Maven 的安裝和組態,包括在不同作業系統上的 PATH 變數設定。
    • 使用 Maven archetype 快速建立 Karate 專案。
  • 基本概念

    • 特徵檔案(Feature Files)的建立和編寫。
    • 場景(Scenarios)的定義和執行。
    • 使用 Postman 請求建立測試場景。

定位器(Locators)與 UI 測試

  • 定位器(Locators):使用 CSS、XPath 和友好的定位器來定位網頁元素。

    • 萬用字元定位器的使用。
    • 使用包含文字內容、元素位置或精確文字內容的定位器。
  • UI 測試

    • 除錯 UI 測試,使用偵錯程式和 karate.stop 方法。
    • 網頁元素斷言和網頁元素列表斷言。

資料驅動測試與環境特定測試

  • 資料驅動測試:使用資料驅動方法最佳化測試。
  • 環境特定測試:使用標籤(Tags)執行特定環境的場景。

日誌記錄與報告

  • 日誌記錄:組態 Logback,包括日誌級別的設定和 Logback 組態的檢查。
  • 報告生成:使用 Cluecumber 和 Surefire 生成報告。

Mock API 與伺服器

  • Mock API:使用 Karate 作為 Mock 伺服器,建立虛擬 API。
  • 獨立 Mock 伺服器:使用獨立的 Mock 伺服器進行測試。

資料函式庫連線與系統屬性

  • 資料函式庫連線:在測試中連線資料函式庫,使用系統屬性傳遞資料函式庫憑證。

Docker 與持續整合

  • Docker:在 Docker 中執行 Karate 測試,傳遞引數和組態環境變數。

多語言支援與擴充套件

  • 多語言支援:Karate 支援多種資料格式,包括 JSON、XML 和 CSV。
  • 擴充套件功能:使用 JavaScript 檔案定義多個函式,擴充套件 Karate 功能。

相關推薦書籍與資源

API 測試與開發實戰:Postman 深度解析

作者:Dave Westerveld
ISBN:9781800569201

這本文將帶你深入瞭解 API 測試的核心概念與實務操作: • 發掘有效 API 測試的關鍵要素 • 使用 Postman 的資料驅動測試,建立可擴充套件的 API 測試 • 瞭解良好 API 設計的標準與最佳實踐 • 熟悉 API 術語,掌握不同型別的 API 及其應用場景 • 進行全面的功能性與非功能性 API 測試 • 學習如何在 Postman 中使用 OpenAPI 和模擬(mocking)等業界標準技術

Python API 開發基礎

作者:Jack Chan, Ray Chung, Jack Huang
ISBN:9781838983994

本文提供 Python API 開發的完整基礎知識: • 理解 RESTful API 的基本概念與架構設計 • 使用 Flask 和 Flask-Restful 擴充套件構建高效的 RESTful API • 透過 Flask-SQLAlchemy 和 Flask-Migrate 管理資料函式庫操作 • 利用 Mailgun API 傳送純文字和 HTML 格式的電子郵件 • 實作分頁功能以提升 API 的效能與使用者經驗 • 使用快取技術最佳化 API 效能並取得最新資訊 • 將應用佈署至 Heroku 並使用 Postman 進行測試

分享你的讀後心得

完成《使用 Karate 編寫 API 測試》這本文後,我們非常期待聽到你的想法!如果你從 Amazon 購買了這本文,請點選此處直接前往 Amazon 評論頁面,分享你的反饋或在你購買的網站上留下評論。

你的評論對我們和技術社群都至關重要,它將幫助我們持續提供優質內容。

取得免費 PDF 版本

感謝你購買這本文!

你可以隨時隨地在任何裝置上閱讀,自由地搜尋、複製和貼上程式碼到你的應用程式中。

福利還不止於此,你還可以獲得獨家折扣、訂閱我們的電子報,並在每日收件箱中享受優質免費內容。

按照以下簡單步驟,即可獲得這些福利: 2. 提交你的購買證明 3. 完成!我們將直接把免費 PDF 和其他福利傳送到你的電子信箱。