Testen von Django-Apps mit SQL Server

In diesem Artikel wird erläutert, wie Sie djangos Testframework für die Arbeit mit SQL Server Datenbanken mithilfe des mssql-django Back-End konfigurieren.

Wie Django-Tests mit SQL Server funktionieren

Wenn Sie ausführen python manage.py test, erstellt Django eine separate Testdatenbank, führt alle Tests aus und zerstört dann die Testdatenbank. Der Testdatenbankname ist standardmäßig test_, gefolgt von Ihrem konfigurierten Datenbanknamen.

Konfigurieren von Testdatenbankeinstellungen

Passen Sie die Testdatenbank mithilfe des TEST Wörterbuchs in Ihrer Datenbankkonfiguration an:

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

TESTeinstellungen

Setting Beschreibung
NAME Name der Testdatenbank. Standardwert: "test_" + NAME.
COLLATION Sortierung für die Testdatenbank. Standard: Standardkollation der Instanz.
DEPENDENCIES Erstellungsreihenfolgenabhängigkeiten bei Verwendung mehrerer Datenbanken.
MIRROR Alias der Datenbank, deren Spiegel diese Testdatenbank sein soll.

Tests ausführen

Führen Sie die vollständige Testsuite aus:

python manage.py test

Führen Sie Tests für eine bestimmte App aus:

python manage.py test myapp

Führen Sie eine bestimmte Testklasse oder -methode aus:

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

Beibehalten der Testdatenbank

Verwenden Sie --keepdb, um die Testdatenbank zwischen den Testläufen zu erhalten. Dieser Ansatz beschleunigt wiederholte Testläufe, indem die Datenbankerstellung und -zerstörung übersprungen wird:

python manage.py test --keepdb

Note

Das --keepdb Flag ist bei Verwendung der verwalteten Identitätsauthentifizierung erforderlich (ActiveDirectoryMsi), da der Testläufer keine Datenbanken mit dieser Authentifizierungsmethode erstellen kann.

Transaktionsisolation in Tests

Djangos TestCase-Klasse führt jeden Test innerhalb einer Transaktion aus und macht sie nach Abschluss des Tests rückgängig. Dieses Verhalten bietet Testisolation, ohne Tabellen für jeden Test zu erstellen und zu zerstören.

Verwenden Sie TransactionTestCasefür Tests, die Transaktionen ausführen müssen (z. B. um transaktionsbezogenes Verhalten zu testen):

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

Verwenden Sie TestCase (nicht TransactionTestCase) wann immer möglich. TestCase ist schneller, weil es ein Transaktions-Rollback verwendet, anstatt Tabellen zu leeren.

Testen mit mehreren Datenbanken

Wenn Ihr Projekt mehrere Datenbanken verwendet, konfigurieren Sie Testabhängigkeiten:

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