如何在 pytest 中打印到控制台?

32 浏览
0 Comments

如何在 pytest 中打印到控制台?

我正在尝试使用TDD(测试驱动开发)和pytest

使用print时,pytest不会在控制台上print

我使用pytest my_tests.py来运行它。

文档似乎说默认情况下应该可以工作:http://pytest.org/latest/capture.html

但是:

import myapplication as tum
class TestBlogger:
    @classmethod
    def setup_class(self):
        self.user = "alice"
        self.b = tum.Blogger(self.user)
        print "This should be printed, but it won't be!"
    def test_inherit(self):
        assert issubclass(tum.Blogger, tum.Site)
        links = self.b.get_links(posts)
        print len(links)   # This won't print either.

什么都没有打印到我的标准输出控制台上(只有正常的进度和有多少个测试通过/失败)。

而我正在测试的脚本包含print

class Blogger(Site):
    get_links(self, posts):
        print len(posts)   # It won't get printed in the test.

unittest模块中,默认情况下会打印所有内容,这正是我所需要的。但是,我希望出于其他原因使用pytest

有人知道如何显示print语句吗?

admin 更改状态以发布 2023年5月22日
0
0 Comments

使用-s选项:

pytest -s

详细答案

来自文档

在测试执行期间,任何发送到stdoutstderr的输出都将被捕获。如果一个测试或一个设置方法失败,它相应的捕获输出通常会与失败的回溯一起显示。

pytest--capture=method选项,其中method是每个测试的捕获方法之一,可以是以下之一:fdsysnopytest还有-s选项,它是--capture=no的快捷方式,这是允许你在控制台中看到你的打印语句的选项。

pytest --capture=no     # show print statements in console
pytest -s               # equivalent to previous command

设置捕获方法或禁用捕获

pytest 有两种执行捕获的方式:

  1. 文件描述符(FD)级别的捕获(默认):所有写入操作系统文件描述符 1 和 2 的内容都会被捕获。

  2. sys 级别的捕获:只有写入 Python 的 sys.stdout 和 sys.stderr 的内容才会被捕获,不会捕获写入文件描述符的内容。

pytest -s            # disable all capturing
pytest --capture=sys # replace sys.stdout/stderr with in-mem files
pytest --capture=fd  # also point filedescriptors 1 and 2 to temp file

0
0 Comments

默认情况下,py.test会捕获标准输出的结果,以便它可以控制如何打印输出。如果它不这样做,它会输出很多文本,而没有测试打印这些文本的上下文。

然而,如果一个测试失败,它将包括一个显示该特定测试的标准输出的报告部分。

例如,

def test_good():
    for i in range(1000):
        print(i)
def test_bad():
    print('this should fail!')
    assert False

会产生以下输出:

>>> py.test tmp.py
============================= test session starts ==============================
platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2
plugins: cache, cov, pep8, xdist
collected 2 items
tmp.py .F
=================================== FAILURES ===================================
___________________________________ test_bad ___________________________________
    def test_bad():
        print('this should fail!')
>       assert False
E       assert False
tmp.py:7: AssertionError
------------------------------- Captured stdout --------------------------------
this should fail!
====================== 1 failed, 1 passed in 0.04 seconds ======================

请注意Captured stdout部分。

如果你想在执行时看到print语句,你可以向py.test传递-s标志。然而,请注意这有时可能很难解析。

>>> py.test tmp.py -s
============================= test session starts ==============================
platform darwin -- Python 2.7.6 -- py-1.4.20 -- pytest-2.5.2
plugins: cache, cov, pep8, xdist
collected 2 items
tmp.py 0
1
2
3
... and so on ...
997
998
999
.this should fail!
F
=================================== FAILURES ===================================
___________________________________ test_bad ___________________________________
    def test_bad():
        print('this should fail!')
>       assert False
E       assert False
tmp.py:7: AssertionError
====================== 1 failed, 1 passed in 0.02 seconds ======================

0