HowTo: continuous integration Django в Jenkins с помощью Selenium

    Это шпаргалка раскрывающая раздел «Интеграция Selenium тестов» статьи Настройка Jenkins для django проекта с нуля. А именно как запускать Selenium тесты на удалённом сервере Jenkins у которого нет монитора и форточек.

    Спасибо black_bunny за статью и она прекрасно покрывает установку и настрйоку Jenkins, но у меня сломалась пара костылей пока я всё это дело объединил в работающую систему с его же django-selenium. Теперь коротко и по делу.

    Для справки: тестировочный сервер у меня Ubuntu 11.10 x64 без монитора и X.org и описываемое действо выполнено именно на нём.

    Установка

    Ставим и настраиваем Jenkins как описано в вышеупомянутой статье.

    Для запуска тестов Selenium понадобится браузер и терминал вывода для этого самого браузера.

    Ставим ему терминал:
    sudo apt-get install xvfb
    

    и сам браузер:
    sudo apt-get install --no-install-recommends firefox
    

    Для работы тестов также потребуется пара python пакетов. Тут можно подсмотреть как автоматизировать сборку тестового окружения. Собственно я использую тот самый fab скрипт с изменённой командой запуска. Её я укажу чуть позже.

    Пакеты для работы Selenium тестов (ставятся через pip install):
    selenium
    django-selenium
    


    Настройка

    Сам автор django-selenium рекомендует использовать свой раннер тестов для запуска под Jenkins, но так как оно описано — оно не заработало, а когда я его подправил и оно заработало, то не стало учитывать настройку PROJECT_APPS для django-jenkins, т.е. запускало абсолютно все тесты из всех пакетов, используемых в проекте. Потому я предлагаю вам свой раннер, который запускается django-jenkins, прогоняет тесты которые положено для него, после чего уже запускает исключительно selenium тесты из django-selenium:

    # -*- coding: utf-8 -*-
    from django_jenkins.runner import CITestSuiteRunner
    from django_selenium.jenkins_runner import JenkinsTestRunner, SeleniumTestRunner
    from django.test.testcases import TestCase
    from django.test.simple import reorder_suite
    
    
    class ProjectRunner(JenkinsTestRunner):
        """
        Project test runner
        """
    
        def __init__(self, **kwargs):
            super(ProjectRunner, self).__init__(**kwargs)
            self.selenium_only = True
    
        def build_suite(self, test_labels, **kwargs):
            suite = SeleniumTestRunner.build_suite(self, test_labels, **kwargs)
            suite.addTest(CITestSuiteRunner.build_suite(self, test_labels, **kwargs))
    
            return reorder_suite(suite, (TestCase,))
    

    Положите этот код в файл test_runner.py в корне Вашего проекта (скажем проект называется «project»).

    Добавьте в настройки проекта:
    SELENIUM_DISPLAY = ':99'
    JENKINS_TEST_RUNNER = 'project.test_runner.ProjectRunner'
    

    Запуск

    В этом месте:

    image

    настройку проекта Jenkins следует немного подредактировать и заменить запускающую команду на:
    xvfb-run ./manage.py jenkins
    

    В общем нужно поместить выполнение тестов в виртуальный фреймбуфер X.org, т.е. перед началом команды запускающей тесты нужно добавить xvfb-run. В конце можете добавить список приложений, хотя это особого смысла не имеет, т.к. у нас есть работающая настройка PROJECT_APPS.

    Вот и всё — удачных тестов!
    Метки:
    • +21
    • 4,9k
    • 8
    Поделиться публикацией
    Похожие публикации
    Комментарии 8
    • –7
      А почему HowTo: continuous integration на затранслейтили? Не кэнаете или не вонтаете?
      • 0
        у меня нет возможности установить на удалённой машинке X и нужный зоопарк браузеров. можно-ли выполнять питонячьи тесты с selenium на удалённом сервере, используя браузеры, запущенные где-то в другом месте?
        • 0
          В теории да — там должен быть запущен selenium-standalone и необходимый браузер (не знаю как на счёт зоопарка). Настройки по этой части можно подсмотреть здесь: j.mp/wQTSKu в разделе Remote

          Сам я не эксперементировал с таким вариантом потому подробнее не подскажу.
        • 0
          Всегда пожалуйста, скоро кстати будет пара багфиксов для django-selenium, исправляющие и ваше issue в том числе. Но в будущем от него можно будет отказаться, так как в django 1.4 будет встроенная поддержка selenium и windmill.
          • 0
            Хотят встроенными средствами покрыть все варианты тестирования? Похвально, ещё бы webtest туда включили, он побыстрее селениума и достаточен, если не нужно JavaScript тестить…
            • 0
              Никакой особой интеграции нет, просто на время теста поднимается вебсервер на localhost, к которому могут обращаться не только Selenium и Windmill, но и любой другой инструмент для браузерного тестирования.
              • 0
                Не то, что я ожидал, похожее решение с manage.py runserver на время тестов предлагают некоторые howto по selenium тестированию…
          • 0
            btw, кастомный раннер не очень хорошо, т.к. на каждую комбинацию используемых тестовых фреймворков раннер не напишешь.

            Корректный способ расширения django-jenkins это наследование от django_jenkins.tasks.BaseTask и указание этого модуля в настройке JENKINS_TASKS. Как пример можно посмотреть на поддержку lettuce тестов — github.com/kmmbvnr/django-jenkins/blob/master/django_jenkins/tasks/lettuce_tests.py

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.