Чому ми пишемо макетні об’єкти під час написання одиничних тестових випадків?


11

Наразі ми пишемо тестові приклади в нашому проекті. Реалізації для методів бази даних існують і працюють прекрасно. У цьому випадку чому нам потрібно писати макетні об’єкти? Чи є якась конкретна причина? Чому я не можу перевірити реалізацію DAO безпосередньо?

Відповіді:


6

Не слід знущатися над дзвінками до бази даних, тому що це перешкоджає меті. З ЧОГОМУ ЗДОРОВ'ЮТИ, наприклад, дзвінки на ваш DAO з, скажімо, сервісного рівня. Знущання дозволяють перевірити методи ізольовано.

Скажімо, у вас є моделювання ресторану з такою архітектурою:

Cook <=> Server <=> Customer

Ви хочете протестувати кожен шар незалежно. Ось Serverваш рівень обслуговування і Cookможна вважати DAO. Це Serverте, що ви хочете знущатися під час тестування Customer, і Cookце те, що ви хочете знущатися під час тестування Server. Проте Cookодиничні тести повинні перевірити, що реалізація повертає гамбургер, коли замовлений гамбургер, а не гумова шина.


3
Я не погоджуюся з твердженням, що ви не повинні знущатися над дзвінками до бази даних, оскільки це перешкоджає меті. тому що це здається занадто загальним. Як говорять інші нижче, вам потрібно провести випробування все ізольовано. Якщо ви перевіряєте тестування, це доступ до бази даних, обов'язково ваш коментар правильний. Якщо ви перевіряєте тестування, це не доступ до бази даних, то ваше перше речення є неправильним. Я згоден з усім іншим, що ти кажеш. +0. :-)
Пітер К.

6

Це цілком нормально перевірити бізнес-бізнес разом із базою даних. але ці тести називаються інтеграційними тестами, навіть якщо ви використовуєте nunit, junit або phpunit для їх виконання.

Експертні випробування - це спеціалізовані тести, де важливе тестування проводиться ізольовано (тобто бузіністичність без бази даних). Для примушення цієї ізоляції використовуються макети / підробки / ступи.


2

Просто: перевірити фактичний DAO, а не вміст бази даних.

Припустимо, у вашому класі DAO Person є метод getByName (). Ви пишете тест і дзвоните в Person.getByName ("Джон Сміт"). Припустимо, тест не вдався, оскільки хтось вилучив запис Джона з бази даних. Тепер кожне програмне забезпечення CI та ваші керівники / рецензенти можуть стверджувати, що програмне забезпечення є несправним, а насправді це не так. Якщо ви знущаєтесь з БД, ви можете довести, що ваш DAO працює, якщо йому задано правильний рядок з правильної таблиці.

Якщо ви дійсно хочете перевірити саму базу даних, тобто: якщо виконання певного методу DAO приводить дані у певний стан, то це також можливо. Більше того, це справді корисно з дурними моделями даних (EAV, вкладений набір дерев), де ви не можете очікувати, що база даних забезпечить цілісність цілісності. Погляньте на DBUnit, щоб полегшити ваше життя.


1

Ще одна причина - уникати часу виконання фактично запущених команд бази даних. Це може здатися не так вже й багато, але накладні витрати на встановлення та розрив з'єднань з часом збільшаться і, швидше за все, значно збільшать загальний час для запуску тестового набору в порівнянні з використанням макетних об'єктів.


0

Щоб виділити клас, який ви тестуєте. Або якщо тест не вдається, як ви знаєте, проблема в класі, який ви тестуєте, або одна з його залежностей.


Чи використовуєте ви безпосередньо методи виклику та тестування при впровадженні DAO?
Vinoth Kumar CM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.