Pytest权威教程09-捕获标准输出及标准错误输出
捕获标准输出及标准错误输出
默认 stdout/stderr/stdin 捕获行为
在测试执行期间,程序中的标准输出/标准错误输出都会被捕获到。 如果测试或setup方法执行失败时,会在报错追溯信息中查看到程序中的标准输出及标准错误输出。(可以通过--show-capture
命令行选项配置是否捕获程序中的标准输出/标准错误输出)。
此外,stdin
被设置为“null”对象,测试运行过程中无法从中读取数据,因为在运行自动化测试时很少需要等待交互式输入。
捕获默认是通过拦截对低优先级文件描述符的写入来完成的。 这允许捕获简单print语句的输出以及测试启动的子进程的输出。
设置捕获方法或禁用捕获
pytest
可以通过两种方式捕获输出:
- 文件描述符(FD)级别捕获(默认):将捕获进入操作系统文件描述符1和2的所有写入。
sys
级别捕获:仅捕获Python文件sys.stdout
和sys.stderr
。 不执行对文件描述符的写入捕获。
你可以在命令行中指定不同的参数来使用不同的捕获机制:
pytest -s # 禁止捕获所有输出
pytest --capture=sys # 使用in-mem文件代替sys.stdout/stderr with
pytest --capture=fd # 同时将filedescriptors 1和2指向临时文件
调试中使用print语句
默认捕获stdout / stderr输出的一个主要好处是可以使用print语句进行调试:
# test_module.py文件内容
def setup_function(function):
print("setting up %s" % function)
def test_func1():
assert True
def test_func2():
assert False
运行此模块将只捕获失败用例相关的print信息,而不显示成功用例的print信息:
$ pytest
=========================== test session starts ============================
platform linux -- Python 3.x.y,pytest-4.x.y,py-1.x.y,pluggy-0.x.y
rootdir: $REGENDOC_TMPDIR,inifile:
collected 2 items
test_module.py .F [100%]
================================= FAILURES =================================
________________________________ test_func2 ________________________________
def test_func2():
> assert False
E assert False
test_module.py:9: AssertionError
-------------------------- Captured stdout setup ---------------------------
setting up <function test_func2 at 0xdeadbeef>
==================== 1 failed,1 passed in 0.12 seconds ====================
在测试用例中使用的捕获的输出
capsys
,capsysbinary
,capfd
和capfdbinary fixture
允许访问在测试执行期间创建的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)的库或子进程的输出流中。
3.3版本新函数
readouterr
的返回值更改为具有两个属性out
和err
的namedtuple
。
3.3版本新函数
如果测试中的代码写入了非文本数据,则可以使用capsysbinary fixture
来捕获它,而后者会从readouterr
方法返回字节。 capfsysbinary fixture
目前仅在Python 3中可用。
3.0版本新函数
要暂时禁用测试中的捕获,capsys
和capfd
都有一个disabled()
方法,可以用作上下文管理器,禁用with块内的捕获:
def test_disabling_capturing(capsys):
print("输出被捕获到了")
with capsys.disabled():
print("输出未捕获到,直接使用sys.stdout标准输出")
print("这个输出也被捕获到了")
Pytest权威教程09-捕获标准输出及标准错误输出的更多相关文章
- 7、pytest -- 捕获标准输出和标准错误输出
目录 1. 标准输出/标准错误输出/标准输入的默认捕获行为 2. 修改和去使能捕获行为 2.1. 文件描述符级别的捕获行为(默认) 2.2. sys级别的捕获行为 2.3. 去使能捕获行为 3. 使用 ...
- linux将标准输出和标准错误输出都重定向到一个文件?
需求描述: 今天在写crontab,里面有标准输出和错误输出,之前使用的是 > /dev/null 2>&1 那这个意思也就等同于将标准输出和错误输出都输出到/dev/null中, ...
- Linux的标准输出、标准错误输出、nohup
1.在bash中标准输出可以用1来表示:通常来说这个1可以省略: 如./xxx >/dev/null 和 ./xxx 1>/dev/null 是一个意思 2.在bash中标准错误输出可以用 ...
- shell :将标准输出及标准错误输出写到指定文件
shell 脚本如下: logFile=/usr/local/log/$today.txt exec >> $logFile 2>&1 1为标准输出stdout.2为标准错误 ...
- Pytest权威教程(官方教程翻译)
Pytest权威教程01-安装及入门 Pytest权威教程02-Pytest 使用及调用方法 Pytest权威教程03-原有TestSuite的执行方法 Pytest权威教程04-断言的编写和报告 P ...
- Pytest权威教程21-API参考-07-配置选项(Configuration Options)
目录 配置选项(Configuration Options) addopts cache_dir confcutdir console_output_style doctest_encoding do ...
- Pytest权威教程21-API参考-05-对象(Objects)
目录 对象(Objects) CallInfo Class Collector Config ExceptionInfo FixtureDef FSCollector Function Item Ma ...
- Pytest权威教程21-API参考-04-钩子(Hooks)
目录 钩子(Hooks) 引导时的Hook方法 初始化时的Hook方法 测试运行时的Hook方法 收集用例时的Hook方法 生成测试结果时的Hook方法 调试/交互Hook方法 返回: Pytest权 ...
- Pytest权威教程21-API参考-03-夹具(Fixtures)
目录 夹具(Fixtures) @ pytest.fixture config.cache的 capsys capsysbinary capfd capfdbinary doctest_namespa ...
随机推荐
- java之hibernate之基于主键的单向一对一关联映射
这篇讲 基于主键的单向一对一关联映射 1.依然考察人和身份证的一对一关系,如果采用主键关联,那么其表结构应该为: 2.类结构 Person.java public class Person imple ...
- dubbo源码阅读之服务目录
服务目录 服务目录对应的接口是Directory,这个接口里主要的方法是 List<Invoker<T>> list(Invocation invocation) throws ...
- error C2338: You've instantiated std::aligned_storage<Len, Align> with an extended alignment (in other words, Align >
报的完整错误为: error C2338: You've instantiated std::aligned_storage<Len, Align> with an extended al ...
- 学习笔记之MongoDB
MongoDB - Wikipedia MongoDB is a cross-platform document-oriented database program. Classified as a ...
- 将H5页面打包成安卓原生app
第一步:下载HBuilderX,新建项目选择5+App新建一个空项目如下图 新建后项目目录结构如下图 第二步,将你要打包成安卓app的文件打包,最后生成的文件目录如下图 1.打包完成后,将对应文件内容 ...
- uwsgi配置文件示例
uwsgi配置文件参考 相关路径请根据自己项目的实际路径配置 在进行Nginx+uwsgi部署Django项目的时候,需要Nginx的配置中包含uwsgi的配置项,具体请查看另一篇:Nginx配置文件 ...
- 使用virtualbox安装unbuntu开启共享文件夹时遇到的权限问题
在安装完虚拟机之后,开启文件夹共享,发现只能用root进行访问,个人帐号无权限: cust@hqjia-desktop:/media$ ll drwxr-xr-x 4 root root 4096 2 ...
- GooglePlay测试支付遇到的问题
推荐谷歌安装器,可以方便地安装谷歌框架及服务 问题列表 1.测试支付时出现:需要验证身份.您需要登录自己google账号 解决:我是使用VPN,VPN地区是日本,但我在google后台设置的发布(下载 ...
- homebrew一直处于updating状态
vim ~/.bash_profile 增加一行 export HOMEBREW_NO_AUTO_UPDATE=true 之后再source一下
- Java 中的函数式接口
java.util.function中定义了几组类型的函数式接口以及针对基本数据类型的子接口. Predicate -- 传入一个参数,返回一个bool结果, 方法为boolean test(T t) ...