Интеграция Django и Selenium



    Всем привет.

    Ни для кого не секрет что тестирование приложений является важным этапом разработки ПО, а если вы разрабатываете веб-приложения, то вам просто необходимо тестировать веб-интерфейс. К счастью, для этой цели существует такой инструмент как 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
    Далее, чтобы начать писать Selenium тесты необходимо создать в приложении файл seltests.py, по аналогии с обычным tests.py. Затем вы просто наследуете класс теста от django_selenium.testcases.SeleniumTestCase и пишите тесты, используя команды Selenium для взаимодействия с браузером.

    Расширение стандартного драйвера

    Для облегчения выполнения стандартных операций был написан расширенный класс драйвера, взаимодействующего с браузером, — 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 тесты
    Как и в случае стандартной команды, можно запускать 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
    

    Если все пошло верно, должна наблюдаться следующая картина:


    Как всегда, буду рад услышать замечания и пожелания по дальнейшей доработке, мнения о том насколько эта библиотека полезна, ну и конечно же буду рад любой помощи по доработке от других гитхабберов.

    Спасибо за внимание.
    Share post

    Similar posts

    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 16

      0
      Спасибо за полезную вещь.
      Было бы очень интересно посмотреть на примеры «живых» тестов силениума. Вы их руками пишите или полуавтоматическим способом через браузер?
        0
        Сам код тестов пишем руками, предварительно проверяя каждую команду в консоли (отдельно запущен selenium-server.jar, testserver, и manage.py shell). В браузере подсматриваем селекторы через Firebug. При определённой сноровке получается довольно быстро.
        Вообще у Selenium есть такая штука как Selenium IDE, она может записывать тесты, но в своём формате насколько мне известно. Чтобы получить питон нужно наверное писать конвертер.
          +1
          У нас как раз возникла необходимость написания подобных тестов для довольно большого js кода. Теперь будем знать с какого боку подойти. =)

          Как-то пытался что-то сделать с Selenium IDE, но, если честно, не пошло. Да и как вы правильно заметили, нужно их еще и конверить потом. В любом случае, они не избавят от большого количества ручного труда.
            +5
            Хм, интересно. Мы тоже пишем тесты вручную и как-раз с помощью Selenium IDE — там есть удобный список доступных команд, справка, и тут же можно выполнить созданные команды и посмотреть результат, а волшебная кнопочка Find Element позволяет проверить правильность селениумовского селектора.

            Что бы IDE выдавал питон-код нужно выбрать в меню формат буфера обмена (на выбор есть несколько языков), далее если выделить команды и нажать Ctrl+C эти команды попадут в буфер обмена в виде питон кода. Так и копи-пастим из Selenium IDE :)
              0
              Спасибо, попробуем!
                0
                о!
              +1
              Для firefox selenium IDE идут специальные конверторы генерируемого кода для нескольких языков в том числе и для Python

              image
                0
                если я не ошибаюсь, то в Selenium IDE можно выбрать формат скрипта (там и Python, и Ruby, и PHP есть)
              +1
              Интересная библиотечка, я в своё время пытался прикрутить выполнение Selenium тестов, что было достаточно геморно… В итоге теперь работает такая схема:

              — nose для поиска и запуска тестов;
              — django-sane-testing как плагин для nose и django-приложение, который запускает код приложения во время работы тестов (самая большая головная боль при запуске селениум-тестов).

              Из плюсов такой схемы:

              — nose и плагины для него, типа coverage и т.д.;
              — можно использовать не стандартный django сервер (который плохо работает со многими параллельными запросами), а cherrypy.
                0
                lettuce + splinter наше все
                  0
                  Может попродробнее расскажете про splinter? Он тоже браузер запускает, я правильно понимаю?
                    0
                    просто удобный враппер вокруг селениума

                    >Он тоже браузер запускает, я правильно понимаю?
                    ага, www.youtube.com/watch?v=Zx21QH6l1GQ
                      0
                      Спасибо, всё-таки умеют люди имена проектам давать, после просмотра youtube предложил видео с названием «Splinter eating Lettuce»)
                  +2
                  Не очень относится в Django, но я тут нашел свежую (23 сентября 2011) книжку по Selenium в формате PDF. Я люблю читать такие штуки в электронной книжке, поэтому часто ищу PDF. Скачать можно тут.
                    +2
                    Оффтоп, конечно, но я искренне так рад django-неделе на хабре!
                      0
                      Стараемся!

                    Only users with full accounts can post comments. Log in, please.