Десь у вашій кодовій базі є рядок коду, який виконує фактичну дію підключення до віддаленої БД. Цей рядок коду 9 разів по 10 викликає "вбудований" метод, що надається бібліотеками часу виконання, характерними для вашої мови та оточення. Таким чином, це не "ваш" код, тому вам не потрібно його тестувати; для цілі одиничного тестування ви можете довіряти, що виклик цього методу буде виконуватись правильно. Що ви все ще можете і що слід перевірити у своєму тестовому наборі одиниць - такі речі, як забезпечення параметрів, які будуть використовуватися для цього виклику, - це те, що ви очікуєте від них, наприклад, переконання, що рядок підключення правильний, або оператор SQL або збережена назва процедури.
Це одна з цілей обмеження, що одиничні тести не повинні залишати їх "пісочниці" та залежати від зовнішнього стану. Це насправді цілком практично; мета одиничного тесту - перевірити, чи написаний вами код (або збирається написати в TDD) поводиться так, як ви думали. Код, який ви не написали, наприклад, бібліотека, яку ви використовуєте для виконання операцій з вашою базою даних, не повинна входити до сфери будь-якого тестування одиниць з тієї простої причини, що ви її не написали.
У вашому наборі тестів на інтеграцію ці обмеження послаблені. Тепер ви можетедизайнерські тести, які стосуються бази даних, щоб переконатися, що код, який ви написали, добре грає з кодом, який ви не зробили. Ці два тестові набори повинні залишатися відокремленими, оскільки ваш тестовий набір одиниць є більш ефективним, чим швидше він працює (так що ви можете швидко переконатися, що всі твердження, зроблені розробниками про їх код, все-таки зберігаються), і майже за визначенням, тест на інтеграцію повільніше на порядок через додаткові залежності від зовнішніх ресурсів. Нехай вбудований бот обробляє повний набір інтеграції кожні кілька годин, виконуючи тести, що блокують зовнішні ресурси, щоб розробники не наступали на пальці ніг, запускаючи ці ж тести локально. А якщо збірка зламається, то що? Набагато більше значення приділяється тому, щоб робота-бот ніколи не провалювала збірку, ніж, мабуть, має бути.
Тепер, наскільки чітко ви можете дотримуватися цього, залежить від вашої точної стратегії підключення до запиту і запиту до бази даних. У багатьох випадках, коли потрібно використовувати рамку доступу до даних «голі кістки», наприклад, об'єкти SqlConnection і SqlStatement ADO.NET, цілий розроблений вами метод може складатися з вбудованих викликів методів та іншого коду, який залежить від наявності підключення до бази даних, і так найкраще, що ви могли зробити в цій ситуації, - це знущатися над усією функцією та довіряти вашим наборам тестів інтеграції. Це також залежить від того, наскільки ви готові розробити свої класи, щоб дозволити замінювати конкретні рядки коду для тестування (наприклад, пропозиція Тобі щодо шаблону методу шаблону, який є хорошим, оскільки дозволяє "часткові макети"
Якщо ваша модель збереження даних покладається на код у вашому рівні даних (наприклад, тригери, збережені програми тощо), просто не існує іншого способу вправити код, який ви самі пишете, ніж розробити тести, які живуть всередині рівня даних або перетинають межа між часом виконання програми та СУБД. Пурист сказав, що цієї моделі слід уникати на користь чогось подібного до ОРМ. Я не думаю, що я б ішов зовсім так далеко; навіть в епоху мовних інтегрованих запитів та інших перевірених компілятором, залежних від домену операцій стійкості, я бачу цінність блокування бази даних лише до операцій, відкритих через збережену процедуру, і, звичайно, такі збережені процедури повинні бути перевірені за допомогою автоматизованих тести. Але такі випробування не є одиничними тестами. Вони є інтеграцією тести.
Якщо у вас є проблеми з цим розрізненням, воно, як правило, ґрунтується на великій важливості, що надається повному "кодовому покриттю" ака "покриттю одиничного тесту". Ви хочете переконатися, що кожен рядок вашого коду охоплюється одиничним тестом. Шляхетна мета на її обличчі, але я кажу горобку; що менталітет піддається анти-моделям, що виходять далеко за межі цього конкретного випадку, наприклад, написання тестів, що не підтверджуються, які виконуються, але не здійснюютьсвій код. Ці типи кінцевих пробіжок виключно заради кількості покриттів шкідливіші, ніж послаблення мінімального покриття. Якщо ви хочете переконатися, що кожен рядок вашої кодової бази виконується деяким автоматизованим тестом, це легко; при обчисленні показників покриття коду включайте тести інтеграції. Ви можете навіть піти на крок далі і виділити ці спірні тести "Itino" ("Інтеграція лише в ім'я"), а між вашим набором тестових пакетів і цією підкатегорією інтеграційних тестів (які все-таки повинні працювати досить швидко) вам слід заграти близько до повного покриття.