Как написать unit-тест для функции в Python?

«Как написать unit-тест для функции в Python?» — вопрос из категории Тестирование, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Unit-тест проверяет корректность работы небольшого, изолированного фрагмента кода, как правило, одной функции или метода. В Python для этого чаще всего используют фреймворки pytest или unittest.

Классическая структура теста следует паттерну Arrange-Act-Assert (AAA):

  • Arrange (Подготовка): Инициализация переменных и настройка окружения.
  • Act (Действие): Вызов тестируемой функции с подготовленными данными.
  • Assert (Проверка): Сравнение полученного результата с ожидаемым.

Пример с pytest (рекомендуется)

pytest более лаконичен и использует стандартный оператор assert.

# my_module.py
def add(a, b):
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise TypeError("Оба аргумента должны быть числами")
    return a + b

# test_my_module.py
import pytest
from my_module import add

# Тест на корректное сложение
def test_add_positive_numbers():
    # Arrange (Подготовка)
    num1 = 10
    num2 = 5

    # Act (Действие)
    result = add(num1, num2)

    # Assert (Проверка)
    assert result == 15

# Тест на обработку исключений
def test_add_with_invalid_types():
    with pytest.raises(TypeError):
        add("a", 2)

Пример с unittest

unittest — встроенный в Python модуль, требующий создания классов для тестов.

# test_my_module_unittest.py
import unittest
from my_module import add

class TestAddFunction(unittest.TestCase):

    def test_add_positive_numbers(self):
        # AAA в одном выражении
        self.assertEqual(add(10, 5), 15)

    def test_add_with_invalid_types(self):
        with self.assertRaises(TypeError):
            add("a", 2)

Запуск тестов:

  • Для pytest: pytest
  • Для unittest: python -m unittest discover