【问题标题】:How do I get a test report when my Jest unit tests fail in Docker?当我的 Jest 单元测试在 Docker 中失败时,如何获得测试报告?
【发布时间】:2020-11-21 06:08:36
【问题描述】:

我创建了一个 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'

来自 Docker 文件的片段:

# run tests
LABEL test=$buildNumber
RUN npm run test -- --reporters=default --reporters=jest-junit --coverage --watchAll=false

当所有测试用例都通过时,会生成一个测试报告,然后我从我的 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

这告诉我测试运行没有创建报告,因为非零退出代码阻止了 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)

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

【问题讨论】:

  • 您的解决方案为我省去了几个小时的麻烦!您可以在下面发布您的答案,以便我投票吗?它可能会帮助其他人找到解决方案

标签: docker azure-devops jestjs create-react-app


【解决方案1】:

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

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

【讨论】:

  • 我对这个解决方案做了一个变体,因为我仍然希望构建步骤失败,所以我存储了退出代码,然后退出了容器。这样容器仍然被创建,以便我可以访问标签并获取报告。 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)
【解决方案2】:

您可以在 docker 步骤上设置 continueOnError 字段,以启用后续步骤。但是,通过这种方式,您的构建以 SucceededWithIssues 状态结束。如果这对您来说没问题,那么一切都完成了。如果没有,您可以在最后一步加上Agent.JobStatus 的条件,就像

- pwsh: exit 1
  condition eq(variables['Agent.JobStatus'], 'SucceededWithIssues')

在构建发生时失败。

【讨论】:

  • 我怀疑这没有帮助,问题似乎在于 Docker 部分,当测试运行返回非零退出代码时,它会停止并且不允许测试运行创建覆盖率报告。我在复制步骤中收到此消息:Error: No such container:path: testcontainer:/app/coverage Error: No such container:path: testcontainer:/app/junit.xml
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多