Какие основные типы тестов применяются в Python?

Ответ

В Python тестирование реализуется с помощью стандартного модуля unittest или сторонних библиотек, таких как pytest. Основные виды тестов включают:

  1. Unit-тесты — тестируют отдельные функции или методы в изоляции, проверяя их корректность и предсказуемость поведения.

    import unittest
    
    def add(a, b):
        return a + b
    
    class TestAdd(unittest.TestCase):
        def test_add_positive_numbers(self):
            self.assertEqual(add(2, 3), 5)
    
        def test_add_negative_numbers(self):
            self.assertEqual(add(-1, -1), -2)
  2. Интеграционные тесты — проверяют взаимодействие нескольких компонентов системы (например, функции с базой данных или API), убеждаясь, что они работают вместе как ожидается.

    # Пример с использованием фикстуры pytest для подключения к БД
    def create_user(db_connection, username):
        # Логика создания пользователя в БД
        db_connection.execute(f"INSERT INTO users (username) VALUES ('{username}')")
        return {'username': username}
    
    def test_user_creation(db_connection_fixture):
        user_data = create_user(db_connection_fixture, "test_user")
        assert user_data['username'] == "test_user"
        # Дополнительная проверка, что пользователь действительно в БД
  3. Mock-тесты — заменяют внешние зависимости (например, базы данных, сторонние API-сервисы, файловую систему) на заглушки (mocks) или шпионы (spies), позволяя изолировать тестируемый компонент и контролировать его окружение.

    from unittest.mock import Mock
    
    def process_api_response(response_data):
        # Предположим, эта функция обрабатывает ответ от внешнего API
        return response_data.get("status")
    
    def test_api_call_processing():
        mock_api_response = Mock(return_value={"status": "ok", "data": []})
        result = process_api_response(mock_api_response())
        assert result == "ok"
        mock_api_response.assert_called_once() # Проверяем, что заглушка была вызвана
  4. Parametrized тесты — позволяют запускать один и тот же тест с различными наборами входных данных, что упрощает тестирование функции с множеством сценариев без дублирования кода.

    import pytest
    
    def multiply(a, b):
        return a * b
    
    @pytest.mark.parametrize("a, b, expected", [
        (1, 2, 2),
        (0, 5, 0),
        (-1, 3, -3),
        (10, 0.5, 5.0)
    ])
    def test_multiply(a, b, expected):
        assert multiply(a, b) == expected

Помимо перечисленных, в Python также активно используются тесты с фикстурами (для подготовки тестового окружения), асинхронные тесты (для асинхронного кода) и тесты для специфичных фреймворков (например, Django, Flask). pytest часто выбирают за его лаконичность, мощные фичи и расширяемость.