JUnit自动化单元测试
本文章轉(zhuǎn)載自 博主 _嘜嘜:https://blog.csdn.net/u012882327/article/details/72642351
JUnit自動(dòng)化單元測試(一):生成測試類
第一步:導(dǎo)入Junit4包到項(xiàng)目中。
可以自己到網(wǎng)上下載junit4 jar包,也可以用JDE自帶junit測試工具包。以Eclipse為例
第二步,創(chuàng)建測試類。
現(xiàn)有Calcuate類,要測試其加減乘除四個(gè)方法,在該類的包點(diǎn)擊右鍵 new other… ,新建JUnit Test Case, 填好各參數(shù)下一步,選擇要測試的函數(shù)完成。
第三步,生成測試類,可以開始測試了。
經(jīng)過以上步驟,生成測試類如下:
此時(shí)我們可以選擇JUnit Test工具運(yùn)行一下:
發(fā)現(xiàn)全部方法都是錯(cuò)誤,別急,這只是第一步,下面接著講。
JUnit自動(dòng)化單元測試(二):簡單測試實(shí)例講解
我們現(xiàn)在有了測試類TestCalcuate,默認(rèn)是這樣的
package junit.demo; import static org.junit.Assert.*; import org.junit.Test; public class TestCalcuate {@Testpublic void testAdd() {fail("Not yet implemented");}@Testpublic void testSub() {fail("Not yet implemented");.....首先注解@Test表示這個(gè)方法是需要JUnit測試的方法,fail()函數(shù)的意思是測試失敗,這就是為什么初始的測試類進(jìn)行測試每個(gè)都會(huì)失敗,因?yàn)榉椒ɡ锩娴膬?nèi)容需要由我們自己寫。
現(xiàn)在我們簡單寫一個(gè)testAdd
package junit.demo; import static org.junit.Assert.*; import org.junit.Test; public class TestCalcuate {@Testpublic void testAdd() {Calcuate calcuate = new Calcuate(); //新建對(duì)象實(shí)例int result = calcuate.add(2, 3); //進(jìn)行add操作assertEquals(5, result); //通過斷言assertEquals看上面得到的結(jié)果是不是期望的結(jié)果}@Testpublic void testSub() {fail("Not yet implemented");.....很好理解,要測試add方法,先創(chuàng)建對(duì)象,然后進(jìn)行add操作,最后通過assertEquals斷言看看得到的結(jié)果是不是我們期望的結(jié)果,此時(shí)再運(yùn)行JUnit Test會(huì)發(fā)現(xiàn)testAdd成功,表示這個(gè)方法測試成功,和我們期望的一樣。
接下來我們寫testSub,聰明的人會(huì)發(fā)現(xiàn),每個(gè)測試方法都要?jiǎng)?chuàng)建對(duì)象,一點(diǎn)都不人性,于是,就有了@Before和@After注解,@Before表示每次測試都會(huì)先執(zhí)行一次,一般用于初始化。@After表示每次測試后都會(huì)執(zhí)行一次,一般用于斷開IO連接等。
package junit.demo; import static org.junit.Assert.*; import org.junit.Test; import org.junit.Before; public class TestCalcuate {Calcuate calcuate; //全局變量@Before //每次測試都會(huì)執(zhí)行一次,一般用于初始化,一般取名為setUppublic void setUp() {calcuate=new Calcuate();}@Testpublic void testAdd() {int result = calcuate.add(2, 3); //進(jìn)行add操作assertEquals(5, result); //通過斷言assertEquals看上面得到的結(jié)果是不是期望的結(jié)果}@Testpublic void testSub() {assertEquals(3, calcuate.sub(5, 2)); } .....現(xiàn)在testAdd、testSub都已完成了測試,聰明的人又會(huì)發(fā)現(xiàn),引用包的時(shí)候import static org.junit.Assert.*;是什么?意思是靜態(tài)導(dǎo)入Assert,我們用到的fail和assertEquals都是Assert的靜態(tài)方法,靜態(tài)導(dǎo)入Assert之后,就不需要我們每次開頭都寫”Assert.”。
JUnit自動(dòng)化單元測試(三):各常用注解和測試函數(shù)詳細(xì)講解
@Test:將一個(gè)方法修飾成一個(gè)可測試的方法;只有@Test修飾之后,這個(gè)方法才會(huì)被JUnit執(zhí)行。
@Test(expected=XXException.class):表示這個(gè)方法一定會(huì)拋出某個(gè)異常;如果沒有拋出該異常則測試失敗。
//測試代碼@Test(expected = ArithmeticException.class)public void testDiv() {int result = calcuate.div(6, 0); // 除法中,除數(shù)為0,拋出ArithmeticException}@Test((timeout=XX):表示這個(gè)方法執(zhí)行的超時(shí)時(shí)間,單位毫秒;如果這個(gè)方法在規(guī)定時(shí)內(nèi)還沒結(jié)果,則測試失敗。
//測試代碼@Test(timeout = 3000)public void testTimeout () {while (true) {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}@Before:會(huì)在每一個(gè)測試方法被運(yùn)行前執(zhí)行一次;一般用于初始化測試數(shù)據(jù)。注意:有多少個(gè)@Test修飾的方法就會(huì)執(zhí)行多少次。
@After:會(huì)在每一個(gè)測試方法運(yùn)行后被執(zhí)行一次;一般用于注銷測試數(shù)據(jù)。注意:有多少個(gè)@Test修飾的方法就會(huì)執(zhí)行多少次。
@BeforeClass:它會(huì)在所有的方法運(yùn)行前執(zhí)行,static修飾;一般用于測試需要讀取文件數(shù)據(jù)時(shí)。注意:不管有多少個(gè)@Test修飾的方法只執(zhí)行一次。
@AfterClass:它會(huì)在所有的方法運(yùn)行結(jié)束后執(zhí)行,static修飾;一般用于斷開文件連接。注意:不管有多少個(gè)@Test修飾的方法只執(zhí)行一次。
@Ignore:所修飾的測試方法會(huì)被測試運(yùn)行器忽略;當(dāng)方法還沒寫完時(shí)可用,寫好之后刪掉@Ignore即可開始測試。
//測試代碼@Ignore@Testpublic void testIgnore () {System.out.println("我會(huì)被忽略,不會(huì)執(zhí)行");}@RunWith:可以更改測試運(yùn)行器 org.junit.runner.Runner;當(dāng)需要多個(gè)或自定義的運(yùn)行器時(shí)用,下一篇具體講解。
注解大致是就這么多,此外還有一些常用的斷言函數(shù):
AssertEquals:斷言兩個(gè)結(jié)果相等;
AssertArrayEquals:斷言兩個(gè)數(shù)組相等;
AssertNotEquals:斷言兩個(gè)結(jié)果不相等;
AssertSame:判斷兩個(gè)對(duì)象是否為同一個(gè),不同于equals這里是使用“==”判斷;
AssertTrue:斷言結(jié)果為真;
AssertFalse:斷言結(jié)果為假;
AssertNull:斷言結(jié)果為空;
AssertNotNull:斷言結(jié)果不為空;
AssertThat:使用Matcher做自定義的校驗(yàn);
如果想了解更多的測試函數(shù),請(qǐng)自行查閱Assert API,這里就不詳細(xì)說明了。
JUnit自動(dòng)化單元測試(四):@RunWith測試套件運(yùn)行器的使用
一些常用的測試方法前面已經(jīng)說了,但有人又說了,JUnit為項(xiàng)目里每個(gè)類都創(chuàng)建一個(gè)對(duì)應(yīng)的測試類,雖然一次能把類里面所有的方法都測試一遍,但是,我一個(gè)項(xiàng)目有可能有上千百個(gè)類,總不能每個(gè)類都點(diǎn)一下進(jìn)行測試吧。
沒錯(cuò),@RunWith注解就是為了這種情況,我們先聲明用套件運(yùn)行器進(jìn)行測試,然后把需要進(jìn)行測試的所有類放進(jìn)套件(集合)里面,一次就可以把所有類所有方法測試完,也叫打包測試。當(dāng)我們沒有聲明的時(shí)候默認(rèn)的則是JUnit自帶的運(yùn)行器,一次只能測試一個(gè)類。
見代碼:
接著,我們只測試SuiteTest 這一個(gè)類就可以看到全部測試類的測試結(jié)果了。
@RunWith最主要是聲明測試的運(yùn)行器,都在org.junit.runners.下面有聲明,其他的一般用不到了,有興趣的朋友可以共同探討分享。
JUnit自動(dòng)化單元測試(五):參數(shù)化測試
要成為JUnit測試高手必不可少的一項(xiàng)技能就是參數(shù)化測試了,現(xiàn)在有一個(gè)方法根據(jù)不同的參數(shù)會(huì)有不同的結(jié)果,為了測試全面如果把所有可能的情況都逐個(gè)寫出來測試一遍那未免太low了,此時(shí)就可以用參數(shù)化測試,舉個(gè)例子:
package junit.demo; import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters;@RunWith(Parameterized.class) //聲明參數(shù)運(yùn)行器 public class ParametersTest {private int first;private int second;/* 構(gòu)造函數(shù)需要的參數(shù)會(huì)自動(dòng)從參數(shù)列表中依次取出 */public ParametersTest(int first, int second) {this.first = first;this.second = second;}/* 這里就是參數(shù)化測試的關(guān)鍵了* 通過@Parameters修飾表示該方法是為這次測試提供參數(shù)的,默認(rèn)是構(gòu)造函數(shù)的參數(shù),以集合的形式傳入。* name屬性則是一個(gè)名字,稍后解釋。* 當(dāng)然最簡單的方法就像這樣寫就行了 */@Parameters(name = "{index}: parm({0},{1})")public static List<Object[]> data() {return Arrays.asList(new Object[][] { { 2, 6 }, { 0, 100 }, { -3, 9 } });}@Testpublic void test() {assertEquals(second, doSome(first));}/* 假如這個(gè)就是我們要測試的方法:* 如果參數(shù)大于零,則返回參數(shù)*3;* 如果參數(shù)等于零,則返回100;* 如果參數(shù)小于零,則返回參數(shù)*-3 */private Object doSome(int first) {if (first > 0) {return first * 3;}if (first == 0) {return 100;}if (first < 0) {return first * -3;}return null;} }OK,這樣測試一下會(huì)發(fā)現(xiàn)三個(gè)測試成功結(jié)果
沒錯(cuò),Parameterized.class參數(shù)運(yùn)行器相當(dāng)于把參數(shù)列表里面的數(shù)據(jù)一次取一組進(jìn)行測試,通過構(gòu)造函數(shù)實(shí)例化將參數(shù)放進(jìn)測試中,我的demo里有三組數(shù)據(jù),因此會(huì)有三個(gè)測試結(jié)果。
同時(shí)細(xì)心的朋友會(huì)發(fā)現(xiàn),每個(gè)測試結(jié)果的顯示名字… 沒錯(cuò),就是代碼里面提到的參數(shù)配置name屬性:”{index}”表示集合下標(biāo),“{0}”表示第一個(gè)參數(shù)值,“{1}”表示第二個(gè)參數(shù)值。很好理解吧。
至此,整個(gè)JUnit已經(jīng)講解了十分之八,最重要還是在實(shí)際運(yùn)用過程中根據(jù)據(jù)需要進(jìn)行單元測試,可能在實(shí)際開發(fā)中很少有公司會(huì)正規(guī)的進(jìn)行單元測試,不過身為一個(gè)開發(fā)者,沒有任何的借口阻擋我們不斷學(xué)習(xí)進(jìn)取的腳步。
總結(jié)
以上是生活随笔為你收集整理的JUnit自动化单元测试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统形式化验证实践教程(10) -
- 下一篇: unity 代码热更+资源管理框架总结