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

使用PyHamcrest執(zhí)行健壯的單元測試

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

[[256592]]

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

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

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

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

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

當(dāng)測試附帶的特性時,生產(chǎn)率通常會降低。當(dāng)代碼更改時測試會失敗,即使它仍然是正確的。發(fā)生這種情況是因為輸出的不同,但在某種程度上是因為它不是函數(shù)契約function’s contract的一部分。

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

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

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

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

Hamcrest 旨在使測試斷言更容易編寫和更精確。

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

這是一個用于簡單函數(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é)果是任何順序的 1、24,因為集合不保證順序。

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

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

想象一下以下功能:

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

我們可以自信地斷言其結(jié)果均勻地分配到至少一個輸入。

匹配器繼承自 hamcrest.core.base_matcher.BaseMatcher,重寫兩個方法:

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

編寫高質(zhì)量的 describe_to 方法很重要,因為這是測試失敗時顯示的消息的一部分。

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

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

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

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

在編輯這篇文章時,我聽到一個傳言,取 “Hamcrest” 這個名字是因為它是 “matches” 字母組成的字謎。嗯…

  1. >>> assert_that("matches", contains_inanyorder(*"hamcrest")
  2. Traceback (most recent call last):
  3.   File "<stdin>", line 1, in <module>
  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)過進一步的研究,我找到了傳言的來源:它是 “matchers” 字母組成的字謎。

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

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

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2023-07-26 08:58:45

Golang單元測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2017-01-14 23:42:49

單元測試框架軟件測試

2017-03-23 16:02:10

Mock技術(shù)單元測試

2012-05-17 09:09:05

Titanium單元測試

2013-06-04 09:49:04

Spring單元測試軟件測試

2024-10-16 16:09:32

2021-03-28 23:03:50

Python程序員編碼

2010-03-04 15:40:14

Python單元測試

2011-05-16 16:52:09

單元測試徹底測試

2011-06-14 15:56:42

單元測試

2020-08-18 08:10:02

單元測試Java

2022-05-12 09:37:03

測試JUnit開發(fā)

2021-05-05 11:38:40

TestNGPowerMock單元測試

2023-08-02 13:59:00

GoogleTestCTest單元測試

2011-07-04 18:16:42

單元測試

2020-05-07 17:30:49

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

2011-08-11 13:02:43

Struts2Junit

2011-06-14 15:39:46

單元測試
點贊
收藏

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