代码覆盖测试-Code Coverage Testing with EclEmma-使用篇
2010-12-15 11:36
471 查看
使用 EclEmma
测试
Java
程序
为了实验 EclEmma 的特性,我们首先在 Eclipse 的 Workspace 中建立一个名称为 test
.emma 的新 Java 项目。接下来,我们在其中建立一个
类,其代码如下所示:
package test.emma;
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args) {
int rand = (int) (Math.random()*100);
if(rand%2==0){
System.out.println( "Hello, world! 0");
}
else
System.out.println("Hello, world! 1");
int result = rand%2==0? rand+rand:rand*rand;
System.out.println(result);
}
}
接下来,我们通过 EclEmma 运行
函数。
图 3 对 Java 应用程序进行覆盖测试
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig003.jpg)
执行完毕之后,我们正在编辑 HelloWorld.java 的窗口将会变成如下所示:
图 4 进行覆盖测试的结果
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig004.jpg)
在
Java 编辑器中,EclEmma
用不同的色彩标示了源代码的测试情况。其中,绿色的行表示该行代码被完整的执行,红色部分表示该行代码根本没有被执行,而黄色的行表明该行代码部分被执
行。黄色的行通常出现在单行代码包含分支的情况,例如上图中的 16
行就显示为黄色。由于程序中有一个随机确定的分支,因此读者的窗口可能与这里稍有不同(11 行或者 14 行中有且只有一个红色的行)。
除了在源代码编辑窗口直接进行着色之外,EclEmma 还提供了一个单独的视图来统计程序的覆盖测试率。
图 5 察看程序的覆盖测试率
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig005.jpg)
EclEmma 提供的 Coverage 视图能够分层的显示代码的覆盖测试率,上图中的信息表明我们对 HelloWorld 的一次运行覆盖了大约 68.6% 的代码。
想
在一次运行中覆盖所有的代码通常比较困难,如果能把多次测试的覆盖数据综合起来进行察看,那么我们就能更方便的掌握多次测试的测试效果。EclEmma
提供了这样的功能。现在,让我们重复数次对 HelloWorld 的覆盖测试。我们注意到 Coverage
视图总是显示最新完成的一次覆盖测试。事实上,EclEmma 为我们保存了所有的测试结果。接下来,我们将通过 Coverage
视图的工具按钮来结合多次覆盖测试的结果。
图 6 用于结合多次覆盖测试结果的工具栏按钮
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig006.jpg)
当我们多次运行 Coverage 之后,我们可以单击上图所示工具栏按钮。之后,一个对话框将被弹出以供用户选择需要合并的覆盖测试。
图 7 选择需要合并的覆盖测试结果
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig007.jpg)
在合并完成之后,我们可以观察到 Java 编辑器和 Coverage 视图中都显示了合并之后的结果:
图 8 察看合并后的覆盖测试结果
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig008.jpg)
从
上图中,我们可以看到,通过多次运行覆盖测试,最终我们的代码达到了 91.4%
的测试覆盖率。有趣的是,图中第三行代码被标记为红色,而此行代码实际上是不可执行的。奥妙在于,我们没有生成任何 HelloWorld类的实例,因此缺省构造函数没有被调用,而 EclEmma 将这个特殊代码的覆盖状态标记在类声明的第一行。
EclEmma 的高级特性
如
果 EclEmma 只能测试 Java Application 的测试覆盖率,那么它相对命令行版本的 Emma
来说,提供的增强就不多了。相反,EclEmma 提供了很多与 Eclipse 紧密结合的功能。它不仅能测试 Java
Application,还能计算 JUnit 单元测试
,对 Eclipse 插件测试的覆盖率。从下图中我们可以看到 EclEmma 目前支持四种类型的程序。
图 9 EclEmma 的配置页面
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig009.jpg)
为了了解 EclEmma 是如何获得覆盖测试数据的,我们需要先对 Emma 有初步的了解。通常代码覆盖测试工具
都需要对被执行的代码进行修改。而 Emma 提供了两种方式来完成这件事。
预插入模式:
对程序进行测量之前,需要采用 Emma 提供的工具对 class 文件或者 jar 文件进行修改。修改完成之后的代码可以立刻被执行。覆盖测试的结果将会被存放到指定的文件中。
即时插入模式:
即
时插入模式不需要事先对代码进行修改。相反,对代码的修改是通过一个 Emma 定制的 Class
loader(类载入器)进行的。这种方式的优点很明显,我们不需要对 class 或者 jar
文件进行任何修改。缺点是我们为了获得测试的结果,需要用 Emma 提供的命令 emmarun 来执行 Java 应用程序。
使用即时插入模式的优点很明显:class 文件和 jar 文件不会被修改。而预插入模式的应用范围更为广泛,对于某些需要嵌入到框架中运行的代码来说(例如 EJB),我们只能使用预插入模式。EclEmma 仅仅使用了 Emma 的预插入模式来工作
,
不过 EclEmma 缺省会在临时目录中创建 class 文件和 jar 文件的副本来进行修改,因此在 workspace 中 class 和
jar 文件仍然保持原样。虽然听上去很好,但是由于需要修改 classpath 来使用修改过的 class 和 jar 文件,对于不能修改
classpath 的应用(例如 Eclipse RCP 和 JUnit Plugin Test)来说,我们还是只能选择修改 workspace
中的 class 文件和 jar 文件。对于 Java Application 和 JUnit 类型的覆盖测试,我们可以在配置对话框中选中“In-place instrumentation”
项来指定直接修改 Workspace 中的 .class 文件和 .jar 文件。
结论
本文通过一个简单的例子介绍了使用 EclEmma 进行覆盖测试的基本过程。EclEmma 允许软件工程师/测试工程师方便的考察测试的覆盖率,并能将测试结果以直观、简洁的方式展现给开发人员。
测试
Java
程序
为了实验 EclEmma 的特性,我们首先在 Eclipse 的 Workspace 中建立一个名称为 test
.emma 的新 Java 项目。接下来,我们在其中建立一个
HelloWorld
类,其代码如下所示:
package test.emma;
public class HelloWorld {
/**
* @param args
*/
public static void main(String[] args) {
int rand = (int) (Math.random()*100);
if(rand%2==0){
System.out.println( "Hello, world! 0");
}
else
System.out.println("Hello, world! 1");
int result = rand%2==0? rand+rand:rand*rand;
System.out.println(result);
}
}
接下来,我们通过 EclEmma 运行
HelloWorld.main()
函数。
图 3 对 Java 应用程序进行覆盖测试
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig003.jpg)
执行完毕之后,我们正在编辑 HelloWorld.java 的窗口将会变成如下所示:
图 4 进行覆盖测试的结果
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig004.jpg)
在
Java 编辑器中,EclEmma
用不同的色彩标示了源代码的测试情况。其中,绿色的行表示该行代码被完整的执行,红色部分表示该行代码根本没有被执行,而黄色的行表明该行代码部分被执
行。黄色的行通常出现在单行代码包含分支的情况,例如上图中的 16
行就显示为黄色。由于程序中有一个随机确定的分支,因此读者的窗口可能与这里稍有不同(11 行或者 14 行中有且只有一个红色的行)。
除了在源代码编辑窗口直接进行着色之外,EclEmma 还提供了一个单独的视图来统计程序的覆盖测试率。
图 5 察看程序的覆盖测试率
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig005.jpg)
EclEmma 提供的 Coverage 视图能够分层的显示代码的覆盖测试率,上图中的信息表明我们对 HelloWorld 的一次运行覆盖了大约 68.6% 的代码。
想
在一次运行中覆盖所有的代码通常比较困难,如果能把多次测试的覆盖数据综合起来进行察看,那么我们就能更方便的掌握多次测试的测试效果。EclEmma
提供了这样的功能。现在,让我们重复数次对 HelloWorld 的覆盖测试。我们注意到 Coverage
视图总是显示最新完成的一次覆盖测试。事实上,EclEmma 为我们保存了所有的测试结果。接下来,我们将通过 Coverage
视图的工具按钮来结合多次覆盖测试的结果。
图 6 用于结合多次覆盖测试结果的工具栏按钮
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig006.jpg)
当我们多次运行 Coverage 之后,我们可以单击上图所示工具栏按钮。之后,一个对话框将被弹出以供用户选择需要合并的覆盖测试。
图 7 选择需要合并的覆盖测试结果
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig007.jpg)
在合并完成之后,我们可以观察到 Java 编辑器和 Coverage 视图中都显示了合并之后的结果:
图 8 察看合并后的覆盖测试结果
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig008.jpg)
从
上图中,我们可以看到,通过多次运行覆盖测试,最终我们的代码达到了 91.4%
的测试覆盖率。有趣的是,图中第三行代码被标记为红色,而此行代码实际上是不可执行的。奥妙在于,我们没有生成任何 HelloWorld类的实例,因此缺省构造函数没有被调用,而 EclEmma 将这个特殊代码的覆盖状态标记在类声明的第一行。
EclEmma 的高级特性
如
果 EclEmma 只能测试 Java Application 的测试覆盖率,那么它相对命令行版本的 Emma
来说,提供的增强就不多了。相反,EclEmma 提供了很多与 Eclipse 紧密结合的功能。它不仅能测试 Java
Application,还能计算 JUnit 单元测试
,对 Eclipse 插件测试的覆盖率。从下图中我们可以看到 EclEmma 目前支持四种类型的程序。
图 9 EclEmma 的配置页面
![](http://www.ibm.com/developerworks/cn/java/j-lo-eclemma/fig009.jpg)
为了了解 EclEmma 是如何获得覆盖测试数据的,我们需要先对 Emma 有初步的了解。通常代码覆盖测试工具
都需要对被执行的代码进行修改。而 Emma 提供了两种方式来完成这件事。
预插入模式:
对程序进行测量之前,需要采用 Emma 提供的工具对 class 文件或者 jar 文件进行修改。修改完成之后的代码可以立刻被执行。覆盖测试的结果将会被存放到指定的文件中。
即时插入模式:
即
时插入模式不需要事先对代码进行修改。相反,对代码的修改是通过一个 Emma 定制的 Class
loader(类载入器)进行的。这种方式的优点很明显,我们不需要对 class 或者 jar
文件进行任何修改。缺点是我们为了获得测试的结果,需要用 Emma 提供的命令 emmarun 来执行 Java 应用程序。
使用即时插入模式的优点很明显:class 文件和 jar 文件不会被修改。而预插入模式的应用范围更为广泛,对于某些需要嵌入到框架中运行的代码来说(例如 EJB),我们只能使用预插入模式。EclEmma 仅仅使用了 Emma 的预插入模式来工作
,
不过 EclEmma 缺省会在临时目录中创建 class 文件和 jar 文件的副本来进行修改,因此在 workspace 中 class 和
jar 文件仍然保持原样。虽然听上去很好,但是由于需要修改 classpath 来使用修改过的 class 和 jar 文件,对于不能修改
classpath 的应用(例如 Eclipse RCP 和 JUnit Plugin Test)来说,我们还是只能选择修改 workspace
中的 class 文件和 jar 文件。对于 Java Application 和 JUnit 类型的覆盖测试,我们可以在配置对话框中选中“In-place instrumentation”
项来指定直接修改 Workspace 中的 .class 文件和 .jar 文件。
结论
本文通过一个简单的例子介绍了使用 EclEmma 进行覆盖测试的基本过程。EclEmma 允许软件工程师/测试工程师方便的考察测试的覆盖率,并能将测试结果以直观、简洁的方式展现给开发人员。
相关文章推荐
- 在Z-Stack代码中使用常量(Using Constants in Code with Z-stack)
- jooq使用自定义策略生成代码(How to use a custom strategy with the jOOQ code-generator and Maven?)
- 使用Ant+JUnit+Cobertura来实现代码覆盖自动测试
- 使用Rational PureCoverage测试代码覆盖率
- 使用Rational PureCoverage测试代码覆盖率
- 使用Rational PureCoverage测试代码覆盖率
- gcov代码覆盖测试工具使用
- CodePro Analytix 代码覆盖测试
- 使用Rational PureCoverage测试代码覆盖率
- 使用VS2008 Team System对C++本地代码进行Code Coverage Report
- 第一行代码:以太坊(2)-使用Solidity语言开发和测试智能合约
- 使用 EclEmma 进行覆盖测试
- Cocos2dx mac下使用versions下报错“linker command failed with exit code 1”
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)
- 测试当前IE浏览器文档模型版本的js代码(使用documenMode)
- android中使用代码混淆出现Conversion to Dalvik format failed with error 1错误的解决办法
- C++ code coverage profiling with GCC/GCOV
- 使用 BenchmarkDotnet 测试代码性能 【Win10】单元测试中捕获异步方法的指定异常
- EMMA: 免费java代码测试覆盖工具