单元测试系列之一:如何使用JUnit、JaCoCo和EclEmma提升单元测试覆盖率

 

更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注我的的微信号,感谢!html

 

 

 

 

原文连接:http://www.cnblogs.com/zishi/p/6726664.htmljava

-----如何快速完成单元测试代码数据库

1.      JUnit安装(http://junit.org/junit4/ 目前最新版本是4.12)

注:下面的一些演示图片是按照我本地的4.11版本,差异不大。api

在项目上右键- Properties- java build path - Libraries, 点击Add External JARs, 选中刚刚下载的Junit包便可。如图所示:微信

 

 

 

 

或者使用如下方式添加:oracle

 

在项目上右键- Properties- java build path - Libraries, 点击Add Library…,以下图所示:eclipse

 

 

在弹出窗口中,选中Junit,点击Next按钮继续:maven

 

 

 

 

接下来就是选择当前版本,咱们目前使用的大版本是Junit 4,能够看到我本地版本为4.11,点击Finish按钮完成:函数

 

 

 

 

2.      JaCoCo和EclEmma安装

JaCoCo(Java Code Coverage)是一种分析单元测试覆盖率的工具JaCoCo(Java Code Coverage)就是一种分析单元测试覆盖率的工具,使用它运行单元测试后,能够给出代码中哪些部分被单元测试测到,哪些部分没有没测到,而且给出整个项目的单元测试覆盖状况百分比,看上去一目了然。EclEmma 是基于 JaCoCo 的一个 Eclipse 插件,开发人员能够方便的和其交互。下面简单介绍这两个工具的安装流程。工具

JaCoco安装:

首先咱们访问JaCoco网站:http://www.eclemma.org/jacoco/ 下载最新版本,目前是:http://search.maven.org/remotecontent?filepath=org/jacoco/jacoco/0.7.9/jacoco-0.7.9.zip

 

 

压缩包解压后,将其中的Jar包拷贝到Java工程下面存放第三方Jar包的目录。好比在我本地存放在这里D:\tools\luna-withtestng\luna\eclipse\plugins

 

 

 

从新启动Eclipse IDE便可加载JaCoCo插件。接下来咱们安装EclEmma:

 

打开 Eclipse 的软件市场,在其中搜索 EclEmma,找到后完成安装,以下图所示:

 

 

 

 

直接安装便可。

3.      自动生成单元测试代码(默认Java项目已Ready):

选择须要生成单元测试代码的项目,并在须要生成测试代码的类上点右键 -  New – Other…,以下图所示:

 

 

 

 

在弹出窗口选择JUnit文件夹,点击展开,选择第一个“JUnit Test Case”,而后点击“Next”:

 

 

 

 

确认一下选中的Junit版本,其余所有按照默认选项便可:

 

 

 

确认无误,点击“Next”按钮,进入下一步:

 

 

 

此处选中咱们须要生成单元测试代码的方法便可,此处我选择了以前写好的两个须要测试的函数,而后点击”Finish”按钮,最终对应生成的单元测试代码以下:

 

 

 

4.      运行单元测试

鼠标选中要运行的代码,EclEmma安装后直接能够点击IDE上方的工具栏,有一个运行按钮,以下图:

 

 

注:若是没有安装EclEmma插件,能够经过菜单Run As – Junit test执行单元测试

 

毫无疑问的,此次运行失败了:

 

 

 

详细的失败log以下:

 

HelloWorldTest.testAddMethod

testAddMethod(com.test.jacoco.HelloWorldTest)

java.lang.AssertionError: Not yet implemented

 at org.junit.Assert.fail(Assert.java:88)

 at com.test.jacoco.HelloWorldTest.testAddMethod(HelloWorldTest.java:19)

 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

  ………..

     

从上方的抛出的信息中,能够看到咱们生成的断言中指定的消息“Not yet implemented”,另外,失败缘由是咱们默认生成的是一个fail断言,咱们看一下关于fail断言的描述:

 

static void

fail()
Fails a test with no message.

static void

fail(String message)
Fails a test with the given message.

 

因此很是清楚的知道,这个断言的用途就是为了使单元测试当即失败,它其实并无测试到咱们的具体代码。

接下来咱们给他们分别添加具体的测试代码和断言,以下图所示:

 

 

 

代码完成以后,继续调用Run As – Junit test,运行,此次毫无疑问运行成功了,看下图:

 

 

 

 

这样咱们就完成了两个函数的单元测试代码覆盖。这里咱们又用到了两个经常使用断言:assertNotNull() assertEquals()。Junit提供不少断言方法给咱们,正确使用这些断言能够帮助咱们肯定被测试的函数是否按照预期的效果正常工做了,很是方便。咱们在本文的最后部分提供了附录文档,详细介绍了Junit的所有断言目录,有兴趣的同窗能够继续查看。

 

5.      查看单元测试覆盖率

JaCoCo和EclEmma安装完成后增长了如下特性:

 

1、未覆盖代码标记为红色,以下图:

 

 

2、已覆盖代码会标记为绿色,如图所示:

 

 

3、固然也有部分覆盖的状况,如图所示(还有多是由于代码未彻底执行):

 

 

 

4、在Eclipse下方的状态栏窗口,增长了一栏“Coverage”,点击能够显示详细的代码覆盖率:

 

5、颜色也能够在Eclipse中自定义设置:

 

 

 

 

 

 

以上是本次插件的所有介绍。咱们经过这些工具能够快速生成单元测试代码,并利用分析工具将单元测试覆盖率尽可能提升,这样咱们对本身开发的代码更有信心了。固然,咱们在这里并非为了单纯的追求这个数字,在增长单元测试覆盖率的诱导下,咱们从新理清了测试的步骤,写出了更有意义、更全面的单元测试。并且根据单元测试分析工具给的反馈,咱们还发现了先前没有想到的情形。所以,单元测试的覆盖率并不仅是一个为了取悦管理者的数据,它实实在在地帮助咱们改善了代码的质量,增长了咱们对所编写代码的信心。

6.  附录文档:Junit Assert目录

 

Junit Assert目录

static void

assertArrayEquals(boolean[] expecteds, boolean[] actuals)
Asserts that two boolean arrays are equal.

static void

assertArrayEquals(byte[] expecteds, byte[] actuals)
Asserts that two byte arrays are equal.

static void

assertArrayEquals(char[] expecteds, char[] actuals)
Asserts that two char arrays are equal.

static void

assertArrayEquals(double[] expecteds, double[] actuals, double delta)
Asserts that two double arrays are equal.

static void

assertArrayEquals(float[] expecteds, float[] actuals, float delta)
Asserts that two float arrays are equal.

static void

assertArrayEquals(int[] expecteds, int[] actuals)
Asserts that two int arrays are equal.

static void

assertArrayEquals(long[] expecteds, long[] actuals)
Asserts that two long arrays are equal.

static void

assertArrayEquals(Object[] expecteds, Object[] actuals)
Asserts that two object arrays are equal.

static void

assertArrayEquals(short[] expecteds, short[] actuals)
Asserts that two short arrays are equal.

static void

assertArrayEquals(String message, boolean[] expecteds, boolean[] actuals)
Asserts that two boolean arrays are equal.

static void

assertArrayEquals(String message, byte[] expecteds, byte[] actuals)
Asserts that two byte arrays are equal.

static void

assertArrayEquals(String message, char[] expecteds, char[] actuals)
Asserts that two char arrays are equal.

static void

assertArrayEquals(String message, double[] expecteds, double[] actuals, double delta)
Asserts that two double arrays are equal.

static void

assertArrayEquals(String message, float[] expecteds, float[] actuals, float delta)
Asserts that two float arrays are equal.

static void

assertArrayEquals(String message, int[] expecteds, int[] actuals)
Asserts that two int arrays are equal.

static void

assertArrayEquals(String message, long[] expecteds, long[] actuals)
Asserts that two long arrays are equal.

static void

assertArrayEquals(String message, Object[] expecteds, Object[] actuals)
Asserts that two object arrays are equal.

static void

assertArrayEquals(String message, short[] expecteds, short[] actuals)
Asserts that two short arrays are equal.

static void

assertEquals(double expected, double actual)
Deprecated. Use assertEquals(double expected, double actual, double delta) instead

static void

assertEquals(double expected, double actual, double delta)
Asserts that two doubles are equal to within a positive delta.

static void

assertEquals(float expected, float actual, float delta)
Asserts that two floats are equal to within a positive delta.

static void

assertEquals(long expected, long actual)
Asserts that two longs are equal.

static void

assertEquals(Object[] expecteds, Object[] actuals)
Deprecated. use assertArrayEquals

static void

assertEquals(Object expected, Object actual)
Asserts that two objects are equal.

static void

assertEquals(String message, double expected, double actual)
Deprecated. Use assertEquals(String message, double expected, double actual, double delta) instead

static void

assertEquals(String message, double expected, double actual, double delta)
Asserts that two doubles are equal to within a positive delta.

static void

assertEquals(String message, float expected, float actual, float delta)
Asserts that two floats are equal to within a positive delta.

static void

assertEquals(String message, long expected, long actual)
Asserts that two longs are equal.

static void

assertEquals(String message, Object[] expecteds, Object[] actuals)
Deprecated. use assertArrayEquals

static void

assertEquals(String message, Object expected, Object actual)
Asserts that two objects are equal.

static void

assertFalse(boolean condition)
Asserts that a condition is false.

static void

assertFalse(String message, boolean condition)
Asserts that a condition is false.

static void

assertNotEquals(double unexpected, double actual, double delta)
Asserts that two doubles are not equal to within a positive delta.

static void

assertNotEquals(float unexpected, float actual, float delta)
Asserts that two floats are not equal to within a positive delta.

static void

assertNotEquals(long unexpected, long actual)
Asserts that two longs are not equals.

static void

assertNotEquals(Object unexpected, Object actual)
Asserts that two objects are not equals.

static void

assertNotEquals(String message, double unexpected, double actual, double delta)
Asserts that two doubles are not equal to within a positive delta.

static void

assertNotEquals(String message, float unexpected, float actual, float delta)
Asserts that two floats are not equal to within a positive delta.

static void

assertNotEquals(String message, long unexpected, long actual)
Asserts that two longs are not equals.

static void

assertNotEquals(String message, Object unexpected, Object actual)
Asserts that two objects are not equals.

static void

assertNotNull(Object object)
Asserts that an object isn't null.

static void

assertNotNull(String message, Object object)
Asserts that an object isn't null.

static void

assertNotSame(Object unexpected, Object actual)
Asserts that two objects do not refer to the same object.

static void

assertNotSame(String message, Object unexpected, Object actual)
Asserts that two objects do not refer to the same object.

static void

assertNull(Object object)
Asserts that an object is null.

static void

assertNull(String message, Object object)
Asserts that an object is null.

static void

assertSame(Object expected, Object actual)
Asserts that two objects refer to the same object.

static void

assertSame(String message, Object expected, Object actual)
Asserts that two objects refer to the same object.

static

<T> void

assertThat(String reason, T actual, Matcher<? super T> matcher)
Asserts that actual satisfies the condition specified by matcher.

static

<T> void

assertThat(T actual, Matcher<? super T> matcher)
Asserts that actual satisfies the condition specified by matcher.

static void

assertTrue(boolean condition)
Asserts that a condition is true.

static void

assertTrue(String message, boolean condition)
Asserts that a condition is true.

static void

fail()
Fails a test with no message.

static void

fail(String message)
Fails a test with the given message.

 

感谢阅读,做者原创技术文章,转载请注明出处

 其余推荐相关阅读:

单元测试系列之一:如何使用JUnit、JaCoCo和EclEmma提升单元测试覆盖率

测试系列之二Mock工具Jmockit实战

单元测试系列之三:JUnit单元测试规范

单元测试系列之四:Sonar平台中项目主要指标以及代码坏味道详解

单元测试系列之五:Mock工具之Mockito实战

单元测试系列之六:JUnit5 技术前瞻

单元测试系列之七:Sonar 数据库表关系整理一(rule相关)

单元测试系列之八:Sonar 数据库表关系整理一(续)

单元测试系列之九:Sonar 经常使用代码规则整理(一)

单元测试系列之十:Sonar 经常使用代码规则整理(二)

单元测试系列之十一:Jmockit之mock特性详解

相关文章
相关标签/搜索