返回文章列表

KarateUI測試除錯與效能調校

本文探討 Karate 框架在 UI 測試方面的除錯技巧與效能調校策略。涵蓋截圖、元素高亮、PDF 匯出、偵錯器使用、HTTP 請求重定向與模擬、Karate Gatling 效能測試設定等導向,提供開發者全面的 UI 測試解決方案。

Web 開發 測試

Karate 框架不僅適用於 API 測試,也提供強大的 UI 測試功能。在 UI 測試中,除錯和效能調校至關重要。Karate 提供了截圖、元素高亮顯示等功能,方便開發者快速定位問題。此外,PDF 匯出功能有助於儲存測試結果,方便團隊協作和問題追蹤。Karate 的偵錯器則允許開發者逐步執行測試,並在斷點處檢查變數和程式碼執行狀態,大幅提升除錯效率。對於複雜的 UI 互動場景,Karate 支援 HTTP 請求攔截和模擬,讓開發者可以精確控制測試流程,並模擬各種網路狀況。最後,Karate Gatling 整合提供強大的效能測試能力,協助開發者評估應用程式在高負載下的表現,並找出效能瓶頸。

除錯 UI 測試

在第4章《執行 Karate 測試》中,我們已經看到了 Karate 結合 VS Code 的強大除錯功能。現在,我們將探討如何在瀏覽器測試中使用相同的技術。請注意,這些技術和方法適用於所有支援的瀏覽器。如果您想了解更多與目標瀏覽器和驅動程式相關的選項,例如使用 Karate Docker 映像進行視訊錄製,請參閱官方檔案的相關章節:https://github.com/karatelabs/karate/tree/master/karate-core#configure-drivertarget。

截圖功能

Karate 會在測試失敗時自動截圖。該截圖會自動附加到測試報告中,可以透過點選測試失敗的步驟來檢視。這使得除錯失敗原因變得更加容易。

圖示:測試報告中的失敗測試截圖

除了預設功能外,我們還可以在任何時候新增截圖。這可以成為幫助跟蹤測試過程的好工具。

要擷取當前頁面狀態的截圖,只需新增以下步驟:

* screenshot()

該截圖將在測試報告的精確位置附加。

元素截圖

Karate UI 支援對特定網頁元素進行截圖。這樣可以減少截圖大小,並在關注特定元素時去除幹擾。程式碼如下:

* screenshot('locator')

在這裡,locator 需要替換為網頁元素的定位器。

高亮元素

為了在視覺上確認元素,您可以高亮單個元素或一組相似元素。這些元素在測試執行期間會被清楚地標記出來,具有邊框和背景顏色。

highlight 功能會標記第一個匹配定位器的元素,而 highlightAll 功能則對所有找到的元素執行相同操作。

圖示:測試執行期間高亮的元素

例如,以下步驟用於高亮所有具有 search-item 類別的元素,這是我網站上每個搜尋結果共有的類別:

* highlightAll('.search-item')

預設高亮持續時間為 3 秒。您可以透過 Karate 的 configure 關鍵字或在 karate-config.js 中使用 karate.configure 函式來組態此設定。

匯出 PDF

有時,將網站的當前狀態儲存為 PDF 檔案會非常方便。例如,這在將其新增到錯誤報告中以向開發人員提供視覺線索時很有用。

只需呼叫以下步驟即可實作此功能:

* def resultAsPdf = pdf({})
* karate.write(resultAsPdf, "search.pdf")

在這裡,我們使用 pdf 函式傳回完整的位元組碼,然後將其傳遞給 karate.write 方法以寫入檔案。它需要一個 JSON 物件作為組態引數(您可以傳遞 {'orientation': 'landscape'} 以強制其進入橫向模式)。在本例中,我使用了一個空物件 {} 以使用預設組態。

圖示:產生的完整頁面 PDF

該 PDF 將保留網站連結,因此您可以直接點選這些連結跳轉到實際網站。

產生的 PDF 檔案會自動儲存在測試專案目標目錄下的指定名稱中。

使用偵錯器

我們在第4章《執行 Karate 測試》中使用了 Karate 偵錯器進行 API 測試。如前所述,使用偵錯器的先決條件是在 VS Code 的 launch.json 檔案中新增偵錯組態。

最快的方法是點選 VS Code CodeLens 中的 Karate: Debug,它出現在測試場景上方。這將開啟一個對話方塊,您可以在其中選擇 Karate (debug),然後自動進入 launch.json 檔案。

圖示:啟動 Karate (debug)

點選 Add Configuration… 按鈕,您將開啟一個組態列表。選擇 Karate (debug): Maven 並儲存檔案。

下次您按下 CodeLens 中的 Karate: Debug 連結時,它應該啟動偵錯伺服器並將 VS Code 置於偵錯模式。

現在,您可以像使用 API 測試一樣,使用偵錯器來除錯瀏覽器測試。您可以參考第4章,瞭解如何一步一步執行測試、在測試之間跳轉,甚至動態更改測試程式碼。

圖示:偵錯主控台命令列用法

當開啟偵錯主控台並在斷點處暫停測試執行時,您可以執行所有可以在 Karate 測試中使用的命令。這使您可以嘗試定位器以查詢元素或直接與它們互動,從而大大加快測試開發的速度。

例如,我在偵錯主控台底部的命令列中輸入了 highlightAll('a'),以框選網站的所有連結元素。

圖示:偵錯主控台中 highlightAll('a') 命令的結果

按下 Enter 鍵將立即執行此命令並執行請求的操作!在 Karate UI 中進行偵錯的好處是,您可以在開啟的瀏覽器中立即以視覺方式確認這些操作。

使用 Karate 進行 HTTP 請求重定向

在進行網頁測試時,Karate 提供了一種強大的方法來攔截和重定向 HTTP 請求。這使得測試變得更加靈活和可控。

除錯測試:使用 karate.stop

karate.stop 方法是一種特殊的除錯方式,它允許你在測試執行過程中暫停並接管瀏覽器,以檢查元素或確認快速執行的動作是否正確。

* karate.stop(1234)

在測試執行過程中,當遇到 karate.stop 時,執行會暫停,並在控制檯日誌中顯示一個類別似以下的訊息:

*** waiting for socket, type the command below:
curl http://localhost:1234

你可以透過在新的終端視窗中執行 curl 命令或開啟 URL 來繼續測試執行。

重定向 HTTP 請求

在某些情況下,你可能需要將瀏覽器的 HTTP 請求重定向到特定的端點或模擬資料。Karate 的模擬功能可以幫助你實作這一點。

調查 API 請求

首先,你需要調查網頁與哪些端點進行通訊以檢索資料。可以使用 Chrome DevTools 的 Network 標籤來檢查網頁的外部資料來源請求。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title KarateUI測試除錯與效能調校

package "網路架構" {
    package "應用層" {
        component [HTTP/HTTPS] as http
        component [WebSocket] as ws
        component [gRPC] as grpc
    }

    package "傳輸層" {
        component [TCP] as tcp
        component [UDP] as udp
        component [TLS/SSL] as tls
    }

    package "網路層" {
        component [IP] as ip
        component [ICMP] as icmp
        component [路由協議] as routing
    }

    package "鏈路層" {
        component [Ethernet] as eth
        component [WiFi] as wifi
        component [ARP] as arp
    }
}

http --> tcp
ws --> tcp
grpc --> tcp
tcp --> tls : 加密
tls --> ip
udp --> ip
ip --> routing
routing --> eth
routing --> wifi
eth --> arp

@enduml

新增模擬回應

一旦你找到了相關的 API 請求,你就可以建立一個模擬回應來替換真實的 API 呼叫。

首先,複製真實的 JSON 回應資料,然後根據需要進行修改。

{
  "Items": [
    {
      "cat": "phone",
      "desc": "This is a test product",
      "id": 1,
      "img": "https://dummyimage.com/200x200?text=Karate",
      "price": 123,
      "title": "Test1"
    }
  ],
  "LastEvaluatedKey": {"id": "9"}
}

組態模擬

接下來,建立一個 Karate 特性檔案來提供模擬回應。

@ignore
Feature: Mock API

Scenario: pathMatches('/entries')
  * def response = read('products.json')

使用模擬回應

在你的測試場景中,你可以使用 karate.configure 方法來啟用模擬。

* karate.configure('mock', { uri: '/entries', feature: 'mock.feature' })

這樣,當網頁發出對 /entries 的請求時,Karate 將傳回你定義的模擬回應。

內容解密:

此段落主要介紹瞭如何使用 Karate 進行 HTTP 請求重定向和模擬。首先,我們瞭解了 karate.stop 方法的使用,這是一種特殊的除錯方式,可以暫停測試執行並接管瀏覽器。接著,我們探討瞭如何調查 API 請求並新增模擬回應。最後,我們學習瞭如何組態和使用模擬回應來替換真實的 API 呼叫。這些技術可以大大提高網頁測試的效率和可靠性。

使用 Karate Gatling 進行效能測試

截至目前為止,我們已經探討了 Karate API 測試的許多不同導向,包括瀏覽器測試。在本章中,我們將探索 Karate 提供的另一種測試型別——效能測試。我們將使用一個簡單的 Karate 場景,並逐步完成將其作為效能測試執行的必要步驟。此外,我們還將檢視日誌和測試報告,以更深入地瞭解這型別的測試以及我們可以從中得出的結論。

在本章中,我們將涵蓋以下主要主題:

  • 什麼是 Gatling?
  • 設定 Karate Gatling
  • 將 Karate 測試作為效能測試執行
  • 檢視 Gatling 報告

技術需求

您需要以下內容:

  • 在第 2 章《設定您的 Karate 專案》中完成的系統和 IDE 設定

建立測試場景

在本章的測試場景中,我們將保持簡單。我們將使用所謂的 Jikan API(https://jikan.moe),它提供了有關動漫和漫畫電影、系列和書籍的資訊。由於此示範應顯示有關一般 API 可用性的一些統計資料,因此我們目前不會費心處理其詳細的請求和回應資料,而是專注於單個端點的回應程式碼。

這是我們將使用的測試場景:

Feature: 效能測試
Scenario: 效能
* url 'https://api.jikan.moe/v4/'
* path 'anime/1'
When method get
Then status 200

內容解密:

此測試場景進行了一個 GET 請求到 anime/1 路徑,檢查 HTTP 狀態碼是否為 200(OK)。

  1. url 'https://api.jikan.moe/v4/':設定請求的基本 URL。
  2. path 'anime/1':指定請求的路徑。
  3. When method get:傳送 GET 請求。
  4. Then status 200:斷言 HTTP 回應狀態碼為 200。

在書籍的這個階段,這個測試場景應該是不言自明的,因為它不包含任何複雜的邏輯。我們現在可以透過在終端機中呼叫 mvn clean test 來執行它,就像我們之前建立的所有其他 Karate 測試一樣。這將是我們用來探索 Karate Gatling 的基本測試。

什麼是 Gatling?

負載測試和效能測試是兩種型別的軟體測試,幫助開發人員評估其應用程式在不同工作負載下的效能。負載測試是模擬使用者流量對應用程式進行測試,以檢查其處理大量請求的能力。這種測試有助於確定應用程式的最大容量,並判斷它是否能夠在預期工作負載下正常執行而不會當機或變慢。

另一方面,效能測試是測量應用程式在不同條件下的速度、可擴充套件性和穩定性的過程。這種測試有助於識別應用程式中的效能瓶頸,並對其進行最佳化,以獲得更好的回應和還原能力。

在 API 的上下文中,負載測試和效能測試用於評估 API 處理大量請求並在預期時間範圍內回應的能力。這些測試幫助開發人員識別潛在的問題,例如回應時間緩慢、錯誤、意外行為,甚至可能對使用者經驗產生負面影響的完全當機。

軟體開發中有多種工具可用於此目的。例如有 Apache JMeter(https://jmeter.apache.org)、Locust(https://locust.io)或 Siege(https://www.joedog.org/siege-home)。本章將重點介紹另一種與 Karate 結合使用的常見工具——Gatling。

Gatling 是一個強大的開源負載和效能測試工具,專為現代 Web 應用程式設計。它允許開發人員和測試人員模擬大量使用者對應用程式發起請求,從而評估其在不同負載下的表現。Gatling 以其易用性、高效能和詳細的報告功能而聞名,使其成為開發人員和 QA 工程師的首選工具之一。

使用 Karate UI 進行瀏覽器測試

使用 Mock 攔截真實請求

Feature: Intercept test
Scenario: Inject custom products
* configure driver = { type: 'chrome' }
* driver 'https://www.demoblaze.com'
* driver.intercept({ patterns: [{ urlPattern: '*/entries' }], mock: 'products.feature' })
* karate.stop(5555)

內容解密:

此範例展示瞭如何使用 driver.intercept 方法攔截特定的請求,並將其轉發到一個 mock feature。

  1. configure driver = { type: 'chrome' }:設定 WebDriver 為 Chrome 瀏覽器。
  2. driver 'https://www.demoblaze.com':開啟指定的網頁。
  3. driver.intercept({ patterns: [{ urlPattern: '*/entries' }], mock: 'products.feature' }):攔截 URL 符合特定模式 (*/entries) 的請求,並將其轉發到 products.feature 中定義的 mock 端點。
  4. karate.stop(5555):暫停測試執行,保持瀏覽器開啟,以便手動驗證結果。

這個強大的功能結合了 Karate 的 mocking 功能和 API 呼叫攔截,使得在瀏覽器測試中模擬 API 回應變得非常方便。

效能測試與 Karate Gatling 整合

Gatling 簡介

Gatling(https://gatling.io)是一款開源的負載測試和效能測試工具,幫助開發者模擬和衡量應用程式的效能。它使用 Scala 程式語言,具有高效、可擴充套件和易用的特點。

Scala 語言概述

Scala 是一種多用途的程式語言,設計用於大型應用程式的高效能和可擴充套件性。它結合了函式式程式設計和物件導向程式設計,使開發者能夠撰寫簡潔、易讀且易於維護的程式碼。由於與 Java 相容並支援分散式運算,Scala 成為建立高效能應用程式的熱門選擇。

使用 Gatling 進行效能測試

Gatling 允許使用者建立複雜的負載測試場景,並在多台機器上執行,以測試應用程式或 API 在不同條件下的效能。除了安裝 Gatling 並使用其使用者介面設計測試案例外,還可以透過多執行緒模擬多個請求。

Gatling 的優勢

Gatling 提供即時的測試結果報告和分析,以圖形格式呈現,幫助識別效能瓶頸。這對於最佳化應用程式以處理更高負載至關重要。Gatling 在軟體開發行業中被廣泛用於確保 Web 應用程式的品質和可擴充套件性。

設定 Karate Gatling

本文將介紹如何設定 Karate Gatling 以進行效能測試。主要工作將在 Maven POM 檔案中完成。

在 VS Code 中設定 Scala

為了有效地撰寫 Scala 程式碼,建議使用支援 Scala 的 IDE。VS Code 提供官方的 Scala 語法外掛,能夠提供程式碼高亮顯示等功能。

建立 Maven 設定檔

Maven 設定檔允許在單一 pom.xml 檔案中組織不同的依賴和工作流程,並在執行時啟用所需的設定檔。這使得使用者能夠選擇要執行的測試以及執行方式。

重組 pom.xml 檔案

標準的 pom.xml 檔案由 Karate Maven 原型(archetype)生成,包含執行 Karate 測試所需的一切。本文將重組 <build> 區段,將 maven-surefire-plugin 區塊移到新的設定檔中。

新增預設設定檔

新增 <profiles> 區段到 pom.xml 檔案中,包含兩個設定檔定義:預設設定檔用於執行單元測試,效能設定檔用於執行 Gatling 效能測試。

<profiles>
    <profile>
        <id>default</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <!-- maven-surefire-plugin 設定 -->
    </profile>
    <!-- 效能設定檔 -->
</profiles>

詳細解說:

  1. profiles 元素:定義多個建置設定檔,可以根據不同需求啟用不同設定。
  2. profile 元素:每個設定檔的定義,包括 idactivation 等屬性。
  3. activeByDefault 元素:指定預設啟用的設定檔。
  4. maven-surefire-plugin 設定:在預設設定檔中包含此外掛,用於執行單元測試。
此圖示說明瞭本章節的主要內容流程,從 Gatling 簡介到設定 Karate Gatling 及 Maven 設定檔的建立。

後續步驟

後續章節將探討 Gatling 測試報告的解讀和分析,以及如何根據測試結果最佳化應用程式的效能。