как избежать котельной плиты с простым креплением в pytest

#python #pytest #fixtures

Вопрос:

У меня есть следующий код в моем test_myfunc.py

 @pytest.fixture
def dummy_string_EN():
    return 'This is an English string.'

@pytest.fixture
def dummy_string_DE():
    return 'Das hier ist Deutsch.'

@pytest.fixture
def dummy_string_FR():
    return 'la maison blanche est tombée'
 

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

 def test_load_language_models(dummy_string_EN):
    tee = myfunc(dummy_string_EN)
    assert tee.language == 'EN'

def test_load_language_models(dummy_string_DE):
    tee = myfunc(dummy_string_DE)
    assert tee.language == 'DE'

def test_other_method(dummy_string_DE):
    tee = myfunc_2(dummy_string_DE)
    Assert tee.attribute3 == 'whatever
 

У меня есть около 6 строковых переменных на 4 разных языках, которые довольно длинные.
Мне кажется, что я что-то упускаю, так как не может быть, чтобы я мог создать приспособление только каким-либо другим способом, кроме как вернуть его из функции.

Есть ли какое-либо другое решение, чтобы избежать всей этой котельной плиты? т. Е. написать декоратор, а затем определить метод для возврата переменной?

Спасибо.

Ps: позже Отредактируем. Чтобы быть ясным, я просто ищу способ использовать переменные (строки или списки) в сотнях тестов различных методов. Каждый метод дает другой результат с одним и тем же строковым вводом. Таким образом, парного подхода не существует.

Ответ №1:

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

 # [per language fixture definition]

@pytest.fixtue
def all_texts(dummy_string_EN, dummy_string_DE, ...):
    strings = {
       "EN": dummy_string_EN,
       "DE": dummy_string_DE,
        ...
    }


@pytest.mark.parametrize("ln_code", ["EN", "DE", ...])
def test_load_language_models(strings, ln_code):
    tee = myfunc(strings[ln_code])
    assert tee.language == ln_code
 

Комментарии:

1. Я добавил комментарий to.my вопрос, потому что, даже если этот ответ верен, но не решает на 100% мою проблему.