使用加载装置进行 Django 单元测试,解决几个相关应用程序问题
我现在正在对现有代码进行单元测试。我遇到了下一个问题:
运行syncdb来创建测试数据库后,Django会自动填充几个表,例如django_content_type或auth_permissions。
然后,假设我需要运行一个复杂的测试,例如检查用户注册,这将需要大量数据表以及它们之间的连接。
如果我尝试使用整个现有数据库来制作固定装置(这对我来说相当方便) - 我将收到类似 此处。发生这种情况是因为 Django 已经填充了 django_content_type 这样的表。
下一个可能的方法是对已填充的syncdb表使用 django dumpdata --exclude 选项。但这也不能很好地工作,因为如果我从同步数据库自动创建的数据库和用户权限表中获取用户和用户组对象,我可能会收到错误,因为连接它们的主键现在指向错误。 此处部分“夹具地狱”对此进行了更好的描述,但是那里显示的解决方案看起来不太好)
我看到的下一个可能的方案是:
- 我正在运行我的测试; Django 创建测试数据库,创建syncdb 并创建所有这些表。
- 在我的测试设置中,我将删除该数据库,创建新的空白数据库。
- 也在测试设置中从现有数据库加载数据转储
I'm now making unit-tests for already existing code. I faced the next problem:
After running syncdb for creating test database, Django automatically fills several tables like django_content_type or auth_permissions.
Then, imagine I need to run a complex test, like check the users registration, that will need a lof ot data tables and connections between them.
If I'll try to use my whole existing database for making fixtures (that would be rather convinient for me) - I will receive the error like here. This happens because, Django has already filled tables like django_content_type.
The next possible way is to use django dumpdata --exclude option for already filled with syncdb tables. But this doesn't work well also, because if I take User and User Group objects from my db and User Permissions table, that was automatically created by syncdb, I can receive errors, because the primary keys, connecting them are now pointing wrong. This is better described here in part 'fixture hell', but the solution shown there doensn't look good)
The next possible scheme I see is next:
- I'm running my tests; Django creates test database, makes syncdb and creates all those tables.
- In my test setup I'm dropping this database, creating the new blank database.
- Load data dump from existing database also in test setup
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这就是问题的解决方法:
在syncdb 创建测试数据库后,在测试的setUp 部分中,我使用
os.system
从我的代码访问shell。然后我只是加载数据库的转储,我想将其用于测试。所以它的工作原理如下:syncdb 用数据填充 contenttype 和其他一些表。然后在测试的设置部分加载 sql 转储会清除所有以前创建的数据,我得到一个不错的数据库。
可能不是最好的解决方案,但它有效=)
That's how the problem was solved:
After the syncdb has created the test database, in setUp part of the tests I use
os.system
to access shell from my code. Then I'm just loading the dump of the database, which I want to use for tests.So this works like this: syncdb fills contenttype and some other tables with data. Then in setUp part of tests loading the sql dump clears all the previously created data and i get a nice database.
May be not the best solution, but it works=)
我的方法是首先使用 South 来简化数据库迁移(这根本没有帮助,但很好),然后使用模型创建方法的模块。
当您运行
安装了 South 的 Django 时,创建测试数据库,并运行所有迁移以提供完全更新的测试数据库。
要编写测试,首先创建一个 python 模块调用 test_model_factory.py ,在此处创建创建对象的函数。
然后在测试中,您可以导入 test_model_factory 模块,并为每个测试创建对象。
My approach would be to first use South to make DB migrations easy (which doesn't help at all, but is nice), and then use a module of model creation methods.
When you run
Django with South installed with create the Test DB, and run all your migrations to give you a completely updated test db.
To write tests, first create a python module calle, test_model_factory.py In here create functions that create your objects.
Then in your tests you can import your test_model_factory module, and create objects for each test.