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