четверг, 26 апреля 2012 г.

DbUnit: общее описание

Тестирование приложений, взаимодействующих с базой данных, имеет свои особенности. Накопленный девелоперами и тестировщиками опыт можно сформулировать в виде database unit testing best practices.
    * Каждому разработчику по базе данных. При написании тестов очень важно, чтобы состояние схемы базы данных и самих данных не менялось во время написания теста. Поэтому в проектах с несколькими разработчиками каждый разработчик должен работать в персональной базе данных.
    * Тесты должны быть независимы от результатов других тестов. Проще всего достичь этого, возвращая базу данных перед каждым тестом в начальное состояние. Этого можно добиться, очищая содержимое базы данных или просто не сохраняя результаты тестов в базе данных (rollback после каждого теста).
    * Функция очистки всей базы данных. Часто необходимо или неизбежно сохранение промежуточных данных и результатов тестов в базе данных (например из-за DDL autocommit в Oracle). Необходимо разработать процедуру возвращения базы данных в инициальное состояние (как вариант, можно загружать dump базы данных или написать программу, очищающую содержимое всех таблиц в схеме).
    * Маленькие входные данных. Для большинства тестов нет необходимости в полноценном содержимом базы данных. Вместо этого надо стараться создавать небольшие входные данные, специфичные для каждого теста; это облегчит анализ ошибок и сократит время разработки.
    * Общие данные. Многие тесты базируются на подобных данных. Чтобы ускорить процесс разработки тестов, можно создать наборы примитивных данных, которые могут быть использованы различными тестами. Кроме того, можно сохранять эти данные в базе перед выполнением группы подобных тестов, чтобы ускорить тестирование системы.

В мире Java удобным инструментом, позволяющим упростить реализацию и применение перечисленных принципов, является DbUnit (http://www.dbunit.org) - java framework для тестирования баз данных. Фактически, это расширение JUnit с возможностями дополнения и интеграции с другими инструментами разработки (Maven, Spring, Eclipse, Ant). DbUnit позволяет описать желаемое или ожидаемое состояние базы данных в виде обыкновенных текстовых файлов, а затем легко и просто выполнить инициализацию этой БД перед запуском каждого теста или проверить её актуальное состояние после выполнения теста.


----------------------------------------------------------------------------------------------------

Некоторые особенности (объективные и не очень).
+ Экспорт данных из БД в файл, импорт из файла в БД, сравнение данных БД и файла с возможностью настройки фильтров (для включения/исключения отдельных колонок таблиц при сравнении).
+ Поддерживаемые форматы файлов-сценариев: xml, csv, xls.
+ Можно выполнять SQL-запросы напрямую, использовать begin-commit-rollback конструкцию, подготовленные запросы и многое другое.
+ Поддержка таска dbunit для тесной интеграции в ant (<taskdef name="dbunit" classname="org.dbunit.ant.DbUnitTask"/>).
+ Возможность работы с большими объёмами данных в поточном режиме.
+ Поддержка достаточно большого списка СУБД (Oracle, MSSQL, MySQL, DB2, Informix, h2, HypersonicSQL, PostgreSQL, SybaseSQL, InterBase, Derby и пр.).
- Могут проявляться проблемы: при вставке - с правильным порядком вставки записей (например, вставка рекурсивных данных), при очистке содержимого таблиц - с наличием каскадных связей и т.д. Как вариант решения, можно отключать на время связи между таблицами.
- Достаточно большое количество не самого простого кода. Чтобы достигнуть уровня "hello world", можно обойтись несколькими строками. Но если требуется отойти в сторону и выполнить дополнительные настройки приложения - количество и сложность кода заметно увеличивается.
- Пробрасывание библиотекой исключений java.lang.Exception, хотя в действительности могут возникать исключения конкретных типов (IOException, SQLException и пр.).
! Не предназначена для проверки или изменения структуры базы данных (для этого лучше применить http://www.liquibase.org/).

----------------------------------------------------------------------------------------------------

Полезные ссылки

Основы тестирования с помощью Java фреймворка DbUnit. Просто и по теме, для ознакомления и понимания сути.
http://dou.ua/lenta/articles/dbunit-basics/

Пишем и тестируем код, работающий с БД, вместе с DbUnit и LiquiBase.
http://black-zorro.com/mediawiki/Пишем_и_тестируем_код%2C_работающий_с_БД%2C_вместе_с_DBUnit_и_LiquiBase._Часть_1
http://black-zorro.com/mediawiki/Пишем_и_тестируем_код%2C_работающий_с_БД%2C_вместе_с_DBUnit_и_LiquiBase._Часть_2
Это же здесь http://www.nestor.minsk.by/sr/2008/10/sr81015.html

Control your test-environment with DbUnit.
http://www.ibm.com/developerworks/java/library/j-dbunit/index.html

Комментариев нет:

Отправить комментарий