You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SonarQube扫描Python代码时测试成功率未识别,提示测试类资源不存在

解决SonarQube不显示Python测试成功率及资源找不到的问题

看起来你的核心问题是SonarQube无法匹配nosetests.xml中的测试类与项目中的实际测试文件,这直接导致了测试成功率数据无法正常展示,同时出现了资源找不到的警告。以下是一步步的排查和解决方法:

1. 确认SonarQube扫描的路径配置

首先要确保SonarQube明确知道你的源码和测试代码位置,在Jenkins的SonarQube扫描步骤中,添加以下参数(根据你的项目结构调整):

sonar.sources=src  # 你的业务代码根目录,比如包含at_overlay的上层目录
sonar.tests=tests  # 测试代码所在的目录
sonar.python.test.reportPaths=nosetests.xml  # 指向生成的测试报告文件
sonar.python.coverage.reportPaths=coverage.xml  # 指向覆盖率报告文件
sonar.python.version=3.x  # 匹配你实际使用的Python版本

如果测试代码和源码不在同一个根目录,一定要明确指定sonar.tests,否则SonarQube无法索引到测试类文件。

2. 确保nosetests生成正确的测试类路径

你看到的The resource for 'tests.test_transformation_helper.TestCase' is not found警告,说明nosetests.xml中记录的测试类路径,和SonarQube索引到的测试文件路径不匹配。解决要点:

  • 运行nosetests时必须在项目根目录执行命令,这样生成的XML中的类名会是完整的模块路径(比如tests.test_transformation_helper.TestCase),SonarQube才能对应到tests/test_transformation_helper.py文件。
  • 可以显式指定测试报告输出路径,避免路径混乱:
nosetests --with-coverage --cover-erase --with-xunit --xunit-file=nosetests.xml --exe --cover-package=at_overlay

3. 检查coverage报告的路径匹配

虽然你的覆盖率数据正确,但也要确保coverage生成的xml中,源码路径和SonarQube识别的一致。运行coverage命令时同样要在项目根目录执行,并且--omit参数要准确:

coverage report --omit=src/tests/*,*/__init__.py
coverage xml --omit=src/tests/*,*/__init__.py --output=coverage.xml

如果你的业务代码在src/at_overlay下,--cover-package=at_overlay是正确的,能确保coverage只统计业务代码的覆盖率。

4. 验证SonarQube Python插件版本

旧版本的SonarQube Python插件对nose测试报告的支持可能存在兼容性问题,建议升级到最新版本的Python插件(在SonarQube的「Administration > Marketplace」中检查更新)。

5. 手动检查nosetests.xml内容

打开生成的nosetests.xml,查看<testcase>标签的classname属性,比如:

<testcase classname="tests.test_transformation_helper.TestCase" name="test_something" time="0.01"/>

确认这个classname对应的文件确实存在于你的项目中(tests/test_transformation_helper.py),并且SonarQube的sonar.tests已经包含了tests目录。如果路径不一致(比如classname是test_transformation_helper.TestCase,缺少tests前缀),说明你是在tests目录下运行的nosetests,回到项目根目录重新执行即可。

6. 清理Jenkins工作区并重新构建

有时候Jenkins工作区的旧报告文件会干扰扫描,建议先清理工作区,再重新执行构建和扫描步骤,确保生成的报告是最新的。

按照以上步骤调整后,SonarQube应该能正确匹配测试类,显示测试成功率,同时消除资源找不到的警告。

内容的提问来源于stack exchange,提问作者hellsgate

火山引擎 最新活动