## Основы юнит-тестирования
Юнит-тестирование — это метод проверки отдельных модулей (юнитов) кода на правильность их работы. В Python для юнит-тестирования часто используется модуль
unittest
, который является частью стандартной библиотеки.
### Основные компоненты
1.
Тестовый случай (Test Case) — это класс, который наследует от
unittest.TestCase
. Он содержит методы, тестирующие отдельные функции или методы.
2.
Тестовый набор (Test Suite) — это набор тестов, который может содержать тестовые случаи и другие тестовые наборы.
3.
Тестовый запуск (Test Runner) — это компонент, который запускает тесты и показывает результаты.
### Основные методы
unittest.TestCase
-
assertEqual(a, b)
— проверяет, что
a
равно
b
.
-
assertNotEqual(a, b)
— проверяет, что
a
не равно
b
.
-
assertTrue(x)
— проверяет, что
x
истинно.
-
assertFalse(x)
— проверяет, что
x
ложно.
-
assertIsNone(x)
— проверяет, что
x
равно
None
.
-
assertIsNotNone(x)
— проверяет, что
x
не равно
None
.
### Пример использования
unittest
import unittest
def add(a, b):
return a + b
class TestMathFunctions(unittest.TestCase):
def test_add(self):
self.assertEqual(add(1, 2), 3)
self.assertEqual(add(-1, 1), 0)
self.assertEqual(add(0, 0), 0)
def test_add_negative(self):
self.assertEqual(add(-1, -1), -2)
if __name__ == '__main__':
unittest.main()
### Запуск тестов
Сохраните тесты в файл, например,
test_math.py
, и запустите его с помощью команды:
python -m unittest test_math.py
## Использование
setUp
и
tearDown
Методы
setUp
и
tearDown
позволяют подготавливать тестовую среду перед каждым тестом и очищать её после теста.
class TestMathFunctions(unittest.TestCase):
def setUp(self):
self.a = 10
self.b = 5
def tearDown(self):
pass # Здесь можно выполнить очистку, если это необходимо
def test_add(self):
self.assertEqual(add(self.a, self.b), 15)
def test_subtract(self):
self.assertEqual(self.a - self.b, 5)
## Параметризованные тесты с
unittest
Для тестирования с несколькими наборами данных можно использовать
subTest
.
class TestMathFunctions(unittest.TestCase):
def test_add(self):
test_cases = [
(1, 2, 3),
(-1, 1, 0),
(0, 0, 0),
(-1, -1, -2)
]
for a, b, expected in test_cases:
with self.subTest(a=a, b=b):
self.assertEqual(add(a, b), expected)
## Использование библиотеки
pytest
pytest
— это более мощная и гибкая библиотека для тестирования в Python, которая поддерживает простую синтаксис и множество плагинов.
### Установка
pytest
pip install pytest
### Пример теста с
pytest
def add(a, b):
return a + b
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
assert add(0, 0) == 0
assert add(-1, -1) == -2
### Запуск тестов с
pytest
Запустите тесты, просто выполнив команду:
pytest
## Заключение
Юнит-тестирование — это важная часть разработки программного обеспечения, которая помогает находить и исправлять ошибки на ранних этапах. Используйте
unittest
для стандартного тестирования и
pytest
для более сложных сценариев. Не забывайте о хорошей практике написания тестов — они должны быть изолированными, понятными и быстро выполняемыми.
### Полезные ссылки
- [Документация по unittest](https://docs.python.org/3/library/unittest.html)