日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
使用PyHamcrest執(zhí)行健壯的單元測(cè)試

 使用此框架編寫(xiě)斷言,提高開(kāi)發(fā)測(cè)試的準(zhǔn)確性。

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、成都網(wǎng)站制作、移動(dòng)網(wǎng)站開(kāi)發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。成都創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開(kāi)放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。成都創(chuàng)新互聯(lián)推出中站免費(fèi)做網(wǎng)站回饋大家。

在測(cè)試金字塔的底部是單元測(cè)試。單元測(cè)試每次只測(cè)試一個(gè)代碼單元,通常是一個(gè)函數(shù)或方法。

通常,設(shè)計(jì)單個(gè)單元測(cè)試是為了測(cè)試通過(guò)一個(gè)函數(shù)或特定分支的特定執(zhí)行流程,這使得將失敗的單元測(cè)試和導(dǎo)致失敗的 bug 對(duì)應(yīng)起來(lái)變得容易。

理想情況下,單元測(cè)試很少使用或不使用外部資源,從而隔離它們并使它們更快。

單元測(cè)試套件通過(guò)在開(kāi)發(fā)過(guò)程的早期發(fā)現(xiàn)問(wèn)題來(lái)幫助維護(hù)高質(zhì)量的產(chǎn)品。有效的單元測(cè)試可以在代碼離開(kāi)開(kāi)發(fā)人員機(jī)器之前捕獲 bug,或者至少可以在特定分支上的持續(xù)集成環(huán)境中捕獲 bug。這標(biāo)志著好的和壞的單元測(cè)試之間的區(qū)別:好的測(cè)試通過(guò)盡早捕獲 bug 并使測(cè)試更快來(lái)提高開(kāi)發(fā)人員的生產(chǎn)力。壞的測(cè)試降低了開(kāi)發(fā)人員的工作效率。

當(dāng)測(cè)試附帶的特性時(shí),生產(chǎn)率通常會(huì)降低。當(dāng)代碼更改時(shí)測(cè)試會(huì)失敗,即使它仍然是正確的。發(fā)生這種情況是因?yàn)檩敵龅牟煌?,但在某種程度上是因?yàn)樗皇呛瘮?shù)契約function’s contract的一部分。

因此,一個(gè)好的單元測(cè)試可以幫助執(zhí)行函數(shù)所提交的契約。

如果單元測(cè)試中斷,那意味著該契約被違反了,應(yīng)該(通過(guò)更改文檔和測(cè)試)明確修改,或者(通過(guò)修復(fù)代碼并保持測(cè)試不變)來(lái)修復(fù)。

雖然將測(cè)試限制為只執(zhí)行公共契約是一項(xiàng)需要學(xué)習(xí)的復(fù)雜技能,但有一些工具可以提供幫助。

其中一個(gè)工具是 Hamcrest,這是一個(gè)用于編寫(xiě)斷言的框架。最初是為基于 Java 的單元測(cè)試而發(fā)明的,但它現(xiàn)在支持多種語(yǔ)言,包括 Python。

Hamcrest 旨在使測(cè)試斷言更容易編寫(xiě)和更精確。

 
 
 
  1. def add(a, b):
  2.     return a + b
  3. from hamcrest import assert_that, equal_to
  4. def test_add():
  5.     assert_that(add(2, 2), equal_to(4))  

這是一個(gè)用于簡(jiǎn)單函數(shù)的斷言。如果我們想要斷言更復(fù)雜的函數(shù)怎么辦?

 
 
 
  1. def test_set_removal():
  2.     my_set = {1, 2, 3, 4}
  3.     my_set.remove(3)
  4.     assert_that(my_set, contains_inanyorder([1, 2, 4]))
  5.     assert_that(my_set, is_not(has_item(3)))

注意,我們可以簡(jiǎn)單地?cái)嘌云浣Y(jié)果是任何順序的 1、24,因?yàn)榧喜槐WC順序。

我們也可以很容易用 is_not 來(lái)否定斷言。這有助于我們編寫(xiě)精確的斷言,使我們能夠把自己限制在執(zhí)行函數(shù)的公共契約方面。

然而,有時(shí)候,內(nèi)置的功能都不是我們真正需要的。在這些情況下,Hamcrest 允許我們編寫(xiě)自己的匹配器matchers。

想象一下以下功能:

 
 
 
  1. def scale_one(a, b):
  2.     scale = random.randint(0, 5)
  3.     pick = random.choice([a,b])
  4.     return scale * pick

我們可以自信地?cái)嘌云浣Y(jié)果均勻地分配到至少一個(gè)輸入。

匹配器繼承自 hamcrest.core.base_matcher.BaseMatcher,重寫(xiě)兩個(gè)方法:

 
 
 
  1. class DivisibleBy(hamcrest.core.base_matcher.BaseMatcher):
  2.     def __init__(self, factor):
  3.         self.factor = factor
  4.     def _matches(self, item):
  5.         return (item % self.factor) == 0
  6.     def describe_to(self, description):
  7.         description.append_text('number divisible by')
  8.         description.append_text(repr(self.factor))

編寫(xiě)高質(zhì)量的 describe_to 方法很重要,因?yàn)檫@是測(cè)試失敗時(shí)顯示的消息的一部分。

 
 
 
  1. def divisible_by(num):
  2.     return DivisibleBy(num)

按照慣例,我們將匹配器包裝在一個(gè)函數(shù)中。有時(shí)這給了我們進(jìn)一步處理輸入的機(jī)會(huì),但在這種情況下,我們不需要進(jìn)一步處理。

 
 
 
  1. def test_scale():
  2.     result = scale_one(3, 7)
  3.     assert_that(result,
  4.                 any_of(divisible_by(3),
  5.                 divisible_by(7)))

請(qǐng)注意,我們將 divisible_by 匹配器與內(nèi)置的 any_of 匹配器結(jié)合起來(lái),以確保我們只測(cè)試函數(shù)提交的內(nèi)容。

在編輯這篇文章時(shí),我聽(tīng)到一個(gè)傳言,取 “Hamcrest” 這個(gè)名字是因?yàn)樗?“matches” 字母組成的字謎。嗯…

 
 
 
  1. >>> assert_that("matches", contains_inanyorder(*"hamcrest")
  2. Traceback (most recent call last):
  3.   File "", line 1, in
  4.   File "/home/moshez/src/devops-python/build/devops/lib/python3.6/site-packages/hamcrest/core/assert_that.py", line 43, in assert_that
  5.     _assert_match(actual=arg1, matcher=arg2, reason=arg3)
  6.   File "/home/moshez/src/devops-python/build/devops/lib/python3.6/site-packages/hamcrest/core/assert_that.py", line 57, in _assert_match
  7.     raise AssertionError(description)
  8. AssertionError:
  9. Expected: a sequence over ['h', 'a', 'm', 'c', 'r', 'e', 's', 't'] in any order
  10.       but: no item matches: 'r' in ['m', 'a', 't', 'c', 'h', 'e', 's']

經(jīng)過(guò)進(jìn)一步的研究,我找到了傳言的來(lái)源:它是 “matchers” 字母組成的字謎。

 
 
 
  1. >>> assert_that("matchers", contains_inanyorder(*"hamcrest"))
  2. >>>

如果你還沒(méi)有為你的 Python 代碼編寫(xiě)單元測(cè)試,那么現(xiàn)在是開(kāi)始的好時(shí)機(jī)。如果你正在為你的 Python 代碼編寫(xiě)單元測(cè)試,那么使用 Hamcrest 將允許你使你的斷言更加精確,既不會(huì)比你想要測(cè)試的多也不會(huì)少。這將在修改代碼時(shí)減少誤報(bào),并減少修改工作代碼的測(cè)試所花費(fèi)的時(shí)間。


分享標(biāo)題:使用PyHamcrest執(zhí)行健壯的單元測(cè)試
網(wǎng)頁(yè)地址:http://www.dlmjj.cn/article/cddoghj.html