gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:50:13 25 4
gpt4 key购买 nike

我有 3 个文件,module.py,其中包含一个示例函数,用于测试输入是否为数字。我有一个名为 test_mymodule_long.py 的文件,它成功使用 py.test 测试并传递了多种类型的输入。 hypothesis 。我使用的是 Python 3.6,但这无关紧要(如果不是,只需删除类型提示)。对于这个特定的功能,将它们分开对我没有帮助;如果假设找到边缘情况,我只想知道有问题的输入和引发的异常。因此,我想按照 test_mymodule_short.py 中的指示编写此测试,但这不起作用。

我的问题是:有没有一种方法可以比在 test_mymodule_long.py 中更有效地在 hypothesis 中编写策略?

这是每个文件中的代码:

'''
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)

关于python - 在 python 中使用假设和 py.test 测试复合策略,我必须一次测试它们吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46351444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com