Unittest
unittest
- это стандартная библиотека Python для написания и выполнения тестов. Она предоставляет структуру для организации тестов, проверок и подготовки данных.Основные концепции
-
TestCase: Основной строительный блок для написания тестов. Классы тестов наследуются от
unittest.TestCase
. -
setUp и tearDown: Методы, которые выполняются перед и после каждого теста соответственно, используются для подготовки данных и их очистки.
-
assertions: Методы для проверки условий и результатов.
import unittest
# Класс с функцией, которую мы будем тестировать
def add(x, y):
return x + y
class MyTestCase(unittest.TestCase):
def setUp(self):
# Инициализация перед каждым тестом
self.value = 42
def tearDown(self):
# Очистка после каждого теста
del self.value
def test_example(self):
# Простой тест, проверяющий значение
self.assertEqual(self.value, 42)
def test_addition(self):
result = add(1, 2)
self.assertEqual(result, 3)
def test_subtraction(self):
result = 2 - 1
self.assertEqual(result, 1)
def test_assertions(self):
self.assertEqual(self.value, 42)
self.assertTrue(isinstance(self.value, int))
self.assertFalse(self.value == 0)
self.assertIn(42, [42, 43, 44])
def test_exceptions(self):
with self.assertRaises(ZeroDivisionError):
1 / 0
if __name__ == '__main__':
unittest.main()
-
Импортируем библиотеку
unittest
. -
Определяем класс
MyTestCase
, наследуемый отunittest.TestCase
. -
Используем
setUp
иtearDown
для инициализации и очистки данных. -
Пишем тесты, используя методы, начинающиеся с
test_
. -
Проверяем результаты с помощью различных методов утверждений (
assertEqual
,assertTrue
,assertFalse
,assertIn
,assertRaises
).
Pytest
pytest
- это мощный и удобный фреймворк для тестирования Python, который часто используется вместо unittest
благодаря своей простоте и расширяемости.# Функция, которую мы будем тестировать
def add(x, y):
return x + y
# Тесты с использованием pytest
def test_add_positive_numbers():
assert add(1, 2) == 3
def test_add_negative_numbers():
assert add(-1, -1) == -2
def test_add_mixed_numbers():
assert add(1, -1) == 0
Фикстуры (fixtures)
Фикстуры позволяют подготовить данные или состояние перед тестами и очистить их после тестов.
import pytest
@pytest.fixture
def setup_data():
# Подготовка данных
data = {"key": "value"}
yield data
# Очистка ресурсов
data.clear()
def test_example(setup_data):
assert setup_data["key"] == "value"
Утверждения
pytest
предоставляет широкий набор встроенных утверждений.def test_assertions():
assert 1 == 1
assert "pytest" in "pytest is awesome"
assert [1, 2, 3] == [1, 2, 3]
assert {"key": "value"} == {"key": "value"}
Маркировка тестов
С помощью маркировки можно группировать и фильтровать тесты.
import pytest
@pytest.mark.slow
def test_slow():
import time
time.sleep(5)
assert True
@pytest.mark.fast
def test_fast():
assert True
# Запуск только быстрых тестов
# pytest -m fast
Плагины
pytest
поддерживает множество плагинов для расширения функциональности.# Установка плагина для покрытия тестами
pip install pytest-cov
# Запуск тестов с измерением покрытия
pytest --cov=my_module tests/
Сравнение unittest и pytest
Преимущества
unittest
-
Встроенная библиотека, не требует установки.
-
Хорошо документирован.
-
Поддерживает сложные структуры тестов и наборы тестов.
Преимущества
pytest
-
Простота и лаконичность синтаксиса.
-
Мощная система фикстур для подготовки данных.
-
Широкий набор плагинов для расширения функциональности.
-
Поддержка удобных утверждений и маркировки тестов.
Недостатки
-
unittest
может быть более громоздким и требует больше кода для написания тестов. -
pytest
требует установки дополнительных библиотек и может потребовать изучения дополнительных возможностей и плагинов.
Выбор фреймворка
Выбор между
unittest
и pytest
зависит от ваших предпочтений и требований проекта. Если важна встроенность и поддержка в стандартной библиотеке, выбирайте unittest
. Если нужна простота и расширяемость, лучше использовать pytest
.Пример тестирования с
unittest
import unittest
def add(x, y):
return x + y
class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(1, 2), 3)
def test_add_negative_numbers(self):
self.assertEqual(add(-1, -1), -2)
def test_add_mixed_numbers(self):
self.assertEqual(add(1, -1), 0)
if __name__ == '__main__':
unittest.main()
Пример тестирования с
pytest
def add(x, y):
return x + y
def test_add_positive_numbers():
assert add(1, 2) == 3
def test_add_negative_numbers():
assert add(-1, -1) == -2
def test_add_mixed_numbers():
assert add(1, -1) == 0