如何测试Django数据库架构?
时间:2020-03-06 14:46:42 来源:igfitidea点击:
我想编写测试,以显示数据库是否与我的models.py文件同步。实际上,我已经编写了它们,只是为了发现每次基于models.py文件运行测试时django都会创建一个新的数据库。
有什么办法可以使models.py测试使用现有的数据库模式?一个在mysql / postgresql中,而不是在/myapp/models.py中?
我不在乎数据库中的数据,我只在乎它的架构,即我希望我的测试能够注意到数据库中的表是否具有比models.py文件中的架构少的字段。
如果有任何相关性,我正在使用unittest框架(实际上是django扩展名)。
谢谢
解决方案
我们所做的是覆盖默认的test_runner,以便它不会创建要测试的新数据库。这样,它将针对我们当前的本地数据库的外观运行测试。但是,如果使用此方法,请务必小心,因为在测试中对数据所做的任何更改都是永久性的。我确保所有测试都将所有更改恢复到原始状态,并将数据库的原始版本保留在服务器上并进行备份。
因此,要做到这一点,我们需要将django.test.simple中的run_test方法复制到项目中的某个位置-我将其放在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)
这样,就没有对主数据库运行测试的危险。