Django-apps testen met SQL Server

In dit artikel wordt uitgelegd hoe u het testframework van Django configureert om met SQL Server databases te werken met behulp van de mssql-django back-end.

Hoe Django-tests werken met SQL Server

Wanneer u uitvoert python manage.py test, maakt Django een afzonderlijke testdatabase, voert u alle tests uit en vernietigt u vervolgens de testdatabase. De naam van de testdatabase wordt test_ standaard gevolgd door de geconfigureerde databasenaam.

Testdatabase-instellingen configureren

Pas de testdatabase aan met behulp van de TEST woordenlijst in uw databaseconfiguratie:

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

TESTinstellingen

Instelling Description
NAME Naam van de testdatabase. Standaard: "test_" + NAME.
COLLATION Sortering voor de testdatabase. Standaard: standaardsortering van instantie.
DEPENDENCIES Afhankelijkheden voor het maken van volgorde bij het gebruik van meerdere databases.
MIRROR Alias van een database waarvan deze testdatabase een afspiegeling moet zijn.

Tests uitvoeren

Voer de volledige testsuite uit:

python manage.py test

Tests uitvoeren voor een specifieke app:

python manage.py test myapp

Voer een specifieke testklasse of -methode uit:

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

De testdatabase behouden

Gebruik --keepdb deze functie om de testdatabase tussen testuitvoeringen te behouden. Deze aanpak versnelt herhaalde testuitvoeringen door het maken en vernietigen van databases over te slaan:

python manage.py test --keepdb

Note

De --keepdb vlag is vereist bij het gebruik van beheerde identiteitsverificatie (ActiveDirectoryMsi), omdat de testrunner geen databases kan maken met die verificatiemethode.

Transactieisolatie in tests

Django's TestCase klasse verpakt elke test in een transactie en rolt deze terug nadat de test is voltooid. Dit gedrag biedt testisolatie zonder tabellen te maken en te vernietigen voor elke test.

Gebruik voor tests die transacties moeten doorvoeren (bijvoorbeeld om transactiegerelateerd gedrag te testen):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

Gebruik TestCase (niet TransactionTestCase) indien mogelijk. TestCase is sneller omdat er gebruik wordt gemaakt van het terugdraaien van transacties in plaats van afkappen van tabellen.

Testen met meerdere databases

Als uw project meerdere databases gebruikt, configureert u testafhankelijkheden:

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