Pytest在派生类中生成测试

3
我需要根据不同的数据生成一些相似的测试。我尝试过
import pytest


class BaseClass(object):
    data = [1]

    @pytest.mark.parametrize("param1", data)
    def test_something(self, param1):
        assert param1


class Test1(BaseClass):
    data = [2, 3]


class Test2(BaseClass):
    data = [0]

但结果是:
collected 2 items

test_of_pytest.py::Test1::test_something[1] PASSED                       [ 50%]
test_of_pytest.py::Test2::test_something[1] PASSED                       [100%]

而不是预期的类似于:

collected 3 items

test_of_pytest.py::Test1::test_something[2] PASSED                       [ 33%]
test_of_pytest.py::Test1::test_something[3] PASSED                       [ 66%]
test_of_pytest.py::Test2::test_something[0] FAIL                       [100%]

当读取BaseClass时,@pytest.mark.parametrize仅运行一次。 如何处理parametrize(或其他一些生成器),使其按照我期望的那样运行?


pytest does not work like that, what you need is fixtures, but even more so why set data in the BaseClass - gold_cy
1
标记只是另一个装饰器;它将在导入时执行一次,使用 Base.data;新的装饰函数附加到类上,子类中没有任何剩余的运行。这不仅适用于 pytest.mark.parametrize,而且可以在任何类和任何装饰方法中重现。 - hoefling
1个回答

1
尝试使用 pytest_generate_tests
def pytest_generate_tests(metafunc):
    # called once per each test function
    funcarglist = metafunc.cls.params[metafunc.function.__name__]
    argnames = sorted(funcarglist[0])
    metafunc.parametrize(
    argnames, [[funcargs[name] for name in argnames] for funcargs in funcarglist]
)


class BaseClass(object):
    params = None

    def test_something(self, param):
        assert param


class Test1(BaseClass):
    params = {
        "test_something": [dict(param=2), dict(param=3)]
    }


class Test2(BaseClass):
    params = {
        "test_something": [dict(param=0)]
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接