🔎 Как писать unit test python | Полезные советы и техники для написания модульных тестов на Python

В Python есть несколько популярных фреймворков для написания юнит-тестов:

  • unittest: Встроенный модуль для написания юнит-тестов в Python. Он предоставляет классы и методы для создания и запуска тестовых случаев.
  • import unittest
    
    class MyTest(unittest.TestCase):
        def test_example(self):
            num1 = 2
            num2 = 3
            result = num1 + num2
            self.assertEqual(result, 5)
    
    if __name__ == '__main__':
        unittest.main()
  • pytest: Фреймворк для написания юнит-тестов, который предлагает более простой синтаксис и богатый набор возможностей. Он автоматически обнаруживает и запускает ваши тесты.
  • import pytest
    
    def test_example():
        num1 = 2
        num2 = 3
        result = num1 + num2
        assert result == 5
  • doctest: Модуль, который позволяет вам писать тесты в виде документации. Тесты выполняются напрямую из документации вашей функции или класса.
  • def add(num1, num2):
        """
        Функция, складывающая два числа.
        
        >>> add(2, 3)
        5
        """
        return num1 + num2
    
    if __name__ == '__main__':
        import doctest
        doctest.testmod()

Детальный ответ

Как писать unit test в Python

Unit test (юнит-тестирование) – это процесс проверки функций или компонент программного обеспечения с целью убедиться, что они работают корректно и соответствуют заданным требованиям. Юнит-тесты помогают выявить ошибки и обеспечивают стабильность и надежность вашего кода.

1. Использование модуля unittest

В Python для написания юнит-тестов обычно используется стандартный модуль unittest. Он предоставляет мощный и удобный инструментарий для создания и запуска тестовых сценариев.


import unittest

class MyTestCase(unittest.TestCase):
    def test_addition(self):
        result = 2 + 2
        self.assertEqual(result, 4)

if __name__ == '__main__':
    unittest.main()
    

В этом примере мы создаем класс MyTestCase, унаследованный от unittest.TestCase. Затем мы определяем метод test_addition, в котором выполняем сложение чисел и сравниваем результат с ожидаемым значением, используя метод assertEqual.

В конце файла мы вызываем функцию unittest.main(), которая запускает все определенные тесты в классе.

2. Написание тестовых методов

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


class MyTestCase(unittest.TestCase):
    def test_addition(self):
        result = 2 + 2
        self.assertEqual(result, 4)
    
    def test_multiplication(self):
        result = 2 * 3
        self.assertEqual(result, 6)
    
    def test_division(self):
        result = 10 / 2
        self.assertEqual(result, 5)
    

В этом примере мы добавили два дополнительных тестовых метода test_multiplication и test_division, каждый из которых проверяет соответствующую операцию.

3. Запуск тестов

Для запуска тестовых сценариев можно использовать команду python -m unittest в командной строке, указав путь к файлу с тестами:


python -m unittest test_example.py
    

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

4. Проверка исключений

Модуль unittest также предоставляет методы для проверки исключений. Если ваш код должен вызвать исключение в определенных ситуациях, вы можете использовать методы assertRaises и assertRaisesRegex.


class MyTestCase(unittest.TestCase):
    def test_division_by_zero(self):
        with self.assertRaises(ZeroDivisionError):
            result = 10 / 0
    
    def test_value_error(self):
        with self.assertRaisesRegex(ValueError, 'invalid literal for int()'):
            result = int('abc')
    

В этом примере мы проверяем, что деление на ноль вызывает исключение ZeroDivisionError, и что попытка преобразования строки в целое число вызывает исключение ValueError с определенным сообщением об ошибке.

5. Использование setUp и tearDown

Методы setUp и tearDown позволяют вам задать начальное состояние и выполнить завершающие действия для каждого тестового метода.


class MyTestCase(unittest.TestCase):
    def setUp(self):
        # Выполняется перед каждым тестом
        self.data = [1, 2, 3]
    
    def tearDown(self):
        # Выполняется после каждого теста
        self.data = None
    
    def test_length(self):
        self.assertEqual(len(self.data), 3)
    
    def test_contents(self):
        self.assertIn(2, self.data)
    

В этом примере метод setUp инициализирует список data, а метод tearDown удаляет его после каждого тестового метода. Таким образом, каждый тест будет выполняться в изолированном окружении.

6. Покрытие кода тестами

Если вы хотите измерять покрытие вашего кода тестами, можно использовать инструменты, такие как coverage.py. Они позволяют узнать, какой процент кода был протестирован.

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

Заключение

Написание юнит-тестов в Python является важной практикой для создания надежного и качественного кода. Модуль unittest предоставляет все необходимые инструменты для создания и запуска тестовых сценариев.

При написании тестовых методов помните о том, что они должны проверять конкретные аспекты вашего кода. Используйте методы assert для сравнения значений и assertRaises для проверки исключений.

Не забывайте запускать тесты и проверять покрытие вашего кода. Это поможет вам обнаружить ошибки и повысить уверенность в качестве вашего программного обеспечения.

Видео по теме

Unit тесты в Python. Тестирование кода | Базовый курс. Программирование на Python

Юнит-тестирование. Использование unittest и coverage в PyCharm

Python Unit Tests: Введение в Тестирование

Похожие статьи:

Как установить модули Python вручную: лучшие практики и советы

🔥 Как запустить скрипт на Python на Windows: пошаговая инструкция

Как понять логику программирования Python: 5 шагов и ️практика для начинающих программистов

🔎 Как писать unit test python | Полезные советы и техники для написания модульных тестов на Python

🕹️ Как написать тетрис на питоне: подробное руководство для начинающих

🔌 Как соединить клиент и сервер python: просто и быстро!

🔢 Как заполнить массив числами с клавиатуры в Python 🖥️