- Pytest:帮助您编写更好的程序
- 完整的 Pytest 文档
- 安装和入门
- 使用和调用
- 在现有测试套件中使用 pytest
- 测试中断言的编写和报告
- Pytest 夹具:显式、模块化、可扩展
- 用属性标记测试函数
- MonkeyPatching / Mocking 模块和环境
- 临时目录和文件
- 捕获 stdout/stderr 输出
- 捕获警告
- 模块和测试文件的 Doctest 集成
- 跳过和 xfail:处理无法成功的测试
- 参数化夹具和测试功能
- 缓存:使用交叉测试运行状态
- UnitTest.TestCase 支持
- 运行为鼻子编写的测试
- 经典的 Xunit 风格设置
- 安装和使用插件
- 编写插件
- 登录
- 良好的集成实践
- 古怪的测试
- Pytest 导入机制和 sys.path/PYTHONPATH
- 设置 bash 完成
- API 引用
- _pytest.hookspec
- _pytest.python_api
- _pytest.outcomes
- _pytest.config
- _pytest.mark
- _pytest.recwarn
- _pytest.assertion
- _pytest.freeze_support
- _pytest.fixtures
- _pytest.cacheprovider
- _pytest.capture
- _pytest.doctest
- _pytest.junitxml
- _pytest.logging
- _pytest.monkeypatch
- _pytest.pytester
- _pytest.tmpdir
- _pytest.python
- _pytest.nodes
- _pytest.reports
- _pytest._code.code
- _pytest.config.argparsing
- _pytest.main
- pluggy.callers
- _pytest.config.exceptions
- py.test 2.0.0:断言++、UnitTest++、Reporting++、Config++、Docs++
- 示例和自定义技巧
- 配置
- 贡献开始
- 向后兼容策略
- Python 2.7 和 3.4 支持
- 企业版 pytest
- 项目实例
- 历史笔记
- 弃用和移除
- 发展指南
- 演讲和辅导
捕获 stdout/stderr 输出
默认stdout/stderr/stdin捕获行为
在测试执行期间,任何输出发送到 stdout
和 stderr
被捕获。如果测试或设置方法失败,则通常会显示相应的捕获输出以及失败跟踪。(此行为可以通过 --show-capture
命令行选项)。
此外, stdin
设置为 空 对象,该对象在尝试读取时将失败,因为在运行自动测试时很少需要等待交互式输入。
默认情况下,捕获是通过截取对低级文件描述符的写操作来完成的。这允许捕获简单打印语句的输出以及由测试启动的子进程的输出。
设置捕获方法或禁用捕获
有三种方法 pytest
可以执行捕获:
fd
(文件描述符)级别捕获(默认):将捕获到操作系统文件描述符1和2的所有写入。sys
级别捕获:仅写入python文件sys.stdout
和sys.stderr
将被捕获。不捕获对文件描述符的写入。tee-sys
捕获:Python写入sys.stdout
和sys.stderr
将被捕获,但是写入也将传递到实际sys.stdout
和sys.stderr
. 这允许输出被 实时打印 并捕获以供插件使用,例如junitxml(pytest 5.4中的新功能)。
您可以从命令行影响输出捕获机制:
pytest -s # disable all capturing pytest --capture=sys # replace sys.stdout/stderr with in-mem files pytest --capture=fd # also point filedescriptors 1 and 2 to temp file pytest --capture=tee-sys # combines 'sys' and '-s', capturing sys.stdout/stderr # and passing it along to the actual sys.stdout/stderr
使用打印语句进行调试
默认捕获stdout/stderr输出的一个主要好处是可以使用print语句进行调试:
# content of test_module.py def setup_function(function): print("setting up", function) def test_func1(): assert True def test_func2(): assert False
运行此模块将精确显示失败函数的输出,并隐藏另一个:
$ pytest =========================== test session starts ============================ platform linux -- Python 3.x.y, pytest-6.x.y, py-1.x.y, pluggy-0.x.y cachedir: $PYTHON_PREFIX/.pytest_cache rootdir: $REGENDOC_TMPDIR collected 2 items test_module.py .F [100%] ================================= FAILURES ================================= ________________________________ test_func2 ________________________________ def test_func2(): > assert False E assert False test_module.py:12: AssertionError -------------------------- Captured stdout setup --------------------------- setting up <function test_func2 at 0xdeadbeef> ========================= short test summary info ========================== FAILED test_module.py::test_func2 - assert False ======================= 1 failed, 1 passed in 0.12s ========================
从测试函数访问捕获的输出
这个 capsys
, capsysbinary
, capfd
和 capfdbinary
fixtures允许访问在测试执行期间创建的stdout/stderr输出。下面是一个示例测试函数,它执行一些与输出相关的检查:
def test_myoutput(capsys): # or use "capfd" for fd-level print("hello") sys.stderr.write("world\n") captured = capsys.readouterr() assert captured.out == "hello\n" assert captured.err == "world\n" print("next") captured = capsys.readouterr() assert captured.out == "next\n"
这个 readouterr()
调用快照到目前为止的输出-捕获将继续进行。测试函数完成后,将恢复原始流。使用 capsys
通过这种方式,您的测试不必关心设置/重置输出流,并且还可以与Pytest自己的每个测试捕获进行良好的交互。
如果要在FileDescriptor级别捕获,可以使用 capfd
fixture提供完全相同的接口,但也允许从库或直接写入操作系统级输出流(FD1和FD2)的子进程中捕获输出。
返回值来自 readouterr
改为A namedtuple
有两个属性, out
和 err
.
如果测试中的代码写入非文本数据,则可以使用 capsysbinary
代替返回的装置 bytes
从 readouterr
方法。
如果测试中的代码写入非文本数据,则可以使用 capfdbinary
代替返回的装置 bytes
从 readouterr
方法。这个 capfdbinary
fixture在filedescriptor级别上运行。
临时禁用测试中的捕获 capsys
和 capfd
有一个 disabled()
可以用作上下文管理器的方法,在 with
def test_disabling_capturing(capsys): print("this output is captured") with capsys.disabled(): print("output not captured, going directly to sys.stdout") print("this output is also captured")
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论