Не могу понять чем принципиально инструменты для приёмочного (acceptance) тестирования отличаются от инструментов для модульного (unit), функционального (functional) и даже нагрузочного (load). Что я думаю не так?
Что мы имеем, например, в nosetests — инструменте для модульного тестирования python'ового кода:
- Придумываем некоторое утверждение, например: «Функция вызваная с такими параметрами возвращает 4»
- Пишем код для вызывающий функцию с нужными параметрами, возможно заменяем какие-то объекты mock'ами
- Сравниваем результат
Что мы делаем для функционального тестирования? То же самое:
- Придумываем или берём из ТЗ утверждение
- Вызываем функцию или программу
- Сравниваем результат
Что мы делаем в FitNesse, инструменте для приёмочного тестирования:
- Придумываем или берём из ТЗ какое-то утверждение
- Пишем вызывальщик функции или программы, возможно используем какие-то обёртки для вызова браузера или графической тестилки (Selenium, Sikuli)
- Сравниваем результат
То есть шаги всегда одни и те же: вызываем действие, сравниваем результат. Почему бы тогда не пользоваться тем же nosetest'ом не только для модульного тестирования, но и в качестве пускалки python'овских сценариев запускающих нагрузочные тесты, функциональные тесты, Sikuli, прочее. В нашем распоряжении сразу оказывается язык с большой библиотекой, поддержка на уровне платформы (framework'а) таких вещей как фикстуры, сценарии запускаемые перед тестом, после теста, запуск из командной строки, возможность легко привязать к системе контроля версий. Зачем тогда городить FitNesse, который сам себе standalone вики с возможностью нажать кнопочку test и запустить примерно такие же скрипты, и ответ увидеть не в командной строке, а в виде зелёных прямоугольничков в браузере. Зачем всё это?