Я довольно новичок в pytest, но я пытаюсь написать многократно используемые функции для запуска тестов в обеих наших средах (QA & Prod). Я не буду запускать все тесты на Prod, которые я запускаю на QA. Я написал функцию, которая читает некоторые файлы .cfg (через ConfigParser) для загрузки в различных тестовых сценариях. Тесты работают, но мне кажется, что мне нужно загрузить тесты в список, прежде чем передать их в тест. Я чувствую, что я пропускаю что-то простое здесь.
Я прочитал документы по параметризации pytest и, может быть, я хладнокровен, но я просто не вижу, как это сделать. Я продолжаю видеть примеры создания тестов, встроенных в код, что на самом деле не то, что я делаю. Я попытался украсить функцию как @ pytest.mark.parametrize и передать имя функции в качестве параметра тестовой функции, но начал получать ошибки «Функция не повторяемая», хотя я возвращал список.
Тесты / sample.cfg
# tests must begin w/[pass, fail] to be processed for assertion
[pass add int and int]
test_envs = all
a = 5
b = 6
[fail int and str]
test_envs = qa
a = 134
b = foo
raise_type = TypeError
[pass add int and int prod]
test_envs = prod
a = 10
b = 6
test_sample.py
import pytest
import os
from configparser import ConfigParser
def tuples_to_dict(pairs):
return dict((x, y) for x, y in pairs)
def get_scenarios(env):
test_conf = ConfigParser()
test_conf.read('tests/sample.cfg')
tests = []
for title in test_conf.sections():
if not title.startswith('pass') and not title.startswith('fail'):
print("Skipping [{}] - unknown format".format(title))
continue
expected = title.split()[0]
test = tuples_to_dict(test_conf[title].items())
test_scope = test.get('test_envs', 'qa')
test_scope = test_scope.split()
if 'test_envs' in test:
del test['test_envs']
if 'all' in test_scope or env in test_scope:
print("Adding [{}]".format(title.title()))
else:
print("Skipping [{0}] - {1} out of scope {2}".format(title.title(), env, ', '.join(test_scope)))
continue
marks = []
if expected.lower() == 'fail':
marks = [pytest.mark.xfail]
tests.append(pytest.param(test, expected.lower(), marks=marks, id=title.title()))
return tests
# @pytest.fixture(params=get_scenarios())
# def scenario(request):
# return request.param
env = os.environ.get('pytest_env', 'unknown')
print("Testing {} env".format(env))
test_scenarios = get_scenarios(env)
# @pytest.mark.parametrize("test, expected", test_scenarios)
@pytest.mark.parametrize("test, expected", test_scenarios)
def test_add(test, expected):
if expected == 'pass':
assert test['a'] + test['b']
elif expected == 'fail':
with pytest.raises(test['raise_type']):
test['a'] + test['b']
else:
raise RuntimeError('should not get here')
Запустите либо export pytest_env=qa
, либо через. чтобы получить тестовый выбор.
Хотя это работает, похоже, я должен каким-то образом передать функцию get_scenarios напрямую в тестовую функцию pytest. Кроме того, я не совсем уверен, что пропускаю некоторые базовые встроенные функции для определения возможностей тестов для конкретных сред. Если есть лучший механизм, я все уши. Я читал функции областей видимости на приборах pytest, но, похоже, это только модуль, тест, сессия, которые не позволяют мне указать среду.