美文网首页
不知道自己代码是否正确,一起来用 Hypothesis 测试一下

不知道自己代码是否正确,一起来用 Hypothesis 测试一下

作者: 孤城暮雨丶 | 来源:发表于2020-12-11 13:39 被阅读0次

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于腾讯云 作者:咸鱼学Python

介绍

无论你使用哪种编程语言或框架,测试都非常重要。Hypothesis是 Python 的一个高级测试库。它允许编写测试用例时参数化,然后生成使测试失败的简单易懂的测试数据。可以用更少的工作在代码中发现更多的bug。该测试库覆盖了大多数情况,并且确实可以帮助你查找代码中的错误。

这篇文章为展示了如何使用Hypothesis在Python中进行测试,并提供了一些示例。

我们如何区分测试?

在我们开始进行基于属性的测试之前,我们需要知道测试的一般区别。有不同的分组测试方法,两种最常见的方法基于测试方法和测试级别。让我们从大多数人已经听说的测试级别开始。本质上,存在四个测试级别(尽管人们可能也知道或定义其他级别):

  • 单元测试
  • 集成测试
  • 系统测试
  • 端到端测试

不同测试级别侧重专注于不同的事物。单元测试侧重于软件的特定部分或功能。这可以是单个功能或功能的一部分。相反,集成测试侧重于通过软件组件的接口进行协作。系统测试甚至更进一步,可以测试整个系统。

现在,我们将看看存在的各种各样的测试方法。

最常见和已知的是静态和动态测试。所谓静态测试(static testing)就是不实际运行被测软件,而只是静态地检查程序代码、界面或文档中可能存在的错误的过程。如果软件或其部分实际执行,我们称之为动态测试。编写单元测试和集成测试属于动态测试。

另一种常见的方法是盒式方法。基本上,它可以分为白盒测试和黑盒测试(以及灰盒测试作为两者的混合)。白盒测试可验证程序的内部结构或工作情况。黑盒测试与之相反,在黑盒测试中,应用程序被视为黑盒,并且对其交互进行测试。这意味着在不了解内部实现的情况下测试功能。

什么是基于属性的测试?

现在,我们快速了解了如何区分测试,您可能会问:什么是基于属性的测试?

基于属性的测试技术( Property-based testing),是指编写对你的代码来说为真的逻辑语句(即“属性”),然后使用自动化工具来生成测试输入(一般来说,是指某种特定类型的随机生成输入数据),并观察程序接受该输入时属性是否保持不变。如果某个输入违反了某一条属性,则用户证明程序存在一处错误,并找到一个能够演示该错误的便捷示例。

### 使用Hypothesis进行基于属性的测试

让我们举一个简单的例子。假设您有两个函数crement()和decrement()。一个示例实现可能如下所示:
# increment_decrement.py

def increment(number: int) -> int:
    return number + 1

def decrement(number: int) -> int:
    return number - 1

您可能会为两者编写单元测试代码,如下所示:

# test_increment_decrement_pytest.py

from increment_decrement import decrement
from increment_decrement import increment

def test_increment():
    x = 5
    expected = 6
    actual = increment(x)
    assert actual == expected

def test_decrement():
    x = 5
    expected = 4
    actual = decrement(x)
    assert actual == expected

注意:测试代码是使用pytest框架编写的。

当然,您可以编写更多的测试脚本来测试具有不同值的两个函数,甚至可以对测试进行参数化。但是,最后您将使用预定义的值来测试这两个功能。

使用基于属性的测试库(例如Hypothesis )编写测试是不同的。在这里,您可以指定要测试的类型以及软件的工作方式或行为方式。然后该库根据指定的类型生成随机值来进行实际测试功能。

让我们看看如何使用Hypothesis来测试我们的两个功能。

# test_increment_decrement_hypothesis.py

from hypothesis import given
import hypothesis.strategies as st

from increment_decrement import decrement
from increment_decrement import increment

@given(st.integers())
def test_increment(x):
    expected = x + 1
    actual = increment(x)
    assert actual == expected

@given(st.integers())
def test_decrement(x):
    expected = x - 1
    actual = decrement(x)
    assert actual == expected

在这里插入图片描述
# div.py

def div(dividend: int, divisor: int) -> int:
    return dividend // divisor

在这里插入图片描述
# test_div.py

from hypothesis import example
from hypothesis import given
import hypothesis.strategies as st

from div import div

@given(dividend=st.integers(), divisor=st.integers())
def test_div(dividend, divisor):
    if divisor == 0:
        expected = -1
    else:
        expected = dividend // divisor
    actual = div(dividend, divisor)
    assert actual == expected

在这里插入图片描述
# div.py

def div(dividend: int, divisor: int) -> int:
    if divisor == 0:
        return -1
    return dividend // divisor

概要

本文主要讲了什么是基于属性的测试以及为什么有用。此外,您快速浏览了Hypothesis库,该库使您可以编写基于属性的测试并与pytest测试一起执行。

相关文章

  • 不知道自己代码是否正确,一起来用 Hypothesis 测试一下

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处...

  • RSpec for Ruby

    为什么写测试 我们每天都在检查自己写的代码的正确性,往往我们会手动执行看看结果是否正确 在界面手动测试 在终端手动...

  • iOS单元测试-XCTest

    前言 单元测试简单来说,就是为了方便测试一些功能是否正常运行,调试接口是否能正常使用,用代码去检测代码是否正确的一...

  • 看!单元测试

    单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。 设想一下,当你...

  • iOS 如何做单元测试

    一、为什么要进行单元测试 单元测试是指开发者编写代码,去验证被测代码是否正确的一种手段,其实就是用代码去检测代码。...

  • 单元测试

    能够快速测试自己代码的正确性@Test

  • selenium自动化测试(基于python)学习之自动化测试基

    第一章:自动化测试基础 1.单元测试 单元测试是指代码级别的测试,代码之间类与类,方法与方法之间的调用是否正确的测...

  • Android 单元测试小总结

    Android 单元测试 保证最小的独立单元(函数)的代码是否正确。 详细介绍:https://github.co...

  • H3BPM Controllers 单元测试(一)

    作用: 1,从代码层面去测试程序是否可靠2,重构代码时,保证了输入和输出的正确性3,单元测试,可以保持功能的颗粒度...

  • Junit从入门到精通(一)简介

    单元测试概述 单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。常...

网友评论

      本文标题:不知道自己代码是否正确,一起来用 Hypothesis 测试一下

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