加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 如何测试django数据库模式?

发布时间:2020-12-16 23:35:05 所属栏目:Python 来源:网络整理
导读:我想编写可以显示数据库是否与models.py文件同步的测试.实际上我已经编写过它们,只是为了发现每次基于models.py文件运行测试时 django都会创建一个新的数据库. 有什么办法可以让models.py测试使用现有的数据库模式吗?在 mysql / postgresql中的那个,而不是/
我想编写可以显示数据库是否与models.py文件同步的测试.实际上我已经编写过它们,只是为了发现每次基于models.py文件运行测试时 django都会创建一个新的数据库.
有什么办法可以让models.py测试使用现有的数据库模式吗?在 mysql / postgresql中的那个,而不是/myapp/models.py中的那个?

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

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

谢谢

解决方法

我们所做的是覆盖默认的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测试时,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)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读