Rom*_*las 3 javascript code-coverage lcov sonarqube karma-coverage
我有一个具有以下结构的应用程序:
my-application
+- pom.xml
+- app
| +- scripts
| | +- app.js
| | +- **/*.js
| +- 3rd-party-libs
+- build
+- node_modules
+- test
Run Code Online (Sandbox Code Playgroud)
我创建了pom.xml唯一一个运行SonarQube分析的人.否则,所有任务都由Grunt运行(测试与Karma一起运行).
内容pom.xml如下:
<properties>
<sonar.language>js</sonar.language>
<sonar.sourceEncoding>UTF-8</sonar.sourceEncoding>
<sonar.javascript.coveragePlugin>lcov</sonar.javascript.coveragePlugin>
<sonar.javascript.lcov.reportPath>build/karma/coverage/lcov.info</sonar.javascript.lcov.reportPath>
<sonar.exclusions>app/3rd-party-libs/**,node_modules/**</sonar.exclusions>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
</properties>
<build>
<sourceDirectory>app/scripts</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
</build>
Run Code Online (Sandbox Code Playgroud)
当我运行时grunt test,它创建一个build/karma/coverage/lcov.info包含以下信息:
TN:
SF:./app/scripts/app.js
FN:16,(anonymous_1)
FN:26,(anonymous_2)
FNF:2
...
Run Code Online (Sandbox Code Playgroud)
在SonarQube分析之后,仪表板显示0%的代码覆盖率.
我怀疑它中的路径SF:是错误的来源.因此,我已经改变了sonar.javascript.lcov.reportPath财产使用另一个lcov.info测试不同的值:app.js,./app.js,app/scripts/app.js,./app/scripts/app.js,但没有工作,保持覆盖率为0%.
我错过了什么?
为了以防万一,我在我的配置中有以下配置karma.conf.js:
coverageReporter: {
reporters: [
{
type: 'lcov',
dir: 'build/karma/coverage',
subdir: '.'
}
]
},
Run Code Online (Sandbox Code Playgroud)
ps:声纳版本是3.7.2,但我也试过4.3,结果相同......
编辑:我已经更新了我的配置以直接使用Sonar-runner,我使用的是最新版本的Sonar(5.0.1)和JS插件(2.3).我还手动修改了lcov.info一个"好"的格式(至少有一种格式与Sonar repo示例相匹配):
SF:./app/scripts/app.js
DA:2,1
DA:20,1
DA:29,1
DA:34,1
end_of_record
SF:./app/scripts/services/exampleService.js
DA:1,1
DA:11,1
DA:12,0
end_of_record
Run Code Online (Sandbox Code Playgroud)
的sonar-project.properties样子:
sonar.projectKey=xxx
sonar.projectName=xxx
sonar.projectVersion=xxx
sonar.sourceEncoding=UTF-8
sonar.sources=app/scripts
sonar.tests=test
sonar.exclusions=app/3rd-party-libs/**,node_modules/**
sonar.dynamicAnalysis=reuseReports
sonar.language=js
sonar.projectBaseDir=.
sonar.javascript.coveragePlugin=lcov
sonar.javascript.lcov.reportPath=build/karma/coverage/lcov.info
Run Code Online (Sandbox Code Playgroud)
仍然,0%的覆盖范围:(
我很无能,所以我决定修改JavaScript插件以添加更多日志.我终于找到了错误,这是一个例外情况的恶性问题!
让我解释.让我们考虑以下saveMeasureFromLCOVFile方法CoverageSensor.java:
protected void saveMeasureFromLCOVFile(SensorContext context) {
String providedPath = settings.getString(JavaScriptPlugin.LCOV_REPORT_PATH);
File lcovFile = getIOFile(fileSystem.baseDir(), providedPath);
...
LOG.info("Analysing {}", lcovFile);
LCOVParser parser = new LCOVParser(fileSystem.baseDir());
Map<String, CoverageMeasuresBuilder> coveredFiles = parser.parseFile(lcovFile);
for (InputFile inputFile : fileSystem.inputFiles(mainFilePredicate)) {
try {
CoverageMeasuresBuilder fileCoverage = coveredFiles.get(inputFile.file().getAbsolutePath());
org.sonar.api.resources.File resource = org.sonar.api.resources.File.create(inputFile.relativePath());
if (fileCoverage != null) {
for (Measure measure : fileCoverage.createMeasures()) {
context.saveMeasure(resource, measure);
}
} else {
// colour all lines as not executed
LOG.debug("Default value of zero will be saved for file: {}", resource.getPath());
LOG.debug("Because: either was not present in LCOV report either was not able to retrieve associated SonarQube resource");
saveZeroValueForResource(resource, context);
}
} catch (Exception e) {
LOG.error("Problem while calculating coverage for " + inputFile.absolutePath(), e);
}
}
}
Run Code Online (Sandbox Code Playgroud)
首先,它读取lcov.info给出的文件,知道我们有哪些文件覆盖数据(通过解析文件检索,用LCOVParser类完成).之后,它从coveredFiles地图中获取相同的文件来进行指标和代码之间的匹配.如果找不到该文件(else部分if (fileCoverage != null) {),则代码覆盖范围被强制为0.
这就是我的项目发生的事情.
那为什么会这样呢?仅仅因为在我的环境中,inputFile等于d:\dev\my-application\app\scripts\app.js和在coveredFiles地图中,我有D:\dev\my-application\app\scripts\app.js.请注意驱动器号中的案例差异(d:反对D:).由于map.get(...)是大小写敏感的,fileCoverage是null再计算没有覆盖.
现在,我必须调查我如何强制道路有正确的情况......
经过更多的调查,我发现插件代码中的一个修改工作(至少对我来说,我没有进入所有可能的影响).在LCOVParser,filePath = CoverageSensor.getIOFile(moduleBaseDir, filePath).getCanonicalPath();可以修改为filePath = CoverageSensor.getIOFile(moduleBaseDir, filePath).getAbsolutePath();,因为第一个返回路径,就像D:\...第二个将返回d:\....
事实上,我甚至不是在Windows上使用的首选案例.以下代码:
public static void main(String[] args) throws IOException {
System.out.println("PATH 1 : " + new File(".").getAbsolutePath());
System.out.println("PATH 2 : " + new File(".").getCanonicalPath());
}
Run Code Online (Sandbox Code Playgroud)
将返回:
PATH 1 : D:\dev\preclosing\preclosing-eme\.
PATH 2 : D:\dev\preclosing\preclosing-eme
Run Code Online (Sandbox Code Playgroud)
无论如何,我暂时陷入困境,我甚至不确定如何在不等待JS插件修复的情况下解决我的问题(因为我的"官方"声纳现在有点老了,只支持JS插件到v2.1).
| 归档时间: |
|
| 查看次数: |
8312 次 |
| 最近记录: |