如何测试 django 数据库模式?

Posted

技术标签:

【中文标题】如何测试 django 数据库模式?【英文标题】:How do I test a django database schema? 【发布时间】:2010-09-13 10:09:08 【问题描述】:

我想编写可以显示数据库是否与我的 models.py 文件同步的测试。其实我已经写好了,只是发现django每次基于models.py文件运行测试时都会创建一个新的数据库。 有什么方法可以让 models.py 测试 使用现有的数据库架构? mysql/postgresql 中的那个,而不是 /myapp/models.py 中的那个?

我不关心数据库中的数据,我只关心它的 schema 即我希望我的测试能够注意到数据库中的表的字段是否少于我的模式模型.py 文件。

如果这有任何相关性,我正在使用 unittest 框架(实际上是它的 django 扩展)。

谢谢

【问题讨论】:

【参考方案1】:

我们所做的是覆盖默认的 test_runner,这样它就不会创建新的数据库来进行测试。这样,它就可以针对我们当前本地数据库的外观运行测试。但是,如果您使用此方法,请务必小心,因为您在测试中对数据所做的任何更改都将是永久性的。我确保我们所有的测试都将所有更改恢复到其原始状态,并将我们数据库的原始版本保存在服务器上并进行备份。

为此,您需要将 run_test 方法从 django.test.simple 复制到项目中的某个位置——我将我的方法放在 myproject/test/test_runner.py 中

然后对该方法进行以下更改:

// change
old_name = settings.DATABASE_NAME
from django.db import connection
connection.creation.create_test_db(verbosity, autoclobber=not interactive)
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)
connection.creation.destroy_test_db(old_name, verbosity)

// to:
result = unittest.TextTestRunner(verbosity=verbosity).run(suite)

确保在顶部执行所有必要的导入,然后在您的设置文件中设置设置:

TEST_RUNNER = 'myproject.test.test_runner.run_tests'

现在,当您运行 ./manage.py test 时,Django 将针对您数据库的当前状态运行测试,而不是根据您当前的模型定义创建新版本。

您可以做的另一件事是在本地创建数据库的副本,然后像这样检查新的 run_test() 方法:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

这样就没有针对您的主数据库运行测试的危险。

【讨论】:

以上是关于如何测试 django 数据库模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Django 中的 sql 模式生成数据模型?

如何将数据从 django 传递到引导模式?

搭建Django测试环境时如何创建外部数据库?

如何在每次测试后重置 Django 测试数据库 ID?

如何自动销毁django测试数据库

如何查看 django sqlite3 db 的数据库和模式