如果你才剛開始接觸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(“該方法還沒有實現”),在執行的時候,僅會報告該方法沒有實現,而不會運行測試方法。
評論
查看更多