Разница между 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
при создании тестовой БД, а не выполнять миграции.