Я пытаюсь разработать пакет автоматизации Pytest для отдыха API REST
В conftest.py У меня есть:
def pytest_addoption(parser):
parser.addoption("--env", action="store", help="accepting dev,qa,stage")
def pytest_configure(config):
global base_path,execution_path,users,user_alpha,user_beta,user_gamma,psw_alpha,psw_beta,psw_gamma
cfg=ConfigParser()
cfg.read('config.ini')
base_path = cfg.get('base', 'path')
if config.getoption('env') in ['qa','stage','dev']:
environ = config.getoption('env')
execution_path = base_path.format(env=environ)
else:
sys.exit(1)
@pytest.fixture(scope='session')
def base():
global execution_path
return execution_path
def get_user():
global execution_path,users
cfg=ConfigParser()
cfg.read('config.ini')
user1 = cfg.get('users','user1')
psw_user1 = cfg.get('users','psw.user1')
user2 = cfg.get('users','user.user2')
psw_user2 = cfg.get('users','psw.user2')
user3 = cfg.get('users','user.user3')
psw_user3 = cfg.get('users','psw.user3')
users = [(user1, psw_user1,user1_token), (user2, psw_user2,user2_token), (user3, psw_user3,user3_token)]
return users
@pytest.fixture(params=get_user(),scope='session', ids=['user1','user2','user3'])
def return_user(request):
return request.param
в test_module.py :
def test_function1(base, return_user):
pass
def test_function2(base, return_user):
pass
output
test_upload.py::test_pass4[user1] PASSED [ 16%]
test_upload.py::test_pass5[user1] PASSED [ 33%]
test_upload.py::test_pass4[user2] PASSED [ 50%]
test_upload.py::test_pass5[user2] PASSED [ 66%]
test_upload.py::test_pass4[user3] PASSED [ 83%]
test_upload.py::test_pass5[user3] PASSED [100%]
Создание токенов можно выполнить с помощью pytest_configure (metafun c). Однако с pytest_configure pytest запускает test_pass4 для каждого пользователя, затем начинает test_pass5 для каждого и, таким образом, генерирует новый токен для каждого теста. Я хотел бы иметь один и тот же токен для всех тестов в одном модуле для одного и того же пользователя.
Чтобы получить токен, мне нужно передать аргумент командной строки, чтобы я мог отформатировать путь_процесса с помощью переменной env, передаваемой в командной строке. Я могу сделать это sh с помощью def get_user (config) для доступа к env. Однако @ pytest.fixture (params = get_user (config)) не распознает конфигурацию. Или у меня нет других параметров для передачи в get_user ().
Есть ли способ выполнить sh это?
ОБНОВЛЕНИЕ : я смог получить доступ к аргументам командной строки внутри прибора с помощью pytest.config.getoption('env'))
и затем выполнить необходимые действия трансформация внутри светильника
@pytest.fixture(params=get_user(),scope='session', ids=['user1','user2','user3'])
def return_user(request):
cfg=ConfigParser()
cfg.read('config.ini')
base_path = cfg.get('base', 'path')
base_path = base_path.format(env=request.config.getoption('env'))
user = #payload to login user
user.token = #code to get token
temp = request.param
temp.append(user.token)
return temp