🔎 Как писать 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()
import pytest
def test_example():
num1 = 2
num2 = 3
result = num1 + num2
assert result == 5
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 для проверки исключений.
Не забывайте запускать тесты и проверять покрытие вашего кода. Это поможет вам обнаружить ошибки и повысить уверенность в качестве вашего программного обеспечения.