この記事では、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"],
},
},
}