妙!JMeter/Pytest/Ginkgo 和自建測試平臺這樣接入 Zadig

語言: CN / TW / HK

 

Zadig 作為一款先進的開源雲原生軟體交付產品,不但能提供強大的測試環境支援日常開發聯調,還支援效能、功能、介面、UI、端到端自動化測試等諸多測試場景,做到對每一行程式碼變更做充分測試驗證後再上線,嚴格保障軟體的生命線。

本文將介紹主流的測試框架 JMeter / Pytest / Ginkgo 以及企業已有的自動化測試平臺如何接入 Zadig,既能享受 Zadig 強大的環境治理能力,又能利用自動化測試最大程度的為軟體交付保駕護航。

下面的案例原始碼均在 「Zadig 程式碼庫。如需操作實踐過程,可以 fork 程式碼,或者將原始碼內容儲存到自己的程式碼倉庫中,並參考「官方文件」整合程式碼源。

Zadig on Github

Zadig on Gitee

JMeter 框架的使用

Apache JMeter 是基於 Java 開發的開源壓力測試工具,被企業廣泛採用。

組織自動化測試程式碼

  • Zadig GitHub 原始碼 位置:https://github.com/koderover/zadig/blob/main/examples/jMeter-demo/demo.jmx

  • Zadig Gitee 原始碼 位置:https://gitee.com/koderover/zadig/blob/main/examples/jMeter-demo/demo.jmx

本例將使用 JMeter 對 KodeRover 官網進行一個簡單的壓測,自動化測試程式碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.3">
  <hashTree>
    <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
      <stringProp name="TestPlan.comments"></stringProp>
      <boolProp name="TestPlan.functional_mode">false</boolProp>
      <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
      <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
        <collectionProp name="Arguments.arguments"/>
      </elementProp>
      <stringProp name="TestPlan.user_define_classpath"></stringProp>
    </TestPlan>
    <hashTree>
      <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
        <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
        <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
          <boolProp name="LoopController.continue_forever">false</boolProp>
          <stringProp name="LoopController.loops">1</stringProp>
        </elementProp>
        <stringProp name="ThreadGroup.num_threads">10</stringProp>
        <stringProp name="ThreadGroup.ramp_time">1</stringProp>
        <boolProp name="ThreadGroup.scheduler">false</boolProp>
        <stringProp name="ThreadGroup.duration"></stringProp>
        <stringProp name="ThreadGroup.delay"></stringProp>
        <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
      </ThreadGroup>
      <hashTree>
        <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
          <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
            <collectionProp name="Arguments.arguments"/>
          </elementProp>
          <stringProp name="HTTPSampler.domain">www.koderover.com</stringProp>
          <stringProp name="HTTPSampler.port"></stringProp>
          <stringProp name="HTTPSampler.protocol">https</stringProp>
          <stringProp name="HTTPSampler.contentEncoding"></stringProp>
          <stringProp name="HTTPSampler.path">/</stringProp>
          <stringProp name="HTTPSampler.method">GET</stringProp>
          <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
          <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
          <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
          <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
          <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
          <stringProp name="HTTPSampler.connect_timeout"></stringProp>
          <stringProp name="HTTPSampler.response_timeout"></stringProp>
        </HTTPSamplerProxy>
        <hashTree/>
      </hashTree>
    </hashTree>
  </hashTree>
</jmeterTestPlan>
  •  

配置 JMeter 的版本

Zadig 系統有內建的 JMeter 應用可直接使用,如果內建版本無法滿足自動化測試訴求,可參考官方文件中「軟體包管理」按需新增。本例以 JMeter5.4.3 版本示例如下。

系統管理員登入 Zadig -> 訪問系統設定 -> 整合管理 -> 軟體包管理,新增 JMeter:

引數說明:

  • 名稱: JMeter 

  • 版本: 5.4.3 

  • Bin Path $HOME/jmeter/bin 

  • 啟用: 開啟 

  • 安裝包地址: https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.4.3.tgz 

  • 安裝指令碼:

  • mkdir -p $HOME jmeter
    tar -c $HOME xzf ${FILEPATH} --strip-components=1

 

在 Zadig 中完成測試配置

進入專案的測試模組,點選  新建測試,完成測試配置。

本例配置說明如下:

  • 作業系統: ubuntu 20.04 

  • 依賴的軟體包:

    JMeter 5.4.3  jave 1.12.0.1 

  • 程式碼資訊:選擇已整合程式碼庫(自動化測試原始碼所在的程式碼庫)

  • 測試指令碼:

  • #!/bin/bash
    set -ex
    
    cd zadig/examples/jMeter-demo/
    
    # run test
    jmeter -n -t demo.jmx -l demo.jtl
    
    # generate reports
    if [ -e reports ]; then
        rm -rf reports
    fi
    jmeter -g demo.jtl -o reports

     

  • 高階配置 - 測試結果匯出:配置測試結果匯出以便在測試執行完畢後下載測試報告進行分析,本例中為  $WORKSPACE/zadig/examples/jMeter-demo/reports

 

執行自動化測試並分析結果

配置完畢後,執行自動化測試。

待自動化測試執行完畢後,點選  下載,將測試報告下載到本地。

解讀下載的測試報告,檢視本次壓力測試的結果,分析效能瓶頸。

 

Pytest 框架的使用

Pytest 是基於 Python 開源測試框架,比較常用於小型規模的測試。

組織自動化測試程式碼

根據實際測試業務和功能,編寫自動化測試程式碼並組織在程式碼倉庫中。本實踐中將使用 Pytest 進行數學運算測試,自動化測試原始碼如下:

  • Zadig GitHub 原始碼 位置:https://github.com/koderover/zadig/blob/main/examples/pytest-demo/

  • Zadig Gitee 原始碼 位置:https://gitee.com/koderover/zadig/tree/main/examples/pytest-demo/

def increase(x):
    return x + 1

def test_increase_1_to_2021_is_2022():
    assert increase(2021) == 2022

def square(x):
    return x * x

def test_the_square_of_5_is_25():
    assert square(5) == 25

def test_the_square_of_negative_5_is_negative_25():
    assert square(-5) == -25

 

配置 Python 的版本

Zadig 系統有內建的 Python 應用可直接使用,如果內建版本無法滿足自動化測試訴求,可參考 官方文件中「軟體包管理按需新增。本例以 Python 3.7.0 示例如下。

引數說明:

  • 名稱: python 

  • 版本: 3.7.0 

  • Bin Path /user/local/python/bin 

  • 啟用: 開啟 

  • 安裝包地址: https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 

  • 安裝指令碼:

  • sudo apt-get update
    sudo apt-get install -y build-essential libffi-dev python-dev python-setuptools python3-pip
    curl -fsSl ${FILEPATH} -o /tmp/Python-3.7.0.tgz
    mkdir -p /opt/python
    tar  -C  /opt/python -zxf  /tmp/Python-3.7.0.tgz
    cd /opt/python/Python-3.7.0
    ./configure --prefix=/usr/local/python && make  && make install

     

在 Zadig 中完成測試配置

進入專案的測試模組,點選  新建測試,完成測試配置。

本配置說明如下:

  • 名稱: ubuntu 20.04 

  • 依賴的軟體包: python 3.7.0 

  • 程式碼資訊:選擇已整合程式碼庫(自動化測試原始碼所在的程式碼庫)

  • 測試指令碼

  • #!/bin/bash
    set -x
    
    pip3 install pytest-html
    pip3 install pytest
    
    cd $WORKSPACE/zadig/examples/pytest-demo
    pytest --junitxml=./junit.xml --html=./report.html # 執行測試並生成 jUnit xml 測試報告和 HTML 測試報告

     

  • Junit 報告所在目錄: $WORKSPACE/zadig/examples/pytest-demo 

 

執行自動化測試並分析結果

配置完畢後,執行自動化測試。

待自動化測試執行完畢後點擊檢視測試報告,可檢視每一條用例的執行詳情。

對於失敗的用例,可以快速過濾重點分析。

 

Ginkgo 框架的使用

Ginkgo 是一個基於 Go 語言的開源 BDD 測試框架,廣泛應用在單元測試、整合測試、驗收測試、效能測試等測試場景。被 Go 語言開發社群、Kubernetes 專案廣泛應用。

組織自動化測試程式碼

  • Zadig GitHub 原始碼 位置:https://github.com/koderover/zadig/tree/main/examples/test-demo/test

  • Zadig Gitee 原始碼 位置:https://gitee.com/koderover/zadig/blob/main/examples/test-demo/test

本實踐中將對 KodeRover 官網及文件站的可用性進行自動化檢測。

package test

import (
        "net/http"
        "testing"

        . "github.com/onsi/ginkgo/v2"
        . "github.com/onsi/gomega"
)

func TestDemo(t *testing.T) {
        RegisterFailHandler(Fail)
        RunSpecs(t, "TestDemo Suite")
}

func HelloGeek(host string) (int, error) {
        req, _ := http.NewRequest("GET", host, nil)
        req.Header.Set("Content-Type", "application/json")

        client := &http.Client{}
        response, err := client.Do(req)
        if err != nil {
                return 0, err
        }
        return response.StatusCode, err
}

var _ = Describe("ZadigWebsitesLifeProbe", func() {
        It("Case1: Hello, Welcome to https://www.koderover.com", func() {
                host := "https://www.koderover.com"
                code, err := HelloGeek(host)
                Expect(err).Should(BeNil())
                Expect(code).Should(Equal(200))
        })

        It("Case2: Hello, Welcome to https://docs.koderover.com/", func() {
                host := "https://docs.koderover.com/"
                code, err := HelloGeek(host)
                Expect(err).Should(BeNil())
                Expect(code).Should(Equal(200))
        })

        It("Case3: Sorry, https://www.koderover.com.cn won't work", func() {
                host := "https://www.koderover.com.cn"
                _, err := HelloGeek(host)
                Expect(err).Should(Not(BeNil()))
        })
})

 

配置依賴的軟體包版本

Zadig 系統有內建的 Ginkgo 應用及 Go 應用可直接使用,如果內建版本無法滿足自動化測試訴求,可參考官方文件中 「軟體包管理 按需新增。本例依賴 Go 1.16 以及 Ginkgo 2.0.0,配置示例如下。

系統管理員登入 Zadig -> 訪問系統設定 -> 整合管理 -> 軟體包管理,分別新增 Ginkgo 和 Go:

Ginkgo 引數說明:

  • 名稱: ginkgo 

  • 版本: 2.0.0 

  • Bin Path $HOME/ginkgo 

  • 啟用: 開啟 

  • 安裝包地址: http://resource.koderover.com/ginkgo-v2.0.0-Linux.tar.gz

  • 安裝指令碼:

  • mkdir -p $HOME/ginkgo
    cd $HOME/ginkgo
    tar -xvf ${FILEPATH}
    chmod +x $HOME/ginkgo/ginkgo

     

Go 引數說明:

  • 名稱: Go 

  • 版本: 1.16.13 

  • Bin Path $HOME/go/bin 

  • 啟用: 開啟 

  • 安裝包地址: https://go.dev/dl/go1.16.13.linux-amd64.tar.gz 

  • 安裝指令碼: 

  • tar -C $HOME -xzf ${FILEPATH}

     

在 Zadig 中完成測試配置

進入專案的測試模組,點選  新建測試,完成測試配置。

本例配置說明如下:

  • 作業系統: ubuntu 20.04 

  • 依賴的軟體包: go 1.16.13和 ginkgo 2.0.0

  • 程式碼資訊:選擇已整合程式碼庫(自動化測試原始碼所在的程式碼庫)

  • 測試指令碼:

  • #!/bin/bash
    set -ex
    
    export GOPROXY=https://goproxy.cn,direct
    cd zadig/examples/test-demo/test
    ginkgo -v --junit-report=out.xml # 執行測試用例併產出 Junit XML 格式的測試報告
  • Junit 報告所在目錄: zadig/examples/test-demo/test 

 

執行自動化測試並分析結果

配置完畢後,執行自動化測試。

待自動化測試執行完畢後點擊檢視測試報告,可檢視每一條用例的執行詳情。對於失敗的用例,可以快速過濾重點分析。

 

已有的測試平臺接入

企業如果有自建的測試平臺、或者使用一些開源、自研的測試框架,可以通過外部系統接入 Zadig。

 

整合外部系統

系統管理員訪問系統設定 -> 整合管理 -> 其他系統整合,填寫自動化測試平臺系統的訪問地址及 API Token。

 

配置工作流 擴充套件 模組

工作流中新增擴充套件模組,和整合的自動化測試平臺系統進行對接:

  1. URL 中選擇整合的外部測試平臺,並填寫對應的自動化測試任務

  2. 根據內部測試平臺介面的實際需要配置請求 Headers

  3. 開啟回撥開關

配置完畢後,執行工作流時會自動觸發已有測試平臺中的測試任務,測試任務執行完畢後按照以下格式向 Zadig 傳送回撥請求,最終把測試結果反饋到 Zadig 工作流中。

# 請求:
POST {安裝 Zadig 後的地址}/api/callback

# 請求 Payload:
{
  "task_name": "voting-demo-workflow-dev", #  Zadig 工作流名稱
  "task_id": 70, # Zadig 工作流任務 ID
  "project_name": "voting-demo", # 專案名稱
  "type": "workflow",
  "status": "fail", # 回撥狀態,success 或 fail
  "status_message": "10 cases fail", # 當回撥狀態為 fail 時,給 Zadig 的錯誤資訊
}

 

解鎖更多測試框架

如果 Zadig 內建的軟體包/測試框架無法滿足測試需求,可以在系統設定中新增新的軟體包應用來支援更多的測試場景,可參考官方文件「軟體包管理」。

Zadig,讓工程師更專注創造!歡迎加入 開源吐槽群🔥

Zadig on Github

Zadig on Gitee