Запустите набор тестов pytest для нескольких версий базы данных. - PullRequest
3 голосов
/ 25 января 2020

Я создаю приложение, которое использует базу данных в бэкэнде. Для интеграционных тестов я запускаю базу данных в Docker и запускаю набор тестов с pytest.

Я использую фиксатор сессионной области с autouse=True, чтобы запустить контейнер Docker:

@pytest.fixture(scope='session', autouse=True)
    def run_database():                     
        # setup code skipped ...

        # start container with docker-py
        container.start()

        # yield container to run tests
        yield container

        # stop container afterwards
        container.stop()

Я передаю соединение с базой данных тестовым функциям с помощью другого фиксатора сессий:

@pytest.fixture(scope='session')
def connection():
    return Connection(...)

Теперь я могу запустить тестовую функцию:

def test_something(connection):
    result = connection.run(...)
    assert result == 'abc'

Однако я бы хотел запускать мои тестовые функции для нескольких разных версий базы данных.

Я могу запустить несколько контейнеров Docker в приспособлении run_database(). Как я могу параметризовать мои тестовые функции так, чтобы они работали для двух разных connection() приборов?

Ответы [ 2 ]

1 голос
/ 27 января 2020

Ответ @Guy работает!

Я нашел другое решение проблемы. Можно параметризовать крепеж. Каждая тестовая функция, которая использует прибор, будет запускаться несколько раз: https://docs.pytest.org/en/latest/fixture.html#parametrizing -фиксаторы

Таким образом, я параметризовал функцию connection():

@pytest.fixture(scope='session', params=['url_1', 'url_2'])
def connection(request):
    yield Connection(url=request.param)

Теперь каждый Функция тестирования, использующая прибор connection, запускается дважды. Преимущество заключается в том, что вам не нужно изменять / адаптировать / отмечать существующие функции тестирования.

0 голосов
/ 26 января 2020

Вы можете отправить функцию, которая выдает соединения, и передать ее с @pytest.mark.parametrize. Если вы измените область действия run_database() на class, она будет выполняться для каждого теста

def data_provider():
    connections = [Connection(1), Connection(2), Connection(3)]
    for connection in connections:
        yield connection


@pytest.fixture(scope='class', autouse=True)
def run_database():
    container.start()
    yield container
    container.stop()


@pytest.mark.parametrize('connection', data_provider())
@pytest.mark.testing
def test_something(connection):
    result = connection.run()
    assert result == 'abc'

Если вы добавите @pytest.mark.parametrize('connection', data_provider()) к run_database(), соединение также будет передано туда.

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