2012-04-08 110 views
16

我仍然使用Django 1.2.1,我认为用较新的Django我们不会import unittest,然后做unittest.TestCasedjango.test.TestCase与unittest的区别vs django.utils.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.unittest并从任unittestunittest2django.test继承。

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

________________________________________________________________ 
| 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之前),哪一个更好?

回答

12

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告诉南使用(更快)syncdb创建测试数据库时,而不是运行迁移。

+0

我创建了一个Django应用程序,我已经在我的test.py文件,示例类从* * TestCase的继承和我只是进口* TestCase的*从* django.test *。如果我输入* * unittest.TestCase生成,这将是一个冲突? – eLRuLL 2013-02-05 14:46:57

+3

@eLRuLL是的,但你可以“从django.test进口的TestCase作为DjangoTestCase”或类似的解决冲突 – 2013-02-07 21:34:26

+0

伟大的小费事做,我不知道。 – eLRuLL 2013-02-07 22:14:26