other solution 通常不起作用。 例如,在our use case 中,pytest 会截断传递给从断言语句调用的函数的参数:
E AssertionError: assert None is not None
E + where None = search('\\n\\*\\s.*\\b[Tt]upla item 0\\b',
'@beartyped pep_hinted() parameter pep_hinted_param=((<function <lambda> at
0x7fe278838830>,),) violates PEP type hint...7fe278838830>,):\n * Not int, bool, or
float.\n * Tuple item 0 value <function <lambda> at 0x7fe278838830> not str.')
beartype_test/unit/pep/p484/test_p484.py:124: AssertionError
请注意 pytest 在上述输出中的子字符串violates PEP type hint 和7fe278838830>,):\n 之间插入的省略号(即...),替换了理解该输出所需的关键任务子字符串。
谢谢,非常乐于助人的 pytest 开发人员。你不应该有。 真的。
有什么问题,兄弟?
为了证实@NicholasDiPiazza 和@MatthiasUrlichs,Pytest 在截断传递给从断言语句调用的函数的参数时很遗憾地忽略了-v 选项——这有点让人生气。
Pytest 开发人员,如果我们要求冗长四次,这意味着:“是的,我们确实想要冗长,对潜在的陷阱有充分的了解,并且可能不太在意,因为未经审查的错误报告比最大限度地减少那些坦率地说不适用于现实世界的持续集成的模糊理论危害。”
有什么解决办法,兄弟?
我们的工作解决方案如下:
addopts = -vvvv --showlocals -p no:xvfb -r a --doctest-glob=
- 将被截断的详细字符串(或对象表示,或 whatever)分配给有问题的测试中的局部变量。例如,在我们的用例中,我们将被截断的详细异常消息分配给该测试中的局部变量:例如,
def test_problem_function():
with raises(Exception) as exception_info:
raise ValueError("a"*1024)
exception_str = str(exception_info.value) # <--- This is where the magic happens.
assert problem_function("a"*1024, exception_str)
def problem_function(substr, bigstr):
return substr not in bigstr
- 改为手动检查 pytest 输出以获取该变量的值:例如,
========================================================== FAILURES ===========================================================
______________________________________________ test_truncated_exception_message _______________________________________________
def test_truncated_exception_message():
with raises(Exception) as exception_info:
raise ValueError("a"*1024)
exception_str = str(exception_info.value)
> assert problem_function("a"*1024, exception_str)
E AssertionError: assert False
E + where False = problem_function(('a' * 1024), 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
exception_info = <ExceptionInfo ValueError('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa') tblen=1>
exception_str = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaa'
beartype_test/unit/pep/p484/test_p484.py:39: AssertionError
虽然AssertionError 本身仍然被截断,但--showlocals 选项正确地保留了本地exception_str 测试变量的未截断值。 瞧!
这实际上像宣传的那样有效,但需要注意的是,这只适用于可直接分配给测试中的局部变量的字符串(或对象表示,或 whatever)。这通常但并非总是如此——这就是为什么 pytest 真的 需要在其错误报告中开始尊重 -vvvvvvvvvvvvvv 选项。