單元測試系列之一:如何使用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特性詳解

相關文章
相關標籤/搜索