Параметризация Pytest с использованием прибора, загруженного из базы данных

Я пытаюсь использовать pytest, чтобы получить идентификатор для запуска комплекта, загрузить комплект из базы данных, а затем сгенерировать тестовые наборы параметризованным способом. Код ниже показывает суть того, что я хочу сделать, но ошибки с fixture 'case' not found,

Как я могу параметризовать case с идентификаторами, которые возвращаются из поиска БД?

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

1 ответ

fixture 'case' not found означает, что параметризация не произошла: строка

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

не был казнен. Это не удивительно, потому что вы не используете прибор suite в test_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
Другие вопросы по тегам