Py.test параметризованные светильники - PullRequest
0 голосов
/ 28 августа 2018

В настоящее время я работаю над некоторыми модульными тестами и тестовыми приборами, используя py.test

У меня есть код, который делает это:

# my py.test file
import pytest

@pytest.fixture
def fixture_1():
    f = open("file_one.txt", 'rb')
    f_str = f.read()
    yield f_str
    f.close()

def test_function_1(fixture_1):
    assert fixture_1.startswith("some_test_data") # example test

Это все хорошо и отлично работает.

Теперь предположим, что я пишу другую тестовую функцию, которая работает с входными данными, хранящимися в другом файле (скажем, file_two.txt, и моя функция выглядит следующим образом:

# in same py file as above
def test_function_2(fixture_1):
     #some test with data from file_two.txt
     assert something_for_fun

В test_function_2 выше я хочу, чтобы fixture_1 выполнял те же операции, что и раньше, но на file_two.txt вместо file_one.txt.

EDIT : я также играл с параметризованными приборами , но это вызывает мою функцию test_function_ * столько раз, сколько аргументов для прибора, что не работает, поскольку функции test_functions специфично для ввода из файла.

Я читал о приспособлении request , но не уверен, как его использовать для проверки контекста тестовой функции.

Если кто-нибудь понял, пожалуйста, дайте мне знать. Тем временем я опубликую, как только у меня получится!

РЕДАКТИРОВАТЬ 2: Я также знаю о inspect и introspect НО я ищу более чистый способ сделать это, желательно с использованием некоторого pytest magic ~

Спасибо!

1 Ответ

0 голосов
/ 28 августа 2018

Вы можете параметризовать прибор из теста и прочитать переданный параметр через request.param:

import pytest

@pytest.fixture
def fixture_1(request):
    filename = request.param
    with open(filename) as f:
        f_str = f.read()
    yield f_str


@pytest.mark.parametrize('fixture_1', ['file_one.txt'], indirect=True)
def test_function_1(fixture_1):
    assert fixture_1.startswith("some_test_data") # example test


@pytest.mark.parametrize('fixture_1', ['file_two.txt'], indirect=True)
def test_function_2(fixture_1):
    assert something_for_fun

Тестовый прогон должен дать:

test_module.py::test_function_1[file_one.txt] PASSED
test_module.py::test_function_2[file_two.txt] PASSED

Вы также можете установить значение прибора по умолчанию для имени файла и параметризовать по требованию:

@pytest.fixture
def fixture_1(request):
    filename = getattr(request, 'param', 'file_one.txt')
    with open(filename) as f:
        f_str = f.read()
    yield f_str


def test_function_1(fixture_1):
    assert fixture_1.startswith("some_test_data") # example test


@pytest.mark.parametrize('fixture_1', ['file_two.txt'], indirect=True)
def test_function_2(fixture_1):
    assert fixture_1.startswith('bar')

Теперь test_function_1 остается непараметризованным:

test_module.py::test_function_1 PASSED
test_module.py::test_function_2[file_two.txt] PASSED
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...