如何在 pytest 中打印到控制台?
如何在 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
语句吗?
使用-s
选项:
pytest -s
详细答案
来自文档:
在测试执行期间,任何发送到stdout和stderr的输出都将被捕获。如果一个测试或一个设置方法失败,它相应的捕获输出通常会与失败的回溯一起显示。
pytest
有--capture=method
选项,其中method
是每个测试的捕获方法之一,可以是以下之一:fd
,sys
或no
。 pytest
还有-s
选项,它是--capture=no
的快捷方式,这是允许你在控制台中看到你的打印语句的选项。
pytest --capture=no # show print statements in console pytest -s # equivalent to previous command
设置捕获方法或禁用捕获
pytest
有两种执行捕获的方式:
-
文件描述符(FD)级别的捕获(默认):所有写入操作系统文件描述符 1 和 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
默认情况下,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 ======================