使用 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 元件執行測試。 使用此選項時,不會考慮元件內的測試數目。 例如,如果您的測試套件包含十個測試元件,而且您針對平行作業使用兩個代理程式,則每個代理程式將會收到五個要執行的測試元件。 您可以使用五個代理程式進一步減少執行測試所花費的時間量,在此情況下,每個代理程式都會取得兩個要執行的測試元件。
當元件內的測試具有相依性或利用 AssemblyInitialize
和 AssemblyCleanup
,或 ClassInitialize
和 ClassCleanup
方法來管理測試程式代碼中的狀態時,應該使用此選項。
在傳統組建管線中平行執行測試
如果您有大型測試套件或需要長時間執行的整合測試在傳統的建置管線中運行,請使用以下步驟。
備註
若要在組建管線中使用多代理程式功能搭配內部部署 TFS 伺服器,您必須使用 TFS 2018 Update 2 或更新版本。
使用單一代理程式建置作業。 使用下圖所示的工作建置Visual Studio專案併發佈組建成品。 這會使用預設作業設定(單一代理程式,沒有平行作業)。
使用多個代理程式平行執行測試,:
新增 代理作業
設定作業,以平行使用多個代理程式。 這裡的範例使用三個代理程式。
小提示
針對大規模平行測試,您可以指定多達99個代理程式。
將 下載組建成品 工作新增至作業。 此步驟是建置作業與測試作業之間的連結,而且必須確保建置作業中產生的二進位檔可在測試作業用來執行測試的代理程式上使用。 確定工作已設定為下載 「目前組建」所產生的成品,而且成品名稱與建置作業中 發行組建成品 工作中使用的成品名稱相同。
新增 Visual Studio Test 工作,並將其設定為使用所需的 切割策略。
在 YAML 管線中設定平行測試的工作
請在 job
中指定 parallel
策略,並說明應該分派多少個作業。 您可以指定多達 99 個代理來擴展大型測試套件的測試能力。
jobs:
- job: ParallelTesting
strategy:
parallel: 2
如需詳細資訊,請參閱 YAML 架構 - 作業。
在傳統發行管線中平行執行測試
如果您有大型測試套件或長時間執行的功能測試需要在部署應用程式後執行,請使用以下步驟。 例如,您可能想要部署 Web 應用程式,並在瀏覽器中執行 Selenium 測試,以驗證應用程式功能。
備註
若要在發行管線中使用多代理程式功能搭配內部部署 TFS 伺服器,您必須使用 TFS 2017 Update 1 或更新版本。
使用單一代理程式部署應用程式。 使用 Azure 部署:建立或更新資源群組或 Azure App Service 部署工作,將 Web 應用程式部署至 Azure App Service。 這會使用預設作業設定(單一代理程式,沒有平行作業)。
使用多個代理程式平行執行測試,:
新增 代理作業
將作業配置為以平行方式 使用多個代理程式。 這裡的範例使用三個代理程式。
小提示
針對大規模平行測試,您可以指定多達99個代理程式。
新增必須在Visual Studio測試工作執行之前執行的任何 其他工作。 例如,執行 PowerShell 腳本來設定測試所需的任何數據。
小提示
發行管線中的作業預設會下載連結至發行管線的所有成品。 若要節省時間,您可以設定工作,只下載作業所需的測試成品。 例如,Web 應用程式二進位檔不需要執行 Selenium 測試,而且如果您的組建管線會個別發佈應用程式和測試成品,則可以略過下載這些專案。
新增 Visual Studio Test 工作,並將其設定為使用所需的 切割策略。
小提示
如果測試機器未安裝 Visual Studio,您可以使用 Visual Studio Test Platform Installer 工作 取得所需的測試平臺版本。
藉由結合平行管線作業與平行測試執行,進行大規模平行測試
在管線中使用平行作業時,它會使用多部機器(代理程式)平行執行每個作業。 測試架構和執行器也提供在單一計算機上平行執行測試的功能,通常是藉由建立多個平行執行的進程或線程。 平行處理原則功能可以分層方式合併,以達成大規模的平行測試。 在 Visual Studio 測試任務的背景下,平行處理可以透過下列方式結合:
測試架構所提供的平行處理原則。 MSTest v2、NUnit、xUnit 等所有新式測試架構都提供平行執行測試的能力。 一般而言,元件中的測試會以平行方式執行。 當測試執行時,這些測試架構會透過測試配接器與 Visual Studio 測試平臺介接。測試架構及其對應的配接器會在 Visual Studio 測試平臺創建的測試主機程式中運作。 因此,此層的平行處理是在所有架構和配接器的處理程序中。
Visual Studio 測試平臺 (vstest.console.exe) 所提供的平行處理原則。 Visual Studio 測試平台可以平行執行測試組件。 vstest.console.exe 的使用者將此辨識為 /parallel 切換。 其方式是藉由在每個可用的核心上啟動測試主機處理程序,並將測試交給組件來執行。 這適用於任何具有 Visual Studio 測試平台測試配接器的架構,因為平行處理單位是測試元件或測試檔案。 當這與測試框架所提供的平行處理能力結合時,會在管道中的單一代理程式上執行測試時,達到最大程度的平行化。
Visual Studio Test (VSTest) 工作所提供的平行處理原則。 VSTest 工作支援跨多個代理程式(或機器)平行執行測試。 測試片段會被建立,且每個代理程式一次執行一個片段。 三種不同的 切割策略,結合測試平臺和測試架構所提供的平行處理原則(如上所述),會產生下列結果:
根據測試和代理程式的數目進行切割。 簡單分片,將測試分成相同大小的區塊。 分片包含來自一個或多個組件的測試。 然後,在代理程式上執行測試時,符合上述 1 和 2 中描述的平行執行方式。
根據過去的運行時間切割。 根據先前執行測試的時間,以及可用的代理程式數目,測試會分組為配量,讓每個配量需要大約相等的運行時間。 片段包含來自一個或多個程序集的測試。 然後,在代理程式上測試執行符合上述 1 和 2 中所述的平行處理原則。
根據組件進行切割。 切片是測試組件,因此包含所有屬於相同組件的測試。 然後,在代理程式上執行符合上述 1 和 2 中所述的平行處理原則。 不過,如果代理程式只收到一個要執行的程序集,則可能 2 不會發生。
協助與支援
- 請參閱我們的 疑難解答 頁面
- 取得 Stack Overflow 的建議,並透過 開發人員社群 取得支援