JUnit基础及第一个单元测试实例(JUnit3.8)
JUnit基礎(chǔ)及第一個(gè)單元測試實(shí)例(JUnit3.8)
?
單元測試
單元測試(unit testing) ,是指對(duì)軟件中的最小可測試單元進(jìn)行檢查和驗(yàn)證。
單元測試不是為了證明您是對(duì)的,而是為了證明您沒有錯(cuò)誤。
單元測試主要是用來判斷程序的執(zhí)行結(jié)果與自己期望的結(jié)果是否一致。
關(guān)鍵是在于所用的測試用例(Test Case) 。
?
JUnit
JUnit是一個(gè)Java語言的單元測試框架。
項(xiàng)目主頁:http://junit.org/
Java的很多IDE,比如Eclipse集成了JUnit,只需要在build path中添加Library并選擇想用的版本即可。
JUnit的兩種主要版本是JUnit 3.8和JUnit 4,前者使用反射,后者使用反射和注解。
博文回顧:本博客上次介紹JUnit的時(shí)候是在反射和注解之后:
http://www.cnblogs.com/mengdd/archive/2013/02/02/2890204.html
結(jié)合實(shí)例來說明單元測試的用法:
1.編寫目標(biāo)類源代碼
新建一個(gè)項(xiàng)目,起名叫JUnitTest,首先編寫一個(gè)目標(biāo)類Calculator:
package com.mengdd.junit;public class Calculator {public int add(int a, int b){return a + b;}public int subtract(int a, int b){return a - b;}public int multiply(int a, int b){return a * b;}public int divide(int a, int b){return a / b;} }
?
2.添加JUnit庫
然后為了使用JUnit,需要加入庫:
右鍵選擇項(xiàng)目Properties->左側(cè)Java Build Path->標(biāo)簽Libraries->Add Library...
彈出的對(duì)話框中選JUnit,然后Next,再選擇JUnit 3或者JUnit 4.
本文示例選擇JUnit 3。
?
3.創(chuàng)建測試類
這里需要注意以下幾點(diǎn):
1.使用JUnit的最佳實(shí)踐:源代碼和測試代碼需要分開。
所以可以新建一個(gè)名叫test的source folder,用于存放測試類源代碼。這樣在發(fā)布程序的時(shí)候測試類的程序就可以丟掉了。
但是這兩個(gè)文件夾中的類編譯出的class文件都會(huì)在同一個(gè)bin文件夾中。
2.測試類和目標(biāo)源代碼的類應(yīng)該位于同一個(gè)包下面,即它們的包名應(yīng)該一樣。
這樣測試類中就不必導(dǎo)入源代碼所在的包,因?yàn)樗鼈兾挥谕粋€(gè)包下面。
3.測試類的命名規(guī)則:
在要測試的類名之前或之后加上Test。
此步驟完成后項(xiàng)目目錄如下:
?
4.測試類代碼編寫
測試類必須繼承于TestCase類。
TestCase文檔說明:
public abstract class TestCase
extends Assert
implements Test
A test case defines the fixture to run multiple tests.
To define a test case
1) implement a subclass of TestCase
2) define instance variables that store the state of the fixture
3) initialize the fixture state by overriding setUp
4) clean-up after a test by overriding tearDown.
Each test runs in its own fixture so there can be no side effects among test runs.
(本文最后參考資料中會(huì)給出JUnit文檔的網(wǎng)盤鏈接,有需要可下載)
還有一個(gè)很重要的Assert類,參見文檔,全是static void方法。
對(duì)于測試類中方法的要求:
在JUnit 3.8中,測試方法需要滿足如下原則:
1.public的。
2.void的。
3.無方法參數(shù)。
4.方法名稱必須以test開頭。 (它通過反射找出所有方法,然后找出以test開頭的方法)。
?
Test Case之間一定要保持完全的獨(dú)立性,不允許出現(xiàn)任何的依賴關(guān)系。
刪除一些方法后不會(huì)對(duì)其他的方法產(chǎn)生任何的影響。
我們不能依賴于測試方法的執(zhí)行順序。
?
綜上,編寫代碼如下:
package com.mengdd.junit;import junit.framework.Assert; import junit.framework.TestCase;public class CalculatorTest extends TestCase {public void testAdd(){Calculator calculator = new Calculator();int result = calculator.add(1, 2);// 判斷方法的返回結(jié)果Assert.assertEquals(3, result);// 第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是要驗(yàn)證的值 }public void testSubtract(){Calculator calculator = new Calculator();int result = calculator.subtract(1, 2);// 判斷方法的返回結(jié)果Assert.assertEquals(-1, result);// 第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是要驗(yàn)證的值 }public void testMultiply(){Calculator calculator = new Calculator();int result = calculator.multiply(2, 3);// 判斷方法的返回結(jié)果Assert.assertEquals(6, result);// 第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是要驗(yàn)證的值 }public void testDivide(){Calculator calculator = new Calculator();int result = calculator.divide(12, 3);// 判斷方法的返回結(jié)果Assert.assertEquals(4, result);// 第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是要驗(yàn)證的值 }}
?
運(yùn)行一下:右鍵選擇該類,Run As->JUnit Test
?
(可以在此處右鍵選擇Run重復(fù)運(yùn)行)
JUnit的口號(hào):Keep the bar green to keep the code clean.
?
5.代碼重構(gòu):setUp()方法的使用
有一個(gè)原則:DRY(Don’t Repeat Yourself)
所以對(duì)代碼進(jìn)行重構(gòu),將重復(fù)的生成對(duì)象的部分放在setUp()方法中。
(重寫的時(shí)候?qū)rotected變?yōu)閜ublic,繼承的時(shí)候擴(kuò)大訪問范圍是沒有問題的。)
先進(jìn)行一個(gè)方法的測試測試:
在CalculatorTest類中加入代碼如下:
@Overridepublic void setUp() throws Exception{System.out.println("set up");}@Overridepublic void tearDown() throws Exception{System.out.println("tear down");}
?
再次運(yùn)行后發(fā)現(xiàn)Console中輸出如下:
說明這兩個(gè)方法執(zhí)行了多次。
?
在每個(gè)測試用例之前執(zhí)行setUp(),每個(gè)測試用例執(zhí)行之后,tearDown()會(huì)執(zhí)行。
即對(duì)于每個(gè)測試用例,執(zhí)行順序?yàn)?#xff1a;
1.setUp()
2.testXXX()
3.tearDown()
?
重構(gòu):使用成員變量生成對(duì)象(為了能在每個(gè)方法中都用到),將生成對(duì)象的語句放在setUp()中,注意這里為每一個(gè)測試用例都會(huì)生成新的對(duì)象。
重構(gòu)后代碼如下:
?
package com.mengdd.junit;import junit.framework.Assert; import junit.framework.TestCase;public class CalculatorTest extends TestCase {private Calculator calculator = null;@Overridepublic void setUp() throws Exception{System.out.println("set up");// 生成成員變量的實(shí)例calculator = new Calculator();System.out.println(calculator);}@Overridepublic void tearDown() throws Exception{System.out.println("tear down");}public void testAdd(){int result = calculator.add(1, 2);// 判斷方法的返回結(jié)果Assert.assertEquals(3, result);// 第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是要驗(yàn)證的值 }public void testSubtract(){int result = calculator.subtract(1, 2);// 判斷方法的返回結(jié)果Assert.assertEquals(-1, result);// 第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是要驗(yàn)證的值 }public void testMultiply(){int result = calculator.multiply(2, 3);// 判斷方法的返回結(jié)果Assert.assertEquals(6, result);// 第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是要驗(yàn)證的值 }public void testDivide(){int result = calculator.divide(12, 3);// 判斷方法的返回結(jié)果Assert.assertEquals(4, result);// 第一個(gè)參數(shù)是期望值,第二個(gè)參數(shù)是要驗(yàn)證的值 }}
?
運(yùn)行后控制臺(tái)輸出:
? 說明每一個(gè)測試的方法前后都會(huì)有setUp()和tearDown()方法的調(diào)用,所以每次生成的都是一個(gè)新的對(duì)象,各個(gè)方法之間沒有干擾。
?
?
參考資料
圣思園張龍老師Unit Test系列視頻教程。
CHM格式文檔網(wǎng)盤鏈接:
JUnit 3.8.1:http://pan.baidu.com/share/link?shareid=539342&uk=2701745266
JUnit 4.0:http://pan.baidu.com/share/link?shareid=539345&uk=2701745266
?
轉(zhuǎn)載于:https://www.cnblogs.com/mengdd/archive/2013/03/26/2983565.html
總結(jié)
以上是生活随笔為你收集整理的JUnit基础及第一个单元测试实例(JUnit3.8)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个打耳洞的个性签名!
- 下一篇: TC配置文件WCMD.INI详解,只能在