摘要:三使用介紹通過(guò)代碼創(chuàng)建通過(guò)注解四常用方法驗(yàn)證方法沒(méi)有被調(diào)用驗(yàn)證方法被調(diào)用了次方法至少被調(diào)用次方法最多被調(diào)用次備注假如你無(wú)法給你程序?qū)憜卧獪y(cè)試,那么意味著你的程序結(jié)構(gòu)有問(wèn)題,需要調(diào)整或重構(gòu)。
Java單元測(cè)試入門
什么是單元測(cè)試
定義:單元測(cè)試是對(duì)軟件或程序的基本(最?。┙M成單元的測(cè)試
對(duì)象:方法、類
特點(diǎn):
為什么要寫單元測(cè)試
需不需要寫單元測(cè)試
只要程序能運(yùn)行就可以了,寫單元測(cè)試?yán)速M(fèi)時(shí)間
代碼很簡(jiǎn)單不需要單元測(cè)試
我保證不會(huì)有什么問(wèn)題的
測(cè)試人員測(cè)試一下就可以了
這次沒(méi)有時(shí)間寫了,下次補(bǔ)上吧
測(cè)試分類
單元測(cè)試->集成測(cè)試->端到端測(cè)試
各測(cè)試占比
Junit例子
import org.junit.*; import static org.junit.Assert.fail; public class ClassNameTest { @BeforeClass //公開(kāi)表態(tài)無(wú)返回值 public static void beforeClass() throws Exception{ //每次測(cè)試類執(zhí)行前執(zhí)行一次,主要用來(lái)初使化公共資源等 } @AfterClass //公開(kāi)表態(tài)無(wú)返回值 public static void afterClass() throws Exception{ //每次測(cè)試類執(zhí)行完成后執(zhí)行一次,主要用來(lái)釋放資源或清理工作 } @Before public void setup() throws Exception { //每個(gè)測(cè)試案例執(zhí)行前都會(huì)執(zhí)行一次 } @After public void teardown() throws Exception { //每個(gè)測(cè)試案例執(zhí)行完成后都會(huì)執(zhí)行一次 } @Test public void testMethodName_give_…_when_…_then_…() { fail("失敗"); } }
常用注解
@Ignore 該注解標(biāo)記的測(cè)試方法在測(cè)試中會(huì)被忽略 @Test @Test(expected=xxxException.class) 斷言該方法會(huì)拋出異常 @Test(timeout=1000) 執(zhí)行時(shí)間超過(guò)設(shè)置的值該案例會(huì)失敗 @RunWith @RunWith(Suite.class) 測(cè)試集運(yùn)行器配合使用測(cè)試集功能 @RunWith(JUnit4.class) 默認(rèn)運(yùn)行器 @RunWith(Parameterized.class) 參數(shù)化運(yùn)行器 @RunWith(Suite.class) @Suite.SuiteClasses({ CalculatorTest.class,SquareTest.class}) @Rule public class ExpectedExceptionsTest { @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void verifiesTypeAndMessage() { thrown.expect(RuntimeException.class); thrown.expectMessage("Runtime exception occurred"); throw new RuntimeException("Runtime exception occurred"); } }
參數(shù)化
@RunWith(Parameterized.class) public class PrimeFactorTest { private PrimeFactor primeFactor; private int input; private Listexpected; //構(gòu)造函數(shù) public PrimeFactorTest(int input, List expected) { this.input = input; this.expected = expected; } @Parameterized.Parameters public static Collection init() { return Arrays.asList(new Object[][]{ {18, Arrays.asList(2, 3, 3)} }); } @Test public void testFactor_when_input_18_then_must_return_2_3_3() { Assert.assertEquals(expected, primeFactor.factor(input)); } }
斷言
常用的斷言方法如下: assertEquals(a, b) 測(cè)試a是否等于b(a和b是原始類型數(shù)值(primitive value)或者必須為實(shí)現(xiàn)比較而具有equal方法) assertFalse(a) 測(cè)試a是否為false(假),a是一個(gè)Boolean數(shù)值。 assertTrue(a)??????? 測(cè)試a是否為true(真),a是一個(gè)Boolean數(shù)值 assertNotNull(a) 測(cè)試a是否非空,a是一個(gè)對(duì)象或者null。 assertNull(a) 測(cè)試a是否為null,a是一個(gè)對(duì)象或者null。 assertNotSame(a, b) 測(cè)試a和b是否沒(méi)有都引用同一個(gè)對(duì)象。 assertSame(a, b)?? 測(cè)試a和b是否都引用同一個(gè)對(duì)象。 fail(string)? Fail讓測(cè)試失敗,并給出指定信息。 assertThat(expected, Matcher) 通過(guò)Matcher斷言 Hamcrest :greaterThan,greaterThanOrEqualTo,lessThan,anything,anyOf,containsString
建議
使用give when then方式命名你的測(cè)試方法名稱。
一個(gè)案例只寫一個(gè)斷言。
要寫注釋,建議分為如下4步驟。
測(cè)試場(chǎng)景
準(zhǔn)備數(shù)據(jù)
測(cè)試執(zhí)行
斷言
Mock介紹一、mock就是在測(cè)試過(guò)程中,對(duì)于某些不容易構(gòu)造或者不容易獲取的對(duì)象,用一個(gè)虛擬的對(duì)象來(lái)創(chuàng)建以便測(cè)試的測(cè)試方法,這個(gè)虛擬的對(duì)象就是mock對(duì)象。mock對(duì)象就是真實(shí)對(duì)象在調(diào)試期間的代替品。
Java常用Mock
EasyMock、JMock、PowerMock、Mockit等
二、Mock工具的原理
?mock工具工作的原理大都如下:
record階段:錄制期望。也可以理解為數(shù)據(jù)準(zhǔn)備階段。創(chuàng)建依賴的class 或interface或method ,模擬返回的數(shù)據(jù),及調(diào)用的次數(shù)等。
replay階段:通過(guò)調(diào)用被測(cè)代碼,執(zhí)行測(cè)試。期間會(huì)invoke 到 第一階段record的mock對(duì)象或方法。
verify階段:驗(yàn)證??梢则?yàn)證調(diào)用返回是否正確。及mock的方法調(diào)用次數(shù),順序等。
三、Mockito使用介紹
通過(guò)代碼創(chuàng)建 1. public?class?UserServiceTest?{?? 2. ????private?UserService?userService;?? 3. ????private?UserDao?mockUserDao;?? 4. ????@Before?? 5. ????public?void?setUp()?{ 6. ????????mockUserDao?=?mock(UserDao.class);?? 7. ????????userService?=?new?UserServiceImpl();?? 8. ????????userService.setUserDao(mockUserDao);?? 9. ????} 通過(guò)注解 1. public?class?UserServiceTest?{?? 2. ? 3. ????@InjectMocks 4. ????private?UserServiceImpl?userService;?? 5. ?? 6. ????@Mock?? 7. ????private?UserDao?mockUserDao;?? 8. ?? 9. ????@Before?? 10. ????public?void?setUp()?{?? 11. ????????MockitoAnnotations.initMocks(this);?? 12. ????}
四、Mockito常用方法
verify verify(mock,?never()).add("twice");? 驗(yàn)證add方法沒(méi)有被調(diào)用 verify(mock,?times(2)).add("twice");? 驗(yàn)證add方法被調(diào)用了2次 verify(mock, atLeast(n)).someMethod(); 方法至少被調(diào)用n次 verify(mock, atMost(n)).someMethod(); 方法最多被調(diào)用n次 when when(mock.someMethod()).thenReturn(value1).thenReturn(value2); when(mock.get(0)).thenReturn("first");? when(mock.get(1)).thenThrow(new?RuntimeException()); when(mock.get(anyInt())).thenReturn("element");? spy List?spy?=?spy(new?LinkedList()); when(spy.get(0)).thenReturn(“foo"); doReturn("foo").when(spy).get(0);備注
假如你無(wú)法給你程序?qū)憜卧獪y(cè)試,那么意味著你的程序結(jié)構(gòu)有問(wèn)題,需要調(diào)整或重構(gòu)。對(duì)待測(cè)試代碼要向生產(chǎn)代碼一樣,測(cè)試代碼也需要重構(gòu)和維護(hù)。
3Q
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71415.html
摘要:添加依賴新建項(xiàng)目選擇三個(gè)依賴對(duì)于已存在的項(xiàng)目可以在加入,將會(huì)幫你自動(dòng)配置好配置基本信息然后在下添加基本配置數(shù)據(jù)庫(kù)連接地址數(shù)據(jù)庫(kù)賬號(hào)數(shù)據(jù)庫(kù)密碼數(shù)據(jù)庫(kù)驅(qū)動(dòng)創(chuàng)建實(shí)體創(chuàng)建一個(gè)實(shí)體,包含姓名年齡屬性創(chuàng)建數(shù)據(jù)訪問(wèn)接口創(chuàng)建一個(gè) 添加依賴 新建項(xiàng)目選擇web,MyBatis,MySQL三個(gè)依賴 showImg(https://segmentfault.com/img/bV2l1L?w=1684&h=1...
摘要:編寫一個(gè)接口創(chuàng)建命名為根據(jù)實(shí)際情況修改創(chuàng)建類,內(nèi)容如下啟動(dòng)主程序,使用等工具發(fā)起請(qǐng)求,可以看到頁(yè)面返回編寫單元測(cè)試用例打開(kāi)的下的測(cè)試入口類。 簡(jiǎn)介 在您第1次接觸和學(xué)習(xí)Spring框架的時(shí)候,是否因?yàn)槠浞彪s的配置而退卻了?在你第n次使用Spring框架的時(shí)候,是否覺(jué)得一堆反復(fù)黏貼的配置有一些厭煩?那么您就不妨來(lái)試試使用Spring Boot來(lái)讓你更易上手,更簡(jiǎn)單快捷地構(gòu)建Spring應(yīng)...
摘要:言歸正傳,上一篇文章單元測(cè)試如何開(kāi)始介紹了幾款單元測(cè)試框架基本用法依賴隔離概念,本篇主要解答單元測(cè)試中幾個(gè)重要問(wèn)題。在單元測(cè)試交流微信群,很多新進(jìn)來(lái)的小伙伴,都會(huì)幾個(gè)大同小異的問(wèn)題。 showImg(/img/bVEpaD?w=1080&h=715); 原文鏈接:http://www.jianshu.com/p/f5d197a4d83a 前言 已經(jīng)一個(gè)月沒(méi)寫文章了,由于9月份在plan...
閱讀 2006·2021-11-24 10:45
閱讀 1861·2021-10-09 09:43
閱讀 1303·2021-09-22 15:38
閱讀 1230·2021-08-18 10:19
閱讀 2849·2019-08-30 15:55
閱讀 3069·2019-08-30 12:45
閱讀 2975·2019-08-30 11:25
閱讀 365·2019-08-29 11:30