Python Pytest распаковать крепеж - PullRequest
0 голосов
/ 08 мая 2018

У меня есть прибор, который создает список предметов во время тестов. Я хочу иметь другой прибор, который параметризован значениями, сгенерированными первым.

Пример кода

import random
import pytest

@pytest.fixture
def values():
    return [random.randint(0, 100) for _ in range(10)]


@pytest.fixture
def value(request):
    return request.param


@pytest.mark.parametrize("value", params=values):
def test_function(value):
    assert value > 0

Проблема с приведенным выше кодом заключается в том, что values является функцией, а не списком. Я довольно много копал, но не нашел способа распаковать прибор, чтобы параметризовать его другим.

Мне известно, что я могу передать приспособление values и итерировать его в тестах, но это не очень хорошее решение, так как я хочу увидеть, какие значения приводят к сбою теста.

Я также открыт для альтернативных решений, например, если возможно запустить подтесты из запущенного теста.

1 Ответ

0 голосов
/ 03 июля 2019

Это кажется неправильным пониманием концепции приборов и ее различием с концепцией параметров.

Pytest имеет две основные фазы:

  • a фаза сбора , где целью является создание списка тестовых "узлов" для запуска. Один тестовый «узел» соответствует одному тестовому идентификатору и означает одно значение для каждого параметра. На этом этапе приборы НЕ выполняются, считываются только метки декоратора (содержащие параметры). Поэтому только параметры, объявленные в декораторах , могут влиять на эту фазу

  • и фаза выполнения , где выполняется каждый тестовый узел. Перед запуском устанавливаются все необходимые приборы, которые еще не настроены. Поэтому функции прибора выполняются на этом этапе и только на этом этапе.

В вашем примере вы хотите, чтобы в результате настройки прибора (фаза B) изменился список создаваемых тестов (фаза A): это не представляется возможным. Вы должны создать этот список где-нибудь еще, например, в pytest init hook в conftest.py или просто как общую переменную в любом из ваших тестовых модулей, и ссылаться на него в параметрах вашего теста или прибора.

См. Также этот вопрос, который очень похож: Тесты параметризации в зависимости от параметризованных значений в pytest

Обратите внимание, что для дополнения комментария hoefling к вашему вопросу теперь вы можете использовать параметризованный прибор в списке параметров: я добавил эту функцию в качестве бета-версии в моем плагине pytest-case для оценки, чтобы мы могли в конечном итоге предложить объединить его в рамках pytest (см. это обсуждение , поэтому не стесняйтесь оставлять отзывы!). Но, к сожалению, это не решит точную проблему, которую вы описываете в этом посте, по фундаментальной причине, описанной выше.

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