SQL Serverを使用して Django アプリをテストする

この記事では、mssql-django バックエンドを使用して SQL Server データベースを操作するように Django のテスト フレームワークを構成する方法について説明します。

SQL Serverでの Django テストのしくみ

python manage.py testを実行すると、Django は個別のテスト データベースを作成し、すべてのテストを実行してから、テスト データベースを破棄します。 テスト データベース名の既定値は、 test_ 後に構成済みのデータベース名が続きます。

テスト データベースの設定を構成する

データベース構成で TEST ディクショナリを使用して、テスト データベースをカスタマイズします。

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

TEST 設定

Setting 説明
NAME テスト データベースの名前。 既定値: "test_" + NAME
COLLATION テスト データベースの照合順序。 既定値: インスタンスの既定の照合順序。
DEPENDENCIES 複数のデータベースを使用する場合の依存関係の作成順序。
MIRROR このテスト データベースがミラー化する必要があるデータベースのエイリアス。

テストの実行

完全なテスト スイートを実行します。

python manage.py test

特定のアプリのテストを実行します。

python manage.py test myapp

特定のテスト クラスまたはメソッドを実行します。

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

テスト データベースを保持する

--keepdbを使用して、テストの実行間にテスト データベースを保持します。 この方法では、データベースの作成と破棄をスキップすることで、繰り返しのテスト実行を高速化します。

python manage.py test --keepdb

Note

テスト ランナーは、その認証方法でデータベースを作成できないため、マネージド ID 認証 (--keepdb) を使用する場合は、ActiveDirectoryMsi フラグが必要です。

テストでのトランザクションの分離

Django の TestCase クラスは、各テストをトランザクションでラップし、テストの完了後にロールバックします。 この動作により、各テストのテーブルを作成および破棄することなく、テストを分離できます。

トランザクションをコミットする必要があるテスト (トランザクション関連の動作をテストする場合など) には、 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

可能な限り TestCase ( TransactionTestCaseではない) を使用してください。 TestCase は、テーブルを切り捨てる代わりにトランザクション ロールバックを使用するため、高速です。

複数のデータベースでテストする

プロジェクトで複数のデータベースを使用する場合は、テストの依存関係を構成します。

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