测试覆盖率
为了衡量代码覆盖率,GWT 支持 EMMA,这是一个广泛用于 Java 代码的代码覆盖率工具。为了能够与其他 EMMA 工具进行交互,GWT 在离线模式下使用 EMMA,也就是说,GWT 使用由 EMMA 注入的类来代替它通过编译 Java 源文件获得的类。
我们提供两种测量代码覆盖率的方法:(i)在 Eclipse 中使用 EclEmma 插件和(ii)使用命令行工具。对于这两种方法,请使用 GWT 下载页面上的 EMMA jar - 它包含一个补丁,因此即使同一个类被不同的类加载器加载,EMMA 也不会丢弃覆盖率数据,这在 GWT 中很常见。
示例
作为运行示例,假设我们使用提供的 webAppCreator
和 junitCreator
工具创建一个项目,如下所示
./webAppCreator -out myapp
-junit ../../../../gwt-tools/lib/junit/junit-3.8.1.jar
com.example.myapp.MyApp
将以下 computeFactorial()
方法添加到 MyApp.java 中,并将虚拟 testFactorial()
方法添加到 MyAppTest.java 中
int computeFactorial(int number) {
if (number ≤ 1) {
return 1;
}
return number * computeFactorial(number - 1);
}
public void testFactorial() {
}
以下部分将使用此示例。
使用 EclEmma,EMMA 的 Eclipse 插件
步骤 1:安装 EclEmma 的补丁版本 - Eclipse 插件
- 请按照 http://www.eclemma.org/installation.html 上的说明安装 EclEmma。
确认在 **运行** 菜单中有一个“覆盖率”块。
步骤 2:为在开发模式下运行测试创建“运行配置”
请按照 在 Eclipse 中运行测试 的说明进行操作。
步骤 3:获取初始覆盖率数据
要获取覆盖率数据,请从覆盖率选项卡中选择配置,然后单击“覆盖率”。在 Eclipse 窗口的以下屏幕截图中,您可以看到 src
文件夹的覆盖率为 0(195 条指令中 0 条指令被覆盖),而测试文件夹的覆盖率为 100%(9 条指令被覆盖)。运行时,您的数字可能会有所不同,因为我们一直在更新 webAppCreator 生成的入门应用程序。请注意,这些指令是字节码指令;EclEmma 会将它们尽可能地映射回 Java 源代码。EclEmma 使用颜色突出显示行
- 已覆盖的行 = 绿色
- 部分覆盖的行 = 黄色
- 未覆盖的行 = 红色
此结果在意料之中,因为默认情况下,MyAppTest.java 文件没有执行任何应用程序代码。它有一个简单的测试,该测试返回 true。
步骤 4:提高覆盖率
通过创建 testFactorial 方法来增强 MyAppTest.java
public void testFactorial() {
assertEquals(1, new MyApp().computeFactorial(0));
}
运行覆盖率后,我们现在看到,computeFactorial
方法中的 13 条指令(下图显示了 computeFactorial
方法中的总指令数)中有 5 条指令被覆盖。(请注意,这些指令是字节码指令。)让我们在 testFactorial() 中添加另一条语句,用于测试大于 0
的数字的阶乘计算,使该方法变为
public void testFactorial() {
assertEquals(1, new MyApp().computeFactorial(0));
assertEquals(2, new MyApp().computeFactorial(2));
}
运行覆盖率后,我们现在看到,computeFactorial()
方法的覆盖率确实如预期的那样为 100%。Eclipse 窗口的以下屏幕截图显示了最终的覆盖率信息。您可以深入到各个类和方法,以查找所需粒度的覆盖率信息。您还可以将覆盖率数据导出为 html 或 xml 格式,以便跟踪代码覆盖率随时间的变化。
使用命令行工具
由于 GWT 需要一个经过修补的 EMMA 版本,请使用 GWT 下载页面上的 EMMA jar。获取覆盖率结果需要执行以下步骤
- 步骤 i - 生成类文件
- 步骤 ii - 使用 Emma 注入类文件 - 这将生成一个 coverage.em 文件
- 步骤 iii - 将修改后的 emma.jar 放入类路径中后,运行测试代码
(黄色文本是工具的输出。为方便起见,我们将修补后的 EMMA jar 复制为当前目录中的 emma.jar。)
# step i: generate the class files
<strong>ant devmode</strong>
# step ii: use emma to instrument the class files, creates a coverage.em file
<strong>java -cp emma.jar emma instr -m overwrite -cp war/WEB-INF/classes/com/example/myapp/client </strong>
<span style="background: #FD5;">EMMA: processing instrumentation path ...
EMMA: instrumentation path processed in 231 ms
EMMA: [5 class(es) instrumented, 0 resource(s) copied]
EMMA: metadata merged into [PARENT_DIR/samples/com/example/myapp/coverage.em] {in 17 ms}</span>
# step iii: run the test code after putting the modified emma.jar in the classpath; generates a coverage.ec file
<strong>ant test.dev</strong>
<span style="background: #FD5;">EMMA: collecting runtime coverage data ...
..
Time: 12.968
OK (2 tests)
EMMA: runtime coverage data merged into [PARENT_DIR/samples/com/example/myapp/coverage.ec] {in 22 ms}</span>
# step iv: generate the coverage report HTML file
<strong>java -cp emma.jar emma report -r html -in coverage.em,coverage.ec </strong>
<span style="background: #FD5;">EMMA: processing input files ...
EMMA: 2 file(s) read and merged in 13 ms
EMMA: writing [html] report to [PARENT_DIR/samples/com/example/myapp/coverage/index.html] ...</span>
请按照 EclEmma 部分的 步骤 4 提高覆盖率。随着您添加更多测试,您可以看到覆盖率不断增加。