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

difference between django.test.TestCase vs unittest vs django.utils.unittest.TestCase

我仍在使用Django 1.2.1,并且我认为对于较新的Django,我们先不要import unittest然后再做unittest.TestCase

插图

1
2
3
4
5
6
7
8
import unittest
class TestThis(unittest.TestCase):

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

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

根据PyCon2011的说法,第二个效率更高。

这是显示关系的图:

enter image description here

因此django.utils.unittestdjango.test继承自unittestunittest2

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

1
2
3
4
5
6
7
8
9
10
11
 ________________________________________________________________
|  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之前的版本),哪个更好?


Django的TestCase增强了unittest.TestCase的一些附加功能:

  • 自动加载夹具。
  • 在事务中包装每个测试。
  • 创建一个TestClient实例。
  • 特定于Django的断言,用于测试诸如重定向和格式错误之类的事情。

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

使用django.test.TestCase有一些小的注意事项,有关更多信息,请参见此处的注释。

也:

如果您只是在寻找一种可以更快地运行测试的方法,请看看在内存中运行测试,并且(如果您使用的是South),请设置SOUTH_TESTS_MIGRATE = False来告诉South使用(快得多)<创建测试数据库时(而不是运行迁移)。