7、pytest -- 捕获标准输出和标准错误输出
1. 标准输出/标准错误输出/标准输入的默认捕获行为
在测试执行期间,任何标准输出和标准错误输出都将会被捕获;如果测试失败或者发生异常,异常信息的堆栈也将一同显示,你可以通过--show-capture
命令行选项来自定义这些行为;
--show-capture
的配置项可以为:no,stdout,stderr,log,all
,默认是all
;
另外,标准输入被设置为一个"null"
对象。因为在自动化测试中,很少需要使用到交互输入的场景;
实际上,当我们想要使用标准输入时,会得到一个错误:
OSError: reading from stdin while output is captured
;
通常情况下,捕获行为是通过拦截对低级别文件描述符的写入操作来实现的。这就使得我们可以捕获简单的print()
语句以及测试中子程序的输出行为;
2. 修改和去使能捕获行为
pytest
有两种捕获行为,可以通过--capture
命令行选项来指定;
2.1. 文件描述符级别的捕获行为(默认)
所有向操作系统的文件描述符1(标准输入)和2(标准错误输入)的写入行为都会被捕获,这个也是pytest
的默认捕获行为,也可以通过--capture=fd
来指定;
文件描述符是与当前进程打开的文件相对应的小整数。例如,标准输入的文件描述符通常是0,标准输出的是1,标准错误的是2,之后被进程打开的文件的描述符依次指定为3、4、5等。
2.2. sys
级别的捕获行为
只有向Python
的sys.stdout
和sys.stderr
的写入行为会被捕获,不执行对文件描述符的写入的捕获,通过--capture=sys
来指定;
2.3. 去使能捕获行为
通过--capture=no
可以去使能pytest
的捕获行为;
也可以通过-s
命令行选项实现相同的效果,它只是--capture=no
的一个快捷方式,本质上是一样的;
3. 使用print()
函数调试用例
默认的捕获行为带来的一个主要的好处是,就是可以使用print()
函数帮助调试用例;
我们来看下面这个例子:
# src/chapter-7/test_module.py
def setup_function(function):
print("setting up", function)
def test_func1():
assert True
def test_func2():
assert False
setup_function(function)
函数会在每个测试用例开始之前执行,做一些初始化的操作;
现在,我们来执行这个模块:
λ pipenv run pytest -q src/chapter-7/test_module.py
.F [100%]
========================== FAILURES ==========================
_________________________ test_func2 _________________________
def test_func2():
> assert False
E assert False
src\chapter-7\test_module.py:32: AssertionError
------------------- Captured stdout setup --------------------
setting up <function test_func2 at 0x000001F35E76C158>
1 failed, 1 passed in 0.05s
可以看到,pytest
会把失败的用例信息精确的打印出来,并且会忽略其他的用例;
4. 在测试用例中访问捕获到的信息
我们可以通过capsys
、capsysbinary
、capfd
和capfdbinary fixtures
来访问测试执行过程中产生的输出信息;
下面这个例子用于检查测试中的输出信息:
# src/chapter-7/test_output.py
import sys
def test_output(capsys):
print('hello')
print('world', file=sys.stderr, end='&') # 标准错误输出,修改结束符
captured = capsys.readouterr()
assert captured.out == 'hello\n' # print() 默认的结束符是换行符
assert captured.err == 'world&'
print('next')
captured = capsys.readouterr()
assert captured.out == 'next\n'
readouterr()
方法会返回一个命名元组(包含out
和err
属性),表示到目前为止所有的标准输出和标准错误输出,然后重置缓存区;
如果你想访问文件描述符级别的测试输出,可以使用capfd fixture
,它提供了完全相同的接口;
如果想访问的是非文本型的数据,可以使用capsysbinary fixture
,它的readouterr()
方法返回的是字节流,参考下面的例子:
# src/chapter-7/test_output.py
def test_binary_output(capsysbinary):
print('hello')
captured = capsysbinary.readouterr()
assert captured.out == b'hello\n'
如果你想临时的去使能捕获行为,可以使用capsys.disabled()
方法,它作为一个上下文管理器来使用,可以禁止with
作用域中的捕获行为,参考下面的例子:
# src/chapter-7/test_output.py
def test_disabling_capturing(capsys):
print("hello")
with capsys.disabled():
print("world")
captured = capsys.readouterr()
assert captured.out == "hello\n"
GitHub仓库地址:https://github.com/luizyao/pytest-chinese-doc
7、pytest -- 捕获标准输出和标准错误输出的更多相关文章
- Pytest权威教程09-捕获标准输出及标准错误输出
目录 捕获标准输出及标准错误输出 默认 stdout/stderr/stdin 捕获行为 设置捕获方法或禁用捕获 调试中使用print语句 在测试用例中使用的捕获的输出 返回: Pytest权威教程 ...
- 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为标准错误 ...
- python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出
看了一个博客,挺不错的.http://www.cnblogs.com/turtle-fly/p/3280519.html 标准输出(sys.stdout)对应的操作就是print(打印)了,标准输入( ...
- 将make的输出(标准输出/标准错误输出)重定向到文件
方式 描述符 含义 stdin 0 标准输入 stdout 1 标准输出 stderr 2 标准错误输出 1.想要把make输出的全部信息,输出到某个文件中 最常见的办法就是:make xxx > ...
- Shell标准输出、标准错误 >/dev/null 2>&1
Shell中可能经常能看到:>/dev/null 2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...
- shell将标准错误输出重定向到 其他地方
经常可以在一些脚本,尤其是在crontab调用时发现如下形式的命令调用: /tmp/test.sh > /tmp/test.log >& 前半部分/tmp/test.sh > ...
- bash shell:重定向标准错误输出
如何重定向标准错误输出到标准输出?如何把标准错误输出输出到一个文件? Bash提供了I/O重定向工具,有3个缺省的文件(标准输出流): stdin - 用来获取输入,比如键盘.文件重定向 stdout ...
随机推荐
- SSM框架手动实现分页逻辑(非PageHelper)
第一种方法:查询出所有数据再分页 分析: 分页时,需要获得前台传来的两个参数,分别为pageNo(第几页数据),pageSize(每页的条数); 根据这两个参数来计算出前端需要的数据是查出数据list ...
- 深入Dapper.NET源码 (文长)
目录 前言.目录.安装环境 Dynamic Query 原理 Part1 Dynamic Query 原理 Part2 Strongly Typed Mapping 原理 Part1 : ADO.NE ...
- Nginx负载均衡配置实例
面对高并发的问题,企业往往会从两个方面来解决.其一,从硬件上面,提升硬件的配置,增加服务器的性能:另外,就是从软件上,将数据库和WEB服务器分离,使数据库和WEB服务器都能够充分发挥各自的性能,并且二 ...
- 【IE低配杀手】html5shiv.js和respond.min.js
HTML5现在越来越流行了,但是一遇到IE低版本浏览器就傻眼了,今天整理了一下一些解决办法. html5shiv:解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题. res ...
- CSS技巧 (1) · 结构和布局
前言 这一篇主要是总结关于结构和布局的一些技巧,不管什么,一个网页上来,最重要的是先确定他的结构和布局,实现基本的布局之后,我们再进行局部的优化和交互特效. 这一篇主要讲 关于 自适应内部元素 的内 ...
- 品Spring:对@Autowired和@Value注解的处理方法
在Spring中能够完成依赖注入的注解有JavaSE提供的@Resource注解,就是上一篇文章介绍的. 还有JavaEE提供的@javax.inject.Inject注解,这个用的很少,因为一般都不 ...
- 利用shell脚本个性化运行jar任务
利用shell脚本可以个性化运行jar任务,废话不多说,直接上代码: #!/bin/bash APP_PATH=/root/bigdata/jars/data_migration_from_sqlse ...
- F#周报2019年第41期
新闻 .NET架构指南 美妙的WebSharper:学术刊物 .NET Core 3.0中Blazor Server的方案与性能 Mono 6.4.0发布说明 CapitolFSharp召集发言人 视 ...
- Python读取excel 数据
1.安装xlrd 2.官网 通过官网来查看如何使用python读取Excel,python excel官网: http://www.python-excel.org/ 实例: (1)Excel内容 把 ...
- 一次Commons-HttpClient的BindException排查
线上有个老应用,在流量增长的时候,HttpClient抛出了BindException.部分的StackTrace信息如下: java.net.BindException: Address alrea ...