以下代码中的
hello
函数写入stdout。它是用 Fortran 编写的,并使用 numpy.F2PY 和 scikit-build 添加到包 hello-f2py 中。 Pytest 似乎无法捕获它写入标准输出的内容……这是为什么?
这里是测试。
from hello_f2py import hello
def setup_function():
hello('Earth')
def test_hello_capfd(capfd):
hello('Moon')
captured = capfd.readouterr()
assert captured.out == 'Hello, Moon!\n'
这是测试结果据称没有捕获。
$ pytest -s
=== test session starts ===
platform linux -- Python 3.10.8, pytest-7.2.2, pluggy-1.0.0
rootdir: /home/itcarroll/tmp/skb, configfile: pytest.ini
collected 1 item
test_hello_f2py.py Hello, Earth!
.
=== 1 passed in 0.08s ===
可以看到
Hello, Earth!
是在setup
调用的时候写的。测试通过使用 capfd
,即使使用 -s
标志。这是我不明白的第一件事。
这是捕获标准输出失败时的结果(没有
-s
标志)。
$ pytest
=== test session starts ===
platform linux -- Python 3.10.8, pytest-7.2.2, pluggy-1.0.0
rootdir: /home/itcarroll/tmp/skb, configfile: pytest.ini
collected 1 item
test_hello_f2py.py F [100%]
======== FAILURES ========
____ test_hello_capfd ____
capfd = <_pytest.capture.CaptureFixture object at 0x7f0969f8f850>
def test_hello_capfd(capfd):
hello('Moon')
captured = capfd.readouterr()
> assert captured.out == 'Hello, Moon!\n'
E AssertionError: assert '' == 'Hello, Moon!\n'
E - Hello, Moon!
test_hello_f2py.py:9: AssertionError
=== short test summary info ====
FAILED test_hello_f2py.py::test_hello_capfd - AssertionError: assert '' == 'Hello, Moon!\n'
=== 1 failed in 0.10s ===
Hello, Earth!
Hello, Moon!
到底是什么?地球和月球没有被捕获并在测试结果后打印出来!?