如何打印到Py Test控制台?

我试图用pytest模块来使用testing驱动开发。 当我写print时pytest将不会print到控制台。

我使用py.test my_tests.py来运行它…

documentation似乎说,它应该默认工作: 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. 

没有什么打印到我的标准输出控制台(只是正常的进展和多less次testing通过/失败)。

而我正在testing的脚本包含print:

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

unittest模块中,默认情况下所有东西都被打印出来,这正是我所需要的。 不过,我想用其他原因使用pytest 。 这似乎是这样的基本function,也许我错过了它!

有谁知道如何使打印语句显示?

默认情况下, py.test捕获标准输出的结果,以便它可以控制如何打印出来。 如果没有这样做,那么会在没有testing打印文本的情况下发出大量文本。

但是,如果testing失败,它将在结果报告中包含一个部分,显示在特定testing中打印到标准的部分。

例如,

 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语句执行时看到,可以将-s标志传递给py.test 。 但是,请注意,这有时可能难以parsing。

 >>> 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 ====================== 

使用-s选项将打印所有function的输出,这可能太多了。

如果你需要特定的输出,你提到的文档页面提供了一些build议:

  1. 插入assert False, "dumb assert to make PyTest print my stuff"在你的函数结束,你会看到你的输出由于testing失败。

  2. 你有特殊的对象通过PyTest传递给你,你可以把输出写入一个文件来检查它,比如

     def test_good1(capsys): for i in range(5): print i out, err = capsys.readouterr() open("err.txt", "w").write(err) open("out.txt", "w").write(out) 

    你可以在单独的选项卡中打开outerr文件,让编辑器自动为你刷新,或者做一个简单的py.test; cat out.txt py.test; cat out.txt shell命令来运行你的testing。

这种做法相当不方便,但可能是你需要的东西:毕竟,TDD意味着你把东西弄糟,当它准备好的时候,保持干净和沉默:-)。

我需要打印关于跳过testing的重要警告,就是PyTest从字面上忽略了一切

我不想通过一个testing来发送信号,所以我做了如下的破解:

 def test_2_YellAboutBrokenAndMutedTests(): import atexit def report(): print C_patch.tidy_text(""" In silent mode PyTest breaks low level stream structure I work with, so I cannot test if my functionality work fine. I skipped corresponding tests. Run `py.test -s` to make sure everything is tested.""") if sys.stdout != sys.__stdout__: atexit.register(report) 

atexit模块允许我 PyTest发布输出stream之后打印内容。 输出如下所示:

 ============================= test session starts ============================== platform linux2 -- Python 2.7.3, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 rootdir: /media/Storage/henaro/smyth/Alchemist2-git/sources/C_patch, inifile: collected 15 items test_C_patch.py .....ssss....s. ===================== 10 passed, 5 skipped in 0.15 seconds ===================== In silent mode PyTest breaks low level stream structure I work with, so I cannot test if my functionality work fine. I skipped corresponding tests. Run `py.test -s` to make sure everything is tested. ~/.../sources/C_patch$ 

即使PyTest处于静默模式,也会打印消息,如果使用py.test -s运行内容,则不会打印py.test -s ,因此所有消息都已经很好地进行了testing。

根据pytest文档 , pytest --capture=sys应该可以工作。 如果您想在testing中捕获标准,请参阅capsys夹具。