如何在 Gitlab CI 中捕获结构化的 xUnit 测试输出?

Posted

技术标签:

【中文标题】如何在 Gitlab CI 中捕获结构化的 xUnit 测试输出?【英文标题】:How to capture structured xUnit test output in Gitlab CI? 【发布时间】:2019-12-25 17:43:16 【问题描述】:

我正在 Gitlab CI 上的 .NET Core 代码库上运行自动化测试。这些测试的唯一输出是包含大量垃圾的控制台,因此很难准确查看哪些测试失败了。

有没有办法从 xUnit 获取结构化测试输出,使 Gitlab 可以处理文件并显示特定测试的结果,就像使用 JUnit 一样?

【问题讨论】:

【参考方案1】:

首先,将JUnitTestLogger nuget 包添加到您的测试项目中:

dotnet add package JUnitTestLogger

接下来,修改你的测试命令:

dotnet test --logger "junit;LogFileName=MyProject.xml"

最后,修改你的.gitlab-ci.yml文件指定输出路径:

test:
  ...
  artifacts:
    reports:
      junit: ./MyProject.xml

【讨论】:

我不确定它是否改变,但我不得不使用“juni;LogFilePath=MyProject.xml” - LogFilePATH 不是 LogFileNAME。【参考方案2】:
    添加JUnitTestLogger NuGet 包 使用测试命令,例如:dotnet test --logger "junit;LogFilePath=path_to_XML_file" 修改.gitlab-ci.yml文件(看我的例子)。您必须使用参数:whenpathsreports
... 
stages: 
  ...
  - tests 

variables:   
 LOGFILEPATH: /builds/myname/myrepository.api.tests/JUnitTestLogFile.xml ...

test_job:
    stage: tests
    script:
    - dotnet test --logger "junit;LogFilePath="$LOGFILEPATH
    artifacts:
        when: always
        paths:
        - $LOGFILEPATH
        reports:
            junit: $LOGFILEPATH

【讨论】:

如果路径不是绝对路径,这将不起作用,您需要更改为LogFilePath=../"$LOGFILEPATH将.xml文件放在项目文件之外,这样您才能正确收集它。您可以修改您的评论以警告人们吗?浪费了一些时间弄清楚...

以上是关于如何在 Gitlab CI 中捕获结构化的 xUnit 测试输出?的主要内容,如果未能解决你的问题,请参考以下文章

在 Script 部分的 .gitlab-ci.yml 中调用 GO 二进制文件并捕获响应

如何从 GitLab CI 管道的工作发送电子邮件?

如何使用 gitlab-ci.yml 在 gitlab 中更新 JSON 文件的内容?

如何在 Gitlab CI 中使用 Dockerfile

如何让 gitlab-runner 从指定文件中读取而不是 .gitlab-ci.yml?

如何在 Gitlab CI 中设置环境变量并使其在本地可测试