Допустим, у меня есть функция, которая принимает строку и возвращает первые 5 символов:
def crop_string(x):
return x[0:5]
Например:
>>> print(crop_string("hello world"))
hello
Теперь скажем, я хочу протестировать эту функцию . Содержимое тестового модуля может быть следующим:
baseline = "hello"
longer = "hello world"
even_longer = "hello world!"
@pytest.mark.parametrize(
"input_string, expected_result",
[
(baseline, baseline),
(longer, baseline),
(even_longer, baseline),
],
)
def test_crop_string(input_string, expected_result):
assert crop_string(input_string) == expected_result
Что будет нормально работать.
Теперь предположим, что это будет частью большего тестового модуля с большим количеством функций. Похоже, что размещение этих тестов внутри класса может иметь следующие преимущества:
class TestCropString:
baseline = "hello"
longer = "hello world"
even_longer = "hello world!"
@pytest.mark.parametrize(
"input_string, expected_result",
[
(baseline, baseline),
(longer, baseline),
(even_longer, baseline),
],
)
def test_crop_string(input_string, expected_result):
assert crop_string(input_string) == expected_result
Это дает мне ошибку: In test_crop_string: function uses no argument 'input_string'
.
Итак, у меня 2 вопросы:
- Каков «хороший» способ «передать» параметры теста (
baseline
, longer
, even_longer
) для запуска тестов. - Будет ли какая-то польза от определения этих тестовых параметров внутри прибора, например, следующим образом?
@pytest.fixture
def setup_test_data():
baseline = "hello"
longer = "hello world"
even_longer = "hello world!"
return baseline, longer, even_longer
(Это был немного глупый пример, но, надеюсь, его достаточно, чтобы объяснить мои вопрос).
Спасибо!