一、環境搭建
對於習慣使用Eclipse開發平臺來說,Junit早已是非常通常的插件,在Eclipse開發平臺中,可以非常方便地搭建Junit測試環境。
1、在Eclipse上創建工程,任何Java工程都行。
2、引入Junit的libraries庫,選用Junit4。如下圖所示:
3、新建一個Java類,用於演示Junit4類的自動生成,java代碼如下:
- package com.hy;
- public class Demo {
- public void method1() {
- System.out.println("method1");
- }
- public void method2() {
- System.out.println("method2");
- }
- public void method3() {
- System.out.println("method3");
- }
- }
4、在該類上右鍵單擊新建,選JUnit Test Case,自動生成一個對應的測試類,如下圖所示:
4、這樣就能自動地生成對應的測試類了,測試類代碼發下:
- package com.hy;
- import static org.junit.Assert.*;
- import org.junit.After;
- import org.junit.AfterClass;
- import org.junit.Before;
- import org.junit.BeforeClass;
- import org.junit.Test;
- public class DemoTest {
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- }
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- }
- @Before
- public void setUp() throws Exception {
- }
- @After
- public void tearDown() throws Exception {
- }
- @Test
- public void testMethod1() {
- fail("Not yet implemented");
- }
- @Test
- public void testMethod2() {
- fail("Not yet implemented");
- }
- @Test
- public void testMethod3() {
- fail("Not yet implemented");
- }
- }
5、如此一來,測試類環境的搭建過程就完成了,最後要做的就是,根據實際的業務需求,對測試類中的測試方法編寫單元測試代碼,直到運行調通。
二、基本規則
從上面的演示可知,測試類名一般都以Test結尾,測試方法名以test開頭。這個也是Junit的基本命名規則。
三、Junit註解
我們此次針對的是Junit4版本,註解也是在Junit4版本纔有的,之前的版本並無註解功能。而註解開發基本上被認爲是一種優秀的設計,所以我們寫單元測試用例時,儘可能地去了解並使用註解。
@Test:使用該註解的方法爲測試方法,自動運行時能夠識別並被執行
包含兩個參數:expected=XXXException.class 期望出現的異常
timeout=xxx 設定程序運行的超時時間
@Ignore:被忽略的測試方法
@Before:在每個測試方法之前運行
@After: 在每個測試方法之後運行
@BeforeClass:在所有測試開始之前運行
@AfterClass:在所有測試開始之後運行
以上幾個就是Junit 4的關鍵註解,熟練使用這幾個註解,將來的測試用例編寫肯定能事半功倍。
注意:@Before與@BeforeClass的區別
@Before會加在每個方法前執行,即有幾個@Test就會執行幾遍。
@BeforeClass 只在所有測試之前執行,只會執行一次。並且@BeforeClass修飾的方法必須是公有的靜態方法(public static )。
@After和@AfterClass也類似
每個測試類中這四個註解不能重複使用,一個方法只能從這四個註解中挑選其中一個。
四、基本寫法
1、setUp(),tearDown(),setUpBeforeClass(),tearDownAfterClass()這四個方法其實就是對應的@Before、@BeforeClass、@After、@AfterClass這四個註解,在Junit4開始使用註解時,其實可以替代這四個方法的功能,只是這四個方法是歷史遺留方法,可以考慮使用,也可以直接使用註解替代。
2、Assert是單元測試用例的核心,建議使用靜態導入。
3、待測試對象,一般建議設計成靜態的。
4、測試方法的要求:帶@Test註解,方法名隨意,返回值必須爲void,不能帶有參數,可以聲明異常(可以參考演示代碼)。
5、Fixture方法的作用
前面介紹的@Before、@BeforeClass、@After、@AfterClass註解修飾的方法,即爲Fixture方法,它是在某些階段必然被調用的方法,如註解功能所示。
@Before、@After修飾方法的一個用處是對待測試對象的“復原”操作,如成員變量回歸,數據庫回滾等,目的是消除@Test方法之間的耦合。也可以用來打印日誌。
@BeforeClass修飾方法可以設計成用來加載一些耗時耗力的操作,如文件流的讀取,數據庫連接等,然後在@AfterClass中釋放對應的資源即可。
6、限時測試
@Test(timeout=1000)超時時間單位爲毫秒
用於測試是否有死循環工是實時性要求比較高的用例,這個非常方便而且非常有用。
7、測試異常
@Test(expected=XXXException.class) XXXException爲聲明式異常
用來驗證聲明式異常,注意此測試的含義:出現了期望的異常,叫做正常,若沒出現異常,Junit會報錯,認爲不正常。這段描述有些拗口,請各位多琢磨琢磨。
8、運行器Runner
類註解@RunWith,指定不同的類可以改變測試類的行爲
9、參數化測試
主要是針對一些相同功能卻要進行多組參數測試的情況,開發步驟如下:
1)參數化測試的類和普通測試類不同,要用特殊的Runner,類註解需要改爲@RunWith(Parameterized.class)
2)定義該測試類的成員變量,一個放測試參數,另一個放該參數產生的預期結果
3)定義測試數據集合方法 public static Collection data() {...},注意該方法要用@Parameters修飾(數據格式爲二維數組)
4)定義帶參數的構造函數,注意定義數據集合時,要和構造函數參數次序一致
其他的與普通測試類似
注意:若測試數據有兩條,則該類下的所有@Test的方法都會執行兩次,所以參數化測試的類不要和別的@Test放在一起。參數化測試方法一般建議單獨建立類。
演示代碼如下:
- //指定@RunWith
- @RunWith(Parameterized.class)
- public class ParamTest {
- //定義成員變量,i爲測試參數,j爲測試結果
- private int i;
- private int j;
- //構造函數
- public ParamTest(int i, int j) {
- super();
- this.i = i;
- this.j = j;
- }
- //測試數據集合,注意使用的註解,數據結構及次序
- @Parameters
- public static Collection data() {
- return Arrays.asList(new Object[][]{{1,2},{3,4},{4,6}});
- }
- @Test
- public void testMethod1() {
- System.out.println(i);
- System.out.println(j);
- //簡單測試,只測試參數加1會不會等於預期結果
- Assert.assertEquals(i+1, j);
- }
- }
預期的執行結果是前兩組參數測試正確,最後一組測試錯誤,運行後的結果爲:
執行結果與預期結果相符合,OK
10、打包測試
將測試類集中起來運行,提高測試效率,代碼如下:
- @RunWith(Suite.class)
- @Suite.SuiteClasses({
- DemoTest.class
- })
- public class ModuleTest {
- public ModuleTest() {
- // TODO Auto-generated constructor stub
- }
- }
1)@Suite.SuiteClasses裏面的是需要打包測試的類
2)該類中可以爲空,類名建議爲模塊名+Test結尾,如ModuleTest.java
以上是Junit4的最基本的使用,相信掌握了這些,對於編寫常規的測試用例已經不是難事,同樣,Junit還有更多更有意思的功能等待我們去挖掘……