我试着在pytest中使用TDD(测试驱动开发)。 当我使用print时,pytest将不会打印到控制台。

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

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

But:

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。

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


当前回答

我最初来到这里是为了找到如何在VSCode的控制台中打印PyTest,同时从那里运行/调试单元测试。这可以通过下面的启动来完成。json配置。给定虚拟环境文件夹.venv。

    "version": "0.2.0",
    "configurations": [
        {
            "name": "PyTest",
            "type": "python",
            "request": "launch",
            "stopOnEntry": false,
            "pythonPath": "${config:python.pythonPath}",
            "module": "pytest",
            "args": [
                "-sv"
            ],
            "cwd": "${workspaceRoot}",
            "env": {},
            "envFile": "${workspaceRoot}/.venv",
            "debugOptions": [
                "WaitOnAbnormalExit",
                "WaitOnNormalExit",
                "RedirectOutput"
            ]
        }
    ]
}

其他回答

使用-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

我需要打印关于跳过测试的重要警告,正好当PyTest静音字面上的一切。

我不想通过测试来传递一个信号,所以我做了如下修改:

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释放输出流之后打印内容。输出如下所示:

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

Message即使在PyTest处于静默模式时也会被打印,如果使用py运行东西则不会被打印。Test -s,所有东西都已经测试好了。

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

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

Insert assert False, "dumb assert to make PyTest print my stuff" at the end of your function, and you will see your output due to failed test. You have special object passed to you by PyTest, and you can write the output into a file to inspect it later, like 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) You can open the out and err files in a separate tab and let editor automatically refresh it for you, or do a simple py.test; cat out.txt shell command to run your test.

这是一种相当粗鄙的做事方式,但它可能是你需要的东西:毕竟,TDD意味着你把东西弄得乱七八糟,然后在它准备好时让它干净安静:-)。

我通常使用这个命令:-

pytest -v -rs --html=report.html --self-contained-html test_Suite.py -s

上面的命令还生成了一个report.html文件,其中捕获并保存了所有打印语句。最后的-s也会显示打印语句到终端。

已经有很多很好的答案,但我想分享一下为什么在运行pytest时无法获得日志。

一个重要的注意事项是,当您编写函数时,每个测试用例必须以test_前缀开始。否则,在使用pytest时就不会有打印语句。

至于命令,我使用下面的命令来获得非常全面的日志:

python -m pytest -v -rs <particular_file.py> -s -o log_cli-level=DEBUG

通过确保您有正确的函数名并使用我的命令,您应该能够确定地看到控制台日志。