[Moscow.pm] Как тестировать приложения с базой данных

Ruslan Zakirov ruslan.zakirov на gmail.com
Вт Фев 23 05:47:40 PST 2010


2010/2/23 Иван Бессарабов <ivan на bessarabov.ru>
> Хочу все-таки научится по умному писать тесты.
>
> Вот есть у меня веб приложение, оно активно взаимодействует с базой
> данных. Хочу все это обложить тестами.
> Сейчас делаю так:
>  1. приложение это крутится на тестовом сервере
>  2. есть файл project.conf где прописаны данные для подключения к базе данных
>  3. создал тестовую базу, забил в нее тестове значения и сохранил dump
>  4. в файлах t/*.t есть некоторое количество тестов
>  5. написал скрипт test_it.pl который: а) создает тестовую базу из
> dump-а б) заменяет конфиг файл на файл с данными для подключения для
> тестовой базы в) прогоняет все тесты и отображает их вывод г)
> возвращает конфиг обратно
>
> Это все работает, но я уверен, что можно сделать лучше.
>
> Расскажите, пожалуйста, о вашем опыте тестирования.

Мы приблизительно так и делаем. Раньше делали на одной БД, но
возникает проблема с параллельным выполнением тестов и мусором от
предыдущих тестов. Теперь создаем базу с нуля для каждого теста.
Медленнее, но писать тесты легче.

Конечно тестировать API работы с БД хорошо, но практика показывает,
что использование API тоже может с багами и тестировать web нужно.

Еще вместо  test_it.pl создается MyApp::Test, MyApp::Test::DB и так
далее. Набор удобных функций для тестирования и установки заглушек:
создание БД, перехват исходящей почты, запуск/остановка сервера,
работа с конфигом, создание тестовых записей, временные директории.

Идея с транзакциями мне тоже нравится. Хотя с отдельной БД под тесты
не так актуальна. Раньше мы тестировали на запущенных серверах, то
есть запускаешь веб сервер и тесты работают с той же БД что и сервер.
Было не плохо,  можно было протестировать конкретную комбинацию веб
сервера и СУБД. apache1 vs apache2, mod_perl vs mod_fcgi vs external
FCGI, nginx, lighttpd - большой зоопарк комбинаций в нашем случае. В
последних версиях мы научились запускать apache+mod_perl и apache+fcgi
помимо чисто perl'овго сервера и сразу нашли несколько багов, которые
проявляются в конкретной среде.

Итого:
* скрипт загружает RT::Test
* создаем БД с дефолтными данными
* под тест создается временная директория
* заглушку на почту - пишем в файл письма
* создаем конфиг и лог файлы во временной директории
* генерим конфиг сервера из шаблонов
* по запросу запускаем сервер
* исполняем тесты
* не чистим временную директорию, если тесты развалились

Как так, более или менее работает. Направлений для улучшений
неисчислимое количество.

-- 
Best regards, Ruslan.


Подробная информация о списке рассылки Moscow-pm