偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

單元測試 Mock不Mock?

開發(fā) 前端
單元測試在軟件開發(fā)過程中還是非常重要的,除了可以提高代碼的質(zhì)量,在引入CI/CD后的自動(dòng)化測試環(huán)節(jié)可以起到快速部署、交付作用。難道每次上線都需要“點(diǎn)點(diǎn)點(diǎn)”測試?這一點(diǎn),我想經(jīng)歷過的人都深有體會。

前言

前段時(shí)間,我們團(tuán)隊(duì)就單元測試是否采用 Mock 進(jìn)行了一番交流,各有各的說法。本文就單元測試 Mock不Mock 給出我的觀點(diǎn),歡迎各位同仁提出不同的意見,共同探討、相互交流。

單元測試沒必要?

我見過好多不寫單元測試的項(xiàng)目,大多給出的原因都是:“沒必要”、“浪費(fèi)時(shí)間”、“get不到單測的作用”,這樣的項(xiàng)目要么是小規(guī)模,要么就是頭鐵。

本人之前也有相同的觀點(diǎn)...

單元測試在軟件開發(fā)過程中還是非常重要的,除了可以提高代碼的質(zhì)量,在引入CI/CD后的自動(dòng)化測試環(huán)節(jié)可以起到快速部署、交付作用。難道每次上線都需要“點(diǎn)點(diǎn)點(diǎn)”測試?這一點(diǎn),我想經(jīng)歷過的人都深有體會。

Mock不Mock?

那什么是Mock?

什么是Mock?

簡單來說,Mock就是模擬目標(biāo)代碼的行為,在實(shí)際測試過程中代替真實(shí)的調(diào)用目標(biāo)。如下圖

圖片圖片

這樣做的意義何在?

Mock的意義何在?

試想一下,單元測試中如果出現(xiàn)以下幾個(gè)問題應(yīng)該怎么辦?

  1. 涉及到的DB操作、網(wǎng)絡(luò)調(diào)用等單元測試產(chǎn)生的數(shù)據(jù)屬不屬于垃圾數(shù)據(jù)?會不會影響業(yè)務(wù)?
  2. 發(fā)布/部署生產(chǎn)環(huán)境的過程中,錯(cuò)誤地執(zhí)行了單元測試引起生產(chǎn)問題怎么辦?
  3. CI過程中的測試環(huán)節(jié)花費(fèi)時(shí)間太長怎么辦?會不會影響集成交付?

以上幾個(gè)問題我想大部分開發(fā)人員都經(jīng)歷過,那如何避免這些問題?我想Mock就是最好的一種方式。

如果將涉及到的外部操作,例如DB操作、網(wǎng)絡(luò)調(diào)用等行為進(jìn)行Mock,那就不會存在垃圾數(shù)據(jù)的問題,也不用擔(dān)心環(huán)境切換帶來的問題,外部耗時(shí)的操作也可以通過Mock避免CI過程過長。

個(gè)人認(rèn)為Mock只是模擬調(diào)用外部的行為,并不影響代碼邏輯。所以,不存在“Mock是不是有效的單元測試”這種說法。

如何Mock?

應(yīng)該Mock什么?

通常,我們編寫的方法(或函數(shù))都是由很多方法按照層級組成的,就像這樣

圖片圖片

當(dāng)我們對頂層方法進(jìn)行單元測試時(shí),應(yīng)該Mock哪些方法?

  • 如果Mock方法1、2、3,那么方法4、5、6就不會被調(diào)用到,里面的邏輯不會被覆蓋到,也就不是有效的單元測試。
  • 如果Mock方法4、5、6,里面的邏輯或返回值有修改,那么就要遞歸向上修改,不符合軟件工程。

但是,如果方法43、、5、6都涉及到DB或者網(wǎng)絡(luò)調(diào)用等外部不可控操作,我們就應(yīng)該對其Mock。

所以,應(yīng)該Mock一些穩(wěn)定的、不可控的方法。

Mock 編寫示例

以Python中的Mock框架為例,下面是一個(gè)示例:

class TestXxService(unittest.TestCase):
    def test_init(self):
        XXService.update(xx)

class XXService:
    def update(xx):
        ......

test_init函數(shù)中的....update會涉及到數(shù)據(jù)庫的操作,這里使用patch模擬這兩個(gè)函數(shù)的行為

# patch("目標(biāo)函數(shù)路徑")
patch('....update')

在模擬的上下文中,XXService.update將會被模擬的函數(shù)替代執(zhí)行

def test_init(self):
        with patch('....update') as mocked_update:
            # 在模擬的上下文中調(diào)用業(yè)務(wù)邏輯函數(shù)
            XXService.update(xx)
            mocked_update.assert_called_once_with(xx)

其中,assert_called_once_with 會驗(yàn)證模擬函數(shù)是否被調(diào)用了一次,并且會驗(yàn)證預(yù)期接收的參數(shù)是否匹配。

如果沒有參數(shù),使用assert_called_once進(jìn)行驗(yàn)證是否被調(diào)用了一次。

如果模擬的函數(shù)實(shí)際被調(diào)用了多次,需要通過以下方式

# 斷言mocked_update被調(diào)用了2次
self.assertEqual(mocked_update.call_count, 2)
# 斷言mocked_update被調(diào)用了,并且參數(shù)正確
mocked_update.assert_any_call(xx)

如果函數(shù)有返回值,在定義模擬函數(shù)時(shí),添加 return_value,return_value可以是任意類型。

patch('...update',
                    return_value='xxx') as mocked_update

在驗(yàn)證返回值時(shí)通過下面的方式

xxxx = mocked_update.return_value
self.assertEqual(xxxx, 'xxx')

通過示例,我們Mock了XXService.update行為,實(shí)現(xiàn)了對XXService的隔離測試,并確保了測試的可靠性和高效性。

總結(jié)

單元測試中使用Mock有以下幾個(gè)好處:

  1. 隔離測試:Mock 使得測試可以專注于測試的代碼邏輯,而不必關(guān)心外部不穩(wěn)定因素。
  2. 提高測試速度:Mock 可以避免耗時(shí)的外部調(diào)用,從而加快測試速度。
  3. 提高測試的可靠性和穩(wěn)定性:通過Mock,可以避免外部變化對測試結(jié)果的影響。

責(zé)任編輯:武曉燕 來源: Hi程序員
相關(guān)推薦

2017-03-23 16:02:10

Mock技術(shù)單元測試

2023-10-28 10:10:41

2021-04-26 14:25:39

ASP.NET Cor單元測試

2021-05-11 15:50:28

ASP.NET單元測試

2018-09-16 22:46:18

Mock單元測試集成測試

2017-01-14 23:42:49

單元測試框架軟件測試

2016-10-20 12:34:08

android單元測試java

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2020-08-18 08:10:02

單元測試Java

2022-03-29 11:32:32

單元測試覆蓋率框架

2011-04-22 10:50:20

Moqmock

2021-05-05 11:38:40

TestNGPowerMock單元測試

2023-07-26 08:58:45

Golang單元測試

2011-07-04 18:16:42

單元測試

2020-05-07 17:30:49

開發(fā)iOS技術(shù)

2011-05-16 16:52:09

單元測試徹底測試

2017-02-23 15:59:53

測試MockSetup

2011-04-18 13:20:40

單元測試軟件測試

2012-05-17 09:09:05

Titanium單元測試
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號