Сегодня я расскажу вам о тестах. Нет, я не буду рассказывать, почему это важно или зачем это нужно делать. Об этом вы прочтете у других авторов. Я же расскажу вам при помощи чего я тестирую свои Django-проекты и приложения.
Итак, знакомтесь, tddspry - альтернатива стандартному подходу в тестировании Django приложений.
Как мы знаем из документации и практики для тестирования приложения надо:
- Собственно написать док или юнит-тест. Если это юнит-тест, то разместить его в
tests.pyилиtests/приложения (при этом надо помнить, что в этом приложении должен присутствовать хотя бы пустойmodels.py). - Выполнить тесты при помощи
./manage.py test app.
Вроде бы ничего сложного или религиозно неправильного нет. Но, я просто не привык к ним. Не привык и точка. Мне намного проще тестировать приложения при помощи python-nose, а вместо стандартного django.test.Сlient использовать twill-овский браузер.
Не буду вдаваться в подробности почему так произошло, но, поверьте, я рад этому до сих пор. Единственное, что меня не устраивало в последнее время это кое-какая монструозность нашей библиотеки для тестирования (которая tddspry и зовется ;) ). И посему я решил вспомнить и применить на практике значение слова рефакторинг. Прошел процесс быстро и практически безболезнено и за три неплоных дня мы имеем практически, да чего уж там таить, фактически новое лицо для нее.
Итак, что-же сейчас умеет tddspry:
- Есть три базовых тест-кейса:
tddspry.NoseTestCase- этот тест-кейс предназначается для любых тестов и по-большому счету является нашим ответомЧемберленуunittest.TestCase. Его особенности: он содержит все декораторы изnose.toolsкак статические методы класса, а все прочие функции из того жеnose.toolsкак методы объекта.tddspry.django.DatabaseTestCase- этот тест-кейс предназначается для тестов в которых необходимо использовать базу данных. Как и в стандартном поведенииunittest.TestCaseон создает или просто настраивает для тестов: а) базу данныхsqlite3в оперативной памяти; б) текущую базу данных изsettingsфайла проекта; в) тестовую базу данных. Самым быстрым для тестов является вариант созданияsqlite3базы данных в оперативной памяти и именно он используется по умолчанию. Но никто не говорит, что вы не сможете протестировать любой другой адаптер. Для этого просто укажитеdatabase_nameаттрибут в вашем тест-кейсе, наследующемDatabaseTestCase. Также, аналогично к джанговским тест-кейсам,DatabaseTestCaseумеет загружать фикстуры. И напоследок этот тест-кейс содержит три безумно простых метода для проверки создания, удаления и исправления модели: они жеcheck_create,check_delete,check_update.tddspry.django.HttpTestCase- этот тест-кейс предназначается для тестов серверной части вашего Django проекта при помощи twill-браузера. Почему twill? Потому что он простой и он на Python'e ;) Единственным существенным его недостатком считаю отсутствие простой функции для кастомного (неGET-запроса), посему в тестированииPOSTилиPUTзапросов вам прийдется дополнительно использовать или джанговский тест-клиент или просто напростоurllib2. Так, но это мы отвлеклись. Что еще особенного вHttpTestCase? Да то, что он содержит в себе все функции изtwill.commands, а также кое-какие стоящие хелперы, как тоlogin,login_to_admin,logout, из названия которых становится ясно, что они делают. Также упрощен интерфейс перехода по урлам, в функциюgoможна передать как уже чистый урл, так и только имя его урлпаттерна, которое будет сконвертировано в чистый урл при помощиdjango.core.urlresolvers.reverse.
- Есть пару воспомогательных хелперов как-то:
tddspry.django.helpers.create_profiletddspry.django.helpers.create_stafftddspry.django.helpers.create_superusertddspry.django.helpers.create_user
- Есть крутой воспомогательный хелпер для проверки работы регистрационного механизма django-registration. Он зовется
tddspry.django.helpers.registration.registration. - Есть прелесный декоратор
show_on_error, который автоматически включен для каждого тестового метода вHttpTestCase. Его прелесть заключается в том, что при ошибке twill'a он показывает содержимое страницы на которой произошла ошибка или при наличии переменной окруженияTWILL_ERROR_DIRсохраняет в этой директории html-страницу с ошибкой.
Для установки библиотеки, достаточно просто выполнить sudo easy_install tddspry. А для непосредственного тестирования вашего Джанго-проекта или приложения необходимо присвоить переменной окружения DJANGO_SETTINGS_MODULE значение актуальных настроек и сказать nosetests :)
Для окончательного примера покажу, какой командой тестируется сам tddspry:
PYTHONPATH=/srv/projects/tddspry-github:. DJANGO_SETTINGS_MODULE=testproject.settings nosetests -w .. --with-coverage --cover-package=tddspry --exe testproject
Так что, надеюсь, что моя информация будет вам полезна и вы будете следить за дальнейшим развитием tddspry. Ведь в планах у меня есть поддержка Django 1.1, использование Selenium или Windmill для клиентских тестов и куча прочих полезностей.
зы. Совсем забыл ;) Примеры тестов, написанных при помощи tddspry, вы можете найти где-то здесь.
зыы. Особенная благодарность Almad'у, автору django-sane-testing, за стимул к полному рефакторингу tddspry. Краткое объяснение: он написал мне в личку на гитхабе, мол так и так, я уже сделал практически то же самое только с Селениумом и без Твилла, посмотри может тебе пригодится. Я посмотрел на его тесты и я окончательно понял, что надо улучшать tddspry.