Python/Django разработчик
0,0
рейтинг
24 февраля 2012 в 12:45

Разработка → 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.

Вот и всё — удачных тестов!
Вадим Лопатюк @qnub
карма
52,2
рейтинг 0,0
Python/Django разработчик
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (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

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