[Из песочницы] Sparrow — perl фреймворк тестирования и мониторинга web приложений
История создания
Sparrow — очень молодой проект. Возник как надстройка над инструментом swat — DSL, написанным на perl для разработки тестовых сценариев различных web приложений. Описание swat — отдельная тема, которую я, возможно, раскрою в следующих публикациях, но, если в двух словах, то swat — это средство для автоматизация web тестирования, базирующееся на использовании утилиты curl и позволяющее создавать произвольные http запросы и валидировать возвращаемый контент.
Установка sparrow
Ставим как обычный cpan модуль.
$ sudo cpanm Sparrow
После установки в текущем PATH становится доступна утилита sparrow, собственно консольный клиент, предоставляющий весь набор функций фреймворка.
Идеология sparrow
Sparrow задуман как простой консольный клиент позволяющий быстро настраивать и запускать тесты для различных web приложений. Можно выделить два типа базовых операций в рамках данного инструмента — создание тестовой структуры и установка, запуск sparrow плагинов.
Структура sparrow проекта
На данный момент есть три основных сущности, которыми оперирует sparrow — проекты, сайты и плагины.
Проекты — абстракции, позволяющие описывать группы тестируемых приложений. У проекта есть идентификатор, набор плагинов и набор тестируемых сайтов. Вот как это может выглядеть в консольном выводе при работе с утилитой sparrow. Выводим структуру sparrow проекта:
$ sparrow project foo
# sparrow environment initialzed at /home/vagrant/sparrow
project foo info:
[plugins]
swat-mongodb-http
swat-pintod
swat-app-docsisious
metacpan
swat-lighttpd
swat-yars
swat-nginx
[sites]
mongodb-http-server [127.0.0.1:28017]
pintod-server [127.0.0.1:3111]
metacpan [http://metacpan.org]
lighttpd [127.0.0.1:8080]
thorsen [http://home.thorsen.pm/docsisious]
yars_server [localhost:9001]
localhost [127.0.0.1]
Из приведенного вывода можно понять, что данный проект содержит набор плагинов (mongodb-http-server, pintod-server, …) для тестирования соответствующих приложений и набор сайтов, о которых речь пойдет далее.
Сайты sparrow
Сайты в sparrow описывают произвольное тестируемое web приложение. Помимо идентификатора сайт должен иметь базовый URL, являющимся «корневым» URL для http запросов, которые будут приходить во время прогона тестов. В большинстве случаем базовый URL может совпадать с fqdn или IP адресом сервера тестируемого приложения, причем указание схемы и порта необязательно. Если быть точным, base url должен быть совместимым с форматом curl url. Стоит также заметить, что несмотря на то, что curl позволяет взаимодействие и с другими протоколами (ftp, …), sparrow в связке со swat используется только для тестирования приложений по протоколу http.
Вот пример создания сайта в проекте sparrow в случае с приложением типа nginx сервер:
$ sparrow project foo add_site nginx-server 127.0.0.1
Плагины sparrow
Плагины — самая интересная и перспективная особенность sparrow, делающим его мощным средством для тестирования и мониторинг web приложений. Возможно, я плохо искал, но не нашел чего-то похожего в других средствах автоматизации тестирования, причем не только в экосистеме perl, но и других языках программирования.
В двух словах, sparrow-плагин — это переносимый набор тестов (test suite), который можно установить и запустить. Очень понятная аналогия может быть построена на примере различных пакетных менеджером, типа yum в centos или apt-get в debian. Под различные типы приложений должна быть возможность выбрать и установить плагин, инкапсулирующий определенный тестовый набор, который может быть запущен для данного приложения.
На данный момент список sparrow плагинов весьма ограничен, но есть надежда, что члены perl community заметят проект и в скором времени мы сможем увидеть много новых плагинов. Тем более что процесс написания нового плагина в большинстве случаев тривиален и даже не требует знания perl как такового, но, повторюсь, раскрытие данной темы выходит за рамки моего поста и, возможно, будет осуществлено в будущем.
Итак, sparrow плагины могут быть установлены и добавлены к проектам:
$ sparrow plg list
# sparrow environment initialzed at /home/vagrant/sparrow
[sparrow plugins list]
swat-yars | https://github.com/melezhik/swat-yars.git
metacpan | https://github.com/CPAN-API/metacpan-monitoring.git
swat-app-docsisious | https://github.com/melezhik/swat-app-docsisious.git
swat-nginx | https://github.com/melezhik/swat-nginx.git
swat-lighttpd | https://github.com/melezhik/swat-lighttpd.git
swat-pintod | https://github.com/melezhik/swat-pintod.git
swat-mongodb-http | https://github.com/melezhik/swat-mongodb-http.git
Установка плагина на данный момент реализована как обычный чекаут из удаленного git репозитария, возможно в будущем данная функциональность будет переписана с использованием собственных sparrow репоизитариев с версионированием дистрибутивов и прочими удобствами, по аналогии с обычным cpan репозитарием.
vagrant@Debian-jessie-amd64-netboot:~/projects/sparrow$ sparrow plg install swat-nginx
# sparrow environment initialzed at /home/vagrant/sparrow
installing plugin swat-nginx ...
Cloning into 'swat-nginx'...
....
Installing modules using /home/vagrant/sparrow/plugins/swat-nginx/cpanfile
Successfully installed Outthentic-DSL-0.0.4
Successfully installed swat-0.1.68
2 distributions installed
Complete! Modules were installed into /home/vagrant/sparrow/plugins/swat-nginx/local
Установив плагин, нужно прикрепить его к проекту и после этого запустить тестовый набор, используя в качестве входного параметра выбранный сайт (web приложение):
$ sparrow project foo add_plg swat-nginx
# sparrow environment initialzed at /home/vagrant/sparrow
plugin swat-nginx is successfully added to project foo
$ sparrow project foo check_site nginx-server swat-nginx
# sparrow environment initialzed at /home/vagrant/sparrow
/home/vagrant/.swat/.cache/3486/prove/00.GET.t ..
ok 1 - GET 127.0.0.1/ succeeded
# response saved to /home/vagrant/.swat/.cache/3486/prove/p3y5aUKFgj
ok 2 - output match '200 OK'
ok 3 - output match /Server: nginx\/(\S+)/
ok 4 - valid nginx version: 1.6.2
1..4
ok
All tests successful.
Files=1, Tests=4, 1 wallclock secs ( 0.01 usr 0.00 sys + 0.04 cusr 0.00 csys = 0.05 CPU)
Result: PASS
Заключение
На этом наше знакомство со sparrow к сожалению заканчивается, хотя, конечно, еще есть о чем рассказать. Как уже упоминалось, проект еще очень молодой и активно развивается, как, впрочем, и основной компонент для написания тестовых сценариев — swat. Есть надежда, что perl сообщество, да и все те, кому близка автоматизация процессов тестирования и мониторинга внесут свой вклад в историю жизни пока еще маленького, но уже проворного воробья (*).
(*) — «sparrow» — в переводе с английского означает воробей.
P.S.
Не удержусь добавить еще несколько важных моментов, возможно, предвосхищая некоторые вопросы, которые могут возникнуть после прочтения статьи.
- удаленный запуск тестов через web api — такая возможность планируется к реализации в ближайшее время, памятуя о большом количестве систем, позволяющих проверять доступность web сервисов через вызовы во внешние API, например, тот же consul или nagios.
- интеграция с существующими системами непрерывной интеграции и отчетности — так на выходе, после запуска sparrow плагина мы получаем TAP, легко написать парсер, конвертирующий результаты в другие форматы. Скажу больше: так как sparrow при запуске плагинов вызывает swat, который в свою очередь использует perl prove для выполнения тестов, данная возможность по конвертации TAP в разные форматы предоставляется «из коробки», ну или с минимальным написанием кода, детали можно узнать на странице документации swat, в секции «TAP».
- ну и, наконец, вполне резонный вопрос — «где уже тестировалось данное решение (sparrow/swat) ?» Swat зарекомендовал себя как очень удобное средство для быстрой разработки smoke тестов для десятков web приложений в короткие сроки в ходе моей ежедневной работы в качестве devops инженера. Sparrow еще только тестируется, но уже сейчас можно сказать, что данный проект является логическим продолжением swat, a c применением sparrow плагинов есть шанс, что станет востребованным с среде web разработчиков, девопосов и системных администраторов.