本文介绍如何将 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"],
},
},
}