1. 程式人生 > >熟悉Junit單元測試方法

熟悉Junit單元測試方法

imp 項目 tno public ESS mat leave .com parameter

定義:

JUnit是一個Java語言的單元測試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源於Kent Beck的sUnit的xUnit家族中最為成功的一個。 JUnit有它自己的JUnit擴展生態圈。多數Java的開發環境都已經集成了JUnit作為單元測試的工具。

JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟件如何(How)完成功能和完成什麽樣(What)的功能。Junit是一套框架,繼承TestCase類,就可以用Junit進行自動測試了。

特性:

JUnit是一個開放源代碼的Java測試框架,用於編寫和運行可重復的測試。他是用於單元測試框架體系xUnit的一個實例(用於java語言)。它包括以下特性:

1、用於測試期望結果的斷言(Assertion)

2、用於共享共同測試數據的測試工具

3、用於方便的組織和運行測試的測試套件

4、圖形和文本的測試運行器

Junit4單元測試的基本用法:(開發環境myeclipse10.7)

1. 準備工作
1.1. 選擇需要單元測試的文件
創建maven工程,右擊需要單元測試的文件,選擇New->other,選擇Junit Test Case; 1.2. 選擇Junit 4
代碼放到src/test/java 1.3. 選擇單元測試函數
添加Junit 4 引用 1.4. 生成test文件
2. 開始測試
2.1. 測試單個函數
方法1:鼠標選到帶測試函數名上,右擊,Run As Junit Test; 方法2:在Junit View裏選擇要測試的函數,右擊Run; 2.2. 測試整個類
方法1:鼠標選到類上,右擊,Run As Junit Test; 方法2:在Junit View裏選擇要測試的類,右擊Run; 3. 常用技巧
3.1. 常用註解
在junit中常用的註解有@Test、@Ignore、@BeforeClass、@AfterClass、@Before、@After、@Runwith、@Parameters JUnit4的測試類不用再繼承TestCase類了。使用註解會方便很多。 @Before 初始化方法 @After 釋放資源 @Test 測試方法,在這裏可以測試期望異常和超時時間 @Ignore 忽略的測試方法 @BeforeClass 針對所有測試,只執行一次,且必須為static void @AfterClass 針對所有測試,只執行一次,且必須為static void @RunWith 指定測試類使用某個運行器 @Parameters 指定測試類的測試數據集合 @Rule 允許靈活添加或重新定義測試類中的每個測試方法的行為 @FixMethodOrder 指定測試方法的執行順序 一個JUnit 4 的單元測試用例執行順序為:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
每一個測試方法的調用順序為:
@Before –> @Test –> @After 3.1.1. @Test
@Test註解的publicvoid方法將會被當做測試用例 JUnit每次都會創建一個新的測試實例,然後調用@Test註解方法 任何異常的拋出都會認為測試失敗 @Test註解提供2個參數: 1,“expected”,定義測試方法應該拋出的異常,如果測試方法沒有拋出異常或者拋出了一個不同的異常,測試失敗 2,“timeout”,如果測試運行時間長於該定義時間,測試失敗(單位為毫秒) [java] view plaincopy 1. public class MathTest { 2. @Test(expected=Exception.class) 3. public void testAdd() throws Exception{ 4. throw new Exception(); 5. } 6. } [java] view plaincopy 1. public class MathTest { 2. @Test(timeout=5000) 3. public void testAdd() { 4. for(;;){ 5. 6. } 7. } 8. } 3.1.2. @Before
當編寫測試方法時,經常會發現一些方法在執行前需要創建相同的對象 使用@Before註解一個publicvoid 方法會使該方法在@Test註解方法被執行前執行(那麽就可以在該方法中創建相同的對象) 父類的@Before註解方法會在子類的@Before註解方法執行前執行 3.1.3. @After
如果在@Before註解方法中分配了額外的資源,那麽在測試執行完後,需要釋放分配的資源。 使用@After註解一個publicvoid方法會使該方法在@Test註解方法執行後被執行 即使在@Before註解方法、@Test註解方法中拋出了異常,所有的@After註解方法依然會被執行,見示例 父類中的@After註解方法會在子類@After註解方法執行後被執行 3.1.4. @BeforeClass
有些時候,一些測試需要共享代價高昂的步驟(如數據庫登錄),這會破壞測試獨立性,通常是需要優化的 使用@BeforeClass註解一個publicstatic void 方法,並且該方法不帶任何參數,會使該方法在所有測試方法被執行前執行一次,並且只執行一次 父類的@BeforeClass註解方法會在子類的@BeforeClass註解方法執行前執行 3.1.5. @AfterClass
如果在@BeforeClass註解方法中分配了代價高昂的額外的資源,那麽在測試類中的所有測試方法執行完後,需要釋放分配的資源。 使用@AfterClass註解一個publicstatic void方法會使該方法在測試類中的所有測試方法執行完後被執行 即使在@BeforeClass註解方法中拋出了異常,所有的@AfterClass註解方法依然會被執行 父類中的@AfterClass註解方法會在子類@AfterClass註解方法執行後被執行 3.1.6. @Ignore
對包含測試類的類或@Test註解方法使用@Ignore註解將使被註解的類或方法不會被當做測試執行 JUnit執行結果中會報告被忽略的測試數 [java] view plaincopy 1. public class MathTest { 2. @Ignore("do not test") 3. @Test 4. public void testAdd() { 5. Math m = new Math(); 6. assertTrue(m.add(1, 1) == 2); 7. } 8. } [java] view plaincopy 1. @Ignore 2. public class MathTest { 3. @Test 4. public void testAdd() { 5. Math m = new Math(); 6. assertTrue(m.add(1, 1) == 2); 7. } 8. } 執行結果相同:
3.2. 制定執行順序
JUnit4.11之後提供了MethodSorters,可以有三種方式對test執行順序進行指定,如下:
/** * Sorts the test methods by the methodname, in lexicographic order, with {@link Method#toString()} used as a tiebreaker */ NAME_ASCENDING(MethodSorter.NAME_ASCENDING), /** * Leaves the test methods in the orderreturned by the JVM. Note that the order from the JVM may vary from run to run */ JVM(null), /** * Sorts the test methods in adeterministic, but not predictable, order */ DEFAULT(MethodSorter.DEFAULT);
可以小試牛刀一下: 3.2.1. 使用DEFAULT方式
默認使用一個確定的,但不可預測的順序
package com.netease.test.junit; import org.apache.log4j.Logger; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; /** * User: hzwangxx * Date: 14-3-31 * Time: 15:35 */ @FixMethodOrder(MethodSorters.DEFAULT) public class TestOrder { private static final Logger LOG = Logger.getLogger(TestOrder.class); @Test public void testFirst() throws Exception{ LOG.info("------1--------"); } @Test public void testSecond() throwsException { LOG.info("------2--------"); } @Test public void testThird() throwsException { LOG.info("------3--------"); } } /* output: 2014-03-3116:04:15,984 0 [main] INFO - ------1-------- 2014-03-3116:04:15,986 2 [main] INFO - ------3-------- 2014-03-3116:04:15,987 3 [main] INFO - ------2-------- */
3.2.2. 按字母排序
根據測試方法的方法名排序,按照詞典排序規則(ASC,從小到大,遞增)。
package com.netease.test.junit; import org.apache.log4j.Logger; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; /** * User: hzwangxx * Date: 14-3-31 * Time: 15:35 */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestOrder { private static final Logger LOG = Logger.getLogger(TestOrder.class); @Test public void testFirst() throwsException { LOG.info("------1--------"); } @Test public void testSecond() throwsException { LOG.info("------2--------"); } @Test public void testThird() throws Exception{ LOG.info("------3--------"); } } /* 2014-03-3116:10:25,360 0 [main] INFO - ------1-------- 2014-03-3116:10:25,361 1 [main] INFO - ------2-------- 2014-03-3116:10:25,362 2 [main] INFO - ------3-------- */
3.3. 常用斷言
斷言是編寫測試用例的核心實現方式,即期望值是多少,測試的結果是多少,以此來判斷測試是否通過。 assertArrayEquals(expecteds, actuals) 查看兩個數組是否相等。 assertEquals(expected, actual) 查看兩個對象是否相等。類似於字符串比較使用的equals()方法 assertNotEquals(first, second) 查看兩個對象是否不相等。 assertNull(object) 查看對象是否為空。 assertNotNull(object) 查看對象是否不為空。 assertSame(expected, actual) 查看兩個對象的引用是否相等。類似於使用“==”比較兩個對象 assertNotSame(unexpected, actual) 查看兩個對象的引用是否不相等。類似於使用“!=”比較兩個對象 assertTrue(condition) 查看運行結果是否為true。 assertFalse(condition) 查看運行結果是否為false。 assertThat(actual, matcher) 查看實際值是否滿足指定的條件 fail() 讓測試失敗 4. 常見問題
4.1. java.lang.ClassNotFoundException
右擊項目,Run As Maven Test,等待test完成就不報該錯誤了。

熟悉Junit單元測試方法