美文网首页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