首页 > 解决方案 > 部分忽略了测试执行

问题描述

我多年来一直在使用声纳,没有任何问题,非常高兴……直到上周我遇到了一个非常奇怪的问题,我完全不知道发生了什么。

我正在使用 GitLab 的管道执行一些单独的单元测试和功能测试,然后合并 Sonar 的 2 个lcov和 2 个xunit报告,最后给我 1 个lcov文件,列出单元测试和功能测试所涵盖的代码,和 1 个包含所有已执行测试的xunit文件。

然后我将这 2 个文件传递给我们的 SonarQube 8.6 - 带有声纳扫描仪 4.5.0.2216 的开发人员版。

这是我正在使用的声纳扫描仪参数:

sonar.projectKey=xxx
sonar.projectName=xxx
sonar.projectVersion=$CI_BUILD_ID
sonar.sources=src
sonar.tests=test
sonar.javascript.lcov.reportPaths=test-results/lcov-merged.info
sonar.testExecutionReportPaths=test-results/xunit-merged.xml

这是合并单元报告和功能报告后最终的 xunit-merged.xml 文件的内容。

<testExecutions version="1">
<file path="test\unit\index.test.ts">
<testCase name=": Save" duration="4"/>
<testCase name="Get functional logs: with empty query" duration="3"/>
<testCase name="Class: ManagementFormService: Function: get (GET handler)" duration="4"/>
<testCase name="Class: ManagementFormService: Function: update (POST handler)" duration="4"/>
<testCase name="Module: Export management form service, controller and externally injected config service" duration="29"/>
<testCase name="Class: ManagementFormService: Function: createForm" duration="1"/>
<testCase name="Class: ManagementFormService: Function: save (success) and createForm" duration="1"/>
<testCase name="Get functionals logs by origin: From valid queries and request" duration="2"/>
<testCase name="Get functionals logs by origin: From valid queries but no request" duration="4"/>
<testCase name="Get functionals logs by origin: From valid queries and request" duration="1"/>
<testCase name="Get functionals logs by origin: From valid queries but no request" duration="1"/>
<testCase name="Get functionals logs by origin: From valid queries and request" duration="0"/>
<testCase name="Get functionals logs by origin: From valid queries but no request" duration="1"/>
<testCase name="Module version: Cache ON, Repository ON, Amqp ON: From valid UUID and request" duration="1"/>
<testCase name="Module version: Cache ON, Repository ON, Amqp ON: From valid UUID but no request" duration="0"/>
<testCase name="Module version: Cache OFF, Repository ON, Amqp ON: From valid UUID and request" duration="0"/>
<testCase name="Module version: Cache OFF, Repository ON, Amqp ON: From valid UUID but no request" duration="0"/>
<testCase name="Module version: Cache OFF, Repository OFF, Amqp ON: From valid UUID and request" duration="1"/>
<testCase name="Module version: Cache OFF, Repository OFF, Amqp ON: From valid UUID but no request" duration="1"/>
<testCase name="Module version: Cache OFF, Repository OFF, Amqp OFF: From valid UUID and request" duration="0"/>
<testCase name="Module version: Cache OFF, Repository OFF, Amqp OFF: From valid UUID but no request" duration="1"/>
</file>
<file path="test\functional\index.test.ts">
<testCase name="Boot: Boot and log booting status" duration="163"/>
</file>
</testExecutions>

它包含 22 个测试,一个测试文件 ( ) 执行的 21 个单元测试test\unit\index.test.ts和另一个测试文件 ( ) 执行的 1 个功能测试test\functional\index.test.ts

这里的问题是 Sonar 只计算 21 个单元测试并忽略最后一个(正如您在捕获中看到的那样)。

SonarQube 说有 21 个测试

最后一个功能测试在 xml 中明确存在时被忽略。

以完全相同的方式,减少了代码覆盖率。单元测试覆盖的所有源代码都标记为已覆盖,但功能测试覆盖的源代码标记为未覆盖,而lconv-merged.info明确表明该文件已正确测试。

正如您在此捕获中看到的,文件的第 45、46 和 49 行src/technical/technical.controller.rest.ts被标记为未覆盖。

SonarQube 说某些代码行没有被测试覆盖

虽然lconv-merged.info报告清楚地表明这些线路都被覆盖了。

部分 lcov 文件列出了测试所涵盖的控制器的行

如果 Sonar 说没有测试也没有覆盖率,我会处理报告文件中格式错误的内容。但在这里,Sonar 就像在挑选它想要展示的东西,我不知道为什么。

所有源代码都在同一个src源路径中,可由声纳扫描仪访问,并且可在声纳中浏览(这表明它们已被正确分析)。

我一直在寻找一个漫长的一周,为什么在获取其余文件时会忽略这两个报告的一部分,但我仍然完全不知道。

有人能帮我吗 ?

标签: unit-testingsonarqubecode-coveragefunctional-testing

解决方案


终于发现问题了...我很笨。

我在 GitLab 中为合并请求触发管道,但在 Sonar 中我正在寻找分支,而不是合并请求。

正确配置后一切正常,列出了功能测试并且覆盖范围是正确的。


推荐阅读