Для виконання простих тестів цілком прийнятні глузування з шару доступу до бази даних. Ви дзвоните getName()
, він називає DAO, що знущався і повертає "Джон" за ім'ям і "Сміт" за прізвищем, збирає їх і все ідеально. Тут немає необхідності перевіряти базу даних.
Речей стає трохи більше, коли логіка стає дещо складнішою. Що робити, якщо у вас був метод "createOrUpdateUser (...)". Якщо ви знущалися над базою даних, ви можете переконатися, що даний метод був викликаний один раз певним параметром, коли макет не повертає жодних об'єктів, а інший метод викликається в базі даних, коли він повертає назад вже існуючий об'єкт. Це починає переходити до тієї нечіткої лінії, де може бути простіше (особливо, якщо вона вже була там) запустити спеціалізовану базу даних пам'яті і перевірити цей код за допомогою попередньо налаштованих даних.
У деякому фактичному коді, над яким я працював (точка продажу), у нас був resumeSuspededTransaction(...)
метод. Це витягнуло б транзакцію з бази даних в об'єкт (та її компоненти) та оновило базу даних. Ми знущалися над цим, і помилка ховалась у коді десь із серіалізацією та десеріалізацією даних, що надходять до бази даних (ми змінили тип, який серіалізувався по-різному в базі даних).
Макет не показав нам помилку, тому що вона повертала свій щасливий шлях - серіалізуйте транзакцію, зберігайте її в макеті, десеріалізуйте її з макету, перевіряйте, що вони рівні. Однак, коли ви серіалізуєте об'єкт із початковим нулем до бази даних, він їх скидає, а потім рекомбінаціює назад до рядка без нулів. Ми застали помилку без бази даних за допомогою усунення несправностей (виявити це не так складно, як тільки ми дізналися, що вона там є).
Пізніше ми помістили туди базу даних і зрозуміли, що помилка ніколи не потрапила б через тест тестування, якби ми замість цього перейшли до бази даних пам'яті.
У пам'яті баз даних є переваги:
- їх можна швидко запустити (без необхідності DBA встановлювати облікові записи, таблиці тощо) для тестування
- дані можуть бути попередньо налаштовані для цього тесту
- тест не повинен турбуватися про те, щоб повернути тест після закінчення
- кожен тест має свою базу даних в пам'яті, тому вам не потрібно хвилюватися, якщо два тести працюють одночасно
- їх можна запускати в системах, які не мають підключення до реальних баз даних