如何过滤pytest栈追踪输出中的不必要行?
如何过滤pytest栈追踪输出中的不必要行?
我是用pip install pytest安装的pytest,平时都是在Windows 10的命令提示符里运行它,不是在IDE里。我常用的启动命令是:
> pytest --random-order -k test_my_test_module
这里的--random-order来自pytest-random-order工具包,我每次运行pytest都会加这个参数,后来嫌麻烦,干脆写了个Python脚本自动帮我带上这个参数启动pytest。
不过就算去掉这个参数,只运行最基础的命令:
> pytest -k test_my_test_module
还是会遇到同样的输出问题。
我现在不确定是不是其他用户也会碰到这种情况——pytest会输出一大串内部实现的调用栈,这些内容对我来说完全没用,根本不想看到。正常来说,pytest是不是应该少显示这些内部细节啊?
我找过pytest输出配置相关的文档,试过--tb=short和-q这些选项,但它们好像没达到我想要的效果——还是会输出大量pytest内部的栈追踪信息。比如我得到的栈追踪片段是这样的:
Stack (most recent call last): File "C:\Users\Mike\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 196, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\Users\Mike\AppData\Local\Programs\Python\Python310\lib\runpy.py", line 86, in _run_code exec(code, run_globals) File "D:\apps\Python\virtual_envs\dev_organiser\Scripts\pytest.exe\__main__.py", line 7, in <module> sys.exit(console_main()) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\_pytest\config\__init__.py", line 206, in console_main code = main() File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\_pytest\config\__init__.py", line 178, in main ret: Union[ExitCode, int] = config.hook.pytest_cmdline_main( File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\pluggy\_hooks.py", line 513, in __call__ return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\pluggy\_manager.py", line 120, in _hookexec return self._inner_hookexec(hook_name, methods, kwargs, firstresult) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\pluggy\_callers.py", line 103, in _multicall res = hook_impl.function(*args) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\_pytest\main.py", line 332, in pytest_cmdline_main return wrap_session(config, _main) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\_pytest\main.py", line 285, in wrap_session session.exitstatus = doit(config, session) or 0 File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\_pytest\main.py", line 339, in _main config.hook.pytest_runtestloop(session=session) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\pluggy\_hooks.py", line 513, in __call__ return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\pluggy\_manager.py", line 120, in _hookexec return self._inner_hookexec(hook_name, methods, kwargs, firstresult) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\pluggy\_callers.py", line 103, in _multicall res = hook_impl.function(*args) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\_pytest\main.py", line 364, in pytest_runtestloop item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\pluggy\_hooks.py", line 513, in __call__ return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult) File "D:\apps\Python\virtual_envs\dev_organiser\lib\site-packages\pluggy\_manager.py", line 120, in _hookexec return self._inner_hookexec(hook_name, methods, kwargs, firstresult) ...
(后面还有很长很长的内容)
我真的不需要这些pytest内部的调用细节,比如那些关于pluggy的内容,每次排查问题都要在一堆无用信息里翻找有用的部分,太麻烦了。
我想到Python的logging模块里,基础Formatter类有个formatStack(stack_info)方法,默认没做什么处理,我们可以重写这个方法,把栈追踪里不需要的行删掉。如果pytest本身没有官方的配置方式来过滤这些无用的栈行,我可能就得试试用这种方法来解决问题了。
备注:内容来源于stack exchange,提问作者mike rodent
相关产品推荐
相关产品推荐

