当前位置: 首页 > 知识库问答 >
问题:

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

卞琨
2023-03-14

我试图使用TDD(测试驱动开发)与pytest。当我使用print时,pytest不会print到控制台。

我正在使用pytestmyu测试。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.

没有任何东西被打印到我的标准输出控制台(只是正常的进度和多少测试通过/失败)。

我正在测试的脚本包含打印:

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

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

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

共有3个答案

蓝苗宣
2023-03-14
匿名用户

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

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

>

  • 在函数末尾插入断言False,哑断言以使PyTest打印我的东西,您将看到由于测试失败而产生的输出。

    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操作。测验猫出来了。txtshell命令来运行测试。

    这是一种相当粗俗的做事方式,但可能正是你需要的东西:毕竟,TDD意味着你弄乱了东西,当它准备好时,让它保持干净和安静:-)。

  • 梁丘德寿
    2023-03-14

    使用-s选项:

    pytest -s
    

    从文档:

    在测试执行期间,将捕获发送到stdout和stderr的任何输出。如果测试或设置方法失败,通常会显示相应的捕获输出以及失败回溯。

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

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

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

    >

  • 文件描述符(FD)级别捕获(默认):将捕获操作系统文件描述符1和2的所有写入。

    sys级捕获:仅写入Python文件sys。标准输出和系统。斯特德尔将被抓获。不执行对文件描述符的写入捕获。

    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
    

  • 贺立果
    2023-03-14

    默认情况下,py。测试捕获标准输出的结果,以便控制如何输出。如果它不这样做,它将喷出大量文本,而不考虑测试打印文本的上下文。

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

    例如

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

    注意捕获的stdout部分。

    如果希望看到在执行语句时打印它们,可以将-s标志传递给py。测试。但是,请注意,这有时很难解析。

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

     类似资料:
    • 问题内容: 我想在用户调用/ button之后,简单地在Python控制台上打印一个“ hello world”。 这是我的幼稚方法: 背景:我想从flask(而不是shell)执行其他python命令。“打印”应该是最简单的情况。我相信我对这里的基本理解还不了解。提前致谢! 问题答案: 看来你已经解决了问题,但是对于其他寻求此答案的人来说,一种简单的方法是通过打印到stderr。你可以这样做:

    • 问题内容: 如何打印(在控制台),,等这个结构中Golang的? 问题答案: 要在结构中打印字段名称: 从包装中: 打印结构时,加号()添加字段名称 假设您有一个Project的实例(在’ ‘中) 文章JSON和Go将提供有关如何从JSON结构中检索值的更多详细信息。 此“按示例进行搜索”页面提供了另一种技术: 那会打印: 如果没有任何实例,则需要 使用反射 来显示给定结构的字段名称,如本例所示。

    • 如何在Golang中打印(在控制台中)该结构的、、等?

    • 在航站楼如何做到这一点?

    • 问题内容: 我的C程序粘贴在下面。在bash中,程序打印“ char is”,不打印Ω。我的语言环境均为en_US.utf8。 问题答案: 这很有趣。显然,编译器将omega从UTF-8转换为UNICODE,但libc某种程度上将其弄乱了。 首先:-format说明符期望一个(即使在wprintf -version 中也是如此),因此您必须指定(并因此指定字符串)。 其次,如果您像这样将语言环境设

    • 你可以使用printf将消息打印到控制台,从而知道应用程序是如何运行的。这是调试代码的很有用的手段,因为你可以打印变量的值、知道什么时候代码将阻塞等等。 我们尝试使用函数unsigned char leds_get(void);打印LED的状态。 获取LED的状态,并将其打印到屏幕。修改test-leds.c如下: #include "contiki.h" #include "dev/leds.h