Pytest自动化测试框架-权威教程09-捕获标准输出及标准错误输出

Pytest默认捕获测试期间的stdout和stderr,便于调试和查看失败信息。捕获可通过文件描述符或sys级别实现,可使用--capture选项切换。capsys和capfdfixture用于在测试中访问和检查输出。测试失败时,只显示相关print信息。禁用捕获可通过capsys.disabled()上下文管理器实现。
摘要由CSDN通过智能技术生成

捕获标准输出及标准错误输出

默认 stdout/stderr/stdin 捕获行为

在测试执行期间,程序中的标准输出/标准错误输出都会被捕获到。 如果测试或setup方法执行失败时,会在报错追溯信息中查看到程序中的标准输出及标准错误输出。(可以通过--show-capture命令行选项配置是否捕获程序中的标准输出/标准错误输出)。

此外,stdin被设置为“null”对象,测试运行过程中无法从中读取数据,因为在运行自动化测试时很少需要等待交互式输入。

捕获默认是通过拦截对低优先级文件描述符的写入来完成的。 这允许捕获简单print语句的输出以及测试启动的子进程的输出。

设置捕获方法或禁用捕获

pytest可以通过两种方式捕获输出:

  • 文件描述符(FD)级别捕获(默认):将捕获进入操作系统文件描述符1和2的所有写入。

  • sys级别捕获:仅捕获Python文件sys.stdout和sys.stderr。 不执行对文件描述符的写入捕获。

你可以在命令行中指定不同的参数来使用不同的捕获机制:

Copypytest -s            # 禁止捕获所有输出
pytest --capture=sys # 使用in-mem文件代替sys.stdout/stderr with 
pytest --capture=fd  # 同时将filedescriptors 1和2指向临时文件

调试中使用print语句

默认捕获stdout / stderr输出的一个主要好处是可以使用print语句进行调试:

Copy# test_module.py文件内容defsetup_function(function):
    print("setting up %s" % function)

deftest_func1():
    assertTruedeftest_func2():
    assertFalse

运行此模块将只捕获失败用例相关的print信息,而不显示成功用例的print信息:

Copy$ 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输出。 下面是一个测试函数示例,它执行一些与输出相关的检查:

Copydeftest_myoutput(capsys):  # or use "capfd" for fd-levelprint("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块内的捕获:

Copydeftest_disabling_capturing(capsys):
    print("输出被捕获到了")
    with capsys.disabled():
        print("输出未捕获到,直接使用sys.stdout标准输出")
    print("这个输出也被捕获到了")

实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。

如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步

在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。

我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,

测试开发视频教程、学习笔记领取传送门!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值