首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >py.test拆卸,查看测试是否失败,并打印子进程输出

py.test拆卸,查看测试是否失败,并打印子进程输出
EN

Stack Overflow用户
提问于 2015-12-11 03:54:32
回答 3查看 4.7K关注 0票数 4

如果测试失败,我希望在py.test解压缩中打印子进程输出,或者将它发送到任何其他人类可读的输出。能不能检查一下测试是否在拆卸中失败了?只有在测试失败时才能获得子进程命令输出的其他方法吗?

我的代码:

代码语言:javascript
复制
"""Test different scaffold operations."""
import subprocess

import pytest
from tempfile import mkdtemp


@pytest.fixture(scope='module')
def app_scaffold(request) -> str:
    """py.test fixture to create app scaffold."""

    folder = mkdtemp(prefix="websauna_test_")

    cmdline = ["..."]

    worker = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    worker.wait(timeout=5.0)

    if worker.returncode is not None:
        raise AssertionError("scaffold command did not properly exit: {}".format(" ".join(cmdline)))

    def teardown():
        worker.terminate()
        # XXX: Hard to capture this only on failure for now
        print(worker.stdout.read().decode("utf-8"))
        print(worker.stderr.read().decode("utf-8"))

    request.addfinalizer(teardown)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-16 22:22:40

您可以用在测试中捕获异常的函数来修饰测试。如果有异常,记录进程输出:

代码语言:javascript
复制
import functools
import subprocess

import pytest


def catch_exception(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        worker = kwargs['app_scaffold']
        try:
            return func(*args, **kwargs)
        except Exception as e:
            print('stdout:', worker.stdout.read().decode("utf-8"))
            print('stderr:', worker.stderr.read().decode("utf-8"))
            raise
    return wrapper


@pytest.fixture(scope='module')
def app_scaffold(request) -> subprocess.Popen:
    """py.test fixture to create app scaffold."""
    cmdline = ["echo", "something"]

    worker = subprocess.Popen(cmdline, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    worker.wait(timeout=5.0)

    return worker


@catch_exception
def test_foo(app_scaffold):
    assert False

这段代码忽略了示例中的一些细节,但我认为它应该包含处理案例所需的全部内容。

票数 4
EN

Stack Overflow用户

发布于 2015-12-11 08:05:51

实际上,您可以捕获在使用capsyscapfd固定装置执行期间创建的stdout/stderr:(https://pytest.org/latest/capture.html)

票数 1
EN

Stack Overflow用户

发布于 2016-03-15 13:50:34

pytest-instafail插件可能很有用

您可以在运行测试时使用--instafail选项。在继续执行其他测试时,立即显示失败的测试失败

参考:https://pypi.python.org/pypi/pytest-instafail

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

https://stackoverflow.com/questions/34215850

复制
相关文章

相似问题

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