PublishTestResults@2 — publikowanie wyników testów w wersji 2

Publikowanie wyników testów w usłudze Azure Pipelines.

Publikowanie wyników testu w usłudze Azure Pipelines/TFS.

Składnia

# Publish Test Results v2
# Publish test results to Azure Pipelines.
- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit' # 'JUnit' | 'NUnit' | 'VSTest' | 'XUnit' | 'CTest'. Alias: testRunner. Required. Test result format. Default: JUnit.
    testResultsFiles: '**/TEST-*.xml' # string. Required. Test results files. Default: **/TEST-*.xml.
    #searchFolder: '$(System.DefaultWorkingDirectory)' # string. Search folder. Default: $(System.DefaultWorkingDirectory).
    #mergeTestResults: false # boolean. Merge test results. Default: false.
    #failTaskOnFailedTests: false # boolean. Fail if there are test failures. Default: false.
    #failTaskOnFailureToPublishResults: false # boolean. Fail if there is failure in publishing test results. Default: false.
    #failTaskOnMissingResultsFile: false # boolean. Fail if no result files are found. Default: false.
    #testRunTitle: # string. Test run title. 
  # Advanced
    #buildPlatform: # string. Alias: platform. Build Platform. 
    #buildConfiguration: # string. Alias: configuration. Build Configuration. 
    #publishRunAttachments: true # boolean. Upload test results files. Default: true.
# Publish Test Results v2
# Publish test results to Azure Pipelines.
- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit' # 'JUnit' | 'NUnit' | 'VSTest' | 'XUnit' | 'CTest'. Alias: testRunner. Required. Test result format. Default: JUnit.
    testResultsFiles: '**/TEST-*.xml' # string. Required. Test results files. Default: **/TEST-*.xml.
    #searchFolder: '$(System.DefaultWorkingDirectory)' # string. Search folder. Default: $(System.DefaultWorkingDirectory).
    #mergeTestResults: false # boolean. Merge test results. Default: false.
    #failTaskOnFailedTests: false # boolean. Fail if there are test failures. Default: false.
    #testRunTitle: # string. Test run title. 
  # Advanced
    #buildPlatform: # string. Alias: platform. Build Platform. 
    #buildConfiguration: # string. Alias: configuration. Build Configuration. 
    #publishRunAttachments: true # boolean. Upload test results files. Default: true.
# Publish Test Results v2
# Publish Test Results to Azure Pipelines/TFS.
- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit' # 'JUnit' | 'NUnit' | 'VSTest' | 'XUnit'. Alias: testRunner. Required. Test result format. Default: JUnit.
    testResultsFiles: '**/TEST-*.xml' # string. Required. Test results files. Default: **/TEST-*.xml.
    #searchFolder: '$(System.DefaultWorkingDirectory)' # string. Search folder. Default: $(System.DefaultWorkingDirectory).
    #mergeTestResults: false # boolean. Merge test results. Default: false.
    #testRunTitle: # string. Test run title. 
  # Advanced
    #buildPlatform: # string. Alias: platform. Build Platform. 
    #buildConfiguration: # string. Alias: configuration. Build Configuration. 
    #publishRunAttachments: true # boolean. Upload test results files. Default: true.

Dane wejściowe

testResultsFormat - Format wyników testu
Alias wejściowy: testRunner. string. Wymagane. Dozwolone wartości: JUnit, , VSTestNUnit, XUnit, CTest. Wartość domyślna: JUnit.

Określa format plików wyników, które chcesz opublikować. Obsługiwane są następujące formaty: CTest, JUnit, NUnit 2, NUnit 3, Visual Studio Test (TRX) i xUnit 2.


testResultsFormat - Format wyników testu
Alias wejściowy: testRunner. string. Wymagane. Dozwolone wartości: JUnit, NUnit, VSTest, XUnit. Wartość domyślna: JUnit.

Określa format plików wyników, które chcesz opublikować. Obsługiwane są następujące formaty: CTest, JUnit, NUnit 2, NUnit 3, Visual Studio Test (TRX) i xUnit 2.


testResultsFiles - Pliki wyników testów
string. Wymagane. Wartość domyślna: **/TEST-*.xml.

Określa co najmniej jeden plik wyników testów.

  • Można użyć wieloznacznych symboli wieloznacznych z jednym folderem (*) i cyklicznych symboli wieloznacznych (**). Na przykład wyszukuje wszystkie pliki XML, **/TEST-*.xml których nazwy zaczynają się od TEST- we wszystkich podkatalogach. Jeśli używasz narzędzia VSTest jako formatu wyników testu, typ pliku należy zmienić na .trx np. **/TEST-*.trx
  • Można określić wiele ścieżek rozdzielonych nowym wierszem.
  • Ponadto akceptuje wzorce minimatch.

Na przykład !TEST[1-3].xml wyklucza pliki o nazwie TEST1.xml, TEST2.xmllub TEST3.xml.


searchFolder - folder Search
string. Wartość domyślna: $(System.DefaultWorkingDirectory).

Opcjonalny. Określa folder do wyszukiwania plików wyników testów.


mergeTestResults - Scal wyniki testu
boolean. Wartość domyślna: false.

Gdy wartość tego elementu logicznego to true, zadanie podrzędne zgłasza wyniki testu ze wszystkich plików względem pojedynczego przebiegu testu. Jeśli wartość to false, zadanie tworzy osobny przebieg testu dla każdego pliku wyników testu.

Uwaga

Użyj ustawienia wyników testu scalania, aby połączyć pliki z tej samej platformy testów, aby upewnić się, że mapowanie wyników i czas trwania są obliczane poprawnie.


failTaskOnFailedTests - Niepowodzenie, jeśli występują błędy testów
boolean. Wartość domyślna: false.

Opcjonalny. Gdy wartość tej wartości logicznej to true, zadanie zakończy się niepowodzeniem, jeśli którykolwiek z testów w pliku wyników zostanie oznaczony jako niepowodzenie. Wartość domyślna to false, która po prostu opublikuje wyniki z pliku wyników.


failTaskOnFailureToPublishResults - Niepowodzenie, jeśli wystąpił błąd podczas publikowania wyników testów
boolean. Wartość domyślna: false.

W przypadku trueniepowodzenia zadania w przypadku niepowodzenia publikowania wyników testu.


failTaskOnMissingResultsFile - Niepowodzenie, jeśli nie znaleziono plików wyników
boolean. Wartość domyślna: false.

Nie można wykonać zadania, jeśli nie znaleziono plików wyników.


testRunTitle - Tytuł przebiegu testu
string.

Opcjonalny. Określa nazwę przebiegu testu, względem którego będą zgłaszane wyniki. Można użyć nazw zmiennych zadeklarowanych w potoku kompilacji lub wydania.


buildPlatform - Tworzenie platformy
Alias wejściowy: platform. string.

Opcjonalny. Określa platformę kompilacji, dla której ma zostać zgłoszony przebieg testu. Na przykład: x64 lub x86. Jeśli zdefiniowano zmienną dla platformy w zadaniu kompilacji, użyj jej tutaj.


buildConfiguration - Konfiguracja kompilacji
Alias wejściowy: configuration. string.

Opcjonalny. Określa konfigurację kompilacji, dla której ma zostać zgłoszony przebieg testu. Na przykład: Debug lub Release. Jeśli zdefiniowano zmienną dla konfiguracji w zadaniu kompilacji, użyj jej tutaj.


publishRunAttachments - Przekazywanie plików wyników testów
boolean. Wartość domyślna: true.

Opcjonalny. Gdy wartość tej wartości logicznej to true, zadanie przekazuje wszystkie pliki wyników testu jako załączniki do przebiegu testu.


Opcje sterowania zadania

Wszystkie zadania mają opcje sterowania oprócz danych wejściowych zadań. Aby uzyskać więcej informacji, zobacz Opcje sterowania i typowe właściwości zadań.

Zmienne wyjściowe

Brak.

Uwagi

To zadanie publikuje wyniki testów w usłudze Azure Pipelines lub TFS, gdy testy są wykonywane w celu zapewnienia kompleksowego środowiska raportowania testów i analizy. Możesz użyć wybranego modułu uruchamiającego testy, który obsługuje wymagany format wyników. Obsługiwane formaty wyników obejmują CTest, JUnit (w tym PHPUnit), NUnit 2, NUnit 3, Visual Studio Test (TRX) i xUnit 2.

Inne wbudowane zadania, takie jak zadanie testowe programu Visual Studio i zadanie interfejsu wiersza polecenia Dot NetCore , automatycznie publikują wyniki testów w potoku. Zadania takie jak Ant, Maven, Gulp, Grunt i Xcode udostępniają wyniki publikowania jako opcję w zadaniu lub kompilują biblioteki, takie jak Cobertura i JaCoCo. Jeśli używasz dowolnego z tych zadań, nie potrzebujesz oddzielnego zadania Publikuj wyniki testu w potoku.

Opublikowane wyniki testów są wyświetlane na karcie Testy w podsumowaniu potoku. Wyniki ułatwiają mierzenie jakości potoku, przeglądanie możliwości śledzenia, rozwiązywanie problemów z awariami i własność awarii dysku.

W poniższym przykładzie pokazano, że zadanie zostało skonfigurowane do publikowania wyników testów.

Otwieranie strony historii testów

To zadanie można również użyć w potoku kompilacji, aby opublikować wyniki pokrycia kodu wygenerowane podczas uruchamiania testów w usłudze Azure Pipelines lub TFS w celu uzyskania raportowania pokrycia.

Wymagania wstępne

Jeśli używasz własnego agenta systemu Windows, na maszynie musi być zainstalowane następujące wymaganie wstępne:

Wartości domyślne zadań

Opcja domyślna używa formatu JUnit do publikowania wyników testów. W przypadku korzystania z narzędzia VSTest jako elementu testRunner należy zmienić opcję testResultsFiles na **/TEST-*.trx.

testResultsFormat jest aliasem nazwy wejściowej elementu testRunner . Pliki wyników mogą być generowane przez wielu modułów uruchamiającego, a nie tylko przez określony moduł uruchamiający. Na przykład format wyników jUnit jest obsługiwany przez wiele modułów uruchamiaczy, a nie tylko jUnit.

Aby opublikować wyniki testów dla języka Python przy użyciu języka YAML, zobacz python w sekcji Ekosystemy tych tematów, która zawiera również przykłady dla innych języków.

Mapowanie formatów wyników

Ta tabela zawiera listę pól zgłoszonych na karcie Testy w podsumowaniu kompilacji lub wydania oraz odpowiednie mapowanie z atrybutami w obsługiwanych formatach wyników testów.

Zakres Pole Test programu Visual Studio (TRX)
Przebieg testu Tytuł Tytuł przebiegu testu określony w zadaniu
Data rozpoczęcia /TestRun/Times.Attributes["start"]. Wartość
Data ukończenia /TestRun/Times.Attributes["finish"]. Wartość
Czas trwania Data ukończenia — data rozpoczęcia
Załączniki Zapoznaj się z sekcją pomocy technicznej dotyczącą załączników poniżej
Wynik testu Tytuł /TestRun/Results/UnitTestResult.Attributes["testName"]. Value lub /TestRun/Results/WebTestResult.Attributes["testName"]. Value lub /TestRun/Results/TestResultAggregation.Attributes["testName"]. Wartość
Data rozpoczęcia /TestRun/Results/UnitTestResult.Attributes["startTime"]. Value lub /TestRun/Results/WebTestResult.Attributes["startTime"]. Value lub /TestRun/Results/TestResultAggregation.Attributes["startTime"]. Wartość
Data ukończenia /TestRun/Results/UnitTestResult.Attributes["startTime"]. Value + /TestRun/Results/UnitTestResult.Attributes["duration"]. Value lub /TestRun/Results/WebTestResult.Attributes["startTime"]. Value + /TestRun/Results/WebTestResult.Attributes["duration"]. Value lub /TestRun/Results/TestResultAggregation.Attributes["startTime"]. Value + /TestRun/Results/TestResultAggregation.Attributes["duration"]. Wartość
Czas trwania /TestRun/Results/UnitTestResult.Attributes["duration"]. Value lub /TestRun/Results/WebTestResult.Attributes["duration"]. Value lub /TestRun/Results/TestResultAggregation.Attributes["duration"]. Wartość
Właściciel /TestRun/TestDefinitions/UnitTest/Owners/Owner.Attributes["name"]. Wartość
Wynik /TestRun/Results/UnitTestResult.Attributes["result"]. Value lub /TestRun/Results/WebTestResult.Attributes["result"]. Value lub /TestRun/Results/TestResultAggregation.Attributes["result"]. Wartość
Komunikat o błędzie /TestRun/Results/UnitTestResult/Output/ErrorInfo/Message.InnerText lub /TestRun/Results/WebTestResultOutput/ErrorInfo/Message.InnerText lub /TestRun/Results/TestResultAggregation/Output/ErrorInfo/Message.InnerText
Ślad stosu /TestRun/Results/UnitTestResult/Output/ErrorInfo/StackTrace.InnerText lub /TestRun/Results/WebTestResultOutput/ErrorInfo/StackTrace.InnerText lub /TestRun/Results/TestResultAggregation/Output/ErrorInfo/StackTrace.InnerText
Załączniki Zapoznaj się z sekcją pomocy technicznej dotyczącą załączników poniżej
Dziennik konsoli /TestRun/Results/UnitTestResult/Output/StdOut.InnerText lub /TestRun/Results/WebTestResultOutput/Output/StdOut.InnerText lub /TestRun/Results/TestResultAggregation/Output/StdOut.InnerText
Dziennik błędów konsoli /TestRun/Results/UnitTestResult/Output/StdErr.InnerText lub /TestRun/Results/WebTestResultOutput/Output/StdErr.InnerText lub /TestRun/Results/TestResultAggregation/Output/StdErr.InnerText
Nazwa agenta /TestRun/Results/UnitTestResult.Attributes["computerName"]. Value lub /TestRun/Results/WebTestResult.Attributes["computerName"]. Value lub /TestRun/Results/TestResultAggregation.Attributes["computerName"]. Wartość
Plik testowy /TestRun/TestDefinitions/UnitTest.Attributes["storage"]. Wartość
Priorytet /TestRun/TestDefinitions/UnitTest.Attributes["priority"]. Wartość

Uwaga

Czas trwania jest używany tylko wtedy, gdy data rozpoczęcia i data ukończenia nie są dostępne.

W pełni kwalifikowany format nazwy testName to Namespace.Testclass.Methodname z limitem znaków 512. Jeśli test jest oparty na danych i ma parametry, limit znaków będzie zawierać parametry.

Podczas publikowania wyniku testu może wystąpić następujący błąd: Nie można opublikować wyników testu: określono nieprawidłowy priorytet

Ten błąd występuje, jeśli którakolwiek z metod testowych ma priorytet ustawiony powyżej 255, napraw priorytet metody testowej w kodzie i ponownie wykonaj testy. Możesz przejrzeć wygenerowany plik trx, aby zobaczyć, że wszystkie testy mają priorytet większy niż 255.

Obsługa załączników

Zadanie Publikuj wyniki testu zapewnia obsługę załączników zarówno dla przebiegu testu, jak i wyników testów dla następujących formatów. W przypadku projektów publicznych obsługujemy łącznie 2 GB załączników.

Test programu Visual Studio (TRX)

Zakres Typ Ścieżka
Przebieg testu Zbierających /TestRun/ResultSummary/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]. Wartość
Wynik testu /TestRun/ResultSummary/ResultFiles/ResultFile.Attributes["path"]. Wartość
Pokrycie kodu /TestRun/TestSettings/Execution/AgentRule/DataCollectors/DataCollector/Configuration/CodeCoverage/Regular/CodeCoverageItem.Attributes["binaryFile"]. Value And /TestRun/TestSettings/Execution/AgentRule/DataCollectors/DataCollector/Configuration/CodeCoverage/Regular/CodeCoverageItem.Attributes["pdbFile"]. Wartość
Wynik testu Moduły zbierające dane /TestRun/Results/UnitTestResult/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]. Value lub /TestRun/Results/WebTestResult/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]. Value lub /TestRun/Results/TestResultAggregation/CollectorDataEntries/Collector/UriAttachments/UriAttachment/A.Attributes["href"]. Wartość
Wynik testu /TestRun/Results/UnitTestResult/ResultFiles/ResultFile.Attributes["path"]. Value lub /TestRun/Results/WebTestResult/ResultFiles/ResultFiles.Attributes["path"]. Value lub /TestRun/Results/TestResultAggregation/ResultFiles/ResultFiles.Attributes["path"]. Wartość

Uwaga

Opcja przekazywania pliku wyników testu jako załącznika jest opcją domyślną w zadaniu, która ma zastosowanie do wszystkich formatów.

Przykłady

Docker

W przypadku aplikacji opartych na platformie Docker istnieje wiele sposobów kompilowania aplikacji i uruchamiania testów:

  • Kompilowanie i testowanie w potoku kompilacji: kompilacje i testy są wykonywane w potoku, a wyniki testów są publikowane przy użyciu zadania Publikuj wyniki testu .
  • Kompilowanie i testowanie za pomocą wieloetapowego pliku Dockerfile: kompilacje i testy są wykonywane wewnątrz kontenera przy użyciu wieloetapowego pliku platformy Docker, ponieważ takie wyniki testów nie są publikowane z powrotem do potoku.
  • Kompilowanie, testowanie i publikowanie wyników za pomocą pliku Dockerfile: kompilacje i testy są wykonywane wewnątrz kontenera, a wyniki są publikowane z powrotem do potoku. Zobacz przykład poniżej.

Kompilowanie, testowanie i publikowanie wyników za pomocą pliku platformy Docker

W tym podejściu utworzysz kod i uruchomisz testy wewnątrz kontenera przy użyciu pliku platformy Docker. Wyniki testu są następnie kopiowane do hosta do opublikowania w potoku. Aby opublikować wyniki testu w usłudze Azure Pipelines, możesz użyć zadania Publikowanie wyników testu . Końcowy obraz zostanie opublikowany na platformie Docker lub Azure Container Registry.

Uzyskiwanie kodu
  1. Dockerfile.build Utwórz plik w katalogu głównym katalogu projektu, wykonując następujące czynności:

    # Build and run tests inside the docker container
    FROM mcr.microsoft.com/dotnet/sdk:2.1
    WORKDIR /app
    # copy the contents of agent working directory on host to workdir in container
    COPY . ./
    # dotnet commands to build, test, and publish
    RUN dotnet restore
    RUN dotnet build -c Release
    RUN dotnet test dotnetcore-tests/dotnetcore-tests.csproj -c Release --logger "trx;LogFileName=testresults.trx"
    RUN dotnet publish -c Release -o out
    ENTRYPOINT dotnet dotnetcore-sample/out/dotnetcore-sample.dll
    

    Ten plik zawiera instrukcje dotyczące kompilowania kodu i uruchamiania testów. Testy są następnie kopiowane do pliku testresults.trx wewnątrz kontenera.

  2. Aby obraz końcowy był jak najmniejszy, zawierający tylko artefakty środowiska uruchomieniowego i wdrożenia, zastąp zawartość istniejącego Dockerfile obrazu następującymi elementami:

    # This Dockerfile creates the final image to be published to Docker or
    # Azure Container Registry
    # Create a container with the compiled asp.net core app
    FROM mcr.microsoft.com/dotnet/aspnet:2.1
    # Create app directory
    WORKDIR /app
    # Copy only the deployment artifacts
    COPY /out .
    ENTRYPOINT ["dotnet", "dotnetcore-sample.dll"]
    
Definiowanie potoku kompilacji
  1. Jeśli masz konto Docker Hub i chcesz wypchnąć obraz do rejestru platformy Docker, zastąp zawartość .vsts-ci.docker.yml pliku następującym kodem:

    # Build Docker image for this app, to be published to Docker Registry
    pool:
      vmImage: 'ubuntu-latest'
    variables:
      buildConfiguration: 'Release'
    steps:
    - script: |
        docker build -f Dockerfile.build -t $(dockerId)/dotnetcore-build:$BUILD_BUILDID .
        docker run --name dotnetcoreapp --rm -d $(dockerId)/dotnetcore-build:$BUILD_BUILDID
        docker cp dotnetcoreapp:app/dotnetcore-tests/TestResults $(System.DefaultWorkingDirectory)
        docker cp dotnetcoreapp:app/dotnetcore-sample/out $(System.DefaultWorkingDirectory)
        docker stop dotnetcoreapp
    
    - task: PublishTestResults@2
      inputs:
        testRunner: VSTest
        testResultsFiles: '**/*.trx'
        failTaskOnFailedTests: true
    
    - script: |
        docker build -f Dockerfile -t $(dockerId)/dotnetcore-sample:$BUILD_BUILDID .
        docker login -u $(dockerId) -p $pswd
        docker push $(dockerId)/dotnetcore-sample:$BUILD_BUILDID
      env:
        pswd: $(dockerPassword)
    

    Alternatywnie, jeśli skonfigurujesz Azure Container Registry i chcesz wypchnąć obraz do tego rejestru, zastąp zawartość .vsts-ci.yml pliku następującym kodem:

    # Build Docker image for this app to be published to Azure Container Registry
    pool:
      vmImage: 'ubuntu-latest'
    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: |
        docker build -f Dockerfile.build -t $(dockerId)/dotnetcore-build:$BUILD_BUILDID .
        docker run --name dotnetcoreapp --rm -d $(dockerId)/dotnetcore-build:$BUILD_BUILDID
        docker cp dotnetcoreapp:app/dotnetcore-tests/TestResults $(System.DefaultWorkingDirectory)
        docker cp dotnetcoreapp:app/dotnetcore-sample/out $(System.DefaultWorkingDirectory)
        docker stop dotnetcoreapp
    
    - task: PublishTestResults@2
      inputs:
        testRunner: VSTest
        testResultsFiles: '**/*.trx'
        failTaskOnFailedTests: true
    
    - script: |
        docker build -f Dockerfile -t $(dockerId).azurecr.io/dotnetcore-sample:$BUILD_BUILDID .
        docker login -u $(dockerId) -p $pswd $(dockerid).azurecr.io
        docker push $(dockerId).azurecr.io/dotnetcore-sample:$BUILD_BUILDID 
      env:
        pswd: $(dockerPassword)
    
  2. Wypchnij zmianę do gałęzi głównej w repozytorium.

  3. Jeśli używasz Azure Container Registry, upewnij się, że rejestr został wstępnie utworzony w Azure Portal. Skopiuj nazwę użytkownika administratora i hasło wyświetlane w sekcji Klucze dostępu ustawień rejestru w Azure Portal.

  4. Zaktualizuj potok kompilacji, wykonując następujące czynności

    • Pula agentów: Hosted Ubuntu 1604
      • dockerId: ustaw wartość na identyfikator platformy Docker dla usługi DockerHub lub nazwę użytkownika administratora dla Azure Container Registry.
      • dockerPassword: ustaw wartość na hasło dla usługi DockerHub lub hasła administratora Azure Container Registry.
    • Ścieżka pliku YAML: /.vsts-ci.docker.yml
  5. W kolejce nową kompilację i watch utworzyć i wypchnąć obraz platformy Docker do rejestru oraz wyniki testów do usługi Azure DevOps.

Wymagania

Wymaganie Opis
Typy potoków YAML, klasyczna kompilacja, wersja klasyczna
Działa w Agent, DeploymentGroup
Wymagania Brak
Możliwości To zadanie nie spełnia żadnych wymagań dotyczących kolejnych zadań w zadaniu.
Ograniczenia poleceń Dowolne
Zmienne ustawialne Dowolne
Wersja agenta 2.0.0 lub nowsza
Kategoria zadania Testowanie