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