Параметризация 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