У меня есть как полный-на-медленный-django-test-db набор, так и сумасшедший набор тестов "быстрый запуск против производства", построенный из общего модуля тестирования. Я использую производственный пакет для проверки работоспособности моих изменений во время разработки и в качестве шага проверки фиксации на моей машине разработки. Модуль django suite выглядит следующим образом:
import django.test
import my_test_module
...
class MyTests(django.test.TestCase):
def test_XXX(self):
my_test_module.XXX(self)
Модуль производственного набора тестов использует пустое unittest и выглядит так:
import unittest
import my_test_module
class MyTests(unittest.TestCase):
def test_XXX(self):
my_test_module.XXX(self)
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests)
unittest.TextTestRunner(verbosity=2).run(suite)
Тестовый модуль выглядит так:
def XXX(testcase):
testcase.assertEquals('foo', 'bar')
Я запускаю чистую юнит-тестовую версию, подобную этой, поэтому в моих тестах в любом случае для них доступен ORM django:
% python manage.py shell < run_unit_tests
где run_unit_tests состоит из:
import path.to.production_module
Производственному модулю нужно немного отличаться от setUp () и tearDown () от версии django, и вы можете поместить туда любую необходимую очистку таблицы. Я также использую тестовый клиент django в общем тестовом модуле, имитируя класс тестового клиента:
class FakeDict(dict):
"""
class that wraps dict and provides a getlist member
used by the django view request unpacking code, used when
passing in a FakeRequest (see below), only needed for those
api entrypoints that have list parameters
"""
def getlist(self, name):
return [x for x in self.get(name)]
class FakeRequest(object):
"""
an object mimicing the django request object passed in to views
so we can test the api entrypoints from the developer unit test
framework
"""
user = get_test_user()
GET={}
POST={}
Вот пример функции тестового модуля, которая тестирует через клиента:
def XXX(testcase):
if getattr(testcase, 'client', None) is None:
req_dict = FakeDict()
else:
req_dict = {}
req_dict['param'] = 'value'
if getattr(testcase, 'client', None) is None:
fake_req = FakeRequest()
fake_req.POST = req_dict
resp = view_function_to_test(fake_req)
else:
resp = testcase.client.post('/path/to/function_to_test/', req_dict)
...
Я обнаружил, что эта структура действительно хорошо работает, а суперскоростная производственная версия пакета значительно экономит время.