21

我仍在使用 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,第二个效率稍高一些。

这是显示关系的图表

在此处输入图像描述

所以django.utils.unittestdjango.test继承自unittestor unittest2

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

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

4

1 回答 1

15

DjangoTestCase增强unittest.TestCase了一些额外的功能:

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

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

使用时有一些小注意事项django.test.TestCase,请参阅此处的注释以获取更多信息。

还:

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

于 2012-05-17T15:27:04.983 回答