Тестирование приложений Django с помощью SQL Server

В этой статье объясняется, как настроить систему тестирования Django для работы с базами данных SQL Server с использованием бэкенда mssql-django.

Как работает тестирование Django с SQL Server

При запуске python manage.py testDjango создает отдельную тестовую базу данных, выполняет все тесты, а затем уничтожает тестовую базу данных. По умолчанию имя тестовой базы данных имеет вид: test_, после которого указывается настроенное вами имя базы данных.

Настройка параметров тестовой базы данных

Настройте тестовую базу данных с помощью словаря TEST в конфигурации базы данных:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<your-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
        "TEST": {
            "NAME": "test_mydb",
            "COLLATION": "SQL_Latin1_General_CP1_CI_AS",
        },
    },
}

Параметры TEST

Setting Описание
NAME Имя тестовой базы данных. По умолчанию: "test_" + NAME.
COLLATION Правила сортировки для тестовой базы данных. По умолчанию: параметры сортировки экземпляра по умолчанию.
DEPENDENCIES Зависимости порядка создания при использовании нескольких баз данных.
MIRROR Псевдоним базы данных, которую должна зеркалировать данная тестовая база данных.

Выполнение тестов

Запустите полный набор тестов:

python manage.py test

Выполните тесты для конкретного приложения:

python manage.py test myapp

Запустите определенный тестовый класс или метод:

python manage.py test myapp.tests.ProductTestCase.test_create_product

Сохранение тестовой базы данных

Используйте --keepdb для сохранения тестовой базы данных между запусками тестов. Этот подход ускоряет повторные запуски тестов путем пропуска создания и уничтожения базы данных:

python manage.py test --keepdb

Note

Флаг --keepdb обязателен при использовании аутентификации с использованием управляемой идентичности (ActiveDirectoryMsi), поскольку средство запуска тестов не может создавать базы данных с помощью этого метода аутентификации.

Изоляция транзакций в тестах

Класс Django TestCase упаковывает каждый тест в транзакцию и откатывает его после завершения теста. Это поведение обеспечивает изоляцию тестов без создания и уничтожения таблиц для каждого теста.

Для тестов, которые необходимо зафиксировать транзакции (например, для тестирования поведения, связанного с транзакциями), используйте TransactionTestCase:

from django.test import TransactionTestCase
from myapp.models import Product

class ProductTransactionTest(TransactionTestCase):
    def test_atomic_operation(self):
        # This test commits to the database
        Product.objects.create(name="Widget", price=9.99)
        self.assertEqual(Product.objects.count(), 1)

Tip

Используйте TestCase (не TransactionTestCase) по возможности. TestCase быстрее, так как он использует откат транзакций вместо усечения таблиц.

Тестирование с несколькими базами данных

Если проект использует несколько баз данных, настройте тестовые зависимости:

DATABASES = {
    "default": {
        "ENGINE": "mssql",
        "NAME": "<primary-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
        "TEST": {
            "NAME": "test_primary",
        },
    },
    "reporting": {
        "ENGINE": "mssql",
        "NAME": "<reporting-database>",
        "USER": "<your-username>",
        "PASSWORD": "<your-password>",
        "HOST": "<your-server>",
        "PORT": "1433",
        "OPTIONS": {
            "driver": "ODBC Driver 18 for SQL Server",
        },
        "TEST": {
            "NAME": "test_reporting",
            "DEPENDENCIES": ["default"],
        },
    },
}