美文网首页Python七号
用 Hypothesis 来自动化单元测试

用 Hypothesis 来自动化单元测试

作者: somenzz | 来源:发表于2020-12-10 22:31 被阅读0次

高质量的代码离不开单元测试,单元测试往往又比较耗时,本文讲述自动化单元测试的方法。

刷过力扣算法题的同学都知道,以为写的代码完美了,一提交才发现这么多情况没有考虑到。然后感叹力扣的单元测试真的牛比。写出好的代码离不开单元测试,现在已经有非常多的可以用来更方便的进行单元测试,然而单元测试会占用大量时间,并且很可能没有覆盖程序应该处理的所有情况。在本文中,将向您展示如何使用 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

未完待续。

相关文章

网友评论

    本文标题:用 Hypothesis 来自动化单元测试

    本文链接:https://www.haomeiwen.com/subject/nbcdgktx.html