TDD з функціями SQL та маніпулювання даними


14

Поки я професійний програміст, я ніколи офіційно не проходив навчання в галузі програмного забезпечення. Оскільки я часто буваю тут і так, я помічав тенденцію до написання одиничних тестів, коли це можливо, і, оскільки моє програмне забезпечення стає складнішим і складнішим, я вважаю автоматизоване тестування гарною ідеєю для налагодження налагодження.

Однак більша частина моєї роботи стосується написання складного SQL, а потім певної обробки результатів. Як би ви написали тест, щоб переконатися, що ваш SQL повертає правильні дані, наприклад? Потім скажіть, якщо дані не були під вашим контролем (наприклад, система сторонніх систем), як можна ефективно перевірити свої процедури обробки, не вручаючи писати копії фіктивних даних?

Найкращим рішенням, про який я можу придумати, є перегляд даних, які разом охоплюють більшість випадків. Потім я можу приєднати ці погляди до свого SQL, щоб побачити, чи повертає він правильні записи, і обробляти перегляди вручну, щоб побачити, чи виконують мої функції тощо. І все-таки це здається надмірним і пластовим; особливо знаходження даних для перевірки на ...


Відповіді:


6

Важливим правилом перевірки всього, що пов’язано з базою даних, є повне виділення його від решти програми.

Архітектура портів і адаптерів - справді хороший приклад. База даних розглядається як зовнішній плагін через адаптер до вашої програми. Те саме стосується всіх сторонніх підсистем. Для тестування того, як поводитиметься ваш додаток, та інтерпретації відповідей сторонніх підсистем, єдиний спосіб я знаю, як перевірити, щоб заглушити відповіді цієї індивідуальної підсистеми. Я не обов'язково маю на увазі, що вам доведеться вручну записати всі об'єкти даних. Ви можете легко скористатися підходом до використання тестування, керованого даними.

Що стосується тестування взаємодії вашої програми з вашою базою даних, ви можете підробити адаптери бази даних, наприклад, використовувати базу даних в пам'яті.

Тепер тестуємо запити до вашої бази даних. Перш за все, всі складні запити слід розкласти на більш легкі, прості та передбачувані запити. Те саме, що ви зробили б для жирового класу або для жирової функції. Існують інструменти, які допоможуть вам протестувати вашу базу даних, як-от Dbunit. Простий підхід, який я інколи використовую, полягає у використанні концепції тестів на характеристики. Тож я б поставив базу даних у стан знань, запустив усі запити, які мені потрібно записати, збережіть вихід у місці (файл, пам'ять) і вважаю цей вихід правильним. Наступні пробіги порівняли б їх вихід з цим, так що, безумовно, запропонував би мені тест регресії, який мені потрібен. Дійсно, перший вихід не гарантується правильним, але проблема регресії може бути вирішена таким чином. Якщо ваші запити добре розкладені, ви можете перевірити їх окремо щодо бази даних, яка знаходиться у відомому стані.


3

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

Перегляди, ймовірно, будуть складним способом зробити це, оскільки вони насправді не піддають тесту першому тестуванню червоного світла, зеленого світла одного аспекту на тест, що є кращим у TDD. Також із представленнями ви не можете написати тест спочатку перед кодом. Кращим підходом було б написання збережених процедур, де ви можете додати логіку «стверджувати» в процедуру (наприклад, використовуючи оператори «якщо») для перевірки виходу на помилку. Вам потрібно перевірити лише одне на кожному тесті одиниці, щоб виділити пристрій, і метод SP був би краще для цього підходить. Крім того, за допомогою SP ви можете запустити весь набір з них як сценарії, коли ви розробляєте початковий код, а пізніше під час тестування на регресії при рефакторингу.

Також майте на увазі, що тести повинні бути повторюваними, і вам знадобляться кілька сценаріїв для ініціалізації та руйнування стану бази даних, щоб переконатися, що стан є однаковим для кожного одиничного тесту.

Що стосується вашого питання щодо даних, які не є під вашим контролем, це складний напрямок. Я вважаю, що вам краще знущатися з фальшивими даними і максимально протестувати винятки та кращі умови для одиничних тестів. Інакше це більше потрапить до категорії тестування інтеграції (що також непогано зробити). Для тестування інтеграції ви можете запустити свої тести на сторонніх даних і дати їм генерувати вихідний результат, а для наступних тестів (наприклад, після рефакторингу) переконайтесь, що ці результати повторюють початковий відомий вихід.


Чому ви не можете написати тест для перегляду, який ще не був закодований?
JeffO

Не, якщо ви використовуєте подання як механізм тестування, як запропоновано ОП.
під ключ

1

У якийсь момент вам знадобляться дані тесту. Якщо ви використовуєте сторонню систему, схема вже створена, але вам потрібно буде вирішити майбутні зміни. Сподіваємось, ви можете отримати ці зміни з документації щодо оновлення, але, можливо, ви будете змушені самостійно порівнювати версії бази даних.

Очікувані набори результатів можна зберегти у таблицях баз даних або зовнішніх файлах / електронних таблицях. Я навіть бачив, як CHECKSUM використовується або порівняється. Під час тестування виду / проростка ви отримаєте помилку, оскільки їх не існує. Потім ви створюєте об'єкт з достатньою кількістю коду, щоб принаймні виконати (SELECT -1 як [неправильно_дані]); і ви отримаєте помилку, оскільки він не відповідає встановленому результату. Як тільки вони збігаються, ви маєте своє зелене світло.

Я почав співпрацювати з власниками проектів і просити їх знущатися над звітами в електронній таблиці та намагатися створити часткові дані для мене (Ви можете помістити дані результатів у тестову таблицю.). Спочатку була певна віддача, але вони зрозуміли, що я буду створювати звіт, і їм доведеться все-таки перевірити це. Це економило час у довгостроковій перспективі. Якщо вони хочуть зробити запит на зміну, вони можуть переробити електронну таблицю. Тепер вони можуть відповісти на питання: "Наскільки важко було б додати ...?"


1

Якщо ваша платформа бази даних - SQL Server, є дуже приємний безкоштовний інструмент: tSQLt .

tSQLt - це база для тестування блоку бази даних для Microsoft SQL Server. tSQLt сумісний із SQL Server 2005 (необхідний пакет 2) та вище для всіх видань.

Я успішно використовував для впровадження тестування на рівні бази даних.

Деякі з ключових елементів, які роблять це настільки корисним, включають:

  • Можливість роботи з підробленими таблицями та поданнями, що зменшує налаштування, що нормально
  • Тести автоматично виконуються в транзакціях (настільки легко відновлюються)
  • Ваші твердження можуть зіставляти таблиці (як справжні, так і підроблені), щоб ви могли побачити, чи легко ви змінили будь-які дані
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.