国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何寫(xiě)好單測(cè)

這篇具有很好參考價(jià)值的文章主要介紹了如何寫(xiě)好單測(cè)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、為什么要寫(xiě)單測(cè)?

單測(cè)即單元測(cè)試(Unit Test),是對(duì)軟件的基本組成單元進(jìn)行的測(cè)試,比如函數(shù)、過(guò)程或者類(lèi)的方法。其意義是:

  • 功能自測(cè),發(fā)現(xiàn)功能缺陷
  • 自我Code Review
  • 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)
  • 促進(jìn)代碼重構(gòu)并提升代碼質(zhì)量

1.1、代碼覆蓋率

單測(cè)質(zhì)量最直接表現(xiàn)的指標(biāo)就是代碼覆蓋率,分為語(yǔ)句覆蓋(Statement coverage)、分支覆蓋(Branch coverage)、條件覆蓋(Condition converage)、路徑覆蓋(Path coverage)

1.2、單元測(cè)試 VS 集成測(cè)試

系統(tǒng)上線前都會(huì)做回歸測(cè)試和集成測(cè)試,但為什么還要加單元測(cè)試呢?

指標(biāo)對(duì)象 單元測(cè)試 集成測(cè)試
測(cè)試對(duì)象 程序單元 模塊組合
測(cè)試方法 白盒測(cè)試 黑盒測(cè)試
測(cè)試時(shí)間 開(kāi)發(fā)階段 集成階段
測(cè)試內(nèi)容 代碼邏輯 接口功能
測(cè)試粒度 較細(xì)粒度 較粗粒度

2、如何寫(xiě)好單測(cè)?

2.1、單測(cè)規(guī)約

可以參考阿里巴巴 的Java開(kāi)發(fā)規(guī)范,以下幾點(diǎn)在單測(cè)中要特別關(guān)注:

  • 【強(qiáng)制】好的單測(cè)必須遵守AIR原則。說(shuō)明:?jiǎn)卧獪y(cè)試在線上運(yùn)行時(shí),像空氣一樣感覺(jué)不到,但在測(cè)試的質(zhì)量保證上,卻是非常關(guān)鍵的。好的單元測(cè)試宏觀上說(shuō),具體有自動(dòng)化(Automatic)、獨(dú)立性(Idependent)、可重復(fù)執(zhí)行(Repeatable)的特點(diǎn)。
  • 【強(qiáng)制】單元測(cè)試應(yīng)該是全自動(dòng)執(zhí)行的,并且非交互式的。測(cè)試用例通常是被定期執(zhí)行的,執(zhí)行過(guò)程必須完全自動(dòng)化才有意義。輸出結(jié)果需要人工檢查的測(cè)試不是一個(gè)好的單元測(cè)試。單元測(cè)試中不準(zhǔn)使用System.Out來(lái)進(jìn)行人肉驗(yàn)證,必須使用Assert來(lái)驗(yàn)證。
  • 【強(qiáng)制】單元測(cè)試是可以重復(fù)執(zhí)行的,不能受到外界環(huán)境的影響。
  • 【推薦】編寫(xiě)單元測(cè)試代碼遵守BCDE原則,以保證被測(cè)試模塊的交付質(zhì)量。
    • B: Border,邊界值測(cè)試,包括循環(huán)邊界、特殊取值、特殊時(shí)間點(diǎn)、數(shù)據(jù)順序等。
    • C: Correct,正確的輸入,并得到預(yù)期的結(jié)果。
    • D: Design,與設(shè)計(jì)文檔相結(jié)合,來(lái)編寫(xiě)單元測(cè)試。
    • E: Error,強(qiáng)制錯(cuò)誤信息輸入(如:非法數(shù)據(jù)、 異常流程、業(yè)務(wù)允許外等),并得到預(yù)期的結(jié)果

2.2、一把好工具

寫(xiě)單側(cè)首先要有好的單測(cè)工具,常用工具: Mockito、PowerMock、 EasyMock、JMockito等,Mock可以解決:

  • 解除對(duì)外部服務(wù)依賴(lài)
  • 減少全鏈路測(cè)試的數(shù)據(jù)準(zhǔn)備
  • 模擬一些非正常的流程
  • 不用加載項(xiàng)目環(huán)境配置
  • 實(shí)現(xiàn)模塊之間的并行開(kāi)發(fā)

2.3、編寫(xiě)單元測(cè)試

單測(cè)怎么寫(xiě),Java知識(shí)總結(jié),單元測(cè)試,驅(qū)動(dòng)開(kāi)發(fā),junit
可以把單元測(cè)試編寫(xiě)流程分為四大步驟,八大操作。

定義對(duì)象階段

定義測(cè)試對(duì)象

在編寫(xiě)單元測(cè)試時(shí),首先需要定義被測(cè)對(duì)象,或直接初始化、或通過(guò)Spy包裝…實(shí)例化。

  • 直接構(gòu)建對(duì)象
    UserService userService = new UserService();
  • 利用Mockito.spy方法
    UserService userService = Mockito.spy(new UserService());
    UserService userService = Mockito.spy(UserService.class);
  • 利用@Spy注解
@RunWith(PowerMockRunner.class) 
public class CompanyServiceTest {
	@Spy
	private UserService userService = new UserService();
}
  • 利用@InjectMocks注解
@RunWith(PowerMockRunner.class)
public class UserServiceTest {
	@InjectMocks
	private UserService userService;
}
模擬依賴(lài)對(duì)象

在編寫(xiě)單元測(cè)試用例時(shí),需要模擬各種依賴(lài)對(duì)象——類(lèi)成員、方法參數(shù)和方法返回值。

  • 直接構(gòu)建對(duì)象
UserDO user = new User(1L, “test”);
List<Long> userIdList = Arrays.asList(1L, 2L, 3L);
  • 反序列化對(duì)象
UserDO user = JSON.parseObject(text, UserDO.class);
List<UserDO> userList = JSON.parseArray(text, UserDO.class);
Map<Long, UserDO> userMap = JSON.parseObject(text, new TypeReference<Map<Long, UserDO>>() {});
  • 利用Mockito.mock方法
MockClass mockClass = Mockito.mock(MockClass.class);
List<Long> userIdList = (List<Long>)Mockito.mock(List.class);

  • 利用@Mock注解 @Mock
    private UserDAO userDAO;
  • 利用Mockito.spy方法
    UserService userService = Mockito.spy(new UserService());
  • 利用@Spy注解
    @Spy
    private UserService userService = new UserService(); // 必須初始化
注入依賴(lài)對(duì)象

在編寫(xiě)單元測(cè)試用例時(shí),需要模擬各種依賴(lài)對(duì)象——類(lèi)成員、方法參數(shù)和方法返回值。

  • 利用Setter方法注入
    userService.setMaxCount(100);
    userService.setUserDAO(userDAO);
  • 利用ReflectionTestUtils.setField方法注入
    ReflectionTestUtils.setField(userService, “maxCount”, 100);
    ReflectionTestUtils.setField(userService, “userDAO”, userDAO);
  • 利用Whitebox.setInternalState方法注入
    Whitebox.setInternalState(userService, “maxCount”, 100);
    Whitebox.setInternalState(userService, “userDAO”, userDAO);
  • 利用@InjectMocks注解注入
    @Mock
    private UserDAO userDAO; @InjectMocks
    private UserService userService;
  • 設(shè)置靜態(tài)常量字段值
    FieldHelper.setStaticFinalField(UserService.class, “l(fā)og”, log);
舉個(gè)例子
@RunWith(PowerMockRunner.class)
public class UserSericeTest {
    // 模擬依賴(lài)對(duì)象(類(lèi)成員)
	@Mock
	private UserDAO userDAO;
	
	// 定義測(cè)試對(duì)象
	@InjectMocks
	private UserService userService;
   
   @Before
   public void before() {
   		// 輸入依賴(lài)對(duì)象(類(lèi)成員)
		Whitebox.setInternalState(userService, "canModify", true);
   }
}

模擬方法階段

在編寫(xiě)單元測(cè)試用例時(shí),需要模擬方法指定參數(shù)并返回指定值。
單測(cè)怎么寫(xiě),Java知識(shí)總結(jié),單元測(cè)試,驅(qū)動(dòng)開(kāi)發(fā),junit

舉個(gè)例子

模擬依賴(lài)對(duì)象的數(shù)據(jù)可以自己構(gòu)建、Mock或者可以從資源文件里讀取。

@Test
public void testCreateUserWithCreate {
    // 模擬依賴(lài)對(duì)象方法:getIdByName
 	Mockito.doReturn(null).when(userDAO).getIdByName(Mockito.anyString());
	Long mockUserId = 2L;
	
	// 從資源文件加載
	String jsonData = ResourceHelper.getResouceAsString(getClass(), path + "/data.json")
	UserDO userDO = JSON.parseObject(jsonData, UserDO.class);
    // 
    Long userId = userService.createUser(userDO);
    Assert.assertEquals("用戶標(biāo)識(shí)不一致", mockUserId, userId);
    
	// 驗(yàn)證依賴(lài)方法
	Mockito.verify(userDAO).getIdByName(userDO.getUserName());
}

調(diào)用方法階段

單測(cè)怎么寫(xiě),Java知識(shí)總結(jié),單元測(cè)試,驅(qū)動(dòng)開(kāi)發(fā),junit

驗(yàn)證方法階段

  • 驗(yàn)證依賴(lài)方法
    單測(cè)怎么寫(xiě),Java知識(shí)總結(jié),單元測(cè)試,驅(qū)動(dòng)開(kāi)發(fā),junit
  • 驗(yàn)證數(shù)據(jù)對(duì)象
    單測(cè)怎么寫(xiě),Java知識(shí)總結(jié),單元測(cè)試,驅(qū)動(dòng)開(kāi)發(fā),junit
  • 驗(yàn)證依賴(lài)對(duì)象
    單測(cè)怎么寫(xiě),Java知識(shí)總結(jié),單元測(cè)試,驅(qū)動(dòng)開(kāi)發(fā),junit

3、 如何做的更好?

寫(xiě)代碼不只是亂寫(xiě)一通,覆蓋率上去了就可以了,它本質(zhì)也是代碼,也要符合代碼規(guī)約。一個(gè)好的單測(cè)命名可以幫助理清單測(cè)Case 也可以便于他人Review。

3.1、規(guī)范命名

  • 測(cè)試類(lèi)命名
    按照行業(yè)慣例,測(cè)試類(lèi)的命名應(yīng)以被測(cè)試類(lèi)名開(kāi)頭并以Test結(jié)尾。 比如:UserServiceTest(用戶服務(wù)測(cè)試類(lèi))
  • 測(cè)試方法命名
    按照行業(yè)規(guī)范,測(cè)試方法命名應(yīng)以test開(kāi)頭并以被測(cè)試方法結(jié)尾。 a) 按照結(jié)果命名
    ? testBatchCreateWithSuccess(測(cè)試:批量創(chuàng)建-成功)
    ? testBatchCreateWithFailure(測(cè)試:批量創(chuàng)建-失敗)
    ? testBatchCreateWithException(測(cè)試:批量創(chuàng)建-異常)
    b) 按照參數(shù)命名
    ? testBatchCreateWithListNull(測(cè)試:批量創(chuàng)建-列表為NULL)
    ? testBatchCreateWithListEmpty(測(cè)試:批量創(chuàng)建-列表為空)
    ? testBatchCreateWithListNotEmpty(測(cè)試:批量創(chuàng)建-列表不為空)
    c) 按照意圖命名
    ? testBatchCreateWithNormal(測(cè)試:批量創(chuàng)建-正常)
    ? testBatchCreateWithGray(測(cè)試:批量創(chuàng)建-灰度)
    ? testBatchCreateWithException(測(cè)試:批量創(chuàng)建-異常)
  • 測(cè)試資源命名-語(yǔ)義化 建議優(yōu)先使用這些參數(shù)和變量的名稱(chēng),并加后綴“.json”標(biāo)識(shí)文件格式。 比如:userCreateList.json

3.2、各環(huán)節(jié)做好驗(yàn)證

  • 不驗(yàn)證返回值 不驗(yàn)證返回值,怎么能保證方法返回了正確值?
  • 不驗(yàn)證方法調(diào)用 不驗(yàn)證方法調(diào)用,怎么能保方法被正確的調(diào)用?
    ? 不驗(yàn)證方法參數(shù) 不驗(yàn)證方法參數(shù),怎么能保證傳遞數(shù)據(jù)的正確性?
    ? 不驗(yàn)證異常信息 不驗(yàn)證異常信息,怎么能保證拋出異常的正確性?

4、常見(jiàn)單測(cè)問(wèn)題

在編寫(xiě)單元測(cè)試用例時(shí),或多或少會(huì)遇到一些問(wèn)題,大多數(shù)是由于對(duì)測(cè)試框架特性不熟悉導(dǎo)致,比如:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-740358.html

  • Mockito不支持對(duì)靜態(tài)方法、構(gòu)造方法、final方法、私有方法的模擬,應(yīng)該使用PowerMock功能;
  • Mockito的any相關(guān)的參數(shù)匹配方法并不支持可空參數(shù)和空參數(shù),應(yīng)該使用nullable方法;
  • 未Mock方法或Mock方法參數(shù)不匹配時(shí),會(huì)返回默認(rèn)值(基礎(chǔ)類(lèi)型為0,對(duì)象類(lèi)型為null);
  • 采用Mockito的參數(shù)匹配方法時(shí),其它參數(shù)不能直接用常量或變量,應(yīng)該使用Mockito的eq方法;
  • 采用Argument的captor方法時(shí),其它參數(shù)不能直接用常量或變量,應(yīng)該使用Mockito的eq方法;
  • 使用when-then語(yǔ)句模擬Spy對(duì)象方法會(huì)先執(zhí)行真實(shí)方法,應(yīng)該使用do-when語(yǔ)句;
  • PowerMock對(duì)靜態(tài)方法、構(gòu)造方法、final方法、私有方法的模擬需要把對(duì)應(yīng)的類(lèi)添加到
    @PrepareForTest注解中;
  • PowerMock模擬JDK的靜態(tài)方法、構(gòu)造方法、final方法、私有方法時(shí),需要把使用這些方法的類(lèi)
    加入到@PrepareForTest注解中,但會(huì)導(dǎo)致單元測(cè)試覆蓋率不被統(tǒng)計(jì);
  • PowerMock使用自定義的類(lèi)加載器來(lái)加載類(lèi),可能導(dǎo)致系統(tǒng)類(lèi)加載器認(rèn)為有類(lèi)型轉(zhuǎn)化問(wèn)題;需要加上@PowerMockIgnore({“javax.crypto.*”})注解。

到了這里,關(guān)于如何寫(xiě)好單測(cè)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Go如何優(yōu)雅的寫(xiě)數(shù)據(jù)庫(kù)的單測(cè)

    Go如何優(yōu)雅的寫(xiě)數(shù)據(jù)庫(kù)的單測(cè)

    ?當(dāng)你想在代碼中測(cè)試 Gorm 時(shí),可以考慮使用單元測(cè)試或集成測(cè)試來(lái)確保 Gorm 的功能正常。下面是一個(gè)簡(jiǎn)單的示例,展示了如何編寫(xiě)一個(gè)基本的 Gorm 單元測(cè)試。 app config config.yaml conf.go services project.go project_test.go init_test.go cmd main.go rootDir, err := os.Getwd() : os.Getwd() 函數(shù)用于獲取當(dāng)

    2024年02月03日
    瀏覽(25)
  • 如何寫(xiě)好測(cè)試用例

    測(cè)試出發(fā)點(diǎn) :要證明所測(cè)的程序是錯(cuò)誤的。 用例設(shè)計(jì)目標(biāo) :盡可能的發(fā)現(xiàn)bug。 用例設(shè)計(jì)內(nèi)容 :待測(cè)試的功能點(diǎn)、測(cè)試環(huán)境、測(cè)試數(shù)據(jù)、執(zhí)行操作、預(yù)期結(jié)果。 測(cè)試環(huán)境的設(shè)計(jì) :設(shè)計(jì)真實(shí)而危險(xiǎn)的環(huán)境,不忽視偶發(fā)環(huán)境。 用例的設(shè)計(jì) :包含正向的預(yù)期結(jié)果和有意導(dǎo)致失敗

    2024年02月13日
    瀏覽(19)
  • 如何寫(xiě)好新聞稿

    如何寫(xiě)好新聞稿

    寫(xiě)好新聞稿是一門(mén)技巧和藝術(shù)的結(jié)合。一個(gè)有效的新聞稿應(yīng)該能夠快速吸引讀者的注意力,并為他們提供有價(jià)值的信息。以下是如何寫(xiě)好新聞稿的步驟和建議: 1.吸引眼球的標(biāo)題 簡(jiǎn)短明了:標(biāo)題應(yīng)該簡(jiǎn)潔,一眼就能告訴讀者新聞的核心內(nèi)容。 使用動(dòng)詞:動(dòng)詞可以帶來(lái)更強(qiáng)的

    2024年02月11日
    瀏覽(50)
  • SpringBoot如何寫(xiě)好單元測(cè)試

    SpringBoot如何寫(xiě)好單元測(cè)試

    Spring中的單元測(cè)試非常方便,可以很方便地對(duì)Spring Bean進(jìn)行測(cè)試,包括Controller、Service和Repository等Spring Bean進(jìn)行測(cè)試,確保它們的功能正常,并且不會(huì)因?yàn)閼?yīng)用的其他變化而出現(xiàn)問(wèn)題。 1. 導(dǎo)入所需的依賴(lài) :在測(cè)試類(lèi)中,需要導(dǎo)入Spring Test相關(guān)的依賴(lài),例如spring-test和JUnit。 2.

    2024年03月23日
    瀏覽(17)
  • 03|「如何寫(xiě)好一個(gè) Prompt」

    Prompt ????? 指令(角色)+ 生成主體 + 額外要求 指令:模型具體完成的任務(wù)描述。例如,翻譯一段文字,翻譯即指令。位置:一般放在模板的最前面; 角色:扮演角色的描述。例如,作為一個(gè)期刊審稿人,期刊審稿人即角色; 利用角色完成一個(gè)具體的任務(wù); 生成主體:對(duì)

    2024年02月15日
    瀏覽(17)
  • 路由器指示燈不亮了怎么辦 路由器上的信號(hào)指示燈不亮的解決辦法總結(jié)

    最近,接到不少網(wǎng)友的反應(yīng)。說(shuō)自己的無(wú)線路由器信號(hào)指示燈不亮,剛開(kāi)始以為是路由器壞額,后來(lái)檢測(cè)發(fā)現(xiàn)不是路由器的問(wèn)題。今天小編就總結(jié)一下導(dǎo)致這種情況可能存在的問(wèn)題,當(dāng)然額,不排除小編總結(jié)的方法不全面。呵呵! 路由器信號(hào)指示燈 一、信號(hào)指示燈不亮 信號(hào)

    2024年02月06日
    瀏覽(42)
  • 如何將寫(xiě)好的Python代碼,封裝運(yùn)行?

    要把Python代碼封裝成可執(zhí)行的程序可以通過(guò)以下步驟完成: 首先將代碼保存為.py文件 然后在代碼中添加適當(dāng)?shù)拿钚袇?shù)解析器(如argparse),使得代碼可以通過(guò)命令行接受輸入?yún)?shù) 之后再在代碼的開(kāi)頭添加#!/usr/bin/env python,這將允許腳本在Unix/Linux/Mac系統(tǒng)中以可執(zhí)行文件的

    2024年02月08日
    瀏覽(23)
  • 【全方位解析】如何寫(xiě)好技術(shù)文章

    【全方位解析】如何寫(xiě)好技術(shù)文章

    前言 為何而寫(xiě) 技術(shù)成長(zhǎng) :相對(duì)于龐大的計(jì)算機(jī)領(lǐng)域的知識(shí)體系,人的記憶還是太有限了,而且隨著年齡的增大,記憶同樣也會(huì)逐漸衰退,正如俗話所說(shuō)“好記性不如爛筆頭”。并且在分享博客的過(guò)程中,我們也可以和大神交流,進(jìn)而發(fā)現(xiàn)自己的認(rèn)知錯(cuò)誤,糾正知識(shí)體系。最

    2024年02月16日
    瀏覽(28)
  • Midjourney干貨篇 - 與AI對(duì)話,如何寫(xiě)好prompt

    Midjourney干貨篇 - 與AI對(duì)話,如何寫(xiě)好prompt

    木匠不會(huì)因?yàn)殡妱?dòng)工具的出現(xiàn)而被淘汰,反而善用工具的木匠,收入更高了。 想要駕馭好Midjourney,可以從以下方面出發(fā)調(diào)整: 首先 Midjourney 基本上是不懂語(yǔ)法的,所以即使你語(yǔ)法錯(cuò)了,只要詞對(duì)了,也能生成圖片,所以prompt 不是越長(zhǎng)越好??梢园阎噶钣枚禾?hào)隔開(kāi),一個(gè)個(gè)輸

    2024年02月06日
    瀏覽(21)
  • 非行穩(wěn)無(wú)以致遠(yuǎn):華為如何寫(xiě)好數(shù)字金融的大文章?

    非行穩(wěn)無(wú)以致遠(yuǎn):華為如何寫(xiě)好數(shù)字金融的大文章?

    在大力發(fā)展實(shí)體經(jīng)濟(jì),推進(jìn)新型工業(yè)化,加快建設(shè)制造強(qiáng)國(guó)、質(zhì)量強(qiáng)國(guó)、航天強(qiáng)國(guó)、交通強(qiáng)國(guó)、網(wǎng)絡(luò)強(qiáng)國(guó)、數(shù)字中國(guó)的時(shí)代背景下,一項(xiàng)工作的重要性正在與日俱增——那就是金融。 在現(xiàn)代化國(guó)家的建設(shè)過(guò)程中,金融是服務(wù)實(shí)體經(jīng)濟(jì),保障新型工業(yè)化建設(shè)的基礎(chǔ),其價(jià)值不言

    2024年02月03日
    瀏覽(15)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包