Тестування БД з допомогою DBUnit
Якщо ви займалися написанням тестів для БД в Java, то швидше за все зіткнулися з проблемою попереднього заповнення таблиць даними. Писати код для заповнення таблиць - не дуже зручно. Одне з рішень нам представляє фреймворк DBUnit.
DBUnit - open source фреймворк який допомагає з вирішенням таких проблем як заповнення баз даних, таблиць, порівняння таблиць та наборів даних з БД. Він же, є розширенням для JUnit.
Крок 0. Знайомство з DBUnit
Де і навіщо використовується дана технологія?
Перед написанням будь-якого програмного продукту, він проходить ряд тестувань. Так як більшість з них використовують бази даних, має сенс перевіряти роботу коду з базою.
Основним є заповнення бази, порівнювання результату, таблиць, очищення бази після виконання тестів. Всі ці операції цілком здійсненні з використанням JUnit. Але, коли база має безліч зв'язків, потрібно перевіряти безліч змін, код розростається до величезних розміром.
У свою чергу, DBUnit дає можливість автоматичного очищення бази, винести набір даних для заповнення в xml файл, а також проводити порівнювання даних цілими наборами. Що забезпечить краще покриття тестування і зробить код більш акуратним.
Крок 1. Додавання залежностей
Займемося тим, що для початку використання, нам необхідно підключити дану бібліотеку. Використовуємо для цього залежність в Maven.
Так само, DBUnit для своєї роботи вимагає наявність Логгер. Додаємо його в наш проект.
Після цього підключення DBUnit закінчена. Тепер залишилося додати інші необхідні бібліотеки в наш проект. Нам знадобиться бібліотеки для наше БД - Mysql. JPA. Hibernate. а також JUnit. Нижче кінцевий варіант конфігураційного файлу Maven з усіма підключеними бібліотеками.
Крок 2. Створення сутностей для тестування
Створимо сутність яку будемо тестувати за допомогою DBUnit. Я вибрав Pеrson. Для поняття цього кроку можуть знадобиться знання з JPA. Детально про це можна подивитися в уроці JPA робота з базою даних.
Крок 3. Створення сервісу для управління сутністю
Для управління створимо сервіс. Він буде видаляти, додавати, редагувати і отримувати об'єкт (и) нашого класу з бази даних.
По закінченню настройки проекту у нас в повинна вийде в main така ось структура:
Крок 4. Знайомство зі структурою тесту
Розглянемо, як виглядають структура нашого тесту.
PersonTest - тести для нашої «персони»
DBUnitConfig - наш конфігураційний клас, який дасть нам можливість швидше створювати тести DBUnit. Він містить налаштування бази даних і поведінки тесту.
db.config.data - містить всередині настройки до бази даних
person-data.xml - всередині містить набір даних (dataset) для ініціалізації бази.
person-data - *. xml - містить набір даних який повинен бути отриманий після виконання будь-яких операцій з БД.
Крок 5. Конфігурація DBUnit
Займемося налаштуванням нашого DBUnit. Створимо клас, наслідуючи від якого ми будемо мати можливість в нащадків використовувати наш налаштований функціонал і не потрібно буде налаштовувати його кожен раз.
IDatabaseTester tester - об'єкт, функціоналом якого ми будемо проводити порівнювання табличок і бд.
Properties prop - тут ми будемо зберігати наші дані для БД. налаштування підключення
IDataSet beforeData - об'єкт, який містить наші дані для ініціалізації бд перед виконанням тесту.
setUp () - в цьому методі ми инициализируем дані, необхідні перед виконанням тесту. Тут ми визначаємо наш тестер
public DBUnitConfig (String name) - конструктор ініціалізує нашу БД в системі для подальшого отримання доступу і можливості в подальшому здійснювати взаємодії.
getDataSet () - повертає наш набір даних
DatabaseOperation getTearDownOperation () - очищає БД після виконання тестів
Крок 6. Створення тестового класу для заповнення бази
Тепер напишемо наш тестовий клас, який буде заповнювати і чистити наші дані, перевіряти їх на відповідність.
setUp () - переобумовленої метод для того, щоб передати в нього наш набір даних для конкретного тесту.
FlatXmlDataSetBuilder (). Build (...) - створює набір даних з переданого йому в потоці файлу xml який містить в собі опис даних, які повинні будуть записані до відповідних таблички. Складається з тега верхнього рівня dataset всередині якого знаходяться теги з атрибутами. Назва тега - ім'я таблички, атрибути всередині - атрибути таблички в БД.
Крок 7. Порівнювання значень
На цьому кроці ми проведемо тестування результатів використовуючи можливості DBUnit. Цю можливість нам дасть інтерфейс IDatabaseTester. Цей інтерфейс дозволяє проводити тестування БД без використання успадкування, як робили ми. Бібліотека DBUnit має в собі клас (Assertion) для проведення порівнювання таблиць або цілих наборів даних між собою. Ми будемо порівнювати цілий набір даних.
Розглянемо приклад перевірки правильного заповнення БД в методі testGetAll ()
Насамперед створюємо набір очікуваних даних:
Створюємо набір даних з існуючих даних в БД:
Робимо порівнювання наборів даних:
У випадках, коли порівнюються таблички або набори даних в яких присутній поле типу auto increment можуть бути помилки при прямому порівнюванні так як, при видаленні одного поля і додавання нового з БД, індекс буде рости, що не буде відповідати індексу з набору даних в xml файлі . Тому, одним рішенням є ігнорування поля, як ми робили вище.
Ми розглянули 2 типу використання DBUnit для проведення тестування.
Перший, наслідуючи від DBTestCase. Таким чином ми отримали клас з конфігураціями для подальшого використання в інших тестах для швидкої їх конфігурації і заповнення.
Другий, використання IDatabaseTester. Дає нам можливість також заповнювати дані бази з xml файлу, використовуючи код нижче:
Правила передруку сайта www.DevColibri.com
Шановний відвідувач проекту!
Вам дозволяється вільно використовувати в своїх цілях будь-який документ при дотриманні наступних умов:
• В кінці передруковувати документа Ви зобов'язані вставити посилання на сайт www.devcolibri.com.
З повагою, Адміністратор!
[email protected]