使用加载装置进行 Django 单元测试,解决几个相关应用程序问题

发布于 2024-08-26 12:30:25 字数 827 浏览 9 评论 0原文

我现在正在对现有代码进行单元测试。我遇到了下一个问题:

运行syncdb来创建测试数据库后,Django会自动填充几个表,例如django_content_type或auth_permissions。

然后,假设我需要运行一个复杂的测试,例如检查用户注册,这将需要大量数据表以及它们之间的连接。

如果我尝试使用整个现有数据库来制作固定装置(这对我来说相当方便) - 我将收到类似 此处。发生这种情况是因为 Django 已经填充了 django_content_type 这样的表。

下一个可能的方法是对已填充的syncdb表使用 django dumpdata --exclude 选项。但这也不能很好地工作,因为如果我从同步数据库自动创建的数据库和用户权限表中获取用户和用户组对象,我可能会收到错误,因为连接它们的主键现在指向错误。 此处部分“夹具地狱”对此进行了更好的描述,但是那里显示的解决方案看起来不太好)

我看到的下一个可能的方案是:

  1. 我正在运行我的测试; Django 创建测试数据库,创建syncdb 并创建所有这些表。
  2. 在我的测试设置中,我将删除该数据库,创建新的空白数据库。
  3. 也在测试设置中从现有数据库加载数据转储

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:

  1. I'm running my tests; Django creates test database, makes syncdb and creates all those tables.
  2. In my test setup I'm dropping this database, creating the new blank database.
  3. Load data dump from existing database also in test setup

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

青衫负雪 2024-09-02 12:30:25

这就是问题的解决方法:

在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=)

梦里°也失望 2024-09-02 12:30:25

我的方法是首先使用 South 来简化数据库迁移(这根本没有帮助,但很好),然后使用模型创建方法的模块。

当您运行

  $  manage.py test my_proj

安装了 South 的 Django 时,创建测试数据库,并运行所有迁移以提供完全更新的测试数据库。

要编写测试,首先创建一个 python 模块调用 test_model_factory.py ,在此处创建创建对象的函数。

def mk_user():
   User.objects.create(...)

然后在测试中,您可以导入 test_model_factory 模块,并为每个测试创建对象。

  def test_something(self):
     test_user = test_model_factory.mk_user()

     self.assert(test_user ...)

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

  $  manage.py test my_proj

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.

def mk_user():
   User.objects.create(...)

Then in your tests you can import your test_model_factory module, and create objects for each test.

  def test_something(self):
     test_user = test_model_factory.mk_user()

     self.assert(test_user ...)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文