国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

一日一技:如何正確為歷史遺留代碼補(bǔ)充單元測(cè)試?

開(kāi)發(fā) 項(xiàng)目管理
如果你的項(xiàng)目是從一開(kāi)始就寫(xiě)單元測(cè)試,那么你寫(xiě)起來(lái)應(yīng)該輕松又愉快,因?yàn)閱卧獪y(cè)試會(huì)促使你的代碼自身變成可測(cè)試的代碼。

我們知道,在軟件工程中,單元測(cè)試是保證軟件質(zhì)量的重要手段之一。一個(gè)優(yōu)秀的代碼,單元測(cè)試的代碼量,經(jīng)常會(huì)超過(guò)被測(cè)試的代碼本身。一個(gè)理想化的開(kāi)發(fā)團(tuán)隊(duì),可能有三分之二的時(shí)間是在寫(xiě)測(cè)試,剩下的三分之一時(shí)間才是寫(xiě)業(yè)務(wù)代碼。

如果你的項(xiàng)目是從一開(kāi)始就寫(xiě)單元測(cè)試,那么你寫(xiě)起來(lái)應(yīng)該輕松又愉快,因?yàn)閱卧獪y(cè)試會(huì)促使你的代碼自身變成可測(cè)試的代碼。

但如果你接手了一個(gè)大項(xiàng)目,里面已經(jīng)有幾十萬(wàn)行代碼了,那么給這些代碼補(bǔ)單元測(cè)試會(huì)讓你知道什么叫做痛不欲生。你會(huì)發(fā)現(xiàn)有一些函數(shù),它讓你不知道怎么寫(xiě)測(cè)試代碼。但你又不能隨便修改代碼的結(jié)構(gòu),誰(shuí)知道會(huì)引起什么連鎖反應(yīng)?

我們來(lái)看一個(gè)例子:

圖片

我想測(cè)試的是business_code?里面,check_data_dup分別返回True或者False的時(shí)候,下面代碼的邏輯。也就是說(shuō),我只關(guān)心第18-27行的邏輯。這個(gè)時(shí)候不關(guān)心MySQL和Redis。但是每次測(cè)試都要從他們里面讀取數(shù)據(jù),這樣就會(huì)導(dǎo)致測(cè)試代碼依賴外部環(huán)境。如果MySQL或者Redis掛了,那么測(cè)試代碼就會(huì)運(yùn)行失敗。

而且,就算Redis和MySQL沒(méi)有故障,你怎么知道你的data_id和pk,在數(shù)據(jù)庫(kù)中對(duì)應(yīng)的是什么數(shù)據(jù)?為了分別走到特定的分支,你還需要去檢測(cè)數(shù)據(jù)庫(kù)中特定數(shù)據(jù)的id。萬(wàn)一是測(cè)試環(huán)境,別人修改了里面的數(shù)據(jù),你的測(cè)試也可能會(huì)掛掉。

如果直接使用Pytest來(lái)寫(xiě)測(cè)試案例,代碼是這樣的:

圖片

可以看到,我運(yùn)行Pytest以后,成功了一個(gè),失敗了一個(gè)。這里我模擬出數(shù)據(jù)庫(kù)中沒(méi)有數(shù)據(jù)能夠讓check_data_dup?走到返回True邏輯的情況。

難道為了讓單元測(cè)試進(jìn)行下去,我還要去數(shù)據(jù)庫(kù)構(gòu)造一條特定的數(shù)據(jù)?這只是單元測(cè)試,又不是集成測(cè)試。

為了解決這個(gè)問(wèn)題,我們就可以使用mock模塊。這是Python自帶的一個(gè)模塊,可以動(dòng)態(tài)替換函數(shù)。

它的寫(xiě)法非常簡(jiǎn)單:

圖片

我們只需要使用@mock.patch裝飾器,裝飾測(cè)試函數(shù)就可以了。這個(gè)裝飾器接收兩個(gè)參數(shù),第一個(gè)參數(shù)是被模擬的函數(shù)的路徑,以點(diǎn)分割;第二個(gè)參數(shù)是你想讓它返回的值。

從上圖可以看到,test_runner.py?運(yùn)行以后,原本在read_data_from_redis和read_data_from_mysql中打印的兩段文字都沒(méi)有打印,說(shuō)明這兩個(gè)函數(shù)已經(jīng)被動(dòng)態(tài)替換了,他們內(nèi)部的代碼不會(huì)運(yùn)行。只會(huì)直接返回我們預(yù)設(shè)的這個(gè)返回值。這樣一來(lái)就跟數(shù)據(jù)庫(kù)解耦了。

注意,在上圖中,由于我們已經(jīng)mock了check_data_dup?,因此read_data_from_redis和read_data_from_mysql?兩個(gè)函數(shù)隨便返回什么值都可以。如果你想順帶也測(cè)試一下check_data_dup,那么可以不mock它,如下圖所示。

圖片

在check_data_dup?函數(shù)的邏輯中,如果data?參數(shù)含有字符x?,并且user_id?是偶數(shù),就返回True?,否則返回False?。我們通過(guò)mock兩個(gè)讀數(shù)據(jù)的函數(shù),分別設(shè)置不同的返回值,就能滿足讓check_data_dup返回不同值的條件。

mock.path有一個(gè)小坑,一定要注意。我們來(lái)看看下面這個(gè)文件結(jié)構(gòu):

圖片

read_data_from_redis和read_data_from_mysql?兩個(gè)函數(shù)分布在了不同的文件里面。在runner.py?中導(dǎo)入并使用了他們。test_runner.py?中,我們使用@mock.patch對(duì)這兩個(gè)函數(shù)定義的路徑打補(bǔ)丁進(jìn)行替換。可是替換了以后,運(yùn)行Pytest,會(huì)發(fā)現(xiàn)這兩個(gè)函數(shù)竟然正常運(yùn)行了。也就是說(shuō)我們的替換失敗了。

之所以會(huì)出現(xiàn)這種情況,是因?yàn)槲覀円蜓a(bǔ)丁的并不是這兩個(gè)函數(shù)定義的地方,而是使用的地方。我們?cè)趓unner.py中,分別使用如下兩個(gè)語(yǔ)句:

from mysql_util.SqlUtil import read_data_from_mysql
from controller.lib.redis.RedisUtil import read_data_from_redis

導(dǎo)入了這兩個(gè)函數(shù),我們也是在runner.py?中使用他們的。因此,@mock.patch?的第一個(gè)參數(shù),依然應(yīng)該是runner.read_data_from_redis和runner.read_data_from_mysql。

正確的做法如下圖所示:

圖片

mock.patch?還有更多高級(jí)用法,例如替換類,替換實(shí)例方法等等。可以在unittest.mock中找到他。從Python 3.3開(kāi)始,官方自帶了unittest.mock?,它跟直接import mock的效果是一樣的。

責(zé)任編輯:武曉燕 來(lái)源: 未聞Code
相關(guān)推薦

2024-07-30 08:16:18

Python代碼工具

2024-07-30 08:11:16

2021-04-12 21:19:01

PythonMakefile項(xiàng)目

2021-09-14 21:29:01

項(xiàng)目環(huán)境變量

2021-06-08 21:36:24

PyCharm爬蟲(chóng)Scrapy

2021-10-15 21:08:31

PandasExcel對(duì)象

2025-05-28 03:15:00

Scrapy數(shù)據(jù)sleep

2020-12-04 06:39:25

爬蟲(chóng)網(wǎng)頁(yè)

2023-10-29 09:16:49

代碼安全命令

2023-10-28 12:14:35

爬蟲(chóng)JavaScriptObject

2022-03-12 20:38:14

網(wǎng)頁(yè)Python測(cè)試

2022-06-28 09:31:44

LinuxmacOS系統(tǒng)

2024-01-29 00:45:36

跨域后端接口

2021-05-08 19:33:51

移除字符零寬

2024-11-11 00:38:13

Mypy靜態(tài)類型

2021-11-12 05:00:43

裝飾器代碼功能

2021-04-27 22:15:02

Selenium瀏覽器爬蟲(chóng)

2024-05-29 00:00:01

字符串Python縮進(jìn)

2020-12-11 06:30:00

工具分組DataFrame

2020-05-19 13:55:38

Python加密密碼
點(diǎn)贊
收藏

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

国产精品一区二区三区久久久| 欧美视频观看一区| 在线免费观看黄色av| 国产精品五月天| 国产精品日韩欧美一区二区三区| 九七电影院97理论片久久tvb| 日韩欧美国产三级| 精品伦理一区二区| 国产乱码精品一区二区三区av| 鲁丝一区二区三区免费| 久久91成人| x99av成人免费| 天堂网在线最新版www中文网| 午夜精品久久久久久久久| 日本在线观看a| 成人黄色大片在线观看| 蜜桃成人在线| 久久久久午夜电影| 国产精品一二区| 欧美三级午夜理伦三级在线观看| 日韩精品视频中文在线观看| 国产色在线观看| 欧美日韩亚洲一区二区三区| 免费看国产黄色片| 日本一区二区三级电影在线观看| 一本大道东京热无码aⅴ| 日韩精品一区第一页| 日韩一区二区三区资源| 亚洲国产老妈| 国产成人精品在线视频| 日韩免费在线| 日韩av男人的天堂| 日韩最新av| 久久久久久久一区二区| 欧美专区一区| 91成人福利在线| 国产乱码精品一区二区亚洲| 777国产偷窥盗摄精品视频| 欧美激情99| 992tv成人免费影院| 在线综合色站| 国产精品一区二区三区久久| 91综合在线| 日韩免费高清在线观看| 深夜福利成人| 国产免费成人在线视频| 樱空桃在线播放| 国产精品专区免费| 亚洲精品98久久久久久中文字幕| 免费在线观看av| 精品视频久久久| 亚洲精品国产嫩草在线观看| 亚洲图中文字幕| 美女网站色精品尤物极品姐弟| 欧美一区二三区| 色爱综合网欧美| 高清视频一区二区三区| 久久久噜噜噜久久狠狠50岁| 日韩和欧美的一区二区| 久久久综合视频| 美女视频黄a视频全免费观看| 亚洲视频香蕉人妖| 香蕉视频国产在线观看| 日韩一级片在线观看| 色在线视频观看| 欧美一区三区三区高中清蜜桃| 日韩精品午夜| 精品一区二区国产| 成人h版在线观看| 成人拍拍拍在线观看| 亚洲欧美二区三区| 麻豆视频在线免费观看| 欧美一级专区免费大片| 国产精品调教| 在线免费观看黄色网址| 亚洲激情小视频| 久久久免费视频网站| 亚洲人成人77777线观看| 国产尤物久久久| 久久久国产精彩视频美女艺术照福利| gogo高清午夜人体在线| 久久久水蜜桃| 欧美一级做一级爱a做片性| 久久久久久久电影一区| 午夜影院欧美| 日韩日韩日韩日韩日韩| 亚洲婷婷综合色高清在线| 国产精品99久久99久久久| 欧美另类久久久品| 日韩一级视频| 国产精品成人品| 国产一区二区三区在线观看免费视频| 日韩人妻精品无码一区二区三区| 亚洲欧美日韩专区| 国产无遮挡又黄又爽免费网站| 欧美日韩精品系列| 欧美影院视频| 一本一道久久a久久综合精品| 17c精品麻豆一区二区免费| 成人线上视频| 7777精品伊久久久大香线蕉语言 | 亚洲色图欧美激情| 在线日本视频| 欧美大片在线影院| 成人激情开心网| 伊人久久青草| 动漫视频在线一区| 国产一区自拍视频| 天堂va蜜桃一区二区三区| 在线看片你懂得| 成人激情免费在线| 激情亚洲影院在线观看| 高潮一区二区| 九七电影院97理论片久久tvb| 精品中文字幕av| 日韩欧美国产1| 综合综合综合综合综合网| 男女午夜刺激视频| 欧美黑人经典片免费观看| 久久影院模特热| 久久国产直播| 91在线观看| 国产欧美中文字幕| 国产一区二区免费视频| 欧美视频在线观看网站| 国产精品久久久久影视| 久久国产精品美女| 成人a视频在线观看| 九色综合狠狠综合久久| 国产国产国产国产国产国产| 精品精品欲导航| 国产又黄又大久久| av日韩电影| av中文字幕av| 亚洲a在线播放| 不卡一卡二卡三乱码免费网站| 波多野结衣中文字幕久久| 美女xx视频| 国产精品一区二区免费| 精品国产一区二区三区久久影院 | 国产69精品久久久久孕妇| 亚洲视频一区二区三区| 久久久国产一区二区三区四区小说 | 色综合天天狠天天透天天伊人| 国产成人午夜视频| 亚洲电影视频在线| 国产欧美日韩伦理| 国产丝袜高跟一区| 精品中文av资源站在线观看| 在线观看网站免费入口在线观看国内| 视频一区国产精品| 韩剧1988免费观看全集| 欧美日韩精品电影| 国产三级欧美三级日产三级99| 欧美激情极品| 99视频入口| 国产视频999| 精品福利在线看| 中文字幕第一区二区| 久久中文字幕国产| 看黄网站在线| 国产精品视频网站| 亚洲综合激情小说| 一区二区蜜桃| 欧美人动性xxxxz0oz| 50度灰在线观看| 日韩在线小视频| 国产精品国产成人国产三级| 久草成人在线| 蜜桃视频在线入口www| 国产精品对白刺激久久久| 在线不卡中文字幕| 国产伦精品一区二区三区视频青涩| 午夜不卡一区| 日韩黄色视屏| 久久福利电影| 亚洲人成欧美中文字幕| 欧美国产一区二区在线观看| 99国产精品免费视频观看| 羞羞电影在线观看www| 欧美二区在线视频| 国产拍精品一二三| 亚洲成人国产精品| 国产欧美日韩中文久久| 成人免费aaa| 欧美性受ⅹ╳╳╳黑人a性爽| 18网站在线观看| 欧美成人免费网| 日韩欧美电影| 国产丝袜在线| 亚洲天堂av线| 韩国成人一区| 精品国产欧美成人夜夜嗨| 亚洲高清免费观看| 久久精品国产亚洲aⅴ| 色爱综合av| 男人天堂视频在线观看| 91热爆在线观看| 国产青草视频在线观看| 91系列在线播放|