高质量的代码离不开单元测试,单元测试往往又比较耗时,本文讲述自动化单元测试的方法。
刷过力扣算法题的同学都知道,以为写的代码完美了,一提交才发现这么多情况没有考虑到。然后感叹力扣的单元测试真的牛比。写出好的代码离不开单元测试,现在已经有非常多的库可以用来更方便的进行单元测试,然而单元测试会占用大量时间,并且很可能没有覆盖程序应该处理的所有情况。在本文中,将向您展示如何使用 Hypothesis 来自动化基于属性的单元测试,以及 Hypothesis 的一些优点。
基于属性的自动化测试
典型的单元测试需要自己写一些测试用例,然后编写测试函数,通过一段代码运行它,然后根据预期结果检查结果。
Hypothesis 有所不同。它是基于属性进行单元测试。基于属性的测试涉及定义对代码的一般期望,而不是特定的示例。例如,如果您有一些代码来计算许多交易的总增值税,则可以定义一堆假设数字及其相应的增值税金额,并将其进行测试。但是,如果您知道增值税为 20%,则基于属性的测试将验证总增值税始终为总金额的 20%。
Hypothesis 基于这些原则,它根据某些规范生成任意输入数据 ,然后将该数据进行测试。更重要的是,当假设找到一个导致断言失败的示例时,它将尝试简化该示例并找到最小的失败案例-这个过程称为“收缩”。Hypothesis 实际上尝试“破坏”您的代码。因此,您的测试将使用相同数量的代码覆盖更大范围的测试用例空间。而且,您一定会找到您从未想到的极端情况。
现在就让我们看看怎么用吧。
Hypothesis 快速入门
安装
pip install hypothesis
也可以安装具体的扩展,如
pip install hypothesis[pandas,django]
使用
假如有以下代码:
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 lst
def decode(lst):
q = ""
for character, count in lst:
q += character * count
return q
单元测试就可以这样写:
from hypothesis import given
from hypothesis.strategies import text
@given(text())
def test_decode_inverts_encode(s):
assert decode(encode(s)) == s
执行结果就是:
Falsifying example: test_decode_inverts_encode(s='')
UnboundLocalError: local variable 'character' referenced before assignment
未完待续。
网友评论