当我的 Jest 单元测试在 Docker 中失败时,如何获取测试报告?

Kun*_*Waz 6 docker jestjs azure-devops create-react-app

我创建了一个 React 应用程序,并使用 Docker 在 Azure DevOps 中设置了一个完全工作的管道来构建、测试和发布我的应用程序。

我的管道 yaml 文件中的片段:

#----------------------------------------------------------------------
# Build the docker image
#----------------------------------------------------------------------
- task: Docker@2
  inputs:
    containerRegistry: 'XXXcontainerrepo'
    repository: 'XXX'
    command: 'build'
    Dockerfile: '**/production.Dockerfile'
    tags: |
      $(Build.BuildNumber)
    arguments: '--build-arg buildNumber="$(Build.BuildNumber)"'
  displayName: 'Docker build'
#----------------------------------------------------------------------
# Export and publish test results
#----------------------------------------------------------------------
- script: |
    export id=$(docker images --filter "label=test=$(Build.BuildNumber)" -q | head -1)
    echo "Container ID: ${id}"
    docker create --name testcontainer $id
    docker cp testcontainer:/app/coverage ./coverage
    docker cp testcontainer:/app/junit.xml ./junit.xml
    docker rm testcontainer
  displayName: 'Copy test results and code coverage reports'

- task: PublishCodeCoverageResults@1
  inputs:
    codeCoverageTool: 'cobertura'
    summaryFileLocation: '$(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml'
  displayName: 'Publish code coverage reports'

- task: PublishTestResults@2
  inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '**/junit.xml'
    mergeTestResults: true
    failTaskOnFailedTests: true
    testRunTitle: 'Jest Unit Tests'
  displayName: 'Publish test results'
Run Code Online (Sandbox Code Playgroud)

Docker 文件中的片段:

# run tests
LABEL test=$buildNumber
RUN npm run test -- --reporters=default --reporters=jest-junit --coverage --watchAll=false
Run Code Online (Sandbox Code Playgroud)

当所有测试用例通过后,会生成一个测试报告,然后我从 Docker 容器中复制该报告并使用 Azure 管道中的任务进行发布。 在此输入图像描述

但是,当测试失败时,我会在 Docker 容器中收到错误,并且构建会失败,但不会创建任何报告。当然,我可以在管道构建日志中看到失败的测试,但我在 Azure DevOps 中看不到可用的报告,因为它从未创建,因此无法发布。

在此输入图像描述 在此输入图像描述

当我在本地运行相同的命令时,当所有测试通过或一个或多个测试失败时,我都会在两种情况下创建测试报告。

所以我的问题是,即使使用 Docker 的一个或多个测试失败,是否也可以创建报告?据我了解,失败测试的数量是退出代码,当退出代码!= 0 时,Docker 容器就会失败。

我仍然希望 Docker 构建步骤在创建报告后失败,但为了以防万一,我在测试结果发布任务中设置了一个标志,以便在一个或多个测试失败时使构建失败。 failTaskOnFailedTests: true

更新

将标志添加到 Docker 构建步骤时,continueOnError: true构建将继续进行下一步,但问题仍然存在。测试运行似乎在创建测试和覆盖率报告之前就停止了,可能是由于它生成的非零退出代码导致 Docker 步骤退出。

在此输入图像描述

在复制测试结果步骤中,我得到以下输出:

Error: No such container:path: testcontainer:/app/coverage
Error: No such container:path: testcontainer:/app/junit.xml
Run Code Online (Sandbox Code Playgroud)

这告诉我测试运行没有创建报告,因为非零退出代码停止了 Docker 构建步骤退出。

解决方案

我最终延迟了退出代码,以便带有测试标签的容器完成,从而可用于下一步提取报告文件。

RUN npm run test -- --reporters=default --reporters=jest-junit --coverage -- 
watchAll=false; \
echo $? > /npm.exitcode;

# if the npm command failed - fail the build here so that we can get the 
test-report files regardless of exit code
RUN exit $(cat /npm.exitcode)
Run Code Online (Sandbox Code Playgroud)

我还添加了condition: succeededOrFailed()复制测试结果步骤和发布代码覆盖步骤,以便它们始终运行,即使构建步骤“失败”。

Cec*_*SFT 3

您可以尝试以下链接中的解决方法:

https://github.com/MicrosoftDocs/azure-devops-docs/issues/2183 https://github.com/microsoft/vstest/issues/1848

尝试将“exit 0”添加到该行的末尾,如下所示:RUN dotnet test MyProject.Tests.csproj -c Release --logger "trx;LogFileName=testresults.trx"; exit 0