Упражнения

Завершённый

В этом упражнении для тестирования функции используется pytest параметризация. Затем вы обновляете тестовый класс для использования светильника setup() вместо метода и teardown() метода. Использование параметризации и работы с светильниками позволяет стать более гибким при создании или обновлении тестов.

Шаг 1. Добавление файла с тестами для этого упражнения

  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 значение.

  2. В том же файле добавьте тесты для 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
    
  3. Затем добавьте еще один тест со значениями 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. Перенос существующего теста на средство тестирования

  1. Добавьте новый тест на основе класса в файл 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/ не гарантируется, что он присутствует в каждой системе.

  2. Создайте средство, использующее pytesttmpdir() средство для записи в файл и возвращающее путь:

    import pytest
    
    @pytest.fixture
    def tmpfile(tmpdir):
        def write():
            file = tmpdir.join("done")
            file.write("1")
            return file.strpath
        return write
    

    В tmpfile() светильнике используется средство pytest tmpdir() , которое гарантирует действительный временный файл, который очищается после выполнения тестов.

  3. 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() для создания файла.

Все тесты должны передаваться при их запуске в терминале без ошибок.