Всем привет.
Ни для кого не секрет что тестирование приложений является важным этапом разработки ПО, а если вы разрабатываете веб-приложения, то вам просто необходимо тестировать веб-интерфейс. К счастью, для этой цели существует такой инструмент как Selenium. Небезызвестные на хабре компании СКБ Контур и Яндекс уже выбрали его как инструмент функционального тестирования своих приложений и сервисов (Яндекс рассказывал об этом на недавно прошедшей YaC).
Теперь к делу.
В одном из проектов, над которым я работаю, мы использовали Selenium начиная еще с первой ветки. Но время не стоит на месте, вышел Selenium 2.0, основанный на технологии webdriver, более функциональный, удобный, и правильно имитирующий события в браузере (подробнее о преимуществах).
Чтобы не заниматься обновлением старого кода поддержки Selenium внутри нашего приложения (а вдруг это придется делать еще и не один раз?), а также чтобы попробовать сделать что-то полезное для других разработчиков, мы решили сразу вынести интеграцию с Selenium в отдельную библиотеку.
Далее я опишу что у нас получилось и как использовать эту библиотеку.
Установка
Библиотеку можно взять с https://github.com/dragoon/django-selenium или установить через pip:
pip install django-selenium
Возможности
Прежде всего библиотека позволяет интегрироваться с подсистемой тестирования django. Вы можете либо просто указать в настройках использовать TestRunner из библиотеки:
TEST_RUNNER = 'django_selenium.selenium_runner.SeleniumTestRunner'
либо унаследовать его и написать свой класс.За кулисами SeleniumTestRunner проделывает следующие операции:
- запускает сервер selenium-server.jar
- запускает экземпляр тестового сервера с тестовыми fixtures
Расширение стандартного драйвера
Для облегчения выполнения стандартных операций был написан расширенный класс драйвера, взаимодействующего с браузером, — django_selenium.testcases.MyDriver. Он содержит такие операции как открыть url, авторизоваться на сайте (стандартная форма django), найти элемент по css селектору, найти элемент и произвести клик, проверить присутствие текста на странице, получить текст алерта и другие. За подробностями прошу пока обращаться к исходному коду класса MyDriver.
Замена команды выполнения тестов
Наконец, чтобы заменить стандартную команду выполнения тестов django на команду с поддержкой selenium тестов, необходимо где-либо в своем приложении унаследовать класс команды следующим образом:
from django_selenium.management.commands import test_selenium
class Command(test_selenium.Command):
def handle(self, *test_labels, **options):
super(Command, self).handle(*test_labels, **options)
Команда поддерживает две дополнительные опции:- --selenium — выполнить все тесты, включая Selenium тесты
- --selenium-only — выполнить только Selenium тесты
Тестовое приложение
Чтобы закрепить сказанное выше я, подготовил небольшое django приложение содержащие один selenium тест:
# Скачиваем selenium-server.jar
wget http://selenium.googlecode.com/files/selenium-server-standalone-2.7.0.jar
git clone git://github.com/dragoon/django-selenium-testapp.git
cd django-selenium-testapp
# Установить правильный путь в переменную SELENIUM_PATH
vi settings.py
# Запускаем тесты
./manage.py test --selenium-only
...
----------------------------------------------------------------------
Ran 1 test in 13.254s
OK
Если все пошло верно, должна наблюдаться следующая картина:
Как всегда, буду рад услышать замечания и пожелания по дальнейшей доработке, мнения о том насколько эта библиотека полезна, ну и конечно же буду рад любой помощи по доработке от других гитхабберов.
Спасибо за внимание.