2012-04-08 3 views
16

Я все еще использую Django 1.2.1, и я думаю, что с новым Django мы не делаем import unittest, а затем делаем unittest.TestCase.разница между django.test.TestCase vs 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 и 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), какой из них лучше?

ответ

12

TestCase Джанго усиливает unittest.TestCase с некоторыми дополнительными функциями:

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

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

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

ТАКЖЕ:

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

+0

Я создал приложение django, и у меня есть в моем файле test.py, наследующий класс от * TestCase *, и я только импортировал * TestCase * из * django.test *. Если я импортирую * unittest.TestCase *, это будет конфликт? – eLRuLL

+3

@eLRuLL да, но вы могли бы сделать «из django.test import TestCase как DjangoTestCase» или что-то подобное, чтобы разрешить конфликт –

+0

отличный совет, я этого не знал. – eLRuLL

Смежные вопросы