Pytest/Hypothesis 未按预期匹配字符串
Pytest/Hypothesis not matching string as expected
我正在测试与 Sanic 一起使用的验证功能。
def validate(val):
try:
if isinstance(val, bool): # Here because the int(val) line will success with int(True)/int(False)
raise ValueError()
if isinstance(val, float):
print("IT'S FLOAT!")
raise ValueError()
if '.' in str(val):
raise ValueError()
n = int(val)
except ValueError as ex:
raise InvalidUsage('Invalid value "{}" for int param "n"'.format(val))
我正在针对浮点值对此进行测试,并使用假设生成测试条件。
@given(val=st.floats())
def test_validate_int_float(val):
with pytest.raises(InvalidUsage) as ex:
validate(val)
print("{}|{}|{}".format(ex.value, f'Invalid value "{val}" for int param "n"',
ex.value == f'Invalid value "{val}" for int param "n"'))
assert ex.match(f'Invalid value "{val}" for int param "n"')
此测试失败:
Falsifying example: test_validate_int_float(val=1e+16)
打印语句如下所示:
IT'S FLOAT!
Invalid value "1e+16" for int param "n"|Invalid value "1e+16" for int param "n"|False
为什么我的断言不匹配?这些字符串在我看来是一样的。我假设这是由于浮点值,但在那种情况下,我该如何正确匹配该值?
在检查等于:
之前将 ex.value
转换为 str
print("{}|{}|{}".format(ex.value, f'Invalid value "{val}" for int param "n"',
str(ex.value) == f'Invalid value "{val}" for int param "n"'))
什么版本的 pytest 和 Python?我很确定这是一个 pytest 使用问题,与假设无关。
虽然不是答案,但使用 match
参数 到 pytest.raises
而不是 returns 上的方法通常更容易阅读,我怀疑不会有同样的问题。
我正在测试与 Sanic 一起使用的验证功能。
def validate(val):
try:
if isinstance(val, bool): # Here because the int(val) line will success with int(True)/int(False)
raise ValueError()
if isinstance(val, float):
print("IT'S FLOAT!")
raise ValueError()
if '.' in str(val):
raise ValueError()
n = int(val)
except ValueError as ex:
raise InvalidUsage('Invalid value "{}" for int param "n"'.format(val))
我正在针对浮点值对此进行测试,并使用假设生成测试条件。
@given(val=st.floats())
def test_validate_int_float(val):
with pytest.raises(InvalidUsage) as ex:
validate(val)
print("{}|{}|{}".format(ex.value, f'Invalid value "{val}" for int param "n"',
ex.value == f'Invalid value "{val}" for int param "n"'))
assert ex.match(f'Invalid value "{val}" for int param "n"')
此测试失败:
Falsifying example: test_validate_int_float(val=1e+16)
打印语句如下所示:
IT'S FLOAT!
Invalid value "1e+16" for int param "n"|Invalid value "1e+16" for int param "n"|False
为什么我的断言不匹配?这些字符串在我看来是一样的。我假设这是由于浮点值,但在那种情况下,我该如何正确匹配该值?
在检查等于:
之前将ex.value
转换为 str
print("{}|{}|{}".format(ex.value, f'Invalid value "{val}" for int param "n"',
str(ex.value) == f'Invalid value "{val}" for int param "n"'))
什么版本的 pytest 和 Python?我很确定这是一个 pytest 使用问题,与假设无关。
虽然不是答案,但使用 match
参数 到 pytest.raises
而不是 returns 上的方法通常更容易阅读,我怀疑不会有同样的问题。