具有 android 测试和测试覆盖率的 sonarqube
Posted
技术标签:
【中文标题】具有 android 测试和测试覆盖率的 sonarqube【英文标题】:sonarqube with both androidTest and test covarage 【发布时间】:2016-09-13 19:11:22 【问题描述】:我正在尝试在我的 android 项目中设置 sonarqube 报告。我目前无法在声纳 UI 中显示所有测试类,覆盖率以百分比显示,目前只有来自 app/src/test/
的单元测试显示为单元测试。
我的项目有一个测试文件夹app/src/test/
,其中包含单元测试,我有一个androidTest 文件夹app/src/androidTest/
,其中包含android 单元、集成和UI 测试。当我通过 gradle 运行所有测试时,android-gradle 插件会生成 build/jacoco/testDebugUnitTest.exec
和 build/test-results/debug/TEST-*Test.xml
,其中包含测试文件夹中单元测试的 jacoco 结果和覆盖率报告。 android-gradle 插件还会生成 build/outputs/code-coverage/connected/coverage.ec
和 build/outputs/androidTest-results/connected/TEST-*Test.xml
包含来自 androidTest 文件夹的结果和覆盖率报告
在我的 build.gradle 中,我可以指定声纳插件的属性。
sonarqube
properties
property "sonar.sources", "src/main/java,src/main/res"
property "sonar.tests", "src/test/java,src/androidTest/java"
property "sonar.java.coveragePlugin", "jacoco"
property "sonar.jacoco.reportPath", "$project.buildDir/jacoco/testDebugUnitTest.exec"
property 'sonar.jacoco.itReportPath', "$project.buildDir/outputs/code-coverage/connected/coverage.ec"
property "sonar.junit.reportsPath", "$project.buildDir/test-results/debug" // path to junit reports
使用sonar.junit.reportsPath
,我可以指定将哪个 xml 报告发送到 sonarqube 服务器。当我将其更改为build/outputs/androidTest-results/connected
时,我得到的 androidTest 在仪表板上显示为单元测试。有没有办法让声纳插件同时查看两个目录或将结果合并在一起?
【问题讨论】:
【参考方案1】:在修复https://jira.sonarsource.com/browse/SONAR-4101 之前,您唯一的选择是编写一个任务,将您的测试结果文件复制到一个地方并将其配置为sonar.junit.reportsPath
,如下所示:
task combineTestResultsForSonarqube
group = "Reporting"
def modules = ["app", "and", "other", "modules"];
doLast
modules.each module ->
File combined = file("$module/build/combined-test-results")
if (combined.exists())
combined.deleteDir()
combined.mkdirs();
def testDirs = [file("$module/build/test-results/debug/"),
file("$module/build/outputs/androidTest-results/connected/")];
testDirs.each testDir ->
if (!testDir.exists())
logging.captureStandardOutput LogLevel.WARN
println "WARNING: ignoring non-existant $testDir.path"
return;
files(testDir.listFiles()).each file ->
new File(combined, file.getName()) << file.text
当您的构建中有不同的风格时,当然必须调整路径。
【讨论】:
虽然这可能会在 SonarQube 测试列表中添加 UI 测试,但它不会增加您的覆盖率或表明方法已被覆盖。有什么解决办法吗? @Elias 如果您使用 Jacoco 进行检测和代码覆盖,那么您已经准备好了,因为较新版本的 Sonarqube 合并了来自单元和检测测试的 Jacoco 覆盖数据。然而,我不知道这对于其他覆盖插件是可能的。 我们使用的是 SonarQube v6,我想这是最新的?我传递了这些属性: property "sonar.java.coveragePlugin", "jacoco" property "sonar.jacoco.reportPath", "build/jacoco/testProductionMinSdk19DebugUnitTest.exec" //junit 覆盖报告属性 "sonar.junit.reportsPath", " build/test-results/productionMinSdk19Debug/" // junit 报告的路径属性 "sonar.android.lint.report", "/build/outputs/lint-results-productionMinSdk19Debug.xml" // lint 报告的路径以上是关于具有 android 测试和测试覆盖率的 sonarqube的主要内容,如果未能解决你的问题,请参考以下文章