Testování aplikací Django pomocí SQL Server

Tento článek vysvětluje, jak nakonfigurovat testovací architekturu Django pro práci s SQL Server databázemi pomocí back-endumssql-django.

Jak funguje testování Django s SQL Server

Když spustíte python manage.py test, Django vytvoří samostatnou testovací databázi, spustí všechny testy a pak zničí testovací databázi. Výchozí název testovací databáze následuje test_ za vaším nakonfigurovaným názvem databáze.

Konfigurace nastavení testovací databáze

Přizpůsobte testovací databázi pomocí slovníku TEST v konfiguraci databáze:

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

Nastavení TESTU

Setting Description
NAME Název testovací databáze. Výchozí hodnota: "test_" + NAME.
COLLATION Řazení pro testovací databázi. Výchozí nastavení: výchozí kolace instance.
DEPENDENCIES Závislosti pořadí vytváření při použití více databází
MIRROR Alias databáze, kterou by tato testovací databáze měla zrcadlit.

Spouštění testů

Spusťte úplnou testovací sadu:

python manage.py test

Spusťte testy pro konkrétní aplikaci:

python manage.py test myapp

Spusťte konkrétní testovací třídu nebo metodu:

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

Zachování testovací databáze

Slouží --keepdb k zachování testovací databáze mezi testovacími běhy. Tento přístup urychlí opakované testovací běhy vynecháním vytváření a zničení databáze:

python manage.py test --keepdb

Note

Příznak --keepdb se vyžaduje při použití ověřování spravované identity (ActiveDirectoryMsi), protože spouštěč testů nemůže pomocí této metody ověřování vytvářet databáze.

Izolace transakcí v testech

Třída Django TestCase zabalí každý test do transakce a vrátí ho zpět po dokončení testu. Toto chování poskytuje izolaci testů bez vytvoření a zničení tabulek pro každý test.

Pro testy, které potřebují potvrdit transakce (například k otestování chování související s transakcemi), použijte 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

Používejte TestCase (ne TransactionTestCase) kdykoli je to možné. TestCase je rychlejší, protože místo zkrácení tabulek používá vrácení transakcí zpět.

Testování s více databázemi

Pokud váš projekt používá více databází, nakonfigurujte testovací závislosti:

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