使用 Visual Studio 測試工作平行執行測試

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

執行測試來驗證程式代碼變更是維護品質的關鍵。 若要讓持續整合練習成功,您必須擁有一個適合每個組建執行的測試套件。 不過,隨著程式代碼基底的成長,回歸測試套件通常會成長,而且執行完整回歸測試可能需要很長的時間。 有時候,測試本身可能會長時間執行 -- 如果您撰寫端對端測試,通常是這種情況。 這可降低客戶價值可傳遞的速度,因為管線無法快速處理組建。

平行執行測試是改善 CI/CD 管線效率的絕佳方式。 這可藉由採用雲端所提供的額外容量來輕鬆完成。 本文討論如何使用多個代理程序, 設定 Visual Studio 測試工作 以平行方式執行測試。

必要條件

熟悉代理程式和作業的概念。 若要平行執行多個作業,您必須設定多個代理程式。 您也需要足夠的 平行作業

測試切割

Visual Studio 測試工作 (第 2 版) 的設計目的是使用平行作業設定順暢地運作。 當包含 Visual Studio 測試工作的管線作業(稱為簡單起見的「VSTest 工作」)設定為在多個代理程式上平行執行時,它會自動偵測涉及多個代理程式,並建立可跨這些代理程式平行執行的測試配量。

您可以設定工作來建立測試配量,以符合不同的需求,例如根據測試和代理程式數目、先前的測試執行時間,或元件中測試的位置進行批處理。

批處理選項

下列各節將說明這些選項。

根據測試和代理程式數目的簡單切割

此設定會使用簡單的切割演算法,將測試 『T』 數目分割成 『N' 代理程式,讓每個代理程式都執行 T/N 測試。 例如,如果您的測試套件包含1000個測試,而且您針對平行作業使用兩個代理程式,則每個代理程式都會執行500個測試。 或者,您可以使用 8 個代理程式進一步減少執行測試所花費的時間量,在此情況下,每個代理程式會平行執行 125 個測試。

當所有測試都有類似的運行時間時,通常會使用此選項。 如果測試執行時間不類似,代理程式可能無法有效地使用,因為某些代理程式可能會接收具有數個長時間執行測試的配量,而其他代理程式可能會接收具有短期執行測試的配量,而且比其餘的代理程式早得多。

根據過去運行時間的測試進行配量

此設定會將過去的運行時間視為建立測試配量,讓每個配量有大約相同的運行時間。 短期執行的測試將會批處理在一起,而長時間執行的測試則會配置給不同的配量。

當元件內的測試沒有相依性,而且不需要在相同的代理程式上執行時,應該使用此選項。 這個選項會產生最有效率的代理程式使用率,因為每個代理程式都會得到相同數量的「工作」,而且所有作業都會大約在同一時間完成。

根據測試元件進行配量

此設定會使用簡單的切割演算法,將測試元件數目 (或檔案) 'A' 除在 'N' 代理程式之間,讓每個代理程式從 A/N 元件執行測試。 使用此選項時,不會考慮元件內的測試數目。 例如,如果您的測試套件包含十個測試元件,而且您針對平行作業使用兩個代理程式,則每個代理程式將會收到五個要執行的測試元件。 您可以使用五個代理程式進一步減少執行測試所花費的時間量,在此情況下,每個代理程式都會取得兩個要執行的測試元件。

當元件內的測試具有相依性或利用 AssemblyInitializeAssemblyCleanup或和 ClassInitializeClassCleanup 方法來管理測試程式代碼中的狀態時,應該使用此選項。

在傳統組建管線中平行執行測試

如果您有大型測試套件或長時間執行的整合測試,以在傳統組建管線中執行,請使用下列步驟。

注意

若要在組建管線中使用多代理程式功能搭配內部部署 TFS 伺服器,您必須使用 TFS 2018 Update 2 或更新版本。

  1. 使用單一代理程式建置作業。 使用下圖所示的工作建置Visual Studio專案併發佈組建成品。 這會使用預設作業設定(單一代理程式,沒有平行作業)。

    buildJobSingleAgent

  2. 使用多個代理程式平行執行測試:

    • 新增代理程序作業

      AddAgentJobBuild

    • 將作業設定為平行使用多個代理程式。 這裡的範例使用三個代理程式。

      ParallelTestJobBuild

      提示

      針對大規模平行測試,您可以指定多達99個代理程式。

    • 將下載 組建成品工作 新增至作業。 此步驟是建置作業與測試作業之間的連結,而且必須確保建置作業中產生的二進位檔可在測試作業用來執行測試的代理程式上使用。 確定工作已設定為下載 「目前組建」所產生的成品,而成品名稱與建置作業中 [發佈組建成品 ] 工作中使用的成品名稱相同。

      DownloadBuildArtifacts

    • 新增 Visual Studio 測試工作,並將其設定為使用必要的切割策略

在 YAML 管線中設定平行測試的工作

指定 parallel 中的 job 策略,並指出應該分派多少個作業。 您可以指定多達 99 個代理程式來相應增加大型測試套件的測試。

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

如需詳細資訊,請參閱 YAML 架構 - 作業

在傳統發行管線中平行執行測試

如果您有大型測試套件或長時間執行的功能測試,請在部署應用程式之後執行,請使用下列步驟。 例如,您可能想要部署 Web 應用程式,並在瀏覽器中執行 Selenium 測試,以驗證應用程式功能。

注意

若要在發行管線中使用多代理程式功能搭配內部部署 TFS 伺服器,您必須使用 TFS 2017 Update 1 或更新版本。

  1. 使用單一代理程式部署應用程式。 使用 Azure 部署:建立或更新資源群組或 Azure App 服務 部署工作,將 Web 應用程式部署至 Azure 應用程式服務。 這會使用預設作業設定(單一代理程式,沒有平行作業)。

    DeployApp1Agent

  2. 使用多個代理程式平行執行測試:

    • 新增代理程序作業

      AddAgentJobRM

    • 將作業設定為平行使用多個代理程式。 這裡的範例使用三個代理程式。

      ParallelTestJobRM

      提示

      針對大規模平行測試,您可以指定多達99個代理程式。

    • 新增在執行 Visual Studio 測試工作之前必須執行的任何其他工作。 例如,執行 PowerShell 腳本來設定測試所需的任何數據。

      提示

      發行管線中的作業預設會下載連結至發行管線的所有成品。 若要節省時間,您可以設定工作,只下載作業所需的測試成品。 例如,Web 應用程式二進位檔不需要執行 Selenium 測試,而且如果您的組建管線會個別發佈應用程式和測試成品,則可以略過下載這些專案。

    • 新增 Visual Studio 測試工作,並將其設定為使用必要的切割策略

      提示

      如果測試機器未安裝 Visual Studio,您可以使用 Visual Studio Test Platform Installer 工作 來取得所需的測試平臺版本。

藉由結合平行管線作業與平行測試執行,進行大規模平行測試

在管線中使用平行作業時,它會使用多部機器(代理程式)平行執行每個作業。 測試架構和執行器也提供在單一計算機上平行執行測試的功能,通常是藉由建立多個平行執行的進程或線程。 平行處理原則功能可以分層方式合併,以達成大規模的平行測試。 在Visual Studio測試工作的內容中,平行處理原則可以透過下列方式合併:

  1. 測試架構所提供的平行處理原則。 MSTest v2、NUnit、xUnit 等所有新式測試架構都提供平行執行測試的能力。 一般而言,元件中的測試會以平行方式執行。 這些測試架構會使用測試配接器和測試架構,以及對應的配接器,與 Visual Studio 測試平臺在測試執行時建立的測試主機程式內運作。 因此,此層的平行處理是在所有架構和配接器的程式內。

  2. Visual Studio 測試平臺 (vstest.console.exe) 所提供的平行處理原則。 Visual Studio 測試平臺可以平行執行測試元件。 vstest.console.exe的用戶會將此辨識為 /parallel 參數。 其方式是在每個可用的核心上啟動測試主機進程,並將測試交給元件來執行。 這適用於任何具有 Visual Studio 測試平台測試配接器的架構,因為平行處理單位是測試元件或測試檔案。 這與測試架構所提供的平行處理原則結合時,會在管線中的單一代理程式上執行測試時,提供最大程度的平行處理。

  3. Visual Studio 測試 (VSTest) 工作所提供的平行處理原則。 VSTest 工作支援跨多個代理程式(或機器)平行執行測試。 測試配量會建立,且每個代理程式一次執行一個配量。 這三種不同的 切割策略,結合測試平臺和測試架構所提供的平行處理原則時(如上所述),會產生下列結果:

    • 根據測試和代理程式的數目進行切割。 簡單切割,其中測試會以相同大小的配量分組。 配量包含來自一或多個元件的測試。 然後,在代理程式上測試執行符合上述 12 中所述的平行處理原則。

    • 根據過去的運行時間切割。 根據先前執行測試的時間,以及可用的代理程式數目,測試會分組為配量,讓每個配量需要大約相等的運行時間。 配量包含來自一或多個元件的測試。 然後,在代理程式上測試執行符合上述 12 中所述的平行處理原則。

    • 根據元件進行配量。 配量是測試元件,因此包含所有屬於相同元件的測試。 接著,在代理程式上執行符合上述 12 中所述的平行處理原則。 不過, 如果代理程式只收到一個要執行的元件,則可能不會發生 2

說明與支援