1. 程式人生 > >Eclipse中怎麼使用junit測試

Eclipse中怎麼使用junit測試

此文引自Didizyp的blog,不是本人原創。


JUnit學習筆記(2007版)

一、簡介
    JUnit是一款由Erich Gamma(《設計模式》的作者)和Kent Beck(極限程式設計的提出者)編寫的開源的迴歸測試框架,供Java編碼人員做單元測試之用。當前版本4.1,可以從www.junit.org網站上獲得。與早期的JUnit 3相比,JUnit 4.1依賴於Java 5.0的新特性,因此無法兼容於jdk 1.4,可以說是一個全新的框架。
    由於這裡使用的IDE是Eclipse 3.2.1加語言包,已經集成了junit 4.1,因此便免去下載和配置類庫的麻煩了^_^
二、建立專案
    下面開啟Eclipse,點選選單“檔案”->“新建”->“專案”或“新建”按鈕,開啟“新建”對話方塊:

請選中“Java專案”,點選“下一步”,進入“新建Java專案”對話方塊:

在這個對話方塊中需要設定專案的名稱以及專案所在目錄,我為自己的專案起名為JUnitTest,目錄為F:\YPJCCK\JUnit\Eclipse\JUnitTest。由於Eclipse自帶了JUnit類庫,因此此時點選“完成”即可。
三、編寫用於測試的JavaBean
    用於測試的JavaBean很簡單,名為Book,只有id和name兩個屬性,這兩個屬性將分別用於兩個用例當中。下面開始編寫該JavaBean。
    請點選“檔案”->“新建”->“類”,開啟“新建Java類”對話方塊,設定包為net.test.unit.junit,名稱為Book,並確保“public static void main(String[] args)”選項沒有選中,然後點選“完成”。修改程式碼如下:
package net.test.unit.junit;
   
public class Book {
   
        private String id = null;
        private String name = null;
   
        public String getId() {
            return id;
        }
   
        public void setId(String id) {
            this.id = id;
        }
   
        public String getName() {
            return name;
        }
   
        publicvoid setName(String name) {
            this.name = name;
        }
   
}
至此,用於測試的JavaBean編寫完成。
四、編寫測試用例
    這裡只用了一個類進行測試,名為BookTest。以前像這樣的類是需要繼承junit.framework.TestCase的,但由於JUnit 4.1充分利用了Java 5.0新增的註解功能,因此便無須再這樣做了。當然,JUnit 4.1仍然提供對舊方式的支援,不過這裡並不打算介紹。
    BookTest類包含兩個用例,分別對應該類的caseId和caseName方法,即每個方法實現一個用例。與JUnit 3.8.1不同,在JUnit 4.1中不再強制要求方法名以test開頭,而是允許隨意命名,只要符合Java的命名規範就行,這裡為了表明這點,特意用了case開頭,但測試用例必須以@Test註解。此外,BookTest還有setUp和tearDown這兩個方法,並分別使用@Before和@After來進行註解,前者在每個測試方法開始之前執行,多用來做初始化;後者在每個測試方法完成之後執行,多用來清理資源。注意,這兩個方法的命名同樣沒有限制,且定義的數量也沒有限制,只是必須用@Before和@After進行註解。另外,JUnit 4.1還提供了@BeforeClass和@AfterClass註解,功能與@Before和@After類似,但前者是用在所有用例執行之前做初始化、之後做清理,而後者是在每個用例執行之前做初始化、之後做清理。下面開始編寫BookTest。
    在Eclipse中,建立BookTest類有兩種方法:方法一,像前邊建立Book類一樣,點選“檔案”->“新建”->“類”來建立;方法二,先在“包資源管理器”中選中Book類,然後點選“檔案”->“新建”->“JUnit測試用例”,開啟“新建JUint測試用例”視窗:

此時會發現,很多資訊已經被Eclipse自動新增進來了。如果想利用Eclipse自動建立測試方法,請點選“下一步”。由於本文會自行編寫測試方法,因此請直接點選“完成”。
    建立BookTest類後,修改程式碼如下:
package net.test.unit.junit;
   
import static org.junit.Assert.*;
   
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
   
public class BookTest {
   
        Book book = null;
   
        @Before
        public void setUp() throws Exception {
            System.out.println("測試開始!");
            book = new Book();
            System.out.println("book物件被初始化!");
        }
   
        @After
        public void tearDown() throws Exception {
            System.out.println("book物件將被清理!");
            book = null;
            System.out.println("測試結束!");
        }
   
        @Test
        public void caseId() {
            book.setId("001"); //設定id屬性的值為001
            //使用Assert檢視id屬性的值是否為001
            assertEquals("001", book.getId());
            System.out.println("id屬性被測試!");
        }
   
        @Test
        public void caseName() {
            book.setName("ASP"); //設定name屬性的值為ASP
            //使用Assert檢視name屬性的值是否為JSP,這是個必然出現錯誤的測試
            assertEquals("JSP", book.getName());
            System.out.println("name屬性被測試!");
        }
       
}
這裡setUp和tearDown方法沒什麼好說的,就是執行了對book物件的初始化和清理,不過caseId和caseName需要說明一下。前者是在對book的id屬性進行測試,首先賦值為”001”,然後使用assertEquals方法檢視id屬性中存放的值是否是期待的值,由於我的期待值也是”001”,所以執行後這個用例應該是成功的;後者則是對book的name屬性進行測試,也是首先賦值為”ASP”,然後使用assertEquals方法檢視其值是否是期待的,由於我特意將期待值設定為根本不可能的”JSP”,因此這個用例執行後會出現一個錯誤。
關於assertEquals方法,是Assert類的一個靜態方法。在程式開頭有這樣一行程式碼,“import static org.junit.Assert.*;”,利用了Java 5.0提供的靜態匯入將Assert類靜態匯入,因此我們在程式中可以直接使用Assert類的任何靜態方法。下面簡單介紹一下靜態類org.junit.Assert。
該類主要包含8類22個方法,如下:
    1.assertEquals(),8個過載,用來檢視物件中存的值是否是期待的值,與字串比較中使用的equals()方法類似;
    2.assertFalse()和assertTrue(),各2個過載,用來檢視變數是是否為false或true,如果assertFalse()檢視的變數的值是false則測試成功,如果是true則失敗,assertTrue()與之相反;
    3.assertSame()和assertNotSame(),各2個過載,用來比較兩個物件的引用是否相等和不相等,類似於通過“==”和“!=”比較兩個物件;
    4.assertNull()和assertNotNull(),各2個過載,用來檢視物件是否為空和不為空;
    5.fail (),2個過載,意為失敗,用來丟擲錯誤。我個人認為有兩個用途:首先是在測試驅動開發中,由於測試用例都是在被測試的類之前編寫,而寫成時又不清楚其正確與否,此時就可以使用fail方法丟擲錯誤進行模擬;其次是丟擲意外的錯誤,比如要測試的內容是從資料庫中讀取的資料是否正確,而導致錯誤的原因卻是資料庫連線失敗。
五、執行BookTest
    編寫好BookTest後,就可以運行了。請點選執行按鈕旁邊的倒三角,選擇“執行為”->“1 JUnit測試”,此時執行效果如下圖:

在圖片的左側可以看到“JUnit”一欄,而且裡邊還有一個錯誤。不過這個錯誤是預計之內的,如果不想看到,可以將testName()方法中的”JSP”改成”ASP”,此時的執行效果如下圖:

此時您會看到,“JUnit”欄中的進度條已不是紅色,而是綠色的,這說明已經沒有錯誤了。
六、測試套件
    當有多個測試類需要同時進行測試時,應使用測試套件來完成該工作。但Eclipse 3.2.1所提供的測試套件建立功能無法很好地支援JUnit 4.1,所以我們只能手工來建立了。
    點選“檔案”->“新建”->“類”建立一個類,類名為AllTests,如下圖:

點選“完成”,修改程式碼如下:
package net.test.unit.junit;
   
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
   
@RunWith(Suite.class)
@Suite.SuiteClasses(BookTest.class)
public class AllTests {}
這裡空類AllTests使用@RunWith和@Suite.SuiteClasses進行註解,以作為測試程式入口。將要測試的類BookTest作為@Suite.SuiteClasses註解的引數,然後將測試套件Suite作為引數設定給執行器@RunWith。下面就可以選中該檔案,點選“執行為”->“1 JUnit測試”了。
    這裡注意一點,@Suite.SuiteClasses註解支援陣列,例如:
        @Suite.SuiteClasses ({BookTest.class, BookTest2.class })
這樣就可以一次執行多個測試類了。
七、命令列下
    前邊介紹的執行方式都是基於Eclipse的,其實JUnit自身也提供了辦法,可以在命令列下執行如下命令:
    java -cp junit-4.1.jar所在資料夾; org.junit.runner.JUnitCore
net.test.unit.junit.AllTests
如果要執行多個測試類,如下:
    java -cp junit-4.1.jar所在資料夾; org.junit.runner.JUnitCore
net.test.unit.junit.AllTests net.test.unit.BookTest
八、JUnit使用進階
    @Ignore註解,忽略測試,用於忽略暫時不想執行的測試用例。以BookTest為例,在檔案頭部新增引用“import org.junit.Ignore;”,然後修改caseName方法:
@Ignore
@Test
    public void caseName()
點選“執行為”->“1 JUnit測試”,執行效果如下:

此時caseName()方法已經被忽略了。
    @Test註解的expected引數,異常測試,用於測試是否會丟擲指定的異常,若丟擲則為成功,反之為失敗。請在BookTest中新增一個測試用例:
    @Test(expected = ArithmeticException.class)
    public void caseException() {
        int n = 2 / 0;
    }
這個測試用例是以0為除數,執行效果如下:

成功!因為指定的ArithmeticException異常被丟擲了。
    @Test註解的timeout引數,限時測試,用於限定測試用例耗費的時間,單位毫秒,如果測試用例沒有在限定時間內完成則為失敗,否則以測試用例的執行結果為準。請在BookTest中新增一個測試用例:
@Test(timeout=1000)
    public void caseWhile() {
        for (;;) {
        }
}
這是一個死迴圈,1秒之後將被強制停止,執行效果如下:

由於超時,執行失敗。
    @Parameters註解,引數化測試,用於對同一測試用例測試一組資料。請新建一個“JUnit測試用例”BookTest2,修改程式碼如下:
package net.test.unit.junit;
   
import static org.junit.Assert.assertEquals;
   
import java.util.Arrays;
import java.util.Collection;
   
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
   
@RunWith(Parameterized.class)
public class BookTest2 {
   
        private String expectedId;
        private String targetId;
        private String expectedName;
        private String targetName;
   
        Book book = null;
   
        @Parameters
        public static Collection Result() {
            return Arrays.asList(new Object[][] {
                { "002", "001", "JSP", "ASP" },
                { "001", "001", "ASP", "ASP" }
                });
        }
   
        public BookTest2(String expectedId, String targetId, String expectedName, String targetName) {
            this.expectedId = expectedId;
            this.targetId = targetId;
            this.expectedName = expectedName;
            this.targetName = targetName;
        }
   
        @Before
        public void setUp() throws Exception {
            System.out.println("測試開始!");
             book = new Book();
             System.out.println("book物件被初始化!");
        }
   
        @After
        public void tearDown() throws Exception {
            System.out.println("book物件將被清理!");
             book = null;
             System.out.println("測試結束!");
        }
   
        @Test
        public void caseId() {
            book.setId(targetId); //設定id屬性的值
             //使用Assert檢視id屬性的值
             assertEquals(expectedId, book.getId());
             System.out.println("id屬性被測試!");
        }
   
        @Test
        public void caseNames() {
            book.setName(targetName); //設定name屬性的值
             //使用Assert檢視name屬性的值
             assertEquals(expectedName, book.getName());
             System.out.println("name屬性被測試!");
        }
}
這個例子其實就是BookTest的擴充套件版,但在原基礎上有幾點變化:
首先是檔案頭部增加了一行程式碼:@RunWith(Parameterized.class),用來呼叫BookTest2類執行;
其次是定義了一個用@Parameters註解的Result靜態方法,該方法用來存放測試資料,本例存放了2組資料,每組4個;
再次是定義了一個帶引數的建構函式,其引數個數與每組測試資料的個數相等;
    最後是定義了expectedId等4個成員變數,用來傳遞測試資料到測試用例中。
下面執行BookTest2,執行效果如下:

測試用例運行了兩遍,第一遍由於期待值和設定值不相等而失敗,第二遍則執行成功。
    junit.framework.JUnit4TestAdapter類。依賴於Java 5.0新特性,開發測試用例無需繼承junit.framework.TestCase的JUnit 4.1已經推出一段時間了,但有些自帶JUnit測試環境的IDE,例如NetBeans 5.5甚至舊版Eclipse仍只支援JUnit 3,無法正確執行基於JUnit 4.1環境開發的測試用例,因此要解決這個問題,需要藉助於junit.framework.JUnit4TestAdapter類。新建類TestSuite,修改程式碼如下:
package net.test.unit.junit;
   
public class TestSuite {
   
        public staticvoid main(String[] args) {
            junit.textui.TestRunner.run(TestSuite.suite());
        }
   
        public static junit.framework.Test suite() {
            return new junit.framework.JUnit4TestAdapter(AllTests.class);   
        }
}
其中最重要的是suite方法,該方法通過junit.framework.JUnit4TestAdapter類使基於JUnit 4環境建立的AllTests類能夠運行於JUnit 3命令列環境下。
九、版本
《JUnit學習筆記》,2005年7月24日,JUnit版本3.8.1,IDE為Eclipse 3.0.1和JBuilderX。
《JUnit學習筆記(第二版)》,2006年1月27日,JUnit版本3.8.1,IDE為Eclipse 3.1.1和JBuilder 2006。
十、參考
    《JUnit 4 搶先看》;
    《單元測試利器 JUnit 4》;
    《全面認識JUnit 4的新特徵》;
    《新版JUnit 4.0 搶先體驗》;
    《JUnit重灌上陣》等。

相關推薦

eclipsejunit簡單使用

bsp cnblogs image 工程 png add 方法調用 pat 調用 1.在工程中右擊 Build Path,Add libraries 然後就可以運行對應的方法了,不需要main方法調用了eclipse中junit簡單使用

javaJunit測試

可能 boolean border add 判斷 數組 環境 字符串 出現 java中Junit測試 問題一:JUnit中什麽時候使用assertTrue,assertFalse語句 assertTrue(boolean condition);condition:如果con

springJunit測試出錯

java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.DefaultCacheAwareContex

eclipse使用JUnit進行單元測試

1、新建java專案 file——new——Java Project 2、新建class檔案 在src上右擊——New——Class 3、配置Junit環境 在Test上右擊——Properties 點選Java Build Path,然後點

整理不易,且整且珍惜 2.開發環境的搭建 3.Eclipse的相關配置 4.使用maven建立web專案 5.Spring+Mybatis+SpringMVC整合 6.mybatis自動生成程式碼 7.spring與mybatis整合Junit測試 8.maven專案的啟動 9.Restful

整理不易,且整且珍惜 2.開發環境的搭建 3.Eclipse的相關配置 4.使用maven建立web專案 5.Spring+Mybatis+SpringMVC整合 6.mybatis自動生成程式碼

Eclipse怎麼使用junit測試

此文引自Didizyp的blog,不是本人原創。 JUnit學習筆記(2007版) 一、簡介     JUnit是一款由Erich Gamma(《設計模式》的作者)和Kent Beck(極限程式設計的提出者)編寫的開源的迴歸測試框架,供Java編碼人員做單元測試之用。當

Eclipse使用junit測試Service層

        從05年以來一直使用struts+spring+Hibernate進行開發,但是對Serveice層的測試從來也沒有認真地使用過junit,今天週末在家試了一下,其實挺簡單的。        專案的原始碼放在src中,再建立一個名為test的Source fo

eclipsejava Dynamatic web的創建過程(或者eclipsejsp的創建或eclipse開發環境(jdk,eclipse,tomcat)的測試

alt 進行 lan .cn ges log image oct ips 1.啟動eclipse程序。 2.File-New->Dynamatic web project,如圖 3.右擊項目名-->new-->New jsp file---> 點

解決TestNG 自動化測試框架如何安裝到eclipse

sem err dmr nco mwl wql urn ycm vro TestNG 自動化測試框架如何安裝到eclipse中 ??? 解釋: TestNG 其實就是一個插件(個人理解為eclipse 中的插件 ) 開門見山---寫步驟 :

Junit測試如何調用Http通信

soft size framework pan font auto 測試 mock unit 在使用Junit做測試的時候,有時候需要調用Http通信,無論是request還是response或者是session會話,那麽在測試類裏該如何調用呢,其實很簡單,spring給我

軟件測試Junit的配置和使用

出現 ide image oot 點擊 roo 快捷鍵 gpo IT 我使用的工具是IDEA,因此配置Junit直接在Setting中下載並使用這兩個插件即可 Junit的使用: 1. 在目標代碼的src文件夾的同級創建一個新的文件夾,作為Testroot文件夾,

junit測試和main方法多執行緒遇到的問題

利用Junit測試多執行緒時經常遇到任務執行不完就會停止,下面是我的任務執行緒類: package timerTest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.i

Spring+MyBatis 在Junit測試需要注意的細節

    在Spring+MyBatis框架下Junit測試時如果直接@Autowired ServiceImpl service 的話會報錯:nullpointerexception; 需要在類上添加註解 @RunWith(SpringJUnit4Clas

Junit單元測試+aop+spring+執行緒池,在進行Junit測試時切面執行緒池內呼叫的方法不執行

一、問題背景: 寫了一個切面,指向某service包下的所有類及方法,當該service包下方法被呼叫時切面執行,切面中用了執行緒池ExecutorService pool = Executors.newFixedThreadPool(5);執行緒池內呼叫了dao層的方法。 二、問題描述:單

ssm進行junit測試

1.加入maven依賴 <!-- 單元測試 --> <dependency> <groupId>junit</groupId> <

SpringBoot整合mybatis,及SpringBootjunit測試

1、pom檔案中引入mybatis依賴:mybatis-spring-boot-starter 和mysql驅動依賴:mysql-connector-java,以及spring-boot-starter-test依賴用於junit測試        

Java之單元測試 eclipseJUnit4的具體使用方法步驟

JUnit4測試方法步驟: 方式一:      ①導包       ②寫測試類    (注意:需要在測試方法上面加上註解@Test)  測試方法(方法以test+測試方法名)  ex:public

eclipse+maven+junit單元測試問題總結

(一)建立工程1.1建立步驟很簡單,網上也有很多說明,在此就不贅述,只說明一點:如果建立的是應用程式,則選擇第1個,如果建立的是web工程,則選擇第2個;1.2建立完工程之後,工程結構如下:如果src/main/java,src/main/resources,src/test

springmvc通過@Value註解讀取Properties配置檔案的值,junit測試可以取到值,但是在業務無法讀取

最近試著做了個springmvc 專案,在加入 發郵件 功能時遇到的問題。 Spring 通過註解獲取*.porperties檔案的內容,除了xml配置外,還可以通過@value方式來獲取。 @value是需要spring註解掃描的,所以要將spring註解掃描配置中加上實

Spring Boot 專案引入websocket後,執行Junit測試報錯

1、報錯資訊如下 java.lang.IllegalStateException: Failed to load ApplicationContext     at org.springframework.test.context.cache.Default