如何对Django数据库迁移进行单元测试?

约翰·米

我们已经使用django迁移(django v1.7 +)更改了数据库。数据库中存在的数据不再有效。

基本上,我想通过在单元测试中构建迁移前的数据库,添加一些数据,应用迁移,然后确认一切顺利进行来测试迁移。

如何:

  1. 加载单元测试时阻止新的迁移

    我发现了一些有关覆盖的内容,settings.MIGRATION_MODULES但无法弄清楚如何使用它。当我检查时,executor.loader.applied_migrations它仍然列出了所有内容。我阻止新迁移的唯一方法是实际删除文件。不是我可以使用的解决方案。

  2. 在unittest数据库中创建一条记录(使用旧模型)

    如果我们可以防止迁移,那么这应该很简单。 myModel.object.create(...)

  3. 应用迁移

    我想我已经找到了test_executor,现在可以解决这个问题:设置一个指向迁移文件的计划并执行它?嗯对不对 得到了任何代码:-D

  4. 确认数据库中的旧数据现在与新模型匹配

    再次,我希望这应该很容易:只需获取在迁移之前创建的实例,并确认它已经以所有正确的方式进行了更改。

因此,挑战实际上只是弄清楚如何防止单元测试应用最新的迁移脚本,然后在准备就绪后再应用它?


也许我有错误的做法?我应该创建固定装置,然后确认它们在最后都很好吗?在应用迁移之前或完成迁移之后,是否加载了夹具?


通过使用MigrationExecutor和选择特定的迁移,.migrate我能够(也许?)将其回滚到特定状态,然后一个接一个地向前滚动。但这引起了人们的怀疑。由于缺少实际的ALTER TABLE指令,目前正在跟踪sqlite混乱。陪审团还在。

约翰·米

我无法阻止单元测试的开始与当前数据库架构,但我没有找到它是很容易恢复到在迁移历史较早点:

其中“ 0014_nulls_permitted”是迁移目录中的文件...

from django.db.migrations.executor import MigrationExecutor
executor.migrate([("workflow_engine", "0014_nulls_permitted")])
executor.loader.build_graph()

注意: 在两次调用之间运行似乎是完成迁移并使事情按预期运行的非常重要的一部分executor.loader.build_graphexecutor.migrate

当前适用于数据库的迁移可以通过以下方式进行检查:

print [x[1] for x in sorted(executor.loader.applied_migrations)]

[u'0001_initial', u'0002_fix_foreignkeys', ... u'0014_nulls_permitted']

我通过ORM创建了一个模型实例,然后通过直接运行一些SQL来确保数据库处于旧状态:

job = Job.objects.create(....)
from django.db import connection
cursor = connection.cursor()
cursor.execute('UPDATE workflow_engine_job SET next_job_state=NULL')

伟大的。现在,我知道我的数据库处于旧状态,并且可以测试正向迁移。因此,0016_nulls_banished是迁移文件:

executor.migrate([("workflow_engine", "0016_nulls_banished")])
executor.loader.build_graph()

迁移0015通过数据库将所有NULL字段转换为默认值。迁移0016会更改架构。您可以散布一些打印语句,以确认事情如预期的那样发生。

现在,该测试可以确认迁移已成功进行。在这种情况下,请确保数据库中没有空值。

jobs = Job.objects.all()
self.assertTrue(all([j.next_job_state is not None for j in jobs]))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Spock和Robospock进行单元测试以创建SQLite数据库

Django单元测试需要很长时间才能创建测试数据库

如何使用Doctrine Fixture加载测试数据库以进行PHP单元测试?

如何对Django邮件进行单元测试?

数据库单元测试框架?

对数据库连接进行单元测试以及有关数据库相关代码和单元测试的一般问题

数据库单元测试

您将如何对仅用于进行数据库调用的方法进行单元测试?

使用H2数据库进行单元测试DAO层

没有数据库的Django单元测试

如何使用数据库查询对对象进行单元测试

如何设置django在单元测试期间不使用内存数据库?

如何对将项目添加到数据库的方法进行单元测试?

如何对数据库插入功能PDO进行单元测试

在流明中进行单元测试时,数据库迁移和事务之间有什么区别?

如何在python中对数据库连接pymysql进行单元测试?

Python单元测试:如何对包含数据库操作的模块进行单元测试?

单元测试(模拟)数据库,如何通过模拟验证数据库方法?

如何对Django RawQuerySets进行单元测试

使用数据库数据进行C#单元测试

Django单元测试等待数据库

假设+单元测试测试锁定sqlite数据库

在Django单元测试中查询数据库

如何使用默认和非托管数据库运行Django单元测试?

Django单元测试:分离单元测试而无需多次查询数据库

在不使用NodeJS连接数据库的情况下对Mysql进行单元测试

Django中的单元测试:如何初始化数据库

如何对Django模型进行单元测试?

涉及数据库的单元测试