[Из песочницы] 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.


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

  1. удаленный запуск тестов через web api — такая возможность планируется к реализации в ближайшее время, памятуя о большом количестве систем, позволяющих проверять доступность web сервисов через вызовы во внешние API, например, тот же consul или nagios.
  2. интеграция с существующими системами непрерывной интеграции и отчетности — так на выходе, после запуска sparrow плагина мы получаем TAP, легко написать парсер, конвертирующий результаты в другие форматы. Скажу больше: так как sparrow при запуске плагинов вызывает swat, который в свою очередь использует perl prove для выполнения тестов, данная возможность по конвертации TAP в разные форматы предоставляется «из коробки», ну или с минимальным написанием кода, детали можно узнать на странице документации swat, в секции «TAP».
  3. ну и, наконец, вполне резонный вопрос — «где уже тестировалось данное решение (sparrow/swat) ?» Swat зарекомендовал себя как очень удобное средство для быстрой разработки smoke тестов для десятков web приложений в короткие сроки в ходе моей ежедневной работы в качестве devops инженера. Sparrow еще только тестируется, но уже сейчас можно сказать, что данный проект является логическим продолжением swat, a c применением sparrow плагинов есть шанс, что станет востребованным с среде web разработчиков, девопосов и системных администраторов.

© Habrahabr.ru