摘要:它由和建立,逐漸成為源于的的家族中最為成功的一個(gè)。與添加進(jìn)入的的依賴中。具有兩個(gè)參數(shù)可選該測(cè)試方法允許執(zhí)行的最大時(shí)間長(zhǎng)度。單位捕獲拋出的異常。這個(gè)類不包含任何方法更改入口類的測(cè)試運(yùn)行器為將要運(yùn)行的測(cè)試類作為數(shù)組傳入到中。
簡(jiǎn)介
JUnit是一個(gè)Java語(yǔ)言的單元測(cè)試框架。它由Kent Beck和Erich Gamma建立,逐漸成為源于Kent Beck的sUnit的xUnit家族中最為成功的一個(gè)。
junit3與junit4區(qū)別測(cè)試用例不是用來(lái)證明你(的邏輯)是對(duì)的,而是用來(lái)證明你(的斷言)沒(méi)有錯(cuò)。
在JUnit3中需要繼承TestCase類,JUnit4不需要繼承任何類;
在JUnit3中需要覆蓋TestCase中的setUp和tearDown方法,其中setUp方法會(huì)在測(cè)試執(zhí)行前被調(diào)用以完成初始化工作,而tearDown方法則在結(jié)束測(cè)試結(jié)果時(shí)被調(diào)用,用于釋放測(cè)試使用中的資源,而在JUnit4中,只需要在方法前加上@Before,@After ;
在JUnit3中對(duì)某個(gè)方法進(jìn)行測(cè)試時(shí),測(cè)試方法的命令是固定的,例如對(duì)addBook這個(gè)方法進(jìn)行測(cè)試,需要編寫(xiě)名字為tetAddBook的測(cè)試方法,而在JUnit4中沒(méi)有方法命令的約束,在方法的前面加上@Test,這就代表這個(gè)方法是測(cè)試用例中的測(cè)試方法;
新的斷言assertThat;
@BeforeClass 和 @AfterClass 。在JUnit3,如果所有的test case僅調(diào)用一次setUp()和tearDown()需要使用TestSetup類;
測(cè)試異常處理@Test(expected = DataFormatException.class);
設(shè)置超時(shí)@Test(timeout = 1000);
忽略測(cè)試@Ignore;
集成測(cè)試(suiteTest)。
最大的不同是junit4基本用注解實(shí)現(xiàn),更加靈活。
junit4與maven添加進(jìn)入maven的pom.xml的依賴中。設(shè)置scope為test;
常用注解junit junit 4.12 test
@BeforeClass: public static void方法,當(dāng)前測(cè)試類,所有的測(cè)試方法運(yùn)行前被執(zhí)行;
@Before: public void方法,當(dāng)前測(cè)試類,他會(huì)在所有方法運(yùn)行結(jié)束后被執(zhí)行;
@Test: public void方法,將一個(gè)普通的方法修飾成為一個(gè)測(cè)試方法。具有兩個(gè)參數(shù)(可選):
timeout: 該測(cè)試方法允許執(zhí)行的最大時(shí)間長(zhǎng)度。單位ms
expected: 捕獲拋出的異常。xx.class
@After: public void方法,與@Before組成一對(duì),會(huì)在每個(gè)測(cè)試方法被運(yùn)行后執(zhí)行一次;
@AfterClass: public static void方法,與@BeforeClass組成一對(duì),在當(dāng)前測(cè)試類做完所有測(cè)試后執(zhí)行的一個(gè)方法;
@Ignore: 所修飾的測(cè)試方法會(huì)被測(cè)試運(yùn)行器忽略;
@RunWith: 更改測(cè)試運(yùn)行器,自定義運(yùn)行器需要繼承于org.junit.runner.Runner。
junit4的hello worldimport org.junit.*; public class HelloTest { @Test public void testAdd(){ Assert.assertEquals("test add", 3, 1 + 2); System.out.print("Test add Ok"); } }
測(cè)試方法上必須使用@Test進(jìn)行修飾;
測(cè)試方法必須使用public void 進(jìn)行修飾,不能待任何的參數(shù);
測(cè)試單元中的每個(gè)方法必須可以獨(dú)立測(cè)試,測(cè)試方法間不能有任何的依賴;
測(cè)試類使用Test作為類名的后綴(可選);
測(cè)試方法使用test作為方法名的前綴(可選);
junit4運(yùn)行流程public class FlowTest { @BeforeClass public static void init(){ System.out.println("test class before"); } @AfterClass public static void destory(){ System.out.println("test class after"); } @Before public void beforeTest(){ System.out.println("before test"); } @After public void afterTest(){ System.out.println("after test"); } @Test public void testAdd(){ Assert.assertEquals("test add", 3, 1 + 2); System.out.println("test add ok"); } @Test public void testSub(){ Assert.assertEquals("test subtraction", 3, 4 - 1); System.out.println("test sub ok"); } }
運(yùn)行結(jié)果
test class before before test test add ok after test before test test sub ok after test test class after
@BeforeClass修飾的方法會(huì)在所有測(cè)試方法調(diào)用前執(zhí)行。該方法為靜態(tài)方法,比較適合加載配置文件。
@AfterClass修飾的方法會(huì)在所有測(cè)試方法調(diào)用后執(zhí)行。該方法為靜態(tài)方法,通常用來(lái)對(duì)資源的清理。比如關(guān)閉數(shù)據(jù)庫(kù)連接。
@Before與@After在每個(gè)測(cè)試方法前后各執(zhí)行一次。
@Test中的參數(shù)public class TimeOutTest { @Test(timeout = 2000) public void testTimeOut(){ while (true){ System.out.println("I"m running!"); try { Thread.sleep(1000 *1); } catch (InterruptedException ignore) { } } } @Test(expected = ArithmeticException.class) public void testException(){ Assert.assertEquals(3,6/0); } }
運(yùn)行結(jié)果
I"m running! I"m running! I"m running! org.junit.runners.model.TestTimedOutException: test timed out after 2000 milliseconds at java.lang.Thread.sleep(Native Method) at TimeOutTest.testTimeOut(TimeOutTest.java:15) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ...
testTimeOut雖然是死循環(huán),但加了@Test(timeout)參數(shù)后還是在2秒運(yùn)行結(jié)束。
testException方法沒(méi)有拋出ArithmeticException,@Test中的expected起作用了。
批量運(yùn)行測(cè)試類-測(cè)試套件(Suite)我們想運(yùn)行所有的測(cè)試類的測(cè)試方法,難道我們只能一個(gè)一個(gè)運(yùn)行每一個(gè)測(cè)試類么,這多累啊。幸好,junit4給我們提供了一種方式一次運(yùn)行所有的測(cè)試類-測(cè)試套件。使用例子如下:
import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({FlowTest.class,TimeOutTest.class}) public class SuiteTest { }
測(cè)試suite就是組織測(cè)試類一起運(yùn)行;
寫(xiě)一個(gè)作為測(cè)試suite的入口類。這個(gè)類不包含任何方法;
更改suite入口類的測(cè)試運(yùn)行器為Suite.class;
將要運(yùn)行的測(cè)試類作為數(shù)組傳入到@Suite.SuiteClasses({})中。
批量運(yùn)行多組測(cè)試用例-測(cè)試參數(shù)化設(shè)置很多時(shí)候,我們需要對(duì)一個(gè)測(cè)試,輸入多組測(cè)試用例來(lái)驗(yàn)證代碼的正確性。在junit4中,我們不需要編寫(xiě)n個(gè)測(cè)試方法。示例如下:
import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import java.util.Arrays; import java.util.Collection; @RunWith(Parameterized.class) public class ParamsTest { private int expected; private int input1; private int input2; public ParamsTest(int expected, int input1, int input2){ this.expected = expected; this.input1 = input1; this.input2 = input2; } @Parameterized.Parameters public static Collection
運(yùn)行結(jié)果
java.lang.AssertionError: add function Expected :4 Actual :5at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.failNotEquals(Assert.java:834) at org.junit.Assert.assertEquals(Assert.java:645) at ParamsTest.testAdd(ParamsTest.java:34) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ...
第一組測(cè)試通過(guò),第2組沒(méi)有
更改默認(rèn)的測(cè)試運(yùn)行器為@RunWith(Parameterized.class);
聲明變量來(lái)存放預(yù)期值(隨便起名字,class中自己使用,expected/input1/input2);
為測(cè)試類聲明一個(gè)帶有參數(shù)的公共構(gòu)造器,并在其中為之聲明變量賦值;
聲明一個(gè)返回值為Collection的公共靜態(tài)方法 并用@Parameterized.Parameters進(jìn)行修飾。
他山之石junit官網(wǎng)getstart: https://github.com/junit-team/junit4/wiki/Getting-started
junit4入門(mén)視頻: http://www.imooc.com/learn/356
junit4手冊(cè):http://wiki.jikexueyuan.com/project/junit/suite-test.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66260.html
摘要:在類里,本地類里用關(guān)鍵字聲明過(guò)的方法,在單元測(cè)試啟動(dòng)后會(huì)自動(dòng)被調(diào)用到。在及的設(shè)定思路里,放在路徑下面以結(jié)尾的類會(huì)被當(dāng)成單元測(cè)試類處理。 ABAP 在ABAP類里,本地類(Local Class)里用關(guān)鍵字FOR TESTING聲明過(guò)的方法,showImg(https://segmentfault.com/img/remote/1460000016898407); 在單元測(cè)試啟動(dòng)后會(huì)自動(dòng)...
摘要:會(huì)把真實(shí)值乘以這個(gè)因子后存儲(chǔ),取出時(shí)再還原。日期類型可以對(duì)日期格式化為字符串存儲(chǔ),但是建議我們存儲(chǔ)為毫秒值,存儲(chǔ)為,節(jié)省空間。 最近在學(xué)習(xí)es,起碼要先有個(gè)es環(huán)境吧,然后再是整合到代碼中使用一下,畢竟只有實(shí)踐才會(huì)有深刻的記憶,這就是所謂的經(jīng)驗(yàn)啊,下面開(kāi)始吧,本文分兩部分,第一部分配置es環(huán)境,第二部分整合到springboot中進(jìn)行簡(jiǎn)單的操作,本人也是初次學(xué)習(xí),如有錯(cuò)誤歡迎指出修正,...
摘要:本周在寫(xiě)單元測(cè)試的時(shí)候遇見(jiàn)了一個(gè)新的,在此記錄一下。通過(guò)查看的源碼果然是這樣沒(méi)有重寫(xiě)的但為什么會(huì)調(diào)用方法呢 本周在寫(xiě)單元測(cè)試的時(shí)候遇見(jiàn)了一個(gè)新的exception,在此記錄一下。 單元測(cè)試中有一段代碼是這樣的: logger.debug(設(shè)置班級(jí)的學(xué)生); klass.setStudentList(Collections.singletonList(student1)); ...
摘要:當(dāng)面講給你聽(tīng)講堂地址,或許是最實(shí)用的教程,新課促銷中,只要你敢來(lái),保你收貨滿滿。優(yōu)惠報(bào)名全程擼碼快速入門(mén)教程全原價(jià),優(yōu)惠價(jià)全程擼碼進(jìn)階全原價(jià),優(yōu)惠價(jià) 回顧 Spring Boot - 初識(shí) Hello World Spring Boot - Servlet、過(guò)濾器、監(jiān)聽(tīng)器、攔截器 Spring Boot - 靜態(tài)資源處理、啟動(dòng)加載、日志處理 Spring Boot - 部署Deplo...
摘要:一旦你完成了相應(yīng)函數(shù),只需要把注解刪去,就可以進(jìn)行正常的測(cè)試。表示該方法只執(zhí)行一次,并且在所有方法之后執(zhí)行。 測(cè)試類型 單元測(cè)試(Unit test) 單元測(cè)試關(guān)注單一的類. 它們存在的目的是檢查這個(gè)類中的代碼是否按照期望正確運(yùn)行. 集成測(cè)試(Integration test) 顧名思義, 集成測(cè)試是檢查開(kāi)發(fā)的模塊和其他模塊整合時(shí)是否正常工作.雖然集成測(cè)試的代碼影響范圍比單元測(cè)試要廣,...
閱讀 2948·2021-11-19 09:40
閱讀 3645·2021-10-09 09:43
閱讀 2708·2021-09-22 15:31
閱讀 1769·2021-07-30 15:31
閱讀 812·2019-08-30 15:55
閱讀 3291·2019-08-30 15:54
閱讀 1198·2019-08-30 11:26
閱讀 1942·2019-08-29 13:00