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!!“ », и это реально работает :).

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

    Просьба не судить плагин чересчур строго — он еще «молодой и неопытный» :) Если кого-то заинтересовало, то не стесняйтесь его допиливать/довешивать так, как душе угодно. И пускай всем будет польза.
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 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?

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