mock測試

mock的使用場合和時(shí)機(jī):

(1)單元測試/接口測試中測試對(duì)象依賴其他對(duì)象,這些被依賴的對(duì)象構(gòu)造復(fù)雜或耗時(shí)或根本無法構(gòu)造(未交付)

(2)我們只測試對(duì)象內(nèi)部邏輯的質(zhì)量,不關(guān)心依賴對(duì)象的邏輯正確性和穩(wěn)定性

基于以下兩個(gè)原則去做mock。這樣mock的投入產(chǎn)出比是最高的。

(1)不需要對(duì)所有的依賴對(duì)象進(jìn)行mock,只對(duì)那些構(gòu)造復(fù)雜、構(gòu)造比較耗時(shí)的依賴進(jìn)行mock

(2)若是分層自動(dòng)化,高層的測試設(shè)計(jì)可以基于以下假設(shè):

? ? ? ?低層的測試已保證低層對(duì)象的質(zhì)量,高層對(duì)低層的依賴可以mock

mock一方面加擋板,一方面可模擬返回?cái)?shù)據(jù)。

測試驅(qū)動(dòng)開發(fā)(TDD)在接口實(shí)現(xiàn)之前可以寫接口測試。在開發(fā)過程中把測試添加到自動(dòng)化測試環(huán)境中。

防止系統(tǒng)B出錯(cuò)引起測試錯(cuò)誤

不會(huì)因系統(tǒng)B的開發(fā)進(jìn)度影響測試,只要定義好了接口mock后即使B未開發(fā)完成仍能進(jìn)行測試

一些速度較慢的操作處理復(fù)雜邏輯的接口,mock后可以快速返回,提升測試效率

模擬在應(yīng)用中不容易構(gòu)造的對(duì)象或比較復(fù)雜的對(duì)象,從而使測試順利進(jìn)行

mock的壞處在于很多情況下無法完全模擬出服務(wù)器的所有可能的返回情況,另外,mock掉了關(guān)聯(lián)方之后,整個(gè)環(huán)境的連通性可能測試的不到位。

Mock 的關(guān)鍵點(diǎn)

Mock 對(duì)象

模擬對(duì)象的概念就是我們想要?jiǎng)?chuàng)建一個(gè)可以替代實(shí)際對(duì)象的對(duì)象,這個(gè)模擬對(duì)象要可以通過特定參數(shù)調(diào)用特定的方法,并且能返回預(yù)期結(jié)果。

Stub(樁)

樁指的是用來替換具體功能的程序段。樁程序可以用來模擬已有程序的行為或是對(duì)未完成開發(fā)程序的一種臨時(shí)替代。

比如我們有一個(gè)獲取溫度的函數(shù)。

publicdoublegetTemperature(String Position) {doubleret = TemperatureRead(Position);}

但是 TemperatureRead 函數(shù)要調(diào)用具體的硬件設(shè)備,而硬件設(shè)備沒準(zhǔn)備好。

我們可以用 Stub 來替換

publicdoubleTemperatureRead(String position) {return28;}

Stub:For replacing a method with code that returns a specified result

Mock:A stub with an expectations that the method gets called

設(shè)置預(yù)期

通過設(shè)置預(yù)期明確 Mock 對(duì)象執(zhí)行時(shí)會(huì)發(fā)生什么,比如返回特定的值、拋出一個(gè)異常、觸發(fā)一個(gè)事件等,又或者調(diào)用一定的次數(shù)。

驗(yàn)證預(yù)期的結(jié)果

設(shè)置預(yù)期和驗(yàn)證預(yù)期是同時(shí)進(jìn)行的。設(shè)置預(yù)期在調(diào)用測試類的函數(shù)之前完成,驗(yàn)證預(yù)期則在它之后。所以,首先你設(shè)定好預(yù)期結(jié)果,然后去驗(yàn)證你的預(yù)期結(jié)果是否正確。

Mock 的好處是什么

提前創(chuàng)建測試; TDD(測試驅(qū)動(dòng)開發(fā))

這是個(gè)最大的好處吧。如果你創(chuàng)建了一個(gè)Mock那么你就可以在service接口創(chuàng)建之前寫Service Tests了,這樣你就能在開發(fā)過程中把測試添加到你的自動(dòng)化測試環(huán)境中了。換句話說,模擬使你能夠使用測試驅(qū)動(dòng)開發(fā)。

團(tuán)隊(duì)可以并行工作

這類似于上面的那點(diǎn);為不存在的代碼創(chuàng)建測試。但前面講的是開發(fā)人員編寫測試程序,這里說的是測試團(tuán)隊(duì)來創(chuàng)建。當(dāng)還沒有任何東西要測的時(shí)候測試團(tuán)隊(duì)如何來創(chuàng)建測試呢?模擬并針對(duì)模擬測試!這意味著當(dāng)service借口需要測試時(shí),實(shí)際上QA團(tuán)隊(duì)已經(jīng)有了一套完整的測試組件;沒有出現(xiàn)一個(gè)團(tuán)隊(duì)等待另一個(gè)團(tuán)隊(duì)完成的情況。這使得模擬的效益型尤為突出了。

你可以創(chuàng)建一個(gè)驗(yàn)證或者演示程序

由于Mocks非常高效,Mocks可以用來創(chuàng)建一個(gè)概念證明,作為一個(gè)示意圖,或者作為一個(gè)你正考慮構(gòu)建項(xiàng)目的演示程序。這為你決定項(xiàng)目接下來是否要進(jìn)行提供了有力的基礎(chǔ),但最重要的還是提供了實(shí)際的設(shè)計(jì)決策。

為無法訪問的資源編寫測試

這個(gè)好處不屬于實(shí)際效益的一種,而是作為一個(gè)必要時(shí)的“救生圈”。有沒有遇到這樣的情況?當(dāng)你想要測試一個(gè)service接口,但service需要經(jīng)過防火墻訪問,防火墻不能為你打開或者你需要認(rèn)證才能訪問。遇到這樣情況時(shí),你可以在你能訪問的地方使用MockService替代,這就是一個(gè)“救生圈”功能。

Mock 可以交給用戶

在有些情況下,某種原因你需要允許一些外部來源訪問你的測試系統(tǒng),像合作伙伴或者客戶。這些原因?qū)е聞e人也可以訪問你的敏感信息,而你或許只是想允許訪問部分測試環(huán)境。在這種情況下,如何向合作伙伴或者客戶提供一個(gè)測試系統(tǒng)來開發(fā)或者做測試呢?最簡單的就是提供一個(gè)mock,無論是來自于你的網(wǎng)絡(luò)或者客戶的網(wǎng)絡(luò)。soapUI mock非常容易配置,他可以運(yùn)行在soapUI或者作為一個(gè)war包發(fā)布到你的java服務(wù)器里面。

隔離系統(tǒng)

有時(shí),你希望在沒有系統(tǒng)其他部分的影響下測試系統(tǒng)單獨(dú)的一部分。由于其他系統(tǒng)部分會(huì)給測試數(shù)據(jù)造成干擾,影響根據(jù)數(shù)據(jù)收集得到的測試結(jié)論。使用mock你可以移除掉除了需要測試部分的系統(tǒng)依賴的模擬。當(dāng)隔離這些mocks后,mocks就變得非常簡單可靠,快速可預(yù)見。這為你提供了一個(gè)移除了隨機(jī)行為,有重復(fù)模式并且可以監(jiān)控特殊系統(tǒng)的測試環(huán)境。

Mockito

介紹

Mockito 是一個(gè)簡單的流行的 Mock 框架。它能夠幫我們創(chuàng)建 Mock 對(duì)象,保持單元測試的獨(dú)立性。

使用它只需要在 Maven 中添加依賴即可。

org.mockitomockito-all2.0.2-beta

創(chuàng)建 Mock 對(duì)象

通過方法創(chuàng)建

class CreateMock {

@Beforepublicvoidsetup() {? ? ? ??

mockUserDao = mock(UserDao.class);? ? ? ? ??

userService =newUserServiceImpl();? ? ? ? ??

userService.setUserDao(mockUserDao);? ??

? }}


通過注解創(chuàng)建

class CreateMock {

@Mock

UserDao mockUserDao;

@InjectMocks

privateUserServiceImpl userService;

@Before

publicvoidsetUp() {

//初始化對(duì)象的注解?

MockitoAnnotations.initMocks(this);? ??

? }? }


參考:https://blog.csdn.net/wwh578867817/article/details/51934404

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Mock 方法是單元測試中常見的一種技術(shù),它的主要作用是模擬一些在應(yīng)用中不容易構(gòu)造或者比較復(fù)雜的對(duì)象,從而把測試與...
    熊熊要更努力閱讀 28,786評(píng)論 2 25
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,724評(píng)論 19 139
  • 一、說在前面 基于微服務(wù)或者SOA的自動(dòng)化測試系統(tǒng)每個(gè)公司都有自己的特有的,我今天就主要介紹一下,我們研發(fā)的一套m...
    小程故事多閱讀 4,734評(píng)論 10 29
  • 1.Creating mock objects 1.1Class mocks idclassMock=OCMCla...
    奔跑的小小魚閱讀 2,841評(píng)論 0 0
  • 1、背景 測試存在問題:1、測試環(huán)境接口不穩(wěn)定2、業(yè)務(wù)系統(tǒng)不是孤立存在的,關(guān)聯(lián)方太多,而且關(guān)聯(lián)系統(tǒng)常常出現(xiàn)不穩(wěn)定的...
    蕭竹閱讀 11,839評(píng)論 1 19

友情鏈接更多精彩內(nèi)容