首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在pytest中打印到控制台?

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

Stack Overflow用户
提问于 2014-07-08 02:33:35
回答 8查看 217K关注 0票数 337

我正在尝试将测试驱动开发( TDD )用于pytest。当我使用print时,pytest无法通过print连接到控制台。

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

documentation似乎说它应该在缺省情况下工作:http://pytest.org/latest/capture.html

但是:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
class Blogger(Site):
    get_links(self, posts):
        print len(posts)   # It won't get printed in the test.

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2014-07-08 02:55:14

默认情况下,py.test捕获标准输出的结果,以便控制打印输出的方式。如果它不这样做,它将在没有测试打印文本的上下文的情况下输出大量文本。

但是,如果测试失败,它将在结果报告中包含一个部分,显示在该特定测试中打印到标准输出的内容。

例如,

代码语言:javascript
运行
复制
def test_good():
    for i in range(1000):
        print(i)

def test_bad():
    print('this should fail!')
    assert False

将产生以下输出:

代码语言:javascript
运行
复制
>>> 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。但是,请注意,这有时很难解析。

代码语言:javascript
运行
复制
>>> 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 ======================
票数 362
EN

Stack Overflow用户

发布于 2019-05-02 18:49:25

简短的回答

使用-s选项:

代码语言:javascript
运行
复制
pytest -s

详细答案

来自the docs

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

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

代码语言:javascript
运行
复制
pytest --capture=no     # show print statements in console
pytest -s               # equivalent to previous command

设置捕获方式或禁用捕获

pytest可以通过两种方式执行捕获:

Python描述符(

  1. file descriptor,FD)级别捕获Python(默认):所有到操作系统文件描述符1和2的写操作都将是Python级别捕获:只捕获对文件sys.stdout和sys.stderr的写操作。不会捕获写入文件脚本的操作。

代码语言:javascript
运行
复制
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
票数 146
EN

Stack Overflow用户

发布于 2016-08-05 17:23:32

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

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

  1. 在您的函数末尾插入assert False, "dumb assert to make PyTest print my stuff",由于测试失败,您将看到您的输出。
  2. 您有一个由PyTest传递给您的特殊对象,您可以将输出写入一个文件中,以便稍后进行检查,如

def test_good1(capsys):对于i输入范围(5):打印i输出,err = capsys.readouterr() open("err.txt","w").write(err) open("out.txt","w").write( out )

您可以在单独的选项卡中打开outerr文件,并让编辑器自动刷新它,或者执行一个简单的py.test; cat out.txt外壳命令来运行测试。

这是一种相当老套的方式,但它可能是你需要的东西:毕竟,TDD意味着你把东西弄乱了,当它准备好的时候就让它干净和安静:-)。

票数 100
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24617397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档