0

我正在尝试使用 pytest 获取要运行的套件的 id,从数据库加载套件,然后以参数化方式生成测试用例。下面的代码显示了我想要做的事情的要点,但是fixture 'case' not found.

如何case使用从数据库查找返回的 id 进行参数化?

import os
from django.core.wsgi import get_wsgi_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "test_harness.settings")
application = get_wsgi_application()

from unitrunner.models import TestSuiteModel as SuiteModel


def pytest_addoption(parser):
    parser.addoption("--suite", action="append", default=[],
        help="Suite ID to evaluate")


def pytest_generate_tests(metafunc):
    if 'suite' in metafunc.fixturenames:
        suite_id = metafunc.fixturenames['suite']

        this_suite = SuiteModel.objects.get(id=suite_id)
        test_cases = this_suite.testCases.all()

        metafunc.parametrize(
            "case",
            [item.id for item in test_cases]
        )


def test_case(case):
    print(case)

    assert False
4

1 回答 1

1

fixture 'case' not found意味着参数化没有发生:线

metafunc.parametrize(
    "case",
    [item.id for item in test_cases]
)

没有被执行。这并不奇怪,因为您不使用 中的夹具suitetest_case因此if 'suite' in metafunc.fixturenames将返回False。如果您实际使用 中的夹具test_case,例如:

@pytest.fixture
def suite():
    pass

@pytest.mark.usefixtures('suite')
def test_case(case):
    print(case)

    assert False

测试将被正确参数化。顺便说一句,suite我的示例中的夹具用作标记,应该更好地重新设计为:

def pytest_generate_tests(metafunc):
    try:
        suite_id = getattr(metafunc.function, 'suite')
    except AttributeError:  # no suite marker
        pass
    else:
        this_suite = SuiteModel.objects.get(id=suite_id)
        test_cases = this_suite.testCases.all()

        metafunc.parametrize(
            "case",
            [item.id for item in test_cases]
        )

现在简单地标记相关测试:

@pytest.mark.suite(1)
def test_case(case):
    assert case == 1
于 2018-04-17T21:35:16.473 回答