使用 SQL Server 测试 Django 应用

本文介绍如何将 Django 的测试框架配置为使用mssql-django后端处理SQL Server数据库。

Django 测试如何与 SQL Server 配合工作

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

测试设置

设置 Description
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

使用托管标识身份验证 (ActiveDirectoryMsi) 时,需要使用 --keepdb 标志,因为测试运行器无法通过该身份验证方法创建数据库。

测试中的事务隔离

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