Teste aplicações Django com SQL Server

Este artigo explica como configurar o framework de testes do Django para funcionar com bases de dados SQL Server usando o mssql-django backend.

Como funciona o teste do Django com o SQL Server

Quando executas python manage.py test, o Django cria uma base de dados de testes separada, executa todos os testes e depois destrói a base de dados de testes. O nome da base de dados de teste tem por predefinição test_ seguido do nome da base de dados configurada.

Configurar as definições da base de dados de teste

Personalize a base de dados de teste usando o TEST dicionário na configuração da sua base de dados:

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",
        },
    },
}

Definições de TEST

Setting Description
NAME Nome da base de dados do teste. Padrão: "test_" + NAME.
COLLATION Compilação para a base de dados de testes. Predefinição: ordenação predefinida da instância.
DEPENDENCIES Dependências da ordem de criação ao utilizar múltiplas bases de dados.
MIRROR O alias da base de dados que esta base de dados de teste deve replicar.

Executar testes

Executa o conjunto completo de testes:

python manage.py test

Faz testes para uma aplicação específica:

python manage.py test myapp

Executa uma classe ou método de teste específico:

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

Mantém a base de dados de testes

Use --keepdb para preservar a base de dados de testes entre execuções de teste. Esta abordagem acelera os testes repetidos ao saltar a criação e destruição de bases de dados:

python manage.py test --keepdb

Note

A --keepdb flag é necessária ao usar autenticação de identidade gerida (ActiveDirectoryMsi), porque o executor de testes não pode criar bases de dados com esse método de autenticação.

Isolamento de transações em testes

A classe TestCase do Django envolve cada teste numa transação e anula-a após a conclusão do teste. Este comportamento proporciona isolamento no teste sem criar ou destruir tabelas para cada teste.

Para testes que precisam de comprometer transações (por exemplo, para testar comportamentos relacionados com transações), utilize 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)

Sugestão

Use TestCase (não TransactionTestCase) sempre que possível. TestCase é mais rápido porque utiliza rollback de transações em vez de truncar tabelas.

Teste com múltiplas bases de dados

Se o seu projeto utiliza múltiplas bases de dados, configure dependências de teste:

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"],
        },
    },
}