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级别的捕获行为

只有向Pythonsys.stdoutsys.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. 在测试用例中访问捕获到的信息

我们可以通过capsyscapsysbinarycapfdcapfdbinary 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()方法会返回一个命名元组(包含outerr属性),表示到目前为止所有的标准输出和标准错误输出,然后重置缓存区

如果你想访问文件描述符级别的测试输出,可以使用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 -- 捕获标准输出和标准错误输出的更多相关文章

  1. Pytest权威教程09-捕获标准输出及标准错误输出

    目录 捕获标准输出及标准错误输出 默认 stdout/stderr/stdin 捕获行为 设置捕获方法或禁用捕获 调试中使用print语句 在测试用例中使用的捕获的输出 返回: Pytest权威教程 ...

  2. linux将标准输出和标准错误输出都重定向到一个文件?

    需求描述: 今天在写crontab,里面有标准输出和错误输出,之前使用的是 > /dev/null 2>&1 那这个意思也就等同于将标准输出和错误输出都输出到/dev/null中, ...

  3. Linux的标准输出、标准错误输出、nohup

    1.在bash中标准输出可以用1来表示:通常来说这个1可以省略: 如./xxx >/dev/null 和 ./xxx 1>/dev/null 是一个意思 2.在bash中标准错误输出可以用 ...

  4. shell :将标准输出及标准错误输出写到指定文件

    shell 脚本如下: logFile=/usr/local/log/$today.txt exec >> $logFile 2>&1 1为标准输出stdout.2为标准错误 ...

  5. python 以标准输出(sys.stdout)为例,看python的标准输入、标准错误输出

    看了一个博客,挺不错的.http://www.cnblogs.com/turtle-fly/p/3280519.html 标准输出(sys.stdout)对应的操作就是print(打印)了,标准输入( ...

  6. 将make的输出(标准输出/标准错误输出)重定向到文件

    方式 描述符 含义 stdin 0 标准输入 stdout 1 标准输出 stderr 2 标准错误输出 1.想要把make输出的全部信息,输出到某个文件中 最常见的办法就是:make xxx > ...

  7. Shell标准输出、标准错误 >/dev/null 2>&1

    Shell中可能经常能看到:>/dev/null  2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...

  8. shell将标准错误输出重定向到 其他地方

    经常可以在一些脚本,尤其是在crontab调用时发现如下形式的命令调用: /tmp/test.sh > /tmp/test.log >& 前半部分/tmp/test.sh > ...

  9. bash shell:重定向标准错误输出

    如何重定向标准错误输出到标准输出?如何把标准错误输出输出到一个文件? Bash提供了I/O重定向工具,有3个缺省的文件(标准输出流): stdin - 用来获取输入,比如键盘.文件重定向 stdout ...

随机推荐

  1. 记录ceph两个rbd删除不了的处理过程

    在一个使用的环境发现两个ceph的rbd删除不了,发现两个rbd都是由于残留了watch的信息.在此记录处理过程. 处理方法 [root@node- ~]# rbd -4cce-b39d-709e05 ...

  2. kubeadm部署高可用集群Kubernetes 1.14.1版本

    Kubernetes高可用集群部署 部署架构: Master 组件: kube-apiserver Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,所有对象 ...

  3. SDI接口基于FPGA GTP实现

    SDI采集和显示,基于xilinx 7系列器件进行实现,注意事项有如下几点: 1,如果多路SDI共用一个GTP Quad,或是SDI和PCIE在一个GTP Quad,时钟资源应该进行共享,既GTP c ...

  4. 05-04 scikit-learn库之主成分分析

    目录 scikit-learn库之主成分分析 一.PCA 1.1 使用场景 1.2 代码 1.3 参数 1.4 属性 1.5 方法 二.KernelPCA 三.IncrementalPCA 四.Spa ...

  5. Python 爬虫 爬取 煎蛋网 图片

    今天, 试着爬取了煎蛋网的图片. 用到的包: urllib.request os 分别使用几个函数,来控制下载的图片的页数,获取图片的网页,获取网页页数以及保存图片到本地.过程简单清晰明了 直接上源代 ...

  6. 玩转ADB命令(ADB命令使用大全)转载

    ADB是什么 Adb的全称为Android Debug Bridge:android调试桥梁,下图为Android官方对adb的介绍:可以看出,Android的初衷是用adb这样的一个工具来协助开发人 ...

  7. Java虚拟机重点知识归纳总结

    一.     JVM内存分区 分为程序计数器.虚拟机栈.本地方法栈.Java堆.方法区5个区域 其中Java堆和方法区是线程共享的,虚拟机栈.本地方法栈.程序计数器是线程隔离的. 程序计数器: 1.可 ...

  8. PowerUp攻击渗透实战

    记录下PowerUp在实战渗透中的利用 准备环境: kali linux 攻击机 已获得靶机meterpreter(非管理)权限 win7 靶机  拥有powershell环境 1)Invoke-Al ...

  9. Ubuntu 安装mysql & 自定义数据存储目录

    一.安装 apt-get install mysql-server 执行过程如下: root@duke:~# apt-get install mysql-server 正在读取软件包列表... 完成 ...

  10. Python开发【第三篇】数据类型

    1.数字类型 int 整数 1 2 3 float 浮点数 1.1 0.9 0.99 complex 复数 (2+0j) str 字符串 'hello world' "hello world ...