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

Posted

技术标签:

【中文标题】django.test.TestCase vs unittest vs django.utils.unittest.TestCase 之间的区别【英文标题】:difference between django.test.TestCase vs unittest vs django.utils.unittest.TestCase 【发布时间】:2012-04-21 07:58:42 【问题描述】:

我仍在使用 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:

所以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】:

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

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

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

使用django.test.TestCase 有一些小注意事项,有关详细信息,请参阅注释here。

还有:

如果您只是在寻找一种更快地运行测试的方法,请查看 running your tests in memory,并且(如果您使用的是 South),请设置 SOUTH_TESTS_MIGRATE = False 以告诉 South 使用 a(更快) syncdb 创建测试数据库时,而不是运行迁移。

【讨论】:

我创建了一个 django 应用程序,我的 test.py 文件中有一个继承自 TestCase 的示例类,我只导入了 TestCase 来自 django.test。如果我导入unittest.TestCase,会不会有冲突? @eLRuLL 是的,但是您可以执行“从 django.test 导入 TestCase 作为 DjangoTestCase”或类似的操作来解决冲突 很好的提示,我不知道。 使用django.test.TestCase的警告链接是404ing

以上是关于django.test.TestCase vs unittest vs django.utils.unittest.TestCase 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

在 Pycharm 下记录运行 django 测试的输出

用于创建数据库、运行测试的 Django / postgres 设置

在功能齐全的 django 应用程序中测试 POST 时出现 405 错误

字符串编码中的 Python-3 和 \x Vs \u Vs \U 以及为啥

markdown `git add -A` vs`git add .` vs`git add -u`

markdown `git add -A` vs`git add .` vs`git add -u`