微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用假设和py.test在python中测试复合策略,我是否必须一次测试它们?

我有3个文件module.py,其中包含一个示例函数,用于测试输入是否为数字.我有一个名为test_mymodule_long.py的文件,该文件成功使用py.testhypothesis测试并传递了几种类型的输入.我使用的是Python 3.6,但这无关紧要(如果不是,则删除类型提示).对于此特定功能,将它们分开对我没有帮助;如果假设发现了极端情况,我只想知道令人讨厌的输入和引发的异常.因此,我想按照test_mymodule_short.py中的指示编写此测试,但这是行不通的.

我的问题是:与在test_mymodule_long.py中相比,有没有办法在假设中更有效地编写策略?

这是每个文件中的代码

'''
mymodule.py
'''

from typing import Union

Number = Union[int, float]


def is_numeric(x: Number):
    try:
        y = float(x)
        return True
    except:
        return False

# -------------------------------------------

'''
test_mymodule_long.py [This code works]
(using pytest to discover tests automatically)
'''
from hypothesis import given, example
import hypothesis.strategies as st
import mymodule

@given(st.integers())
def test_is_numeric_integer(num):
    result = stats.is_numeric(num)
    assert isinstance(result, bool)


@given(st.floats())
def test_is_numeric_float(num):
    result = stats.is_numeric(num)
    assert isinstance(result, bool)


@given(st.text())
def test_is_numeric_text(num):
    result = stats.is_numeric(num)
    assert isinstance(result, bool)


@given(st.lists(st.floats()))
def test_is_numeric_list(num):
    result = stats.is_numeric(num)
    assert isinstance(result, bool)

# -------------------------------------------

'''
test_mymodule_short.py [This code fails!]
(using pytest to discover tests automatically)
'''
from hypothesis import given, example
import hypothesis.strategies as st
import mymodule

@given(st.integers())
@given(st.floats())
@given(st.text())
@given(st.lists(st.floats()))
def test_is_numeric_list(num):
    result = mymodule.is_numeric(num)
    assert isinstance(result, bool)

请注意,我认为错误消息在这里并不真正重要,它更多的是“这不是您要怎么做”的情况,我正在寻求有关是否存在一种紧凑的方法来测试一个功能的建议多种假设策略.另外,我知道适当的is_numeric函数将以不同的方式编程(假设您确实需要这样的函数).我也知道,此处指示的测试尚不足以了解其是否有效.这些只是使我的问题更清楚的例子.

解决方法:

无法对一个测试使用多个策略,但是您可以将多个策略组合为一个策略,然后在测试中使用该策略-one_of策略.因此,您可以编写如下内容

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

@given(st.one_of(
    st.integers(), 
    st.floats(),
    st.text(),
    st.lists(st.floats()),
))
def test_is_numeric_list(num):
    result = mymodule.is_numeric(num)
    assert isinstance(result, bool)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐