在Java/Junit中,我需要使用某个对象测试null.我可以通过多种方式测试条件,但我一直在使用assertTrue进行大多数测试.当我在assertTrue中检查空值时,EclEmma声明它只测试一个分支.
当我手动将语句解析为变量(比如将结果设置为布尔值并将其传递给assertTrue)时,代码覆盖率在断言上被认为是完整的,而不是在变量初始化行上.
为什么会这样?这是否与Java显然添加的额外字节代码相关,如http://sourceforge.net/apps/trac/eclemma/wiki/FilteringOptions所述?任何解决方案(除了使用其他断言语句).
assertTrue:
assertTrue( myObject == null ); //1 of 2 branches
Run Code Online (Sandbox Code Playgroud)
assertTrue:
boolean test = (myObject == null); //1 of 2 branches missing
assertTrue(test); // complete
Run Code Online (Sandbox Code Playgroud)
assertNull:
assertNull( myObject ) //complete;
Run Code Online (Sandbox Code Playgroud) 该声纳页面基本上列出了不同代码覆盖率分析工具采用的各种方法:
这三种方法是什么,哪种方法效率最高?为什么?如果效率问题的答案是"它取决于",那么请解释原因?
有没有办法使用JaCoCo和tomcat7-maven-plugin嵌入式实例获取代码覆盖?
jacoco-maven-plugin在我的WAR POM中配置来检测我的单元测试,但我不确定如何将jacoco代理连接到嵌入式Tomcat实例来检测针对Tomcat运行的集成测试.鉴于嵌入了Tomcat实例,我不确定这种方法是否可行.有没有其他方法可以实现这一目标?我可以从使用Tomcat Maven插件切换到使用Cargo获取覆盖范围,但如果可能的话,我宁愿坚持使用Tomcat插件.
以下是我POM的一些相关摘要:
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.6.2.201302030002</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-failsafe-plugin</artifactId>
<version>2.14</version>
<executions>
<execution>
<id>integration-tests</id>
<goals>
<goal>integration-test</goal>
<goal>verify</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<systemProperties>
<!-- as expected, this system property doesn't work since Tomcat is embedded, but this is the type of config I'm looking for -->
<JAVA_OPTS>-javaagent:${project.build.directory}/${jacoco.jar}=destfile=${project.build.directory}/jacoco.exec,append=true</JAVA_OPTS>
</systemProperties>
</configuration>
<executions>
<execution>
<id>tomcat-startup</id>
<goals>
<goal>run-war-only</goal>
</goals>
<phase>pre-integration-test</phase>
<configuration>
<fork>true</fork>
</configuration>
</execution>
<execution>
<id>tomcat-shutdown</id>
<goals> …Run Code Online (Sandbox Code Playgroud) 我正在运行Jacoco的Maven插件.该prepare-agent目标运行正常,但不会产生jacoco.exec由于某种原因文件.随后report目标抱怨Skipping JaCoCo execution due to missing execution data file.
有任何想法吗?
我一直试图在一段时间内安静地进行Jacoco测试覆盖.我在这些主题中尝试了几种可能的解决方案:
使用JaCoCo Gradle插件的Android测试代码覆盖率
如何使用Android gradle插件0.10.0或更高版本获取jacoco覆盖率报告?
我正在使用genymotion在一个emulatated设备中运行测试.这是我添加到build.gradle的内容:
apply plugin: 'jacoco'
android{
jacoco {
version "0.7.1.201405082137"
}
buildTypes{
debug{
testCoverageEnabled = true
}
}
}
jacoco {
toolVersion "0.7.1.201405082137"
}
Run Code Online (Sandbox Code Playgroud)
要运行它,我会使用类似的东西
./gradlew clean
./gradlew createFLAVOR_NAMEDebugCoverageReport
Run Code Online (Sandbox Code Playgroud)
相关生成的文件/文件夹是:
/build/intermediates/coverage-instrumented-classes
/build/intermediates/jacoco
/build/outputs/code-coverage/connected/flavors/MyFlavor/coverage.ec
Run Code Online (Sandbox Code Playgroud)
但是,@ build/reports/jacoco/test/html/index.html或任何html页面/代码覆盖率报告@/build/outputs都没有.
我还尝试创建一个专门的任务来构建一个覆盖率报告:
def coverageSourceDirs = [
'src/main/java',
]
task jacocoTestReport(type: JacocoReport, dependsOn: "connectedAndroidTestFLAVOR_NAMEDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports after running tests."
reports {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: './build/intermediates/classes/debug',
excludes: ['**/R*.class', …Run Code Online (Sandbox Code Playgroud) 我正在使用jacoco:report标签生成jacoco报告.我收到的错误如下:
[jacoco:report] Classes in bundle 'Code Coverage Report' do no match with execution data. For report generation the same class files must be used as at runtime.
[jacoco:report] Execution data for class xxxxx does not match.
[jacoco:report] Execution data for class yyyyy does not match.
Run Code Online (Sandbox Code Playgroud)
蚂蚁报告目标如下:
<target name="report">
<jacoco:report>
<executiondata>
<file file="${jacocoexec.dir}/${jacocoexec.filename}"/>
</executiondata>
<!-- the class files and optional source files ... -->
<structure name="Code Coverage Report">
<classfiles>
<fileset file="./jar/abc.jar"/>
</classfiles>
<sourcefiles>
<fileset dir="./code/src"/>
</sourcefiles>
</structure>
<!-- to produce reports …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Jacoco为Kotlin做声纳设置以生成代码覆盖率报告,但它没有显示任何代码覆盖率.在检查Sonar控制台时,它显示以下错误.任何人之前都遇到过这个问题,任何建议可能会错过.
元信息
插件使用sonarqube版本"2.6.1"
gradleVersion ='3.0.1'
kotlinVersion ='1.2.21'
Sonarqube版本=版本6.7.1(版本35068) - LGPL v3
令人沮丧的是,我的设置项目生成空白代码覆盖率报告:(.PFA.
编辑:请找到项目结构快照.
我正在添加声纳和Jacoco gradle文件设置我正用于生成声纳矩阵报告.
这是sonar.gradle文件:
sonarqube {
properties {
property "sonar.projectKey", "jacoco.sonar.test"
property "sonar.projectName", "Sonar Jacoco Test"
property "sonar.projectVersion", "1.1"
property "sonar.java.source", "7"
property "sonar.android.lint.report", "build/outputs/lint-results.xml"
property "sonar.java.binaries", "build/tmp/kotlin-classes"
property "sonar.java.test.binaries", "build/intermediates/classes/test/,build/tmp/kotlin-classes/devDebugUnitTest"
property "sonar.tests","src/test/java"
property "sonar.sources","src/main/java"
property "sonar.java.coveragePlugin", "jacoco"
property "sonar.jacoco.reportPaths","build/jacoco/testDevDebugUnitTest.exec"
property "sonar.junit.reportsPath","build/test-results/testDevDebugUnitTest"
}
}
Run Code Online (Sandbox Code Playgroud)
这里是jacoco.gradle文件
apply plugin: 'jacoco'
jacoco {
toolVersion = "0.7.9"
reportsDir = file("${project.projectDir}/app/build/reports")
}
task jacocoTestReport(type: JacocoReport, dependsOn: "app:testDevDebugUnitTest") {
group = …Run Code Online (Sandbox Code Playgroud) 我有一个多模块Android项目,我发现jacoco报告的报道与Sonarqube报告的内容之间存在差异.该项目也是一个多风味的项目,产生了许多不同的变种.我正在使用此插件来帮助我生成所有任务.任务为每个变体生成单独的报告.
当我运行我的jacoco报告时,我看到了这个:
我的项目有一些排除,但即使没有它们,覆盖率%s也不匹配.
以下是我的相关信息:Sonar 5.6版.
Gradle runner
plugins { id "org.sonarqube" version "2.0.1" }
Run Code Online (Sandbox Code Playgroud)
声纳配置:(在root build.gradle上)
sonarqube {
properties {
property "sonar.projectKey", "com.xxx.myApp"
property "sonar.projectName", "Android My App"
property "sonar.projectVersion", "3.0"
property "sonar.java.binaries", "build/classes"
property "sonar.coveragePlugin", "jacoco"
property "sonar.jacoco.reportMissing.force.zero", "false"
}
}
Run Code Online (Sandbox Code Playgroud)
声纳配置(在app/build.gradle上)
sonarqube {
properties {
property "sonar.sources", "src/main/java"
property "sonar.tests", "src/test/java"
property "sonar.java.tests", "src/test/java"
property "sonar.junit.reportsPath", "build/test-results/myAppGoogleMobileDebug"
property "sonar.java.binaries", "build/intermediates/classes/myAppGoogleMobile/debug"
property "sonar.jacoco.reportPath", "build/jacoco/testMyAppGoogleMobileDebugUnitTest.exec"
property "sonar.coverage.exclusions", coverageExclusions
}
}
Run Code Online (Sandbox Code Playgroud)
Jacoco config on(app/build.gradle) …
是否有任何选项可以从Android Studio中的测试覆盖率报告中排除Dagger2类
我刚刚下载了最新版本的SonarQube 4.3,然后尝试使用以下命令构建一个java-8项目:
mvn clean install
mvn sonar:sonar
Run Code Online (Sandbox Code Playgroud)
这给了我下面的例外.
谷歌搜索,我得到的印象这是一个应该修复的早期问题......?
http://sonarqube.15.x6.nabble.com/Sonar-analyze-Java-1-8-project-Failure-td5023663.html
http://jira.codehaus.org/browse/SONARJAVA-482
SonarQube 4.3是否支持java-8?
或者任何线索,有什么问题?
-------------------------------------------------------
T E S T S
-------------------------------------------------------
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:386)
at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:401)
Caused by: java.lang.RuntimeException: Class java/util/UUID could not be instrumented.
at org.jacoco.agent.rt.internal_6effb9e.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:138)
at org.jacoco.agent.rt.internal_6effb9e.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:99)
at org.jacoco.agent.rt.internal_6effb9e.PreMain.createRuntime(PreMain.java:55)
at org.jacoco.agent.rt.internal_6effb9e.PreMain.premain(PreMain.java:47)
... 6 more
Caused by: java.lang.NoSuchFieldException: $jacocoAccess
at java.lang.Class.getField(Class.java:1690)
at org.jacoco.agent.rt.internal_6effb9e.core.runtime.ModifiedSystemClassRuntime.createFor(ModifiedSystemClassRuntime.java:136)
... 9 more
FATAL ERROR in native method: processing of -javaagent failed
Exception in thread "main"
Run Code Online (Sandbox Code Playgroud)