日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python 如何用 Hypothesis 來(lái)自動(dòng)化單元測(cè)試

瀏覽:205日期:2022-06-24 11:44:10

高質(zhì)量的代碼離不開(kāi)單元測(cè)試,而設(shè)計(jì)單元測(cè)試的用例往往又比較耗時(shí),而且難以想到一些極端情況,本文講述如何使用 Hypothesis 來(lái)自動(dòng)化單元測(cè)試

刷過(guò)力扣算法題的同學(xué)都知道,有時(shí)候覺(jué)得代碼已經(jīng)很完善了,一提交才發(fā)現(xiàn)很多情況沒(méi)有考慮到。然后感嘆力扣的單元測(cè)試真的牛比。

因此,高質(zhì)量的代碼離不開(kāi)單元測(cè)試,如果現(xiàn)在還沒(méi)有寫(xiě)過(guò)單元測(cè)試,建議先去學(xué)習(xí)以下常用的單元測(cè)試庫(kù)[1],只要實(shí)踐過(guò),才能感受到本文開(kāi)頭提到的那些痛點(diǎn)。

Hypothesis 是一個(gè) Python 庫(kù),用于讓單元測(cè)試編寫(xiě)起來(lái)更簡(jiǎn)單,運(yùn)行時(shí)功能更強(qiáng)大,可以在代碼中查找您不會(huì)想到的極端情況。它穩(wěn)定,強(qiáng)大且易于添加到任何現(xiàn)有測(cè)試框架中。它的工作原理是讓您編寫(xiě)斷言每種情況都應(yīng)該正確的測(cè)試,而不僅僅是您偶然想到的那些。

Hypothesis 的基礎(chǔ)知識(shí)

典型的單元測(cè)試需要自己寫(xiě)一些測(cè)試用例,然后編寫(xiě)測(cè)試函數(shù),通過(guò)一段代碼運(yùn)行它,然后根據(jù)預(yù)期結(jié)果檢查結(jié)果。

Hypothesis 有所不同。它是基于屬性進(jìn)行單元測(cè)試。它通過(guò)生成與您的規(guī)范匹配的任意數(shù)據(jù)并檢查在這種情況下程序是否仍然有效。如果找到了一個(gè)失敗的用例,它將采用該示例并將其測(cè)試用例范圍縮減縮減為一定尺寸,然后對(duì)其進(jìn)行簡(jiǎn)化,直到找到一個(gè)仍會(huì)導(dǎo)致問(wèn)題的小得多的示例。然后將其保存,后續(xù)單元測(cè)試時(shí)仍會(huì)使用這些用例。

現(xiàn)在就讓我們看看怎么用吧。

Hypothesis 快速入門(mén)1、安裝

可以通過(guò) pip 安裝,也可以通過(guò)源代碼安裝[2],也可以安裝一些擴(kuò)展[3],如下:

pip install hypothesispip install hypothesis[pandas,django]2、使用

先寫(xiě)一段代碼,保存在 mycode.py 中,功能是對(duì)字符串進(jìn)行特定的編碼和解碼,內(nèi)容如下:

def encode(input_string): count = 1 prev = '' lst = [] for character in input_string: if character != prev: if prev: entry = (prev, count) lst.append(entry) count = 1 prev = character else: count += 1 entry = (character, count) lst.append(entry) return lstdef decode(lst): q = '' for character, count in lst: q += character * count return q

對(duì)這段代碼進(jìn)行單元測(cè)試,往往需要寫(xiě)很多測(cè)試用例,現(xiàn)在我們使用 hypothesis 來(lái)自動(dòng)為我們測(cè)試,編寫(xiě) test_mycode.py (文件名隨意),內(nèi)容如下:

from hypothesis import givenfrom mycode import decode,encodefrom hypothesis.strategies import textimport unittestclass TestEncoding(unittest.TestCase): @given(text()) def test_decode_inverts_encode(self, s): self.assertEqual(decode(encode(s)), s)if __name__ == '__main__': unittest.main()

可以看出,這里并沒(méi)有出現(xiàn)具體的測(cè)試用例,而是使用來(lái) text 的策略,相當(dāng)于 hypothesis 自動(dòng)窮舉來(lái)可能的情況,也可以看出它很容易可其他測(cè)試框架集成,這里是 unittest。現(xiàn)在來(lái)運(yùn)行一下看看效果:

(py38env) ➜ tmp python test_mycode.pyFalsifying example: test_decode_inverts_encode( self=<__main__.TestEncoding testMethod=test_decode_inverts_encode>, s=’’,)E======================================================================ERROR: test_decode_inverts_encode (__main__.TestEncoding)----------------------------------------------------------------------Traceback (most recent call last): File 'test_mycode.py', line 9, in test_decode_inverts_encode def test_decode_inverts_encode(self, s): File '/Users/aaron/py38env/lib/python3.8/site-packages/hypothesis/core.py', line 1162, in wrapped_test raise the_error_hypothesis_found File 'test_mycode.py', line 10, in test_decode_inverts_encode self.assertEqual(decode(encode(s)), s) File '/Users/aaron/tmp/mycode.py', line 14, in encode entry = (character, count)UnboundLocalError: local variable ’character’ referenced before assignment----------------------------------------------------------------------Ran 1 test in 0.048sFAILED (errors=1)

這里測(cè)試出當(dāng)字符串為 ’’ 的時(shí)候會(huì)拋出 UnboundLocalError 的異常。現(xiàn)在我們來(lái)修復(fù)這個(gè) bug,然后把所有的測(cè)試用例 s 給打印出來(lái),看看它用了哪些測(cè)試用例。

encode 函數(shù)加入以下代碼:

if not input_string: return []

test_mycode.py 文件打印出測(cè)試用例:

@given(text())def test_decode_inverts_encode(self, s): print(f'{s=}') self.assertEqual(decode(encode(s)), s)

再次執(zhí)行:

(py38env) ➜ tmp python test_mycode.pys=’’s=’1’s=’0’s=’0’s=’0’s=’Ā’s=’U000cf5e5’s=’0’s=’’s=’0’s=’0’s=’E’s=')dù’x18U0003deb3¤jd's=’U0005bc37x07U000537a1ÝÀãiÎU000ce9e5x0b’s=’U0005bc37U0005bc37U000537a1ÝÀãiÎU000ce9e5x0b’s=’U0005bc37U000537a1U000537a1ÝÀãiÎU000ce9e5x0b’s=’ÀU000537a1U000537a1ÝÀãiÎU000ce9e5x0b’s=’U000965e1x12x85&U000f500aÄÃc’s=’nU0004466cx86Îx07’s=’ÊU00063f1ex01Gx88’s=’ÚVn’s=’VVn’s=’U0008debf??è’s=’U0008debf??è’s=’U0008debf??’s=’U0008debfU0008debf’s=’U0008debfU0008debfó]½àqx82#U00015196U0001c8beg’s=’U0008debfgó]½àqx82#U00015196U0001c8beg’s=’?’s=’Î’s=’ÎU00085b9e’s='Î8’?U00057c38Ù;x07U000a5ea8Ò»=U00091d5b~8뺈's=’U000d6497Ý>’s=’U000e0f01’s=’U000e0f01Å0y¢KN®’s=’U000e0f01Å0y¢KN®’s=’U00050a06’s=’ÅU000b98b3かU000ba80aá`Ã-Êux8cx90³FÔ'’s=’x8eU0004612ax83ç’s=’x8e’s=’x8ex98U000fb3e0U0010d2b3x10x82x94Ð渥’s=’¥W’s=’pU000e5a2aE·`ì’s=’U000b80f8x12U000c2d54’s=’.U000703de’s=’6U00010ffaU000f7994x8e’s=’116U000f7994x8e’s=’1?6U000f7994x8e’s=’4?6U000f7994x8e’s=’4x8e6U000f7994x8e’s=’0’s=’U0006a564´Ðx93üx9eb&ix1cÑ’s=’U000ceb6f’s=’U000ceb6fxa0x08’s=’U000ceb6fxa0x08’s=’U000ceb6fꄃx08’s=’U000ceb6fꄃ勻U0007cc15U000b2aaa×**’s=’U000ceb6fꄃ勻’s=’勻ꄃ勻’s=’Jx14?ö’s=’q)’s=’q)’s=’qU00060931’s=’q6’s=’U000e3441’s=’U000e3441U00019958¯’s=’x13’s=’U000f34dbk’s=’Kp&tÛà’s=’nöx93’s=’nnx93’s=’U00019c8dѳU00056cbdU000e3b2fU00058d302’s=’x90=Rx8bßx03’s=’x9a’s=’U000147e7’s=’U000147e7x85U0007a3ef’s=’U000147e7U00050a070Â>’s=’U000a4089x0eC+RÁx02x97x9cüÌïSSU0006cbc5;ÿ~x16x019VÇU000a32fdQ÷x15’s=’ÞÚ¾x19©Z®’s=’ਸ਼æ’s=’U000cd45a’s=’U000cd45aU000e15cbÑx08Jueb3eúßx07Ix91x9ax18x16Çx80x1a’s=’x8f}ºx0eqx0b’s=’x0e}ºx0eqx0b’s='U000e05a3&¶º[fõx8bÜR’ͼtx97íWx05U000caea9U0008fd74U000e8f1c¹?dfƾx13's=’x10U000e12e2ùU0006f96erýU00014bafx00x95U000dbc92ÉU00081613µU0003b865ZU0008cc3c’s=’úU000b561fx8fÎ’s=’tàÖ÷’s=’àx92©ÌU000618fax92’s=’U000aaf94x94x84U000cda69U0005291aU000a63deþ¿Ox8a>U000b458bÊ.U00086f07x1a’s=’U0009754e?U_xa0x13PQx18ºx07U0006c9c5.Á’s=’U00102456’s=’³WᵎÕ’s=’x14x1c’s=’x14’s=’x14U00105bcd'x10Ôx99U000a5032RU00056c44V&÷>+U000aaff2ñ®U000d7570%ª!U00032553´8x^«’s=’x00U000e2ac4¼ÄUrB’s=’x00U000e2ac4¼ÄUrB’s=’x00U000e2ac4¼ÄUrB’s=’ªx1aUx8aÇU000b2fb9U0005a586’.----------------------------------------------------------------------Ran 1 test in 0.180sOK

從執(zhí)行結(jié)果可以看出,’’ 首先被測(cè)試,其次 hypothesis 使用了大量的極端測(cè)試用例,減輕了手寫(xiě)的負(fù)擔(dān),大大提升了效率。

雖然 hypothesis 具有自動(dòng)記憶功能,你仍然可以顯式的指定某個(gè)測(cè)試用例一直被測(cè)試,而且這是推薦的做法,比如我想在每次的測(cè)試中都測(cè)試 ’’,可以這樣寫(xiě):

from hypothesis import given, examplefrom hypothesis.strategies import text@given(text())@example('')def test_decode_inverts_encode(s): assert decode(encode(s)) == s

這一點(diǎn)非常有用,提升了測(cè)試代碼的可讀性,可以用來(lái)告訴開(kāi)發(fā)人員或者未來(lái)的自己,輸入的字符串必須要考慮 ’’ 的情形。

此外,執(zhí)行單元測(cè)試,不一定要使用 unittest.main(),也可以這樣,是不是很方便:

if __name__ == '__main__': test_decode_inverts_encode()3、其他策略參考從哪里開(kāi)始

以上僅僅是拋磚引玉,hypothesis 還有很多自動(dòng)化的特性,不再一一列舉,最好的學(xué)習(xí)方法是邊做,邊嘗試。hypothesis 是一個(gè)開(kāi)源項(xiàng)目,有著詳細(xì)的官方文檔[4],GitHub 倉(cāng)庫(kù)[5]這里都是你開(kāi)啟自動(dòng)化測(cè)試的好地方:

參考資料

[1]

庫(kù): https://realpython.com/python-testing/

[2]

源代碼安裝: https://github.com/HypothesisWorks/hypothesis/blob/master/CONTRIBUTING.rst

[3]

擴(kuò)展: https://hypothesis.readthedocs.io/en/latest/extras.html

[4]

官方文檔: https://hypothesis.readthedocs.io/en/latest/quickstart.html#running-tests

[5]

GitHub 倉(cāng)庫(kù): https://github.com/HypothesisWorks/hypothesis/

以上就是python 如何用 Hypothesis 來(lái)自動(dòng)化單元測(cè)試的詳細(xì)內(nèi)容,更多關(guān)于python 用 Hypothesis 來(lái)自動(dòng)化單元測(cè)試的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产欧美日韩一区二区三区四区| 宅男噜噜噜66国产日韩在线观看| 精品中文字幕一区二区三区| 高清精品久久| 波多野结衣一区| 99视频一区| 精品视频在线观看网站| 国产精品777777在线播放 | 久久精品97| 在线亚洲精品| 亚洲一区激情| 国产精品porn| 免费亚洲婷婷| 91精品啪在线观看国产18| 欧美日韩国产亚洲一区| 亚州欧美在线| 丝袜av一区| 一本一道久久a久久| 国产精品片aa在线观看| 九九色在线视频| 蜜臀91精品一区二区三区| 亚洲精品欧美| 黄色在线网站噜噜噜| 亚洲va在线| 亚洲啊v在线免费视频| 国产成人精品一区二区三区免费| 欧美午夜精彩| 国产激情一区| 亚洲经典在线| 日本精品不卡| 国产亚洲欧美日韩在线观看一区二区| 日韩在线欧美| 日韩成人午夜精品| 久久国产影院| 免费亚洲婷婷| 最新亚洲国产| 亚洲精华国产欧美| 国产亚洲毛片| 另类欧美日韩国产在线| 九九综合在线| 日韩成人精品一区二区| 日本精品国产| 亚洲视频国产| 国产精品毛片一区二区在线看| 蜜臀久久久99精品久久久久久| 国产精品免费精品自在线观看| 亚洲欧美在线专区| 天堂网av成人| 国产精品一站二站| 日韩av一区二区在线影视| 一区二区三区四区在线看| 粉嫩av一区二区三区四区五区| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品久久| 国产精品免费不| 日本欧美一区二区在线观看| 亚洲影视一区二区三区| 亚洲黄色网址| 欧美不卡高清一区二区三区| 久久精品xxxxx| 婷婷五月色综合香五月| 国产精品日韩欧美一区| 欧美精品一二| 香蕉精品999视频一区二区| 中文字幕在线高清| 伊人网在线播放| 国产一区二区亚洲| 国产一区日韩欧美| 精品国产日韩欧美精品国产欧美日韩一区二区三区| 亚洲色诱最新| 亚洲精品九九| 91伊人久久| 国产精品欧美一区二区三区不卡| 亚洲精品系列| 一区二区精彩视频| 亚洲日本三级| 久久狠狠亚洲综合| 高清一区二区| 九色精品91| 亚州av一区| 国产精品一站二站| 色综合狠狠操| 欧美成人精品三级网站| 久久影院一区二区三区| 欧美一区二区三区久久精品| 国产精品一区二区精品| 日本一区二区高清不卡| 久久高清免费| 日本国产欧美| 97精品视频在线看| 亚洲精品第一| 久久不见久久见免费视频7| 日韩一区三区| 热久久国产精品| 久久久久亚洲精品中文字幕| 成人国产精品久久| 91精品国产成人观看| 性色av一区二区怡红| 免费久久精品视频| 精品三级av在线导航| 蜜桃tv一区二区三区| 日本精品久久| 精品中文字幕一区二区三区av| 日本色综合中文字幕| 色爱综合网欧美| 三级一区在线视频先锋| 日韩精品91亚洲二区在线观看| 国产精品18| 国产亚洲综合精品| 开心激情综合| 亚洲免费影院| 精品日韩一区| 日韩动漫一区| 日韩精品欧美| 国产精品嫩草影院在线看| 亚洲综合不卡| 亚洲精品888| 国产精品久久久久蜜臀| 日韩中文字幕视频网| 欧美99久久| 福利一区视频| 国产精品视频一区二区三区 | 不卡专区在线| 麻豆视频在线观看免费网站黄 | 免费一级欧美片在线观看网站| 久久亚洲专区| 久久久久久夜| 国产精品国产三级国产在线观看| 日韩av网站免费在线| 午夜久久av| 欧美天堂在线| 国产日韩中文在线中文字幕 | 久久精品国产福利| 日韩二区在线观看| 久久福利精品| 久久久精品久久久久久96| 久久人人97超碰国产公开结果| 黑森林国产精品av| 人人香蕉久久| 久久高清免费| 好吊视频一区二区三区四区| 亚洲精品乱码| 国模大尺度视频一区二区| 91精品亚洲| 综合亚洲自拍| 日韩国产激情| 伊人精品一区| 蜜桃av一区| 日韩精品成人| 国产精品久久777777毛茸茸| 国产精品久久久久蜜臀| 久久理论电影| 视频一区中文字幕| 日韩精品欧美大片| 国产精品久久久免费| 精品在线网站观看| 日本欧美不卡| 尹人成人综合网| 国产亚洲精品美女久久久久久久久久| 91av一区| 91精品国产自产在线观看永久∴| 国产一区一一区高清不卡| 亚洲第一精品影视| 久久国产三级精品| 国产精品av久久久久久麻豆网| 午夜电影一区| 1024精品一区二区三区| 亚洲我射av| 久久夜夜操妹子| 国产精品自拍区| 欧美亚洲国产激情| 国产免费av国片精品草莓男男| 五月天久久777| 国产精品一区二区中文字幕| 久久久久国产一区二区| 最新日韩欧美| 日本亚洲不卡| 精品中文字幕一区二区三区四区| 狠狠干成人综合网| 国内揄拍国内精品久久| 亚洲tv在线| 午夜国产精品视频| 国产精品777777在线播放 | 久久99蜜桃| 黑丝一区二区| 老司机免费视频一区二区| 精品一区在线| 国产亚洲电影| 久久精品国内一区二区三区水蜜桃| 蜜臀av性久久久久蜜臀aⅴ四虎| 精品国产欧美日韩| 免费看黄色91| 综合激情视频| 欧美精品自拍| 999精品色在线播放| 国产精品一区二区av日韩在线| 蜜臀久久久久久久| 国产一区二区高清| 免费在线成人网| 亚洲一级淫片|