gpt4 book ai didi

python - 单元测试中如何强调对输入数据的限制?

转载 作者:行者123 更新时间:2023-12-01 08:21:55 24 4
gpt4 key购买 nike

我进行了参数化测试,例如:

import pytest
from datetime import time


def get_next_hour(time_str: str):
t = time(*map(int, time_str.split(':')))
new_t = time((t.hour + 1) % 24, t.minute)
return new_t.strftime('%H:%M')


@pytest.mark.parametrize(
"t_str, result_str",
[
('10:30', '11:30'),
('11:30', '12:30'),
]
)
def test_good_input(t_str, result_str):
result = get_next_hour(t_str)
assert result == result_str

测试test_good_input必须仅适用于有效的时间字符串(对于无效数据,我有另一个测试test_bad_input)。我如何强调它 - 在文档字符串中,或​​使用断言输入数据?

带有文档字符串

def test_good_input(t_str, result_str):
"""for t_str allowed only time-valid strings"""

result = get_next_hour(t_str)
assert result == result_str

带有验证输入

def test_good_input(t_str, result_str):

assert ':' in t_str, 'input data is not time'

result = get_next_hour(t_str)
assert result == result_str

或者还有其他方法吗?

最佳答案

我想说注释或测试函数文档字符串中的粗警告应该足够了。这不是应验证的不受信任的用户输入;另外,最好让测试尽可能简单。如果某些开发人员在没有先阅读文档的情况下滥用测试输入,那么现在就是他自己的错。

但是,使用 pytest 肯定可以进行测试参数验证(例如,通知开发人员测试的函数没有任何问题,并且他们使用了错误的测试)。我将通过使用间接参数化来进行隐式参数验证。在下面的示例中,来自 mark.parametrize 的每个参数将首先传递到具有相同名称的固定装置,您可以在测试开始之前进行预处理:

def validate(input):
try:
datetime.strptime(input, '%H:%M')
except ValueError as e:
pytest.fail('Your test parametrization is wrong. The test argument is erroneous: {}'.format(e))


@pytest.fixture
def t_str(request):
validate(request.param)
return request.param


@pytest.fixture
def result_str(request):
validate(request.param)
return request.param


@pytest.mark.parametrize(
"t_str, result_str",
[
('10:30', '11:30'),
('11:30', '12:30'),
('10:30', 'bar'),
],
indirect=True
)
def test_good_input(t_str, result_str):
...

现在第三个测试将失败并显示描述性错误消息:

test_spam.py::test_good_input[10:30-11:30] PASSED
test_spam.py::test_good_input[11:30-12:30] PASSED
test_spam.py::test_good_input[10:30-bar] ERROR

============================================= ERRORS ==============================================
__________________________ ERROR at setup of test_good_input[10:30-bar] ___________________________

...

input = 'bar'

def validate(input):
try:
datetime.strptime(input, '%H:%M')
except ValueError as e:
> pytest.fail('Your test parametrization is wrong. The test argument is erroneous: {}'.format(e))
E Failed: Your test parametrization is wrong. The test argument is erroneous: time data 'bar' does not match format '%H:%M'

test_spam.py:15: Failed
================================ 2 passed, 1 error in 0.05 seconds ================================

有关间接参数化的更多信息:Deferring the setup of parametrized resources

关于python - 单元测试中如何强调对输入数据的限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54588510/

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