Функция Pytest для параметризации тестов для среды - PullRequest
0 голосов
/ 05 июля 2019

Я довольно новичок в 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, но, похоже, это только модуль, тест, сессия, которые не позволяют мне указать среду.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...