Упражнения
В этом упражнении для тестирования функции используется pytest параметризация. Затем вы обновляете тестовый класс для использования светильника setup() вместо метода и teardown() метода. Использование параметризации и работы с светильниками позволяет стать более гибким при создании или обновлении тестов.
Шаг 1. Добавление файла с тестами для этого упражнения
Создайте тестовый файл с именем test_advanced.py и добавьте следующий код:
def str_to_bool(string): if string.lower() in ['yes', 'y', '1']: return True elif string.lower() in ['no', 'n', '0']: return FalseФункция
str_to_bool()принимает строку в качестве входных данных и в зависимости от его содержимогоTrueвозвращает илиFalseзначение.В том же файле добавьте тесты для
str_to_bool()функции. Сначала используйтеpytest.mark.parametrize()для проверки всех истинных значений:import pytest @pytest.mark.parametrize("string", ['Y', 'y', '1', 'YES']) def test_str_to_bool_true(string): assert str_to_bool(string) is TrueЗатем добавьте еще один тест со значениями false:
@pytest.mark.parametrize("string", ['N', 'n', '0', 'NO']) def test_str_to_bool_false(string): assert str_to_bool(string) is FalseТеперь есть два теста, охватывающие все возможные входные данные для значений и
Trueвозвращаемых значенийFalse.
Примечание.
Как правило, тесты не находятся в том же файле, что и фактический код. Для простоты понимания примеры в этом упражнении будут содержать фактический код в одном файле. В реальных проектах Python вы обнаружите, что тесты отделены файлами и каталогами от кода, который тестируется.
Шаг 2. Запустите тесты и ознакомьтесь с отчетом
После добавления тестов необходимо выполнить pytest и проверить выходные данные. Используйте флаг повышенной детализации (-v), чтобы все входные значения рассматривались как отдельный тест.
$ pytest -v test_avanced.py
============================= test session starts ==============================
Python 3.9.6, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /private
collected 8 items
test_advanced.py::test_str_to_bool_true[Y] PASSED [ 12%]
test_advanced.py::test_str_to_bool_true[y] PASSED [ 25%]
test_advanced.py::test_str_to_bool_true[1] PASSED [ 37%]
test_advanced.py::test_str_to_bool_true[YES] PASSED [ 50%]
test_advanced.py::test_str_to_bool_false[N] PASSED [ 62%]
test_advanced.py::test_str_to_bool_false[n] PASSED [ 75%]
test_advanced.py::test_str_to_bool_false[0] PASSED [ 87%]
test_advanced.py::test_str_to_bool_false[NO] PASSED [100%]
============================== 8 passed in 0.01s ===============================
Хотя вы написали только две тестовые функции, pytest удалось создать восемь тестов в общей сложности благодаря parametrize() функции.
Шаг 3. Перенос существующего теста на средство тестирования
Добавьте новый тест на основе класса в файл test_advanced.py . Этот тест должен использовать функцию
setup()иteardown(), которая создает временный файл с текстом. После каждого теста файл удаляется. Он должен выглядеть так:import os class TestFile: def setup(self): with open("/tmp/done", 'w') as _f: _f.write("1") def teardown(self): try: os.remove("/tmp/done") except OSError: pass def test_done_file(self): with open("/tmp/done") as _f: contents = _f.read() assert contents == "1"Этот тестовый класс создает файл, но проблематично, так как путь /tmp/ не гарантируется, что он присутствует в каждой системе.
Создайте средство, использующее
pytesttmpdir()средство для записи в файл и возвращающее путь:import pytest @pytest.fixture def tmpfile(tmpdir): def write(): file = tmpdir.join("done") file.write("1") return file.strpath return writeВ
tmpfile()светильнике используется средство pytesttmpdir(), которое гарантирует действительный временный файл, который очищается после выполнения тестов.TestFileОбновите класс таким образом, чтобы он использовал средство исправления вместо вспомогательных методов:class TestFile: def test_f(self, tmpfile): path = tmpfile() with open(path) as _f: contents = _f.read() assert contents == "1"Этот тестовый класс теперь может убедиться, что временный файл создается и содержит соответствующее содержимое для утверждения.
Проверьте свою работу
Теперь у вас должен быть файл Python с именем test_advanced.py со следующим кодом:
- Функция
str_to_bool()принимает строку и возвращает логическое значение в зависимости от содержимого строки. - Два параметризованных теста для
str_to_bool()функции, один из них проверяетTrueзначения и другой, который проверяетFalseзначения. - Настраиваемое
pytestсредство, использующееtmpdir()средство для создания временного готового файла с некоторым содержимым. - Тестовый класс, использующий пользовательское средство тестирования
tmpfile()для создания файла.
Все тесты должны передаваться при их запуске в терминале без ошибок.