Junit介紹
????■Juint由Erich Gamma和Kent Beck編寫的一個測試框架
????■開源軟件
????■支持語音有Smalltalk,Java,C++,Perl等
????■支持的IDE:JBuilder透乾,VisualAge欧募,Eclipse等
????■Junit測試是程序員測試谍婉,即所謂白盒測試,因為程序員知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能
常用的測試基本概念
????■白盒測試:程序內(nèi)部的邏輯結(jié)構(gòu)和其他信息對測試人員是公開的
????■回歸測試:軟件或環(huán)境的修復或更正后的“再測試”,自動測試工具對這類測試尤其有用
????■單元測試:是最小顆粒度的測試辽社,以測試某個功能或代碼塊费什。一般由程序員來做钾恢,因為它需要知道內(nèi)部設計和編碼的細節(jié)
????■JUnit:是一個開發(fā)源代碼的Java測試框架,用于編寫和運行可重復的測試鸳址。他是用于單元測試框架體系xUnit的一個實例(用于Java語言)瘩蚪。主要用于白盒測試,回歸測試
單元測試工具
目前最流行的單元測試工具是xUnit系列框架稿黍,常用的根據(jù)語言不同分為
????■Junit(java)
????■Cppunit(C)
????■DUnit(Delphi)
????■Nunit(.net)
????■PhpUnit(Php)
????■Pyunit(Python)等
在Eclipse中配置好Junit
????1.在該項目上點右鍵疹瘦,點“屬性”
????2.選擇“Java Build Path”,選擇“Libraries”標簽巡球,點擊“Add Library”按鈕言沐,彈出Add Libray窗體,選中“Junit”酣栈,單擊“Next”
生成Junit的測試用例框架
????■在Eclipse的Package Explorer中右擊Calculate.java呢灶,選擇new-->“Junit Test Case”
????■setUpBeforeClass():調(diào)用這個測試類的時候,會先執(zhí)行setUpBeforeClass的內(nèi)容钉嘹。只會被執(zhí)行一次(因為測試類只會被調(diào)用一次鸯乃,所以它只會執(zhí)行一次),主要用于初始化
????■tearDownAfterClass():測試類所有方法都被執(zhí)行之后,它會執(zhí)行該方法缨睡,只會被執(zhí)行一次鸟悴。初始化工作做一些執(zhí)行后處理,例如關(guān)閉和數(shù)據(jù)庫的連接
????■setUp():每個測試用例執(zhí)行的時候奖年,都會執(zhí)行setUp()
????■tearDown():每次測試用例執(zhí)行后细诸,都會執(zhí)行tearDown()
????■Class?under?test:選擇被測試類,可以直接輸入類名/Browse
單元測試基本思想:通過斷言來判斷陋守,期望值與實際值比對震贵,一致的話,斷言成功水评。如果不一致則失敗猩系。
????■測試類是一個獨立的類,沒有任何父類中燥。測試類的名字也可以任意命名寇甸,沒有任何局限性。但是建議都用類名+Test來命名
????■我們不能通過類的聲明來判斷它是不是一個測試類疗涉,它與普通類的去唄在于它內(nèi)部的方法和聲明
創(chuàng)建一個待測試類的對象
Private static Calculator calculator= new Calculator();
????■需要測試哪個類拿霉,首先就要創(chuàng)建該類的對象
????■為了測試Calculater類,我們必須創(chuàng)建一個calculator對象
測試方法的聲明
????■在測試類中咱扣,并不是每個方法都是用于測試的绽淘,必須使用“標注”來明確表明哪些是測試方法
????? ? ◆@Before
????? ? ◆@Test:表明這是一個測試方法
????? ? ◆?@Ignore:跳過,不執(zhí)行
????■方法名可以隨便取闹伪,沒有任何限制沪铭,但是規(guī)范寫法是test+方法名,方法名首字母大寫
????■方法的返回值必須為void
????■方法不能有任何參數(shù)
????■如果違反這些規(guī)范祭往,運行時會拋出一個異常
測試方法的例子——@test
? ? @Test
?? ?? ? public void testAdd(){
?? ??? ?? ? calculator.add(2);
?? ??? ?? ? calculator.add(3);
?? ??? ?? ? assertEquals(5,calculator.getResult());?? ?//判斷期待結(jié)果和實際結(jié)果是否相等
? ? }
????■我們期待的結(jié)果應該是5
????■第一個參數(shù)填寫期待結(jié)果伦意,第二個參數(shù)填寫實際結(jié)果
????■JUnit會自動進行測試并把測試結(jié)果反饋給用戶
測試方法的例子——@Ignore
? ? @Ignore("Mulctiply() Not yet implented")
? ? public void testMultiply(){?? ?
?? ?}
????■加上@Ignore標注的含義就是“某些方法尚未完成,暫不參與此次測試”
????■這樣的話測試結(jié)果就會提示你又幾個測試被忽略硼补,而不是失敗
@Before和@After
? ? @Before
? ? public void setUp() throws Exception{
?? ?? ? calculator.clear();
? ? {?
? ? @After
? ? public void tearDown() throws Exception{
? ? }
????■@Before,@After是每個方法測試時候必然被調(diào)用的代碼
????■保證每個測試都是獨立的驮肉,相互之間沒有任何耦合度
????■這里不需要@Test標注,因為這不是一個test
測試開始-->setUp-->test*****-->tearDown-->測試結(jié)束
@BeforeClass或@AfterClass
????■只在測試用例初始化執(zhí)行@BeforeCalss方法已骇,當所有測試執(zhí)行完畢后离钝,執(zhí)行@AfterClass進行收尾工作
????■用于測試讀取文件等耗時的方法
????■該方法必須是public和static的
????■注意:@BeforeClass和@AfterClass只執(zhí)行一次
????■@Before,@After是每個測試用例執(zhí)行的時候都會執(zhí)行
限時測試
? ? @Test(timeout=2000)//設置超時時間為2000ms
? ? public?void?testDivide(){
?? ?? ? for( ; ;)褪储;//死循環(huán)
?? ?}
????■對于邏輯很復雜卵渴,循環(huán)嵌套比較深的程序采用限時測試
????■函數(shù)設定一個執(zhí)行時間,超過了這個時間鲤竹,他們就會被系統(tǒng)強行終止浪读,并且系統(tǒng)還會向你匯報該函數(shù)結(jié)束的原因是因為超時
測試異常
@Test(expected = ArithmeticException.class)
public void divideByZero(){
? ? calculator.divide(0);
}
????■expected屬性用來測試函數(shù)應該拋出的異常
Runner(運行器)
????■JUnit中有一個默認的Runner,如果你沒有指定,那么系統(tǒng)自動使用默認Runner來運行你的代碼
????■@RunWith是用來修飾類碘橘,可以指定需要的Runner
參數(shù)化測試
可以將所有參數(shù)集中起來一次測試互订。步驟如下:
????1.為這種測試專門生成一個新的類
????2.定義一個待測試的類,并且定義兩個變量痘拆,一個用于存放參數(shù)仰禽,一個用于存放期待的結(jié)果
????3.定義測試數(shù)據(jù)的集合,用@Papameters標注進行修飾
????4.創(chuàng)建構(gòu)造函數(shù)對先前定義的兩個參數(shù)進行初始化
參數(shù)化測試
??■數(shù)據(jù)驅(qū)動:用多組不同的數(shù)據(jù)執(zhí)行相同的腳本——腳本是固定的纺蛆,但是測試數(shù)據(jù)是變化的吐葵,一組數(shù)據(jù)或多組數(shù)據(jù)
? ?■ 關(guān)鍵字驅(qū)動:操作元素,操作動作桥氏,輸入的值温峭,三個都可以自定義
可以將所有參數(shù)集中起來一次測試。步驟如下:
????1.為這種測試專門生成一個新的類
????2.定義一個待測試的類识颊,并且定義兩個變量诚镰,一個用于存放參數(shù)奕坟,一個用于存放期待的結(jié)果
????3.定義測試數(shù)據(jù)的集合祥款,用@Papameters標注進行修飾
????4.創(chuàng)建構(gòu)造函數(shù)對先前定義的兩個參數(shù)進行初始化
測試集
步驟:
????1.用@RunWith標注傳遞一個參數(shù)Suite.class
????2.用@Suite.SuiteClasses表明這個類是一個打包測試類
????3.把需要打包的類作為參數(shù)傳遞給該標注
對于一些比較大,較長期且相對于需求越穩(wěn)定的項目月杉,非常適合底層的單元測試的方式來進行刃跛,整體的質(zhì)量會提高,效率也很高
推薦書籍:單元測試的藝術(shù)