11.5. Тестирование с помощью модулей unittest и pytest.

Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Самоучитель Python 3, собранный из материалов данного сайта. Предназначен в основном для тех, кто хочет изучить язык программирования Python с нуля.

Unittest
unittest - это стандартная библиотека Python для написания и выполнения тестов. Она предоставляет структуру для организации тестов, проверок и подготовки данных.
 
Основные концепции
  1. TestCase: Основной строительный блок для написания тестов. Классы тестов наследуются от unittest.TestCase.
  2. setUp и tearDown: Методы, которые выполняются перед и после каждого теста соответственно, используются для подготовки данных и их очистки.
  3. 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()
  1. Импортируем библиотеку unittest.
  2. Определяем класс MyTestCase, наследуемый от unittest.TestCase.
  3. Используем setUp и tearDown для инициализации и очистки данных.
  4. Пишем тесты, используя методы, начинающиеся с test_.
  5. Проверяем результаты с помощью различных методов утверждений (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

категории

ТЕОРИЯ

  • Введение в Python
  • Основы программирования на Python
  • Управляющие конструкции
  • Структуры данных
  • Функции и модули
  • Обработка исключений
  • Работа с файлами и потоками
  • файловая система
  • Объектно-ориентированное программирование (ООП)
  • Регулярные выражения
  • Дополнительные темы

Мы в соцсетях