Testar aplicativos Django com SQL Server

Este artigo explica como configurar a estrutura de teste do Django para trabalhar com bancos de dados SQL Server usando o mssql-django back-end.

Como o teste do Django funciona com SQL Server

Quando você executa python manage.py test, o Django cria um banco de dados de teste separado, executa todos os testes e destrói o banco de dados de teste. O nome do banco de dados de teste tem como padrão test_ seguido pelo nome do banco de dados configurado por você.

Definir configurações de banco de dados de teste

Personalize o banco de dados de teste usando o TEST dicionário na configuração do banco 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",
        },
    },
}

Configurações de TESTE

Setting Descrição
NAME Nome do banco de dados de teste. Padrão: "test_" + NAME.
COLLATION Ordenação para o banco de dados de teste. Padrão: ordenação padrão da instância.
DEPENDENCIES Dependências de ordem de criação ao usar vários bancos de dados.
MIRROR Alias de um banco de dados que esse banco de dados de teste deve espelhar.

Executar testes

Execute o conjunto de testes completo:

python manage.py test

Execute testes para um aplicativo específico:

python manage.py test myapp

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

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

Manter o banco de dados de teste

Use --keepdb para preservar o banco de dados de teste entre execuções de teste. Essa abordagem acelera as execuções de teste repetidas ignorando a criação e a destruição do banco de dados:

python manage.py test --keepdb

Note

O --keepdb sinalizador é necessário ao usar a autenticação de identidade gerenciada (ActiveDirectoryMsi), pois o executor de teste não pode criar bancos de dados com esse método de autenticação.

Isolamento de transação em testes

A classe TestCase do Django envolve cada teste em uma transação e a reverte após sua conclusão. Esse comportamento fornece isolamento de teste sem criar e destruir tabelas para cada teste.

Para testes que precisam confirmar transações (por exemplo, para testar o comportamento relacionado à transação), use 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

Use TestCase (não TransactionTestCase) sempre que possível. TestCase é mais rápido porque usa a reversão de transação em vez de truncar tabelas.

Testar com vários bancos de dados

Se o projeto usar vários bancos de dados, configure as 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"],
        },
    },
}