Udostępnij za pośrednictwem


Uruchamianie testów równolegle dla dowolnego modułu uruchamiającego testy

Azure DevOps Services | Azure DevOps Server 2022 r. — Azure DevOps Server 2019 r.

Uruchamianie testów w celu zweryfikowania zmian w kodzie jest kluczem do utrzymania jakości. Aby ciągła integracja zakończyła się pomyślnie, niezbędne jest posiadanie dobrego zestawu testów uruchamianego przy każdej kompilacji. Jednak wraz ze wzrostem bazy kodu zestaw testów regresji również rośnie, a uruchamianie pełnego testu regresji może zająć dużo czasu. Czasami testy same w sobie mogą być długotrwałe — zwykle jest to przypadek, jeśli piszesz testy kompleksowe. Zmniejsza to szybkość dostarczania wartości klienta, ponieważ potoki nie mogą przetwarzać kompilacji wystarczająco szybko.

Równoległe uruchamianie testów to doskonały sposób na zwiększenie wydajności potoków ciągłej integracji/ciągłego wdrażania. Można to łatwo zrobić, stosując dodatkową pojemność oferowaną przez chmurę. W tym artykule omówiono sposób równoległego przetwarzania zadań przy użyciu wielu agentów.

Wymagania wstępne

Zapoznaj się z pojęciami dotyczącymi agentów i zadań. Każdy agent może uruchamiać tylko jedno zadanie naraz. Aby uruchomić wiele zadań równolegle, należy skonfigurować wielu agentów. Potrzebne są również wystarczające zadania równoległe.

Konfigurowanie zadań równoległych

Określ strategię "równoległą" w języku YAML i określ liczbę zadań, które mają zostać wysłane. Zmienne System.JobPositionInPhase i System.TotalJobsInPhase są dodawane do każdego zadania.

jobs:
- job: ParallelTesting
  strategy:
    parallel: 2

Porada

Można określić maksymalnie 99 agentów, aby skalować testy w górę dla dużych zestawów testów.

Fragmentowanie zestawu testów

Aby uruchomić testy równolegle, należy najpierw wyciąć (lub podzielić) zestaw testów, aby każdy wycinek mógł być uruchamiany niezależnie. Na przykład zamiast uruchamiać duży pakiet 1000 testów na jednym agencie, można użyć dwóch agentów i uruchomić 500 testów równolegle na każdym agencie. Możesz też skrócić czas potrzebny na dalsze uruchamianie testów przy użyciu 8 agentów i równoległego uruchamiania 125 testów na każdym agencie.

Krok, który uruchamia testy w zadaniu, musi wiedzieć, który wycinek testu powinien zostać uruchomiony. Zmienne System.JobPositionInPhase i System.TotalJobsInPhase mogą być używane do tego celu:

  • System.TotalJobsInPhase wskazuje całkowitą liczbę wycinków (można to traktować jako "totalSlices")
  • System.JobPositionInPhase identyfikuje konkretny wycinek (można to traktować jako "sliceNum")

Jeśli wszystkie pliki testowe są reprezentowane jako tablica jednowymiarowa, każde zadanie może uruchomić plik testowy indeksowany pod adresem [sliceNum + totalSlices], dopóki wszystkie pliki testowe nie zostaną uruchomione. Jeśli na przykład masz sześć plików testowych i dwa zadania równoległe, pierwsze zadanie (fragmentator0) uruchomi pliki testowe o numerze 0, 2 i 4, a drugie zadanie (wycinek1) uruchomi pliki testowe o numerze 1, 3 i 5.

6 testów w 2 wycinkach

Jeśli zamiast tego użyjesz trzech zadań równoległych, pierwsze zadanie (wycinek0) uruchomi pliki testowe o numerze 0 i 3, drugie zadanie (wycinek1) uruchomi pliki testowe o numerze 1 i 4, a trzecie zadanie (wycinek2) uruchomi pliki testowe o numerze 2 i 5.

6 testów w 3 wycinkach

Przykładowy kod

Ten przykład platformy .NET Core używa --list-tests parametrów dotnet test i --filter do fragmentowania testów. Testy są uruchamiane przy użyciu narzędzia NUnit. Wyniki testów utworzone przez DotNetCoreCLI@2 zadanie testowe są następnie publikowane na serwerze. Zaimportuj (do Azure Repos lub Azure DevOps Server) lub rozwidlenie (do usługi GitHub) w tym repozytorium:

https://github.com/idubnori/ParallelTestingSample-dotnet-core

Ten przykładowy język Python używa skryptu programu PowerShell do fragmentowania testów. Testy są uruchamiane przy użyciu narzędzia pytest. Wyniki testów w stylu JUnit utworzone przez narzędzie pytest są następnie publikowane na serwerze. Zaimportuj (do Azure Repos lub Azure DevOps Server) lub rozwidlenie (do usługi GitHub) w tym repozytorium:

https://github.com/PBoraMSFT/ParallelTestingSample-Python

Ten przykładowy kod JavaScript używa skryptu powłoki bash do fragmentowania testów. Testy są uruchamiane przy użyciu mocha runner. Wyniki testów w stylu JUnit utworzone przez mocha są następnie publikowane na serwerze. Zaimportuj (do Azure Repos lub Azure DevOps Server) lub rozwidlenie (do usługi GitHub) w tym repozytorium:

https://github.com/PBoraMSFT/ParallelTestingSample-Mocha

Przykładowy kod zawiera plik azure-pipelines.yml w katalogu głównym repozytorium, którego można użyć do utworzenia potoku. Postępuj zgodnie ze wszystkimi instrukcjami w temacie Tworzenie pierwszego potoku , aby utworzyć potok, i zobacz testowanie fragmentowania w akcji.

Łączenie równoległości na potrzeby masowego testowania równoległego

Gdy zadania równoległe są używane w potoku, potok używa wielu maszyn do równoległego uruchamiania każdego zadania. Większość modułów uruchamiających testy zapewnia możliwość równoległego uruchamiania testów na jednej maszynie (zazwyczaj przez utworzenie wielu procesów lub wątków, które są uruchamiane równolegle). Dwa typy równoległości można połączyć na potrzeby masowego testowania równoległego, co sprawia, że testowanie w potokach jest niezwykle wydajne.

Pomoc i obsługa techniczna