Разница между django.test.TestCase vs unittest vs django.utils.unittest.TestCase

Я все еще использую 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, второй слегка более эффективен.

Вот диаграмма показывающая отношения:

enter image description here

Итак django.utils.unittest и django.test наследуем либо от unittest, либо от 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), какой из них лучше?

Ответы

Ответ 1

Django TestCase улучшает unittest.TestCase с некоторыми дополнительными функциями:

  • Автоматическая загрузка светильников.
  • Обертывает каждый тест в транзакции.
  • Создает экземпляр TestClient.
  • Специфические для Django утверждения для тестирования таких вещей, как ошибки перенаправления и формы.

Вообще говоря, вы, скорее всего, будете использовать один из подклассов Django TestCase. Обычно это будет django.test.TestCase, который для эффективности обертывает тест в транзакции БД и использует откат для "отмены" теста в БД. Если вам нужно вручную управлять транзакциями в рамках своего теста, вам нужно будет использовать django.test.TransactionTestCase, так как вы не можете запустить/отменить транзакцию внутри транзакции.

Есть некоторые незначительные оговорки в использовании django.test.TestCase, см. примечание здесь для получения дополнительной информации.

и

Если вы просто ищете способ быстрее запускать свои тесты, посмотрите выполнение тестов в памяти и (если вы используете Юг), установите SOUTH_TESTS_MIGRATE = False, чтобы сказать Югу использовать (гораздо быстрее) syncdb при создании тестовой БД, а не выполнять миграции.