【原文链接】Pytest----如何打开或关闭实时输出和捕获标准输出
Pytest框架在默认情况下是打开捕获标准输出的,即当用例断言失败时,默认情况下pytest会自动将脚本中的print的内容放在捕获标准输出中打印出来。这里还是以如下最简单的测试脚本为例,注意要让断言失败,因为如果断言成功了,则pytest的机制是不会显示捕获标准输出的。
def test_demo():
print("in test_demo ...")
assert 1==2
执行结果让下,可以看到此时在Captured stdout call 部署即捕获标准输出中将脚本中打印的信息打印出来了。这说明在默认情况下,pytest是开启了捕获标准输出的。
(demo-HCIhX0Hq) E:\demo>pytest
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
rootdir: E:\demo
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 item
test_demo.py F [100%]
======================== FAILURES =========================
________________________ test_demo ________________________
def test_demo():
print("in test_demo ...")
> assert 1==2
E assert 1 == 2
test_demo.py:4: AssertionError
------------------ Captured stdout call -------------------
in test_demo ...
================= short test summary info =================
FAILED test_demo.py::test_demo - assert 1 == 2
==================== 1 failed in 0.07s ====================
(demo-HCIhX0Hq) E:\demo>
当然开启了捕获标准输出的时候,脚本中的打印的信息就不会在实时标准输出中显示。下面可以将脚本修改为如下,即脚本断言成功,此时pytest的机制是不会打印捕获标准输出,但是会打印实时标准输出。
def test_demo():
print("in test_demo ...")
assert 1==1
执行结果如下,可以看出此时实时标准输出中并未把脚本中的print的信息打印出来。这与上面的分析结论是一致的,即pytest默认情况下开启了捕获标准输出,而此时用例断言成功,因此不会显示捕获标准输出,因此在这里控制台输出中没有显示脚本中的print的信息。
(demo-HCIhX0Hq) E:\demo>pytest
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
rootdir: E:\demo
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 item
test_demo.py . [100%]
==================== 1 passed in 0.02s ====================
(demo-HCIhX0Hq) E:\demo>
Pytest提供了 –s 的参数用来关闭捕获标准输出,当关闭了捕获标准输出时,脚本中的print的内容就会在实时标准输出中打印出来,如下使用pytest –s命令执行时,断言此时仍然是成功的,可以从控制台的输出中看到此时已经将脚本中的print的内容显示出来了。
(demo-HCIhX0Hq) E:\demo>pytest -s
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
rootdir: E:\demo
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 item
test_demo.py in test_demo ...
.
==================== 1 passed in 0.02s ====================
(demo-HCIhX0Hq) E:\demo>
为了进一步验证 –s 参数是关闭捕获标准输出的结论,下面继续将脚本修改为断言失败的情况下,因为在断言失败的情况下,如果没有关闭捕获标准输出,那么将继续看到捕获标准输出的打印,而如果真的关闭了,则即使脚本失败了也不会显示捕获标准输出了。脚本修改为如下:
def test_demo():
print("in test_demo ...")
assert 1==2
此时使用pytest –s 命令执行,执行结果如下,可以看出此时控制台的输出中没有了Captured stdout call的内容,这就验证了上面的结论。
(demo-HCIhX0Hq) E:\demo>pytest -s
=================== test session starts ===================
platform win32 -- Python 3.7.9, pytest-7.2.0, pluggy-1.0.0
rootdir: E:\demo
plugins: assume-2.4.3, rerunfailures-10.2
collected 1 item
test_demo.py in test_demo ...
F
======================== FAILURES =========================
________________________ test_demo ________________________
def test_demo():
print("in test_demo ...")
> assert 1==2
E assert 1 == 2
test_demo.py:4: AssertionError
================= short test summary info =================
FAILED test_demo.py::test_demo - assert 1 == 2
==================== 1 failed in 0.07s ====================
(demo-HCIhX0Hq) E:\demo>
因此总结起来,pytest中是通过-s参数关闭捕获标准输出的,在许多教程或者书籍中,有不少说法是-s参数是用来显示详细信息的,这个这是一种简单的假想,不是太准确的。实际上-s是关闭了捕获标准输出了。