【原文链接】Pytest----什么是实时标准输出和捕获标准输出
在pytest中,执行日志显示其实是比较复杂的,这里将陆续地详细的讲解。首先要理解什么是实时标准输出和捕获标准输出,从字面意思来理解,实时标准输出就是在脚本执行过程中打印的标准输出,而捕获标准输出,就是在执行的过程中被后台程序捕获的标准输出,但并未在控制台打印的,pytest对捕获标准输出的处理方式是当测试用例成功时,捕获标准输出不会打印,而当测试用例失败时,才会将捕获标准输出打印处理。
为了更好的和后续实时日志和捕获日志区分开来,这里要特别说明的是这里得标准输出主要是指stdout中的内容,通俗点来理解,就可以暂时简单地理解为通过print语句打印的内容。
首先看如下一段测试代码,这里在测试脚本中打印了一句话,然后测试断言是成功的。
def test_demo():
print("in test_demo ...")
assert 1==1
使用pytest命令执行结果如下,这里好像并没有什么特别之处,这里需要说明的是,print语句打印的内容要么在实时标准输出中,要么在捕获标准输出中,即不会同时在实时标准输出和捕获标准输出中,这里因为用例通过,所以根据pytest的机制是不会显示捕获标准输出的,因此这里只显示了实时标准输出,但是从打印的记过可以看出,这里并未打印测试脚本中打印的那一行话,这是因为在默认情况下,是开启捕获实时输出的,换句话当用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>
为了能显示出捕获标准输出,我们可以将测试脚本中的断言改为失败,如下:
def test_demo():
print("in test_demo ...")
assert 1==2
执行结果如下,Captured stdout call 下面的一行内容即捕获标准输出的内容,显然这里打印出来了。
(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的设计原理也是有道理的,即在默认情况下,是开启捕获标准输出的,这样一来,当执行一批自动化脚本的时候,脚本中通过print打印的信息都会记录到捕获标准输出中,而当用例失败时,会在执行完成脚本之后交给捕获标准输出都打印出来,这样一来就极大的方便了问题定位。