如何在收集测试时替换py.test中的测试函数?

时间:2016-02-04 20:33:35

标签: python pytest

我有一个带有测试功能的模块,我想在收集阶段之后和测试运行之前编写conftest.py文件来装饰模块中的所有函数。我不想用测试功能编辑模块。 我这样试过:

test_foo.py

def test_foo ():
    assert 1 == 42

conftest.py

def pytest_generate_tests (metafunc):
    def test_bar ():
        assert 1 == 2
    metafunc.function = test_bar

当我运行测试时,我得到了这个:

==================================== FAILURES =====================================
____________________________________ test_foo _____________________________________

    def test_foo ():
>       assert 1 == 42
E       assert 1 == 42

但我期望关于1 == 2的断言错误。

2 个答案:

答案 0 :(得分:1)

如果要在测试之前运行某个功能,请定义 fixture 并使用灯具名称作为测试参数。

import pytest


@pytest.fixture
def fixture1():
    assert 1 == 2


def test_foo(fixture1):
    assert 1 == 42

输出:

    @pytest.fixture
    def fixture1():
>       assert 1 == 2
E       assert 1 == 2


如果要在每个测试之前运行某个功能,请使用autouse=True定义 fixture 。我想这就是你想要的。

import pytest


@pytest.fixture(autouse=True)
def fixture1():
    assert 1 == 2


def test_foo():
    assert 1 == 42

输出:

    @pytest.fixture(autouse=True)
    def fixture1():
>       assert 1 == 2
E       assert 1 == 2


如果您需要自定义测试装饰器,请使用标准装饰器语法。

def my_test_decorator(test):
    def wrapper():
        assert 1 == 2

    return wrapper


@my_test_decorator
def test_foo():
    assert 1 == 42

输出:

    def wrapper():
>       assert 1 == 2
E       assert 1 == 2

答案 1 :(得分:1)

我只需要替换pytest项目的runtest方法。