SonarQube - 是否有关于如何解决覆盖问题的基本 example/explanation?
SonarQube - Is there basic example/explanation of how coverage issues can be resolved?
我对使用 SonarQube/Cloud 还很陌生(所以请保持温和!),我正在努力研究如何改进我的代码所具有的“新代码的 0% 覆盖率”。
这是一个例子:
我添加了代码:
validation_errors = []
for field in required:
if field not in request.POST:
validation_errors.append("field '{0}' missing".format(field))
if len(validation_errors) > 0:
return JsonResponse({'errors': validation_errors}, status=400 )
我对此进行了 (Django) 测试:
def test_required_params(self):
# no username
response = self.client.post(self.url, { 'password': 'secret', 'media_file': self.video_file })
self.assertRaises(forms.ValidationError)
self.assertEqual(response.status_code, 400)
但是当我 运行 声纳扫描仪时,在在线报告中,我收到消息说这些线没有被覆盖(参见:https://sonarcloud.io/component_measures?id=django_oppia&metric=new_coverage&selected=django_oppia%3Aapi%2Fmedia.py)
我确定我必须对覆盖率指标的实际含义有一些非常基本的 mis/non-understanding 了解。
如果有人能向我解释我需要在我的代码中 add/update 什么(只是上面的特定示例),我将不胜感激,因此 SonarCloud 分析不会继续将其标记为未涵盖.
感谢您的帮助 - 如果您需要有关 code/platform/versions 等的任何额外信息,请告诉我。
编辑
我正在 运行ning:
的声纳扫描仪命令
sonar-scanner \
-Dsonar.projectKey=django_oppia \
-Dsonar.organization=alexlittle-github \
-Dsonar.sources=. \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.login=xxxxxxxxxx \
-Dsonar.exclusions=docs/_build/**/*
我 运行 这是我源代码的根目录,我 specified/edited 在 sonar/conf/sonar-scanner.properties 文件中没有任何内容(它只是默认安装的版本)
感谢上面@metalisticpain 的评论 post,我现在可以正常工作了。
这个问题是因为我错过了创建覆盖率报告。
对于遇到同样问题的其他人,以下是我的解决方法...
首先我运行覆盖工具(从我的项目目录的根目录):
coverage erase
coverage run --branch --source=oppia
coverage xml -i
然后将声纳扫描仪指向这个 coverage.xml 文件:
sonar-scanner \
-Dsonar.projectKey=django_oppia \
-Dsonar.organization=alexlittle-github \
-Dsonar.sources=. \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.login=xxxxxxxxxx \
-Dsonar.exclusions=docs/_build/**/*,tests/**/*,oppiamobile/settings_secret.py \
-Dsonar.python.coverage.reportPath=./coverage.xml
我添加了一些额外的排除项,但真正有所不同的是将 reportPaths 添加到 coverage.xml
我对使用 SonarQube/Cloud 还很陌生(所以请保持温和!),我正在努力研究如何改进我的代码所具有的“新代码的 0% 覆盖率”。
这是一个例子:
我添加了代码:
validation_errors = []
for field in required:
if field not in request.POST:
validation_errors.append("field '{0}' missing".format(field))
if len(validation_errors) > 0:
return JsonResponse({'errors': validation_errors}, status=400 )
我对此进行了 (Django) 测试:
def test_required_params(self):
# no username
response = self.client.post(self.url, { 'password': 'secret', 'media_file': self.video_file })
self.assertRaises(forms.ValidationError)
self.assertEqual(response.status_code, 400)
但是当我 运行 声纳扫描仪时,在在线报告中,我收到消息说这些线没有被覆盖(参见:https://sonarcloud.io/component_measures?id=django_oppia&metric=new_coverage&selected=django_oppia%3Aapi%2Fmedia.py)
我确定我必须对覆盖率指标的实际含义有一些非常基本的 mis/non-understanding 了解。
如果有人能向我解释我需要在我的代码中 add/update 什么(只是上面的特定示例),我将不胜感激,因此 SonarCloud 分析不会继续将其标记为未涵盖.
感谢您的帮助 - 如果您需要有关 code/platform/versions 等的任何额外信息,请告诉我。
编辑 我正在 运行ning:
的声纳扫描仪命令sonar-scanner \
-Dsonar.projectKey=django_oppia \
-Dsonar.organization=alexlittle-github \
-Dsonar.sources=. \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.login=xxxxxxxxxx \
-Dsonar.exclusions=docs/_build/**/*
我 运行 这是我源代码的根目录,我 specified/edited 在 sonar/conf/sonar-scanner.properties 文件中没有任何内容(它只是默认安装的版本)
感谢上面@metalisticpain 的评论 post,我现在可以正常工作了。 这个问题是因为我错过了创建覆盖率报告。
对于遇到同样问题的其他人,以下是我的解决方法...
首先我运行覆盖工具(从我的项目目录的根目录):
coverage erase
coverage run --branch --source=oppia
coverage xml -i
然后将声纳扫描仪指向这个 coverage.xml 文件:
sonar-scanner \
-Dsonar.projectKey=django_oppia \
-Dsonar.organization=alexlittle-github \
-Dsonar.sources=. \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.login=xxxxxxxxxx \
-Dsonar.exclusions=docs/_build/**/*,tests/**/*,oppiamobile/settings_secret.py \
-Dsonar.python.coverage.reportPath=./coverage.xml
我添加了一些额外的排除项,但真正有所不同的是将 reportPaths 添加到 coverage.xml