我在做什么? 我目前正在为前端应用程序设置持续集成/交付管道。我们计划使用SonarQube作为代码质量工具,并希望在SONAR中导入junit测试结果/代码覆盖率以进行进一步分析。
我能够成功将javascript代码覆盖率报告导入SONAR。我们正在使用Gulp / Karma / PhantomJS / Jasmine等,并使用Karma coverage / Junit记者生成测试结果。 Junit测试文件名是TEST-xunit.xml。
我被困在哪里? 我需要您的帮助/专家指导,将Javascript测试结果导入SONAR。我尝试了不同的东西,但不知何故无法将单元测试源/结果导入SONAR。
我尝试了什么? 之前我们使用的是SONAR Runner 2.3,SONAR Qube 4.5 / Javascript插件2.2并能够导入Junit高级统计数据,例如测试通过/失败等。但是,我们无法导航到单个测试以查看哪个测试通过/失败。< / p>
在进一步研究时,注意到Javascript插件2.3如果没有找到测试源,则为该场景添加了更多消息。此外,还有一些其他依赖项,因此将SONAR qube升级到5.0。使用SONAR runner 2.4测试并观察以下消息。目前,高级别的统计数据也没有被导入。
JSTestDriverSensor.java 代码来自github上的SONAR Javascript插件)
LOG.warn("Test result will not be saved for test class \"{}\", because SonarQube associated resource has not been found using file name: \"{}\"",
getUnitTestClassName(classKey), getUnitTestFileName(classKey));
由SONAR gulp插件生成的sonar-runner.properties(使用SONAR Runner 2.3)
sonar.projectBaseDir=C:/xxxxx/homepage2
sonar.host.url=http://xxxxx:9000/sonarqube/
sonar.jdbc.url=jdbc:mysql:// xxxxx:3306/sonar
sonar.jdbc.username= xxxxx
sonar.jdbc.password= xxxxx
sonar.projectKey=homepage:0.0.0
sonar.projectName=homepage
sonar.projectVersion=0.0.0
sonar.sources=src/app,src/components
sonar.exclusions=src/**/*spec.js
sonar.tests=test
sonar.language=js
sonar.sourceEncoding=UTF-8
sonar.javascript.lcov.reportPath=reports/coverage/lcov.info
sonar.javascript.jstestdriver.reportsPath=reports/unit
我甚至尝试过单独的SONAR runner 2.4安装,但仍然收到相同的错误消息。
问题吗 1.必须有一些我忽略的东西,不知何故无法确定导致这种情况的原因。我想我要么设置测试目录路径错误,要么JSTestDriverSensor错误地解释测试目录文件。建议? 2.首先,我只想导入一个示例junit xml文件,以查看它是否成功导入。之后,我可以修改karma junit generator输出以匹配输入junit xml。这里需要一些参考例子。
附加一些日志。我修改了junit xml来设置不同的类名,以查看JsTestDriverSensor是否找到它。但事实并非如此!
[23:31:24] 23:31:24.122 DEBUG - Language of file 'src/app/main/textOverride.controller.js' is detected to be 'js'
23:31:24.122 DEBUG - Language of file 'src/app/main/main.routes.js' is detected to be 'js'
23:31:24.123 DEBUG - Language of file 'test/app/main/testSpec.js' is detected to be 'js'
[23:31:24] 23:31:24.138 DEBUG - Language of file 'src/components/navbar/navbar.controller.js' is detected to be 'js'
[23:31:24] 23:31:24.169 INFO - 7 files indexed
[23:31:26] 23:31:26.632 INFO - Quality profile for js: Sonar way
[23:31:26] 23:31:26.670 DEBUG - Sensors : QProfileSensor -> JavaScriptSquidSensor -> JsTestDriverSensor -> CoverageSensor -> InitialOpenIssuesSensor -> ProjectLinksSensor -> VersionEventsSensor -> FileHashSensor -> SCM Sensor (wrapped) -> CPD Sensor (wrapped)
23:31:26.671 INFO - Sensor QProfileSensor...
[23:31:26] 23:31:26.680 INFO - Sensor QProfileSensor done: 9 ms
23:31:26.680 INFO - Sensor JavaScriptSquidSensor...
[23:31:26] 23:31:26.950 INFO - 6 source files to be analyzed
[23:31:27] 23:31:27.081 INFO - 6/6 source files analyzed
[23:31:27] 23:31:27.113 INFO - Sensor JavaScriptSquidSensor done: 433 ms
[23:31:27] 23:31:27.114 INFO - Sensor JsTestDriverSensor...
23:31:27.114 INFO - Parsing Unit Test run results in Surefire format from folder C:\xxxxx\homepage2\reports\unit
[23:31:27] 23:31:27.176 WARN - Test result will not be saved for test class "app.main.testSpec", because SonarQube associated resource has not been found using file name: "app/main/testSpec.js"
[23:31:27] 23:31:27.177 WARN - Test result will not be saved for test class "src.app.main.testSpec", because SonarQube associated resource has not been found using file name: "src/app/main/testSpec.js"
答案 0 :(得分:2)
对于阅读此内容并使用Grunt(而不是Gulp)的任何人,都有一个grunt and karma插件可将单元测试结果转换为适当的格式以导入SonarQube。安装插件并设置Grunt配置。例如:
my_target: {
project: {
key: 'projectKey',
name: 'projectName',
version: package.version
},
paths: [{
cwd: '.',
src: './src', // source being tested
test: './tests/unit', // tests for the source
reports: {
// karma output for unit test results
unit: './tests/reports/dev/completion/unit.xml',
// karma output for unit test coverage
coverage: './tests/reports/dev/coverage/lcov/lcov.info'
}
}]
}
默认情况下,这将创建karma文件并转换为./tmp/sonar/results
然后在你的声纳属性中添加类似
的内容sonar.tests=./tests/unit
sonar.sources=./src
sonar.javascript.jstestdriver.reportsPath=.tmp/sonar/results/
sonar.javascript.lcov.reportPath=.tmp/sonar/results/coverage_report.lcov
注意:有一点让我感到震惊的是,当Sonar运行时,名为test.spec.js的测试将转换为test_spec,然后当它将结果映射回到文件,它仍然寻找test_spec.js而不是test.spec.js.我修正了这个问题,只需将我的测试名称更改为蝙蝠下划线。
另一个注意事项:在Jenkins中使用这种方法时,我只是将它用于转换测试结果,而不是用于其他任何事情。因此,karmaSonar的Grunt任务将失败(因为盒子上没有配置或找到SonarQube的实例),所以如果你不希望整个构建失败,请确保在Grunt中使用--force标志。我发现即使任务失败,文件也被转换得很好。然后我在我的工作中使用了Invoke Standalone SonarQube Analysis步骤来运行静态代码分析并获取测试结果。
希望这有帮助!