ves*_*sii 6 java code-coverage jacoco eclemma
我们使用非 Java 测试。他们每个人都执行我们用 Java 编写的工具。我正在尝试使用 Eclemma 来创建测试的覆盖率报告。让我们从一项测试开始。我们用build.xml. 我想以某种方式为每个测试创建一个覆盖率报告,然后将它们合并到一个主报告中。我发现Jacoco 有我可以用来合并这些报告的CMD 界面。但我不明白如何使用覆盖包运行该工具?
我对 Java 覆盖的整个概念有点困惑。在诸如 Python 和 Perl 之类的动态语言中,我只是使用覆盖率模块执行代码,它会创建覆盖率报告。
我们用来执行工具的命令:
gandu -vm /usr/pkgs/java/1.6.0.25-64/bin/java -configuration /.ganduData -data /.ganduData -configuration /ganduInternalConfig --session_id 1582722179
Run Code Online (Sandbox Code Playgroud)
我应该添加一些选项吗?
内置build.xml:
<target name="pde-build" depends="clean, init">
<java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true">
<arg value="-application" />
<arg value="org.eclipse.ant.core.antRunner" />
<arg value="-buildfile" />
<arg value="${eclipseLocation}/plugins/org.eclipse.pde.build_${pdeBuildPluginVersion}/scripts/productBuild/productBuild.xml" />
<arg value="-Dtimestamp=${timestamp}" />
<classpath>
<pathelement location="${eclipseLocation}/plugins/org.eclipse.equinox.launcher_${equinoxLauncherPluginVersion}.jar" />
</classpath>
</java>
</target>
Run Code Online (Sandbox Code Playgroud)
我应该添加以下命令吗?
<arg value="-autVMArgs" />
<arg value="-Xmx800m;-XX:MaxPermSize=600M;-javaagent:${jacoco-agent-path}=destfile=${jacoco-report},append=true"/>
Run Code Online (Sandbox Code Playgroud)
更新:感谢这两个答案,我设法使用 CLI 创建了报告。但看起来它显示(几乎)零覆盖率。它在我看到已执行的打印行上显示红色(未覆盖)(它们已打印到标准输出)。
该项目包含很多包,但第一次尝试时,我正在尝试为特定包创建覆盖率报告。我跑了:
gandu -vm /usr/pkgs/java/1.6.0.25-64/bin/java -configuration /.ganduData -data /.ganduData --session_id 1583967465 -vmargs -Xmx256m -Xms128m -javaagent:/jacoco_coverage/jacoco-0.8.5/lib/jacocoagent.jar
Run Code Online (Sandbox Code Playgroud)
然后我跑了:
/usr/pkgs/java/1.6.0.16-64/bin/java -jar /jacoco_coverage/jacoco-0.8.5/lib/jacococli.jar report jacoco.exec --classfiles /gandu_repo/com.core.gandu/bin/ --html temp_dir --sourcefiles /gandu_repo/com.core.gandu/src/
Run Code Online (Sandbox Code Playgroud)
输出:
[WARN] Some classes do not match with execution data.
[WARN] For report generation the same class files must be used as at runtime.
[WARN] Execution data for class <PATH> does not match.
[INFO] Analyzing 8 classes.
Run Code Online (Sandbox Code Playgroud)
我很难理解如何classfiles和sourcefiles。我试图覆盖的文件是Application. 在binI have in some internal folderApplication.class和 in srcI have in some internal folder 中Application.java。我什至尝试为这些文件添加完整路径classfiles,sourcefiles但仍然没有覆盖(全部为红色)。可能是什么问题呢?工具的结构: 根包含很多包,每个包都有文件夹bin和src. 每个src文件夹都包含带有 Java 文件的递归文件夹。该bin具有相同的结构class文件。
据我所知,添加 java 代理的唯一地方是在单元测试的配置中。
应将代理添加到执行被测应用程序的 JVM。您的困惑可能来自这样一个事实,即单元测试通常与被测代码在同一个 JVM 中执行。
从您的描述中不清楚应用程序的 JVM 是如何启动的。
但是,请考虑以下src/Main.java示例:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception {
String input;
try (BufferedReader reader = new BufferedReader(new InputStreamReader(System.in))) {
input = reader.readLine();
}
if ("hello".equals(input)) {
System.out.println("Hello, World!");
}
}
}
Run Code Online (Sandbox Code Playgroud)
编译后
javac -d classes src/Main.java
Run Code Online (Sandbox Code Playgroud)
这个应用程序可以在 JVM 中使用从JaCoCo zip 分发中获取的JaCoCo Java Agent执行,如下所示
java -javaagent:jacoco/lib/jacocoagent.jar -cp classes Main
Run Code Online (Sandbox Code Playgroud)
然后执行测试——例如在这种情况下手动输入“hello”。
JVM 正常终止后,您将获得jacoco.exec文件。
通过将 this jacoco.exec、源文件和类文件传递给JaCoCo 命令行界面,您可以创建 HTML 报告:
java -jar jacoco/lib/jacococli.jar report jacoco.exec --classfiles classes --sourcefiles src --html report
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个覆盖包?是 Eclemma 还是 Jacoco?
EclEmma 是一个基于 JaCoCo 的 Eclipse IDE 插件。
如果为了测试您从 Eclipse IDE 执行您的应用程序,那么您可以使用 EclEmma 通过 JaCoCo 启动它。下面是在 Eclipse IDE 中执行的相同示例:
但是,这不适用于其他场景,例如 Ant 构建。
如何使用覆盖包运行该工具?我应该将它添加到 build.xml 文件中吗?我应该将它添加到命令行吗?
这取决于你如何执行你的应用程序——如果你的应用程序是由 Ant 执行的测试,那么你可以使用JaCoCo Ant Tasks来配置代理和生成报告。例如,这里build.xml的 Ant 生成与src/Example.java上述命令相同的报告:
<project xmlns:jacoco="antlib:org.jacoco.ant" name="Example Ant Build with JaCoCo" default="rebuild">
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="jacoco/lib/jacocoant.jar"/>
</taskdef>
<target name="clean">
<delete dir="classes"/>
<delete dir="report"/>
<delete file="jacoco.exec"/>
</target>
<target name="compile">
<mkdir dir="classes"/>
<javac srcdir="src" destdir="classes" debug="true" includeantruntime="false"/>
</target>
<target name="run" depends="compile">
<jacoco:agent property="jacocoAgent" />
<java classname="Main" fork="true">
<classpath path="classes"/>
<jvmarg value="${jacocoAgent}"/>
</java>
</target>
<target name="report" depends="run">
<jacoco:report>
<executiondata>
<file file="jacoco.exec"/>
</executiondata>
<structure name="JaCoCo Ant Example">
<classfiles>
<fileset dir="classes"/>
</classfiles>
<sourcefiles encoding="UTF-8">
<fileset dir="src"/>
</sourcefiles>
</structure>
<html destdir="report"/>
</jacoco:report>
</target>
<target name="rebuild" depends="clean,report"/>
</project>
Run Code Online (Sandbox Code Playgroud)
如果应用程序是由一些自定义的自制工具执行的,那么直接将代理添加到命令行可能会更好。