Пользователь
0,0
рейтинг
14 октября 2012 в 16:29

Разработка → FitNesse + TeamCity — добавь проекту тонуса

Доброго времени суток, любители зажать конструируемую систему в рамки разнообразных тестов! Многие из вас пользуются средствами для создания системных тестов. Кто-то даже использует FitNesse, о котором на Хабре немного рассказывали. Поэтому не буду повторяться и писать про то, что такое FitNesse и с чем его едят. Лучше расскажу про то, как заставить проект «заниматься фитнесом» в процессе сборки, которая протекает при помощи TeamCity.
Интересненько? Тогда добро пожаловать под кат.

Итак, дано:

  1. Проект, написанный на PHP и которому нужен внешний каркас из тестов. Разработчик хочет быть уверен, что после внесения изменений конечный пользователь будет видеть ровно то, что видел раньше плюс новую фишечку. А не новую фишечку и резко окосевший UI соседнего модуля управления отчетами.
  2. Системные тесты для контроля UI через Selenium Webdriver, написанные на базе PHPUnit. Обладают 2мя недостатками, а именно:
    • Тестировщик должен знать PHP, PHPUnit, API Webdriver'а. И при этом писать чистый код, который сможет прочитать не только он.

      Давайте облегчим ему жизнь уже :)
    • Поэтому существующие тесты написаны так, что поддерживать их — дело темное и неблагодарное. Еще темнее и неблагодарнее ситуация, когда программистам не удается с ходу понять, а почему же, собственно, слетел тест. И приходится тратить время…

  3. Автоматическая сборка проекта и прогонка всех тестов при помощи TeamCity
  4. Некоторое количество UI тестов, управляемых FitNesse. Более читаемые, чем написанные на PHP, и каждый желающий может открыть нашу FitNesse-wiki и запустить любой тест. И даже менеджерам понятно, что же там происходит на экране :). Однако, при сборке проекта эти тесты автоматически не запускаются.

Решение.

Решать будем последний пунктик путем скрещивания TeamCity Buildrunner и FitNesse. Делать это можно по-разному: можно самостоятельно настраивать связку FitNesse runner + TeamCity, а можно пойти простым путём и воспользоваться специально обученным плагином. Из коробки плагин умеет запускать FitNesse по указанному в настройках пути, прогонять тесты и выдавать краткую статистику. В общем, чудо, но расстраивает следующим:
  • Возникли проблемы при запуске на BuildAgent'е, который крутится под Linux
  • FitNesse запускается каждый раз при запуске сборки. И вырубается по ее завершении. А хочется иногда перейти на страничку конкретного теста и посмотреть ему в глаза :)

Поэтому наша команда решила взять плагинчик, допилить его под наши фантастические требования и поделиться с сообществом. Перепиленный плагин доступен на GitHub.
Кратенько опишу процесс установки и настройки. В целом он похож на тот, что описан в README оригинального плагина, однако теперь FitNesse должен быть кем-нибудь запущен на BuilAgent'е заранее. И т.к. он там будеть шуршать постоянно, можно в любой момент времени зайти и запустить любой понравившийся тест руками.
  • При помощи ant собираем проект в архив Fitnesse.zip, предназначенный для скармливания TeamCity-серверу.
  • Подсовываем TeamCity серверу наш архив в папку plugins. И перезагружаем сервер.
  • Теперь TeamCity должен обновить своих BuildAgent'ов новым плагином. Если что-то на агентах пошло не так — перезагрузите их.
  • На TeamCity сервере появился новый runner — Fitnesse runner. Теперь можно добавить еще один шаг сборки. Конфигурируется он просто, в 2 параметра:
    FitNesse host — собственно, адрес, по которому можно открыть нашу FitNesse wiki.
    Test names — перечисление тестов, которые необходимо прогнать. Имена тестов пишутся в строчку, разделитель — точка с запятой.
  • На BuildAgent'e запускаем FitNesse и настраиваем его так, чтобы он подхватывал тесты, которые соберет BuilAgent. В нашем случае это решилось заданием переменной $FITNESSE_ROOTPATH при запуске через параметр -d:
    java -jar fitnesse-standalone.jar -p 8080 -d ~/BuildAgent/work/branch/test/src/Fitnesse
    

    А т.к. при сборке BuildAgent обновляет папку branch/test/src/Fitnesse, то у FitNesse всегда в наличии будут тесты собираемой ветки.
  • Все, можно запускать сборку.

Ответ.

Примерно такие картиночки сможем наблюдать на выходе. Это увидим в результатах тестирования:


А это в buil log'ах:

Для полного счастья осталось заставить ссылки работать «как ссылки», в чем может помочь вот эта статья. Но это уже обсуждение другого плана.

Какой профит от FitNesse?

Во-первых, один раз разработав и задокументировав API, который доступен из FitNesse, тестировщика больше не придется просить писать PHP-код. У него появляется единственный инструмент — Wiki-разметка, которой он пишет сценарии тестов и заодно документацию. Если понадобится новая API-ручка, то ее напишет не тестировщик, а команда разработчиков. Которым за код, собственно, деньги платят :).
Во-вторых, вести документацию по системе можно прямо на страничке с тестами. Новым сотрудникам будет полезно поковыряться с такой базой знаний. Да и сам стиль написания FitNesse тестов гораздо более удобен для восприятия человеком, знакомым с английским языком. При желании можно даже менеджерам показывать — пускай видят, что «User Vasya logs in with password vasyapassword and receives alert with message „PANIC!!“ », и это реально работает :).

К сообществу.

Просьба не судить плагин чересчур строго — он еще «молодой и неопытный» :) Если кого-то заинтересовало, то не стесняйтесь его допиливать/довешивать так, как душе угодно. И пускай всем будет польза.
@elgris
карма
4,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

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

Комментарии (6)

  • 0
    Насчет того, что тестировщик должен знать PHP, PHPUnit,… Впринципе да, неплохо бы знать PHP, это несложно и в жизни пригодится :) Но вот PHPUnit из коробки достаточно тяжел для настройки и использования даже разработчикам. А его Selenium модуль, впринципе морально устарел. Для упрощения жизни тестировщикам, можно использовать тот же Codeception. Требует минимального знания PHP, зато красиво интегрируется в CI и тоже производит репорты понятные менеджеру. Ну или <a href='http://behat.org">Behat там и PHP знать не надо, можно всё на разрабов повесить )
    • 0
      > Но вот PHPUnit из коробки достаточно тяжел для настройки и использования даже разработчикам

      Да ладно? Установка через PEAR, парой команд с офсайта.

      Использование — понимание для чего нужны тесты, как они пишутся и несколько assert'ов.
      • 0
        Ой, вы бы знали сколько с бубном танцевать надо, когда PEAR сломался. А ломается он часто. Честно, уже это самая проблема. А во многих дистрибутивах PEAR не стоит из коробки…

        Честно, сам сначала распостранял через PEAR и понял, что это вызывает проблемы у многих людей
        • 0
          Мне просто везёт, наверное :-)

    • 0
      Спасибо. Мы, правда, не пользуем Selenium модуль от PHPUnit, полагаемся на ручной вызов API Webdriver'a через обвязку. Но это получается еще веселее :). Попробую поиграться с Codeception. Можно даже попробовать пробросить API на сторону FitNesse.
  • 0
    Ребята, я правильно понял: чтобы просто попробовать ваш плагин, мне надо собрать плагин из исходников именно на машине с тимсити, поставив туда предварительно jdk и ant?

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