我怎样才能让我在 pytest 中的断言不再被省略号缩写?
How can I get my assertions in pytest to stop being abbreviated with ellipsis?
如何让我在 pytest 中的断言不再被省略号缩写?
每次我有一个报告错误的断言时,它都会用“...”截断我的所有字符串,这是为什么?我怎么能阻止呢?
你能举个例子吗?这是我的输出结果:
def test_foo():
> assert "a"*100 == "a"*100 + "b"
E assert 'aaaaaaaaaaaa...aaaaaaaaaaaaa' == 'aaaaaaaaaaaaa...aaaaaaaaaaaab'
E Skipping 89 identical leading characters in diff, use -v to show
E - aaaaaaaaaaa
E + aaaaaaaaaaab
E ? +
我认为 diff 非常清楚失败的原因 - 但是 -v
(如消息所示)我得到了完整的 diff:
def test_foo():
> assert "a"*100 == "a"*100 + "b"
E assert 'aaaaaaaaaaaa...aaaaaaaaaaaaa' == 'aaaaaaaaaaaaa...aaaaaaaaaaaab'
E - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
E + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
E ?
doesn't work in general. In 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
之间插入的省略号(即 ...
),替换了 mission-critical 子字符串需要理解该输出。
谢谢,非常有帮助的 pytest 开发人员。你不应该有。 真的。
有什么问题吗,兄弟?
为了证实这两个 and @MatthiasUrlichs,Pytest 在截断传递给从断言语句调用的函数的参数时遗憾地忽略了 -v
选项——这不仅仅是轻微的愤怒。
Pytest 开发人员,如果我们要求冗长四次,这意味着:“是的,我们确实想要冗长,是 well-apprised 潜在的陷阱,并且可以不关心,因为未经审查的错误报告是比最小化那些坦率地说不适用于 real-world 持续集成的模糊理论危害重要得多。"
兄弟,有什么解决办法?
我们的工作方案如下:
addopts = -vvvv --showlocals -p no:xvfb -r a --doctest-glob=
- 将被截断的详细字符串(或对象表示,或 随便 )分配给有问题的测试中的局部变量。例如,在我们的用例中,我们将被截断的详细异常消息分配给该测试中的局部变量:例如,
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
测试变量的未截断值。 瞧!
这实际上像宣传的那样工作,但需要注意的是,这仅像宣传的那样工作,用于在测试中可直接分配给局部变量的字符串(或对象表示,或 任何 )。这通常但并非总是如此——这就是为什么 pytest really 需要开始在其错误报告中考虑 -vvvvvvvvvvvvvv
选项。
如何让我在 pytest 中的断言不再被省略号缩写?
每次我有一个报告错误的断言时,它都会用“...”截断我的所有字符串,这是为什么?我怎么能阻止呢?
你能举个例子吗?这是我的输出结果:
def test_foo():
> assert "a"*100 == "a"*100 + "b"
E assert 'aaaaaaaaaaaa...aaaaaaaaaaaaa' == 'aaaaaaaaaaaaa...aaaaaaaaaaaab'
E Skipping 89 identical leading characters in diff, use -v to show
E - aaaaaaaaaaa
E + aaaaaaaaaaab
E ? +
我认为 diff 非常清楚失败的原因 - 但是 -v
(如消息所示)我得到了完整的 diff:
def test_foo():
> assert "a"*100 == "a"*100 + "b"
E assert 'aaaaaaaaaaaa...aaaaaaaaaaaaa' == 'aaaaaaaaaaaaa...aaaaaaaaaaaab'
E - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
E + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab
E ?
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
之间插入的省略号(即 ...
),替换了 mission-critical 子字符串需要理解该输出。
谢谢,非常有帮助的 pytest 开发人员。你不应该有。 真的。
有什么问题吗,兄弟?
为了证实这两个 -v
选项——这不仅仅是轻微的愤怒。
Pytest 开发人员,如果我们要求冗长四次,这意味着:“是的,我们确实想要冗长,是 well-apprised 潜在的陷阱,并且可以不关心,因为未经审查的错误报告是比最小化那些坦率地说不适用于 real-world 持续集成的模糊理论危害重要得多。"
兄弟,有什么解决办法?
我们的工作方案如下:
addopts = -vvvv --showlocals -p no:xvfb -r a --doctest-glob=
- 将被截断的详细字符串(或对象表示,或 随便 )分配给有问题的测试中的局部变量。例如,在我们的用例中,我们将被截断的详细异常消息分配给该测试中的局部变量:例如,
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
测试变量的未截断值。 瞧!
这实际上像宣传的那样工作,但需要注意的是,这仅像宣传的那样工作,用于在测试中可直接分配给局部变量的字符串(或对象表示,或 任何 )。这通常但并非总是如此——这就是为什么 pytest really 需要开始在其错误报告中考虑 -vvvvvvvvvvvvvv
选项。