如何让我在 pytest 中的断言不再被省略号缩写?

Nic*_*zza 11 python pytest

我怎样才能让我在 pytest 中的断言停止被省略号缩写?

每次我有一个报告错误的断言时,它都会用“...”截断我的所有字符串,这是为什么?我怎么能阻止呢?

Cec*_*rry 9

其他解决方案通常不起作用。例如,在我们的用例中,pytest 截断传递给从断言语句调用的函数的参数:

\n
E                   AssertionError: assert None is not None\nE                    +  where None = search(\'\\\\n\\\\*\\\\s.*\\\\b[Tt]upla item 0\\\\b\',\n\'@beartyped pep_hinted() parameter pep_hinted_param=((<function <lambda> at\n0x7fe278838830>,),) violates PEP type hint...7fe278838830>,):\\n  * Not int, bool, or\nfloat.\\n  * Tuple item 0 value <function <lambda> at 0x7fe278838830> not str.\')\n\nbeartype_test/unit/pep/p484/test_p484.py:124: AssertionError\n
Run Code Online (Sandbox Code Playgroud)\n

...请注意pytest 在未经我们许可的情况下在子字符串violates PEP type hint和上述输出中插入的省略号(即) 7fe278838830>,):\\n,替换了理解该输出所需的关键任务子字符串。

\n

谢谢,非常有帮助的 pytest 开发人员。你不应该这样做。真的。

\n

有什么问题吗,兄弟?

\n

为了证实@NicholasDiPiazza@MatthiasUrlichs,Pytest-v在截断传递给从断言语句 \xe2\x80\x93 调用的函数的参数时遗憾地忽略了选项,这不仅仅是轻微的令人愤怒。

\n

Pytest 开发人员,如果我们要求详细四次,这意味着:“是的,我们确实想要详细,对潜在的陷阱很了解,并且可以不在乎,因为未经审查的错误报告比最小化这些错误重要得多坦率地说,模糊的理论危害不适用于现实世界的持续集成。”

\n

有什么解决办法吗,兄弟?

\n

我们的工作解决方案如下:

\n\n
addopts = -vvvv --showlocals -p no:xvfb -r a --doctest-glob=\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 将被截断的详细字符串(或对象表示形式,或其他任何内容)分配给有问题的测试中的局部变量。例如,在我们的用例中,我们将被截断的详细异常消息分配给该测试中的局部变量:例如,
  • \n
\n
def test_problem_function():\n    with raises(Exception) as exception_info:\n        raise ValueError("a"*1024)\n\n    exception_str = str(exception_info.value)   # <--- This is where the magic happens.\n    assert problem_function("a"*1024, exception_str)\n\ndef problem_function(substr, bigstr):\n    return substr not in bigstr\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 手动检查 pytest 输出以获取该变量的值:例如,
  • \n
\n
========================================================== FAILURES ===========================================================\n______________________________________________ test_truncated_exception_message _______________________________________________\n\n    def test_truncated_exception_message():\n        with raises(Exception) as exception_info:\n            raise ValueError("a"*1024)\n    \n        exception_str = str(exception_info.value)\n>       assert problem_function("a"*1024, exception_str)\nE       AssertionError: assert False\nE        +  where False = problem_function((\'a\' * 1024), \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\')\n\nexception_info = <ExceptionInfo ValueError(\'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\') tblen=1>\nexception_str = \'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaa\'\n\nbeartype_test/unit/pep/p484/test_p484.py:39: AssertionError\n
Run Code Online (Sandbox Code Playgroud)\n

虽然其AssertionError本身保持截断,但该--showlocals选项正确保留本地测试变量的未截断值exception_str瞧\xc3\xa0!

\n

这实际上像所宣传的那样工作,但需要注意的是,这仅像所宣传的那样适用于可直接分配给测试中的局部变量的字符串(或对象表示,或其他)。\xe2\x80\x93 通常但并非总是如此,这就是为什么 pytest确实需要开始尊重-vvvvvvvvvvvvvv其错误报告中的选项。

\n