FitNesse


FitNesse — это веб-сервер, вики и инструмент автоматизированного тестирования для программного обеспечения. Он основан на проекте Уорда Каннингема Framework for Integrated Test. FitNesse спроектирован для поддержки приёмочного тестирования более, чем модульного тестирования, в том, что облегчает детальное читаемое описание требований к системе.

FitNesse позволяет пользователям разрабатываемой системы осуществлять ввод в специальном формате (доступном для не-программистов). На основе ввода автоматически создаются тесты. Эти тесты затем исполняются системой, и результаты возвращаются пользователю. Преимущество такого подхода заключается в быстрой обратной связи от пользователей. Разработчик тестируемой системы должен предоставить небольшую поддержку (классы, называемые «фикстурами», удовлетворяющие определенным требованиям).

FitNesse написан на Java. Основателем проекта является Роберт Мартин. Первые версии программы поддерживали только Java, но со временем поддержка расширилась до множества других языков (C++, Python, Ruby, Delphi, C#, etc.)

Введение в FitNesse

FitNesse, как метод тестирования

FitNesse изначально был задуман, как всеобмъемлющий интерфейс к Fit framework. Основным намерением было поддержать agile стиль black-box тестирования приёмочного и регрессионного тестирования.

В FitNesse тестирование основано на понятии чёрного ящика, где тестируемая система рассматривается, как чёрный ящик и проверяется соответствие сгенерированного выхода заданному входу. Тестировщик отвечает за проектирование тестов в функциональном смысле и описания их в FitNesse, а разработчик отвечает за связывание FitNesse и тестируемой системы, так, что FitNesse может исполнять тесты и проверять ожидаемый выход с полученным.

Идея этого метода тестирования, как описано в Fit for Developing Software заключается в том, что усиленное взаимодействие тестировщиков и разработчиков повысит общее видение системы и требований к ней, тем самым подталкивая обе группы общению «на одном языке».

FitNesse, как инструмент тестирования

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

FitNesse упрощает создание тестов, что позволяет тестировщикам и разработчикам сфокусироваться на формировании высококачественного тестового набора, а не изучении механики выполнения тестов. FitNesse облегчает создание тестов тремя способами:

  • Создавать таблицы просто.
  • Просто устанавливать соответствие между таблицей и вызовом к тестируемой системе.
  • Документировать тесты просто и гибко.
  • Чтобы удовлетворить эти требования, FitNesse использует механизм вики. Вики позволяет быстро и удобно создавать HTML страницы и чрезвычайно упрощает описание таблиц. Эти качества делают язык WikiWiki идеально подходящим для «пользовательского интерфейса» FitNesse: с одной стороны он позволяет просто выразить требование в виде таблиц, с другой ограничивает содержимой этих таблиц довольно простым текстом. Это означает, что язык WikiWiki может справиться с любой формой таблицы, необходимой для конкретного теста, и в то же время ограничивает содержимое таблиц численно-буквенным текстом, который можно однозначно перевести в вызову определенной функции программного обеспечения. Итого, так как каждый тест в FitNesse — это вики страница, тестировщик может включить в тест развёрнутое описание требований.

    FitNesse, как программное обеспечение

    FitNesse разработан на Java. Он поставляется в виде единственного исполняемого jar файла, который включает вики движок, встроенный веб-сервер, тестовый движок и все ресурсы (картинки, стили, и так далее) необходимые для создания веб сайта в стиле FitNesse.

    FitNesse сфокусирован на удобстве использования, как инструмента тестирования. Таким образом, он включает все необходимые компоненты: после запуска инструмент запускает встроенный веб сервер, который позволяет получить доступ к страницам с одинаковой лёгкостью как с локальной машины, так и через интернет. Встроенный сервер довольно лёгкий и может быть запущен как на ноутбуке, так и на специализированном сервере.

    Вики движок FitNesse сфокусирован на удобстве. Он не требует наличия базы данных — страницы хранятся в виде файлов. Сразу после первого запуска, вики включает полную документацию на FitNesse и несколько примеров.

    Вики движок довольно примитивный, но содержит все основные средства, распространённые среди вики движков: поиск, история изменений для каждой страницы и обзор файлов. Также доступны некоторые операции рефакторинга, позволяющие удалять, перемещать и переименовывать файлы. В дополнение, движок содержит средства управления тестами, такие как кнопки запуска тестов, способы определения тестовых наборов (Test Suite) и обзор истории результатов тестирования для анализа трендов. Также, вики движок содержит базовые средства авторизации и защиты страниц.

    Выполнение тестов

    Для тестирования в FitNesse необходимы 4 составляющие:

    • Вики страница с описанием теста в виде таблицы принятия решений.
    • Тестовый движок, который интерпретирует содержимое страницы.
    • Тестовая фикстура, которая вызывается тестовым движком и передает управление тестирумой системе.
    • Тестируемая система.

    Из этих четырёх компонент команда разработки создает две: вики страницу и фикстуру.

    Пример

    Для программы деления, таблица, заданная wiki-страницей может выглядеть следующим образом (взято из FitNesse Two Minute Example):

    Связь между движком тестирования и тестируемой системой осуществляется через фикстуру. Для данной таблицы её код на языке Java может выглядеть таким образом:

    public class DivisionComponentTest extends ColumnFixture{ private double num; private double denom; public void setNumeratorValue (double numerator) { num = numerator; } public void setDenominatorValue (double denominator) { denom = denominator; } public double result() { return SystemUnderTest.divide (num, denom); } }

    Для сопоставления таблицы и фикстуры используется convert-to-camel case. Эта нотация применяется ко всем заголовкам таблиц и используется для определения имен классов и методов фикстуры. Колонка с заголовком, заканчивающимся вопросительным знаком, интерпретируется, как выход фикстуры. Остальные колонки используются, как вход фикстуры. Методы фикстуры вызываются в порядке следования колонок таблицы слева направо.

    Тестовые движки

    Описанное выше сопоставление выполняется тестовым движком. FitNesse поддерживает два: FIT и SLIM.

    FIT

    FIT (Framework for Integrated Test) — больше, чем движок, это тестовый фреймворк сам по себе. Изначально FitNesse разрабатывался, как интерфейс к FIT.

    Его идея проста: html текст, который создается сервером, полностью передается на Runner — плагин на конкретном языке программирования. Как следствие из этого Runner должен для каждого языка программирования разбирать HTML текст, понимать, какие команды необходимо вызвать, вызывать эти команды, создавать результирующий HTML. Основной плюс такого подхода — результирующая HTML страница может создаваться по-разному разными плагинами (в том числе NetRunner, например, умеет внедрять .Net Xml Help в обработанный тест, что позволяет видеть подсказки в момент просмотра результата теста). Минус тоже очевиден — разные плагины могут разбирать HTML по-разному.

    SLIM

    SLIM (Simple List Invocation Method) — это альтернатива FIT. Движки SLIM реализуют протокол SLIM. Вместо совмещения всех элементов вики тестирования, SLIM движок занимается только на вызове фикстур; он работает, как отдельный сервер, который удаленно вызывается из FitNesse. Интерпретация вики страниц и генерация страницы результата осуществляется вики движком.

    Архитектура движка SLIM позволяет создавать более легковесные фикстуры, что упрощает создание плагина для FitNesse, однако принципиальных отличий для пользователя FitNesse (как для создателя тестового API, так и для писателя сценариев) нет.