如果你才剛開始接觸Java世界,那么要做的第一件事情是,安裝JDK——Java Development Kit(Java開發工具包),它自帶有Java Runtime Environment(JRE)和JVM(Java運行時環境)。它能讓你在自己的電腦上編譯、運行、測試你的Java程序。
此外,你還需要IDE(集成開發環境)。選擇有很多,如IntelliJ、Eclipse和NetBeans。
Java Junit測試框架
1、相關概念
? JUnit:是一個開發源代碼的Java測試框架,用于編寫和運行可重復的測試。它是用于單元測試框架體系xUnit的一個實例(用于java語言)。主要用于白盒測試,回歸測試。
? 白盒測試:把測試對象看作一個打開的盒子,程序內部的邏輯結構和其他信息對測試人
員是公開的。
? 回歸測試:軟件或環境的修復或更正后的再測試,自動測試工具對這類測試尤其有用。
? 單元測試:最小粒度的測試,以測試某個功能或代碼塊。一般由程序員來做,因為它需要知道內部程序設計和編碼的細節。
2、 單元測試
2.1、單元測試的好處
? 提高開發速度,測試是以自動化方式執行的,提升了測試代碼的執行效率。
? 提高軟件代碼質量,它使用小版本發布至集成,便于實現人員除錯。同時引入重構概念,讓代碼更干凈和富有彈性。
? 提升系統的可信賴度,它是回歸測試的一種。支持修復或更正后的“再測試”,可確保代碼的正確性。
2.2、單元測試的針對對象
? 面向過程的軟件開發針對過程。
? 面向對象的軟件開發針對對象。
? 可以做類測試,功能測試,接口測試(最常用于測試類中的方法)。
2.3、單元測試工具和框架
目前的最流行的單元測試工具是xUnit系列框架,常用的根據語言不同分為JUnit(java),CppUnit(C++),DUnit (Delphi ),NUnit(.net),PhpUnit(PHP )等等。
單元測試框架的第一個和最杰出的應用就是由Erich Gamma (《設計模式》的作者)和Kent Beck(XP(Extreme Programming)的創始人 )提供的開放源代碼的JUnit。
3、Junit入門簡介
3.1、JUnit的好處和JUnit測試編寫原則
使用JUnit的好處:
? 可以使測試代碼與產品代碼分開。
? 針對某一個類的測試代碼通過較少的改動便可以應用于另一個類的測試。
? 易于集成到測試人員的構建過程中,JUnit和Ant的結合可以實施增量開發。
? JUnit是公開源代碼的,可以進行二次開發。
? 可以方便地對JUnit進行擴展。
JUnit測試編寫原則:
? 簡化測試的編寫,這種簡化包括測試框架的學習和實際測試單元的編寫。
? 使測試單元保持持久性。
? 可以利用既有的測試來編寫相關的測試。
3.2、JUnit的特征
? 使用斷言方法判斷期望值和實際值差異,返回Boolean值。
? 測試驅動設備使用共同的初始化變量或者實例。
? 測試包結構便于組織和集成運行。
? 支持圖型交互模式和文本交互模式。
3.3 JUnit框架組成
? 對測試目標進行測試的方法與過程集合,可稱為測試用例(TestCase)。
? 測試用例的集合,可容納多個測試用例(TestCase),將其稱作測試包(TestSuite)。
? 測試結果的描述與記錄。(TestResult) 。
? 測試過程中的事件監聽者(TestListener)。
? 每一個測試方法所發生的與預期不一致狀況的描述,稱其測試失敗元素(TestFailure)
? JUnit Framework中的出錯異常(AssertionFailedError)。
JUnit框架是一個典型的Composite模式:TestSuite可以容納任何派生自Test的對象;當調用TestSuite對象的run()方法是,會遍歷自己容納的對象,逐個調用它們的run()方法。3.5 JUnit中常用的接口和類
? Test接口:運行測試和收集測試結果
Test接口使用了Composite設計模式,是單獨測試用例(TestCase),聚合測試模式(TestSuite)及測試擴展(TestDecorator)的共同接口。 它的public int countTestCases()方法,用來統計測試時有多少個TestCase。另外一個方法就是public void run( TestResult ),TestResult是實例接受測試結果, run方法執行本次測試。
? TestCase抽象類:定義測試中固定方法
TestCase是Test接口的抽象實現,(不能被實例化,只能被繼承)其構造函數TestCase(string name)根據輸入的測試名稱name創建一個測試實例。由于每一個TestCase在創建時都要有一個名稱,若測試失敗了,便可識別出是哪個測試失敗。
TestCase類中包含的setUp()、tearDown()方法。
setUp()方法集中初始化測試所需的所有變量和實例,并且在依次調用測試類中的每個測試方法之前再次執行setUp()方法。
tearDown()方法則是在每個測試方法之后,釋放測試程序方法中引用的變量和實例。
開發人員編寫測試用例時,只需繼承TestCase,來完成run方法即可,然后JUnit獲得測試用例,執行它的run方法,把測試結果記錄在TestResult之中。
? Assert靜態類:一系列斷言方法的集合
Assert包含了一組靜態的測試方法,用于期望值和實際值比對是否正確,即測試失敗,Assert類就會拋出一AssertionFailedError異常,JUnit測試框架將這種錯誤歸入Failes并加以記錄,同時標志為未通過測試。如果該類方法中指定一個String類型的傳參則該參數將被做為AssertionFailedError異常的標識信息,告訴測試人員改異常的詳細信息。
JUnit 提供了6大類31組斷言方法,包括基礎斷言、數字斷言、字符斷言、布爾斷言、對象斷言。其中assertEquals(Object expcted,Object actual)內部邏輯判斷使用equals()方法,這表明斷言兩個實例的內部哈希值是否相等時,最好使用該方法對相應類實例的值進行比較。
而assertSame(Object expected,Object actual)內部邏輯判斷使用了Java運算符“==”,這表明該斷言判斷兩個實例是否來自于同一個引用(Reference),最好使用該方法對不同類的實例的值進行比對。
asserEquals(String message,String expected,String actual)該方法對兩個字符串進行邏輯比對,如果不匹配則顯示著兩個字符串有差異的地方。
ComparisonFailure類提供兩個字符串的比對,不匹配則給出詳細的差異字符。
? TestSuite測試包類??多個測試的組合
TestSuite類負責組裝多個Test Cases。待測得類中可能包括了對被測類的多個測試,而TestSuit負責收集這些測試,使我們可以在一個測試中,完成全部的對被測類的多個測試。TestSuite類實現了Test接口,且可以包含其它的TestSuites。它可以處理加入Test時的所有拋出的異常。
TestSuite處理測試用例有6個規約(否則會被拒絕執行測試)
2 測試用例必須是公有類(Public)
2 用例必須繼承與TestCase類
2 測試用例的測試方法必須是公有的( Public )
2 測試用例的測試方法必須被聲明為Void
2 測試用例中測試方法的前置名詞必須是test
2 測試用例中測試方法誤任何傳遞參數
? TestResult結果類和其它類與接口
TestResult結果類集合了任意測試累加結果,通過TestResult實例傳遞個每個測試的Run()方法。TestResult在執行TestCase是如果失敗會異常拋出。
TestListener接口是個事件監聽規約,可供TestRunner類使用。它通知listener的對象相關事件,方法包括測試開始startTest(Test test),測試結束endTest(Test test),錯誤,增加異常addError(Test test,Throwable t)和增加失敗addFailure(Test test,AssertionFailedError t)。
TestFailure失敗類是個“失敗”狀況的收集類,解釋每次測試執行過程中出現的異常情況。其toString()方法返回“失敗”狀況的簡要描述
4、Eclipse中JUnit的使用
測試對于保證軟件開發質量有著非常重要的作用,單元測試更是必不可少,JUnit是一個非常強大的單元測試包,可以對一個/多個類的單個/多個方法測試,還可以將不同的TestCase組合成TestSuit,使測試任務自動化。
Eclipse同樣集成了JUnit,可以非常方便地編寫TestCase。Eclipse自帶了一個JUnit的插件,不用安裝就可以在你的項目中開始測試相關的類,并且可以調試你的測試用例和被測試類。
4.1、Eclipse中JUint使用步驟
以下步驟環境為Eclipse SDK 3.2.2及JUnit3.8.1
? 新建一個測試用例或選擇已有的所想測試的JAVA文件,點擊“File-》New-》…”菜單項或右擊文件,在彈出的“New”對話框中選擇“JUnit Test Case”,就進入“New JUnit Test Case”對話框
? 在“New JUnit TestCase”對話框填寫相應的欄目,主要有Name(測試用例名),SuperClass(若JUnit的版本是3.8.1,則測試的超類一般默認為junit.framework.TestCase; 若JUnit版本是JUnit 4.4,則默認超類為java.lang.Object。),Class Under Test(被測試的類),Source Folder(測試用例保存的目錄),Package(測試用例包名),及是否自動生成main,setUp,tearDown方法。在此一般填寫NAME及選上復選上setUpt和teardown即可。
? 點擊“Next》”按鈕,則進入Test Methods,在此你可以直接勾選你想測試的被測試類的方法,Eclipse將自動生成與被選方法相應的測試方法,點擊“Fishish”按鈕后一個測試用例就創建好了。
? 編寫完成測試用例后,點擊“Run”按鈕就可以看到運行結果了。
補充:要使用JUnit,您必須首先將JUnit JAR保存在項目的Build路徑上并創建一個測試類。將JUnit保存在項目的Build路徑上的步驟為:
右擊項目—》選擇菜單底部的Properties選擇Java Build Path—》選擇Libraries—》點擊Add Variable按鈕—》查看已有的列表中有無JUnit文件,若沒有,則點擊Configure Variable—》New按鈕,輸入JUNIT_LIB作為變量名稱,編輯該變量并指向解壓后的JUnit目錄中的一個名為JUnit.jar的文件—》然后在選擇剛才添加的jar文件依次點擊OK即可。
4.2、Eclipse中JUnit應用示例
下面我們作一個在Eclipse中利用JUnit對HelloWorld的測試 測試方法:
? HelloWorld.sayHello()是否執行正常,并且結果也符合要求
? HelloWorld.add()方法是否與我們預期一樣執行
下一步,我們準備對這兩個方法進行測試,確保功能正常。選中HelloWorld.java,右鍵點擊,選擇New-》JUnit Test Case:
進入下面這個頁面,在此諸多欄目已經填好,即是這個需要測試的文件的相關信息,若是想在測試完之后即刪除測試文件,也可更改路徑。(本機在Eclipse已有的JUnit3.8.1的基礎上又添加了一個新版本JUnit4.4)
點擊Next進入Test Methods,在此選擇所要測試的方法sayHello及add。
點擊Finish,最后編寫完成測試用例代碼如下:
直接運行Run-》Run As-》JUnit Test,就可以看到JUnit測試結果:
綠色表示測試通過,只要有1個測試未通過,就會顯示紅色并列出未通過測試的方法。
5、后記
從上面的來看,JUnit的使用并不很難,但關鍵就是最后一步完成測試碼,即編寫TestCase。要編寫一個好的TestCase卻并非易事。一個不好的TestCase往往是既浪費了時間,也起不了實際的作用。相反,一個好的TestCase,不僅可以很好的指出代碼中存在的問題,而且也可以作為代碼更準確的文檔,同時還在持續集成的過程中起非常重要的作用。我們在作測試寫TestCase時需要注意的幾點:
? 測試的獨立性:一次只測試一個對象,方便定位出錯的位置。這有兩層意思:一個TestCase,只測試一個對象;一個TestMethod,只測試這個對象中的一個方法。
? 給測試方法一個合適的名字。 一般取名為原來的方法名后加一個Test。
? 在assert函數中給出失敗的原因,如:assertTrue( “… should be true”, ……),方便查錯。在這個例子中,如果無法通過assertTrue,那么給出的消息將被顯示。在junit中每個assert函數都有第一個參數是出錯時顯示消息的函數原型。
? 測試所有可能引起失敗的地方,如:一個類中頻繁改動的函數。對于那些僅僅只含有getter/setter的類,如果是由IDE(如Eclipse)產生的,則可不測;如果是人工寫,那么最好測試一下。
? 在setUp和tearDown中的代碼不應該是與測試方法相關的,而應該是全局相關的。如針對與測試方法A和B,在setUp和tearDown中的代碼應該是A和B都需要的代碼。
? 測試代碼的組織:相同的包,不同的目錄。這樣,測試代碼可以訪問被測試類的protected變量/方法,方便測試代碼的編寫。放在不同的目錄,則方便了測試代碼的管理以及代碼的打包和發布。
闡述JUnit的測試流程架構。我們將從不同的角度來詳細分析這個圖。
圖 測試序列圖
TestNG和JUnit是針對Java語言的兩個比較常用的測試框架。JUnit出現的比較早,但是早期的JUnit 3對測試代碼有非常多的限制,使用起來很不方便,后來的JUnit 4得到很大的改進。TestNG的出現介于JUnit 3和JUnit 4,但是TestNG在很多方面還要優于JUnit 4。下面從整體上對TestNG和JUnit 4進行比較全面的比較。 TestNG與JUnit的相同點:1. 使用annotation,且大部分annotation相同。2. 都可以進行單元測試(Unit test)。3. 都是針對Java測試的工具。 TestNG與JUnit的不同點:1. JUnit只能進行單元測試,TestNG可以進行單元測試(unit test),功能測試(function test),端到端測試(e2e test),集成測試(Integration test)等。2. TestNG需要一個額外的xml配置文件,配置測試的class、method甚至package。3. TestNG的運行方式更加靈活:命令行、ant和IDE,JUnit只能使用IDE。4. TestNG的annotation更加豐富,比如@ExpectedExceptions、@DataProvider等。5. 測試套件運行失敗,JUnit 4會重新運行整個測試套件。TestNG運行失敗時,會創建一個XML文件說明失敗的測試,利用這個文件執行程序,就不會重復運行已經成功的測試。 TestNG比JUnit 4靈活性的體現:1. JUnit 4中必須把@BeforeClass修飾的方法聲明為public static,這就限制了該方法中使用的變量必須是static。而TestNG中@BeforeClass修飾的方法可以跟普通函數完全一樣。2. JUnit 4測試的依賴性非常強,測試用例間有嚴格的先后順序。前一個測試不成功,后續所有的依賴測試都會失敗。TestNG 利用@Test 的dependsOnMethods屬性來應對測試依賴性問題。某方法依賴的方法失敗,它將被跳過,而不是標記為失敗。3. 對于n個不同參數組合的測試,JUnit 4要寫n個測試用例。每個測試用例完成的任務基本是相同的,只是受測方法的參數有所改變。TestNG的參數化測試只需要一個測試用例,然后把所需要的參數加到TestNG的xml配置文件中。這樣的好處是參數與測試代碼分離,非程序員也可以修改參數,同時修改無需重新編譯測試代碼。4. 為了測試無法用String或原語值表示的復雜參數化類型,TestNG提供的@DataProvider使它們映射到某個測試方法。5. JUnit 4的測試結果通過Green/Red bar體現,TestNG的結果除了Green/Red bar,還有Console窗口和test-output文件夾,對測試結果的描述更加詳細,方便定位錯誤。 簡單說就是TestNG比Junit強大, 但是那些更強大的功能你全部都用不到的話, 那你還是就用junit, 比較簡單, 國人用的多, 出了問題中文也比較好查。 英文還不錯并且有想要了解除了單元測試以外的測試的話, 就用TestNG吧。
詳解Java單元測試Junit框架實例
主要介紹了Java的異常測試框架JUnit使用上手指南,JUnit是Java代碼進行單元測試中的常用工具,
問題:
1、目前測試存在的問題
2、Junit注意的細節
3、Junit使用規范
4、斷言
5、案例
junit(單元測試框架)
1、目前存在的問題
1、目前的測試方法如果需要測試,都需要在main方法上調用
2、目前的結果都需要我們人工比對
2、Junit 注意的細節
1、如果使用junit測試一個方法的時候,在junit窗口上顯示綠色那么表示測試正確,如果顯示了紅色,則代表該方法測試出現了異常不通過
2、如果點擊方法名、類名、包名、工程名運行junit分別測試的是對于的方法,類、包中的所有類的test方法,工程中所有test的方法
3、@Test測試的方法不能是static修飾與不能帶有形參
4、如果測試一個方法的時候需要準備測試的環境或者是清理測試的環境,那么可以@Before、@After、@BeforeClass、@AfterClass 這四個注釋,@Before、@After 是在每個測試方法測試的時候都會調用一次,@AfterClass、@BeforeClass是在所有的測試方法測試之前與之后都會調用一次,這個方法必須是靜態的
3、junit使用規范
1、一個類如果需要測試,那么該類就應該對應著一個測試類,測試類的命名規范:被測試類的類名+Test
2、一個被測試的方法一般對應一個測試的方法,測試的方法的命名規范是:test+被測試的方法的方法名
4、斷言
斷言就是不顯示結果,按照程序運行的預期值和實際值進行比對,顯示運行的狀態。
5Assert.assertSame(5, max); // 底層是用了 ==
Assert.assertSame(new String(“abc”), “abc”);
Assert.assertEquals(new String(“abc”), “abc”); //底層是使用Equals方法比較的
Assert.assertNull(“aa”);
Assert.assertTrue(true);
5、案例
?
28package cn.xlucas.junit;
import java.io.*;
import org.junit.*;
public class JunitDemo1 {
//準備測試的環境
//@Before
@BeforeClass
public static void beforeRead(){
System.out.println(“準備測試環境成功。。。”);
}
//讀取文件數據,把把文件數據都
@Test
public void readFile() throws IOException{
FileInputStream fileInputStream = newFileInputStream(“F:\\a.txt”);
int content = fileInputStream.read();
System.out.println(“內容:”+content);
}
@Test
public void sort(){
System.out.println(“讀取文件數據排序。。”);
}
//清理測試環境的方法
// @After
@AfterClass
public static void afterRead(){
System.out.println(“清理測試環境。。”);
}
}
一、JUnit4是JUnit框架有史以來的最大改進,其主要目標便是利用Java5的Annotation特性簡化測試用例的編寫。
二、先簡單解釋一下什么是Annotation,這個單詞一般是翻譯成元數據。元數據是什么?元數據就是描述數據的數據。也就是說,這個東西在Java里面可以用來和public、static等關鍵字一樣來修飾類名、方法名、變量名。修飾的作用描述這個數據是做什么用的,差不多和public描述這個數據是公有的一樣
三、對Person類的方法進行測試:
測試類Person:
[java] view plain copy
package com.ren.junit;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
測試該類的方法PersonTest:
[java] view plain copy
package com.ren.junit;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
//對Person類進行測試
public class PersonTest {
private Person p;
@BeforeClass
public static void beforeClass() {
System.out.println(“boforeClass”);
}
@Before
public void before() {
p = new Person(“lisi”,20);
System.out.println(“before”);
}
@Test
public void testGetName() {
System.out.println(p.getName());
}
@Test
public void testGetAge() {
System.out.println(p.getAge());
}
@After
public void after() {
System.out.println(“after”);
}
@AfterClass
public static void afterClass() {
System.out.println(“afterClass”);
}
}
輸出結果:
boforeClass
before
lisi
after
before
20
after
afterClass
以下是轉載:
我們先看一下在JUnit 3中我們是怎樣寫一個單元測試的。比如下面一個類:
[java] view plain copy
public class AddOperation {
public int add(int x,int y){
return x+y;
}
}
我們要測試add這個方法,我們寫單元測試得這么寫:
[java] view plain copy
import junit.framework.TestCase;
import static org.junit.Assert.*;
public class AddOperationTest extends TestCase{
public void setUp() throws Exception {
}
public void tearDown() throws Exception {
}
public void testAdd() {
System.out.println(\“add\”);
int x = 0;
int y = 0;
AddOperation instance = new AddOperation();
int expResult = 0;
int result = instance.add(x, y);
assertEquals(expResult, result);
}
}
可以看到上面的類使用了JDK5中的靜態導入,這個相對來說就很簡單,只要在import關鍵字后面加上static關鍵字,就可以把后面的類的static的變量和方法導入到這個類中,調用的時候和調用自己的方法沒有任何區別。
我們可以看到上面那個單元測試有一些比較霸道的地方,表現在:
1.單元測試類必須繼承自TestCase。
2.要測試的方法必須以test開頭。
如果上面那個單元測試在JUnit 4中寫就不會這么復雜。代碼如下:
[java] view plain copy
import junit.framework.TestCase;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
*
* @author bean
*/
public class AddOperationTest extends TestCase{
public AddOperationTest() {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
public void add() {
System.out.println(\“add\”);
int x = 0;
int y = 0;
AddOperation instance = new AddOperation();
int expResult = 0;
int result = instance.add(x, y);
assertEquals(expResult, result);
}
}
我們可以看到,采用Annotation的JUnit已經不會霸道的要求你必須繼承自TestCase了,而且測試方法也不必以test開頭了,只要以@Test元數據來描述即可。
從上面的例子可以看到在JUnit 4中還引入了一些其他的元數據,下面一一介紹:
@Before:
使用了該元數據的方法在每個測試方法執行之前都要執行一次。
@After:
使用了該元數據的方法在每個測試方法執行之后要執行一次。
注意:@Before和@After標示的方法只能各有一個。這個相當于取代了JUnit以前版本中的setUp和tearDown方法,當然你還可以繼續叫這個名字,不過JUnit不會霸道的要求你這么做了。
@Test(expected=*.class)
在JUnit4.0之前,對錯誤的測試,我們只能通過fail來產生一個錯誤,并在try塊里面assertTrue(true)來測試。現在,通過@Test元數據中的expected屬性。expected屬性的值是一個異常的類型
@Test(timeout=xxx):
該元數據傳入了一個時間(毫秒)給測試方法,
如果測試方法在制定的時間之內沒有運行完,則測試也失敗。
@ignore:
該元數據標記的測試方法在測試中會被忽略。當測試的方法還沒有實現,或者測試的方法已經過時,或者在某種條件下才能測試該方法(比如需要一個數據庫聯接,而在本地測試的時候,數據庫并沒有連接),那么使用該標簽來標示這個方法。同時,你可以為該標簽傳遞一個String的參數,來表明為什么會忽略這個測試方法。比如:@lgnore(“該方法還沒有實現”),在執行的時候,僅會報告該方法沒有實現,而不會運行測試方法。
junit測試是現在編寫測試代碼的手段之一,
本文簡要介紹如何快速搭建一個junit測試環境。
工具/原料
eclipse工具
junit包
方法/步驟
1
首先創建一個java Project;將junit包和hamcrest-core包導入到項目中
2
創建一個source folder 資源文件夾 test,資源文件夾和普通的文件夾區別是,資源文件夾中的java文件可以被自動編譯。
3
在java文件中編寫java代碼UserMananger.java,在test文件中創建一個與需要進行測試的java代碼同包名稱的TestUserManager.java文件。
4
junit4采用的是通過注解的方式(在方法的上面加上@)。
@Before表示在所有方法運行前運行的方法;
@After表示在所有的方法運行之后執行的方法;
@Test表示這是一個測試方法
@BeforeClass表示在這個測試類構造之前執行的方法
@AfterClass表示在這個測試類構造之后執行的方法
5
如果是對某一個方法進行測試,在方法的名稱上點擊右鍵 --》 run as --》 JUnit Test
6
如果是對所有的方法都執行一遍,在類體上右鍵--Run as--》 JunitTest 。
綠色的表示運行通過的方法,紅x的表示運行失敗的方法。
本文簡要介紹一下在Eclipse3.2中使用JUnit4進行單元測試的方法。
首先,我們來一個傻瓜式速成教程,不要問為什么,Follow Me,先來體驗一下單元測試的快感!
首先新建一個項目叫JUnit_Test,我們編寫一個Calculator類,這是一個能夠簡單實現加減乘除、平方、開方的計算器類,然后對這些功能進行單元測試。這個類并不是很完美,我們故意保留了一些Bug用于演示,這些Bug在注釋中都有說明。該類代碼如下:
package andycpp;
public class Calculator {
private static int result; // 靜態變量,用于存儲運行結果
public void add(int n) {
result = result + n;
}
public void substract(int n) {
result = result - 1; //Bug: 正確的應該是 result =result-n
}
public void multiply(int n) {
} // 此方法尚未寫好
public void divide(int n) {
result = result / n;
}
public void square(int n) {
result = n * n;
}
public void squareRoot(int n) {
for (; ;) ; //Bug : 死循環
}
public void clear() { // 將結果清零
result = 0;
}
public int getResult() {
return result;
}
}
第二步,將JUnit4單元測試包引入這個項目:在該項目上點右鍵,點“屬性”,如圖:
在彈出的屬性窗口中,首先在左邊選擇“Java Build Path”,然后到右上選擇“Libraries”標簽,之后在最右邊點擊“Add Library…”按鈕,如下圖所示:
然后在新彈出的對話框中選擇JUnit4并點擊確定,如上圖所示,JUnit4軟件包就被包含進我們這個項目了。
第三步,生成JUnit測試框架:在Eclipse的Package Explorer中用右鍵點擊該類彈出菜單,選擇“New à JUnit Test Case”。如下圖所示:
在彈出的對話框中,進行相應的選擇,如下圖所示:
點擊“下一步”后,系統會自動列出你這個類中包含的方法,選擇你要進行測試的方法。此例中,我們僅對“加、減、乘、除”四個方法進行測試。如下圖所示:
之后系統會自動生成一個新類CalculatorTest,里面包含一些空的測試用例。你只需要將這些測試用例稍作修改即可使用。完整的CalculatorTest代碼如下:
package andycpp;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
public class CalculatorTest {
private static Calculator calculator = new Calculator();
@Before
public void setUp() throws Exception {
calculator.clear();
}
@Test
public void testAdd() {
calculator.add(2);
calculator.add(3);
assertEquals(5, calculator.getResult());
}
@Test
public void testSubstract() {
calculator.add(10);
calculator.substract(2);
assertEquals(8, calculator.getResult());
}
@Ignore(“Multiply() Not yet implemented”)
@Test
public void testMultiply() {
}
@Test
public void testDivide() {
calculator.add(8);
calculator.divide(2);
assertEquals(4, calculator.getResult());
}
}
第四步,運行測試代碼:按照上述代碼修改完畢后,我們在CalculatorTest類上點右鍵,選擇“Run As à JUnit Test”來運行我們的測試,如下圖所示:
運行結果如下:
進度條是紅顏色表示發現錯誤,具體的測試結果在進度條上面有表示“共進行了4個測試,其中1個測試被忽略,一個測試失敗”。
我們繼續對初級篇中的例子進行分析。初級篇中我們使用Eclipse自動生成了一個測試框架,在這篇文章中,我們來仔細分析一下這個測試框架中的每一個細節,知其然更要知其所以然,才能更加熟練地應用JUnit4。
一、 包含必要地Package
在測試類中用到了JUnit4框架,自然要把相應地Package包含進來。最主要地一個Package就是org.junit.*。把它包含進來之后,絕大部分功能就有了。還有一句話也非常地重要“import static org.junit.Assert.*;”,我們在測試的時候使用的一系列assertEquals方法就來自這個包。大家注意一下,這是一個靜態包含(static),是JDK5中新增添的一個功能。也就是說,assertEquals是Assert類中的一系列的靜態方法,一般的使用方式是Assert. assertEquals(),但是使用了靜態包含后,前面的類名就可以省略了,使用起來更加的方便。
二、 測試類的聲明
大家注意到,我們的測試類是一個獨立的類,沒有任何父類。測試類的名字也可以任意命名,沒有任何局限性。所以我們不能通過類的聲明來判斷它是不是一個測試類,它與普通類的區別在于它內部的方法的聲明,我們接著會講到。
三、 創建一個待測試的對象。
你要測試哪個類,那么你首先就要創建一個該類的對象。正如上一篇文章中的代碼:
private static Calculator calculator = new Calculator();
為了測試Calculator類,我們必須創建一個calculator對象。
四、 測試方法的聲明
在測試類中,并不是每一個方法都是用于測試的,你必須使用“標注”來明確表明哪些是測試方法。“標注”也是JDK5的一個新特性,用在此處非常恰當。我們可以看到,在某些方法的前有@Before、@Test、@Ignore等字樣,這些就是標注,以一個“@”作為開頭。這些標注都是JUnit4自定義的,熟練掌握這些標注的含義非常重要。
五、 編寫一個簡單的測試方法。
首先,你要在方法的前面使用@Test標注,以表明這是一個測試方法。對于方法的聲明也有如下要求:名字可以隨便取,沒有任何限制,但是返回值必須為void,而且不能有任何參數。如果違反這些規定,會在運行時拋出一個異常。至于方法內該寫些什么,那就要看你需要測試些什么了。比如:
@Test
public void testAdd() {
calculator.add(2);
calculator.add(3);
assertEquals(5, calculator.getResult());
}
我們想測試一下“加法”功能時候正確,就在測試方法中調用幾次add函數,初始值為0,先加2,再加3,我們期待的結果應該是5。如果最終實際結果也是5,則說明add方法是正確的,反之說明它是錯的。assertEquals(5, calculator.getResult());就是來判斷期待結果和實際結果是否相等,第一個參數填寫期待結果,第二個參數填寫實際結果,也就是通過計算得到的結果。這樣寫好之后,JUnit會自動進行測試并把測試結果反饋給用戶。
六、 忽略測試某些尚未完成的方法。
如果你在寫程序前做了很好的規劃,那么哪些方法是什么功能都應該實現定下來。因此,即使該方法尚未完成,他的具體功能也是確定的,這也就意味著你可以為他編寫測試用例。但是,如果你已經把該方法的測試用例寫完,但該方法尚未完成,那么測試的時候一定是“失敗”。這種失敗和真正的失敗是有區別的,因此JUnit提供了一種方法來區別他們,那就是在這種測試函數的前面加上@Ignore標注,這個標注的含義就是“某些方法尚未完成,暫不參與此次測試”。這樣的話測試結果就會提示你有幾個測試被忽略,而不是失敗。一旦你完成了相應函數,只需要把@Ignore標注刪去,就可以進行正常的測試。
七、 Fixture(暫且翻譯為“固定代碼段”)
Fixture的含義就是“在某些階段必然被調用的代碼”。比如我們上面的測試,由于只聲明了一個Calculator對象,他的初始值是0,但是測試完加法操作后,他的值就不是0了;接下來測試減法操作,就必然要考慮上次加法操作的結果。這絕對是一個很糟糕的設計!我們非常希望每一個測試都是獨立的,相互之間沒有任何耦合度。因此,我們就很有必要在執行每一個測試之前,對Calculator對象進行一個“復原”操作,以消除其他測試造成的影響。因此,“在任何一個測試執行之前必須執行的代碼”就是一個Fixture,我們用@Before來標注它,如前面例子所示:
@Before
public void setUp() throws Exception {
calculator.clear();
}
這里不在需要@Test標注,因為這不是一個test,而是一個Fixture。同理,如果“在任何測試執行之后需要進行的收尾工作”也是一個Fixture,使用@After來標注。由于本例比較簡單,沒有用到此功能。
JUnit4的一些基本知識就介紹到此,還有一些更靈活的用法放在本系列的高級篇中給大家介紹!
1.類的定義:類是同一事物的總稱,類是封裝對象的屬性和行為的載體,反過來說具有相同屬性和行為的一類實體被稱為類。
2.Junit工具的使用:
第一步
首先新建一個項目叫JUnit_Test,我們編寫一個Calculator類,這是一個能夠簡單實現加減乘除、平方、開方的計算器類,然后對這些功能進行單體測試。
第二步,將JUnit4單元測試包引入這個項目:在該項目上點右鍵,點“屬性”,如圖:
在彈出的屬性窗口中,首先在左邊選擇“Java Build Path”,然后到右上選擇“Libraries”標簽,之后在最右邊點擊“Add Library…”按鈕,如下圖所示:
然后在新彈出的對話框中選擇JUnit4并點擊確定,如上圖所示,JUnit4軟件包就被包含進我們這個項目了。
第三步,生成JUnit測試框架:在Eclipse的Package Explorer中用右鍵點擊該類彈出菜單,選擇“New à JUnit Test Case”。如下圖所示:
點擊“下一步”后,系統會自動列出你這個類中包含的方法,選擇你要進行測試的方法。此例中,我們僅對“加、減、乘、除”四個方法進行測試。
之后系統會自動生成一個新類CalculatorTest,里面包含一些空的測試用例。你只需要將這些測試用例稍作修改即可使用。
第四步,運行測試代碼:按照上述代碼修改完畢后,我們在CalculatorTest類上點右鍵,選擇“Run As à JUnit Test”來運行我們的測試,如下圖所示:
運行結果如下:
4.記錄各個階段的時間
1.類的定義:類是同一事物的總稱,類是封裝對象的屬性和行為的載體,反過來說具有相同屬性和行為的一類實體被稱為類。
2.Junit工具的使用:
第一步
首先新建一個項目叫JUnit_Test,我們編寫一個Calculator類,這是一個能夠簡單實現加減乘除、平方、開方的計算器類,然后對這些功能進行單體測試。
第二步,將JUnit4單元測試包引入這個項目:在該項目上點右鍵,點“屬性”,如圖:
在彈出的屬性窗口中,首先在左邊選擇“Java Build Path”,然后到右上選擇“Libraries”標簽,之后在最右邊點擊“Add Library…”按鈕,如下圖所示:
然后在新彈出的對話框中選擇JUnit4并點擊確定,如上圖所示,JUnit4軟件包就被包含進我們這個項目了。
第三步,生成JUnit測試框架:在Eclipse的Package Explorer中用右鍵點擊該類彈出菜單,選擇“New à JUnit Test Case”。如下圖所示:
點擊“下一步”后,系統會自動列出你這個類中包含的方法,選擇你要進行測試的方法。此例中,我們僅對“加、減、乘、除”四個方法進行測試。
之后系統會自動生成一個新類CalculatorTest,里面包含一些空的測試用例。你只需要將這些測試用例稍作修改即可使用。
第四步,運行測試代碼:按照上述代碼修改完畢后,我們在CalculatorTest類上點右鍵,選擇“Run As à JUnit Test”來運行我們的測試,如下圖所示:
運行結果如下:
1、Junit簡介:
Junit最初是由Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework),為單元測試(Unit Test)的支持框架。用來編寫和執行重覆性的測試。即所謂白盒測試。
它包括了以下的特性:
1 對預期結果作斷言
2 提供測試裝備的生成與銷毀
3 易于組織執行測試
4 圖形與文字界面的測試器
2、Junit的環境配置
環境:Eclipse 中配置junit,選擇項目Junit4(在Package Explorer中) -》 右擊鼠標 -》 選擇properties -》 選擇Java Build Path (在左邊的菜單中) -》 在右邊選擇標簽 Libraries -》 單擊按鈕“Add Library” -》 選擇JUnit , 單擊按鈕 “Next》” -》 選擇JUnit library version 為: JUnit4 -》 單擊按鈕“Finish” –》 單擊按鈕 “OK”
Junit4是Junit框架有史以來的最大改進,其主要目標是利用java5的Annotation特性來簡化測試用例的編寫。Junit4的官方網址是http://www.junit.org/。
3、總結一下3-4的不同,及4的改進
下面我們以一個簡單的例子來介紹如何使用 Junit4同Junit3編寫測試用例:
public Class XXXX{
public String hello(){
return “hello”;
}
}
對于這個類的用junit3編寫測試用例:
import junit.framework.TestCase;
public Class XXXXTest extends TestCase{
public void testHello(){
asssertEqual(new XXXX().Hello(),”hello”);
}
}
用junit4編寫測試用例:
import static org.junit.framework.assertEqual;
import org.junit.Test;
//這兩個是junit4中必須導入的s
public Class XXXXTest{
@Test
public void helloTest(){
asssertEqual(new XXXX().Hello(),”hello”);
}
}
從上面例子我們對Junit3和Junit4有了一個初步的印象,下面我們重點介紹Junit4與Junit3的主要區別。
JUnit3 JUnit4
必須引入類TestCase
import junit.framework.TestCase; 必須引入
import org.junit.Test;
import static org.junit.Assert.*;
必須繼承類TestCase
class BaseClassTest extends TestCase 不需要
測試方法必須以test開頭
public void testMethod () 不需要,
但是類開始的時候要標記 @Test
通過assert*方法來判斷結果
assertTrue(baseClass.method ().equals(“test.junit.BaseClass”));
評論