加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

使用PyHamcrest执行健壮的单元测试

发布时间:2019-01-31 05:06:19 所属栏目:建站 来源:Moshe Zadka
导读:行使此框架编写断言,进步开拓测试的精确性。 在测试金字塔的底部是单位测试。单位测试每次只测试一个代码单位,凡是是一个函数或要领。 凡是,计划单个单位测试是为了测试通过一个函数或特定分支的特定执行流程,这使得将失败的单位测试和导致失败的 bug
副问题[/!--empirenews.page--]

行使PyHamcrest执行结实的单位测试

行使此框架编写断言,进步开拓测试的精确性。

在测试金字塔的底部是单位测试。单位测试每次只测试一个代码单位,凡是是一个函数或要领。

凡是,计划单个单位测试是为了测试通过一个函数或特定分支的特定执行流程,这使得将失败的单位测试和导致失败的 bug 对应起来变得轻易。

抱负环境下,单位测试很少行使或不行使外部资源,从而断绝它们并使它们更快。

单位测试套件通过在开拓进程的早期发明题目来辅佐维护高质量的产物。有用的单位测试可以在代码分开开拓职员呆板之前捕捉 bug,可能至少可以在特定分支上的一连集成情形中捕捉 bug。这符号着好的和坏的单位测试之间的区别:好的测试通过尽早捕捉 bug 并使测试更快来进步开拓职员的出产力。坏的测试低落了开拓职员的事变服从。

当测试附带的特征时,出产率凡是会低落。今世码变动时测试会失败,纵然它如故是正确的。产生这种环境是由于输出的差异,但在某种水平上是由于它不是函数左券function’s contract的一部门。

因此,一个好的单位测试可以辅佐执行函数所提交的左券。

假如单位测试间断,那意味着该左券被违背了,应该(通过变动文档和测试)明晰修改,可能(通过修复代码并保持测试稳固)来修复。

固然将测试限定为只执行民众左券是一项必要进修的伟大手艺,但有一些器材可以提供辅佐。

个中一个器材是 Hamcrest,这是一个用于编写断言的框架。最初是为基于 Java 的单位测试而发现的,但它此刻支持多种说话,包罗 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))  

这是一个用于简朴函数的断言。假如我们想要断言更伟大的函数怎么办?

  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)))

留意,我们可以简朴地断言其功效是任何次序的 124,由于荟萃不担保次序。

我们也可以很轻易用 is_not 来否认断言。这有助于我们编写准确的断言,使我们可以或许把本身限定在执行函数的民众左券方面。

然而,偶然辰,内置的成果都不是我们真正必要的。在这些环境下,Hamcrest 应承我们编写本身的匹配器matchers

想象一下以下成果:

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

我们可以自信地断言其功效匀称地分派到至少一个输入。

匹配器担任自 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))

编写高质量的 describe_to 要领很重要,由于这是测试失败时表现的动静的一部门。

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

凭证老例,我们将匹配器包装在一个函数中。偶然这给了我们进一步处理赏罚输入的机遇,但在这种环境下,我们不必要进一步处理赏罚。

  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 匹配器与内置的 any_of 匹配器团结起来,以确保我们只测试函数提交的内容。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读