django.test.TestCase与unittest vs django.utils.unittest.TestCase之间的区别

时间:2012-04-08 17:32:27

标签: django django-testing

我仍在使用Django 1.2.1,我认为对于较新的Django,我们不会import unittest然后执行unittest.TestCase

插图

import unittest
class TestThis(unittest.TestCase):

from django.utils.unittest import TestCase
class TestThis(TestCase):

from django.test import TestCase
class TestThis(TestCase):

根据PyCon2011 talk,第二个略微更有效率。

以下是显示关系的diagram

enter image description here

所以django.utils.unittestdjango.test继承unittestunittest2

我不确定以下是否正确。请帮忙编辑。

 ________________________________________________________________
|  Name                   |  Django Version  |  Python Version  |
-----------------------------------------------------------------
|  unittest               |     >= 1.0       |      >= 2.6      |
-----------------------------------------------------------------
|  django.utils.unittest  |     >= 1.3       |       ??         |
-----------------------------------------------------------------
|  django.test            |     >= 1.0       |      >= 2.6      |
|   - SimpleTestCase            >= 1.4              >= 2.7      |
|   - LiveServerTestCase        >= 1.4              >= 2.7      |
-----------------------------------------------------------------

在效率方面,三者中哪一个更好?许多Django开发人员在测试时都会模拟,因此有时甚至不需要数据库。有没有办法在我们运行manage.py test myapp.MyClass时创建表格?对于旧版本(1.3之前),哪一个更好?

1 个答案:

答案 0 :(得分:13)

Django TestCase通过一些额外的功能增强unittest.TestCase

  • 自动加载灯具。
  • 在交易中包装每个测试。
  • 创建一个TestClient实例。
  • 特定于Django的断言,用于测试重定向和表单错误等内容。

一般来说,您最有可能使用Django的TestCase子类之一。通常这将是django.test.TestCase,为了提高效率,它将测试包装在数据库事务中,并使用回滚来“撤消”数据库中的测试。如果您需要在测试中手动管理事务,则需要使用django.test.TransactionTestCase,因为您无法在事务中启动/回滚事务。

使用django.test.TestCase时有一些小问题,请参阅说明here以获取更多信息。

ALSO:

如果您只是想找到更快地运行测试的方法,请查看running your tests in memory和(如果您使用的是南方),请设置SOUTH_TESTS_MIGRATE = False告诉South使用(快得多)syncdb在创建测试数据库时,而不是运行迁移。