Одиничне тестування збережених процедур


44

Я це досить довго розглядав.

Основне питання: як з'єднати тестові збережені процедури?

Я бачу, що я можу налаштувати одиничні тести відносно легко для функцій у класичному сенсі (я маю на увазі, що вони отримують нульовий або більше аргументів і повертають значення). Але якщо я розглядаю приклад у реальному житті, здавалося б, просту процедуру введення рядка десь, з декількома тригерами, які роблять це, і що до або після вставки, навіть визначити межі "одиниці" досить складно. Чи слід тестувати лише самого INSERTсебе? Думаю, це досить просто, з відносно низьким значенням. Чи слід перевірити результат усього ланцюга подій? Окрім питання, чи це одиничний тест чи ні, проектування відповідного тесту може бути досить напруженою роботою з безліччю додаткових знаків запитання, що виникають на шляху.

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

Тож як ви перевіряєте збережені процедури? Чи є порог складності, коли він стає абсолютно безнадійним? Які ресурси потрібні для обслуговування?

EDIT Ще одне невелике запитання, засноване на відповіді Алекса Кузнецова: Або є прапором, під яким він абсолютно марний?

Відповіді:


32

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

Я написав статтю під назвою « Закрити ці лазівки»: уроки, отримані з тестування модулів T-SQL , а також деякі публікації в блозі

Що стосується вашого питання "Чи є поріг складності, коли він стає абсолютно безнадійним?", Складні модулі потребують тестів набагато більше, ніж прості.

Щоб спростити технічне обслуговування, ми генеруємо очікувані результати та зберігаємо їх в окремих файлах - це робить величезну зміну.


15

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

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

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

Не існує порогового рівня складності на високому або нижньому кінці, який не повинен перешкоджати тестуванню або тестуванню одиниць. Розглянемо ці питання:

  1. Ви завжди пишете безкоштовний код про помилку?
  2. Чи завжди у маленьких одиницях немає помилок?
  3. Чи гаразд у великого підрозділу помилка?
  4. Скільки помилок потрібно, щоб спричинити катастрофу?

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

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

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

@dezso Це чудове запитання та концепція, якій потрібно набагато більше експозиції у світі баз даних.
Лей Ріффель,

"ви повинні протестувати весь ланцюжок подій як одиницю" - це найконтактніша річ, яку ви могли сказати. Це не одиниця, якщо це так. Ви робите інтеграційне тестування
Джо Філіпс

@Joe Philips - Назвіть це, що вам подобається, переконайтесь, що процедура, яка робить вставку і спрацьовує кілька тригерів, робить те, що, як передбачається, потрібно мати автоматизовані тести.
Лі Ріффер

8

Для PostgreSQL перевірте pgTAP :

pgTAP - це набір функцій бази даних, що спрощує написання тестів, що випромінюють TAP, у скриптах psql або тестових функціях у стилі xUnit.


Побачене, дякую. Хтось із цим відчував?
dezso

Так, зараз досить багато людей. Підпишіться на список пошти, якщо у вас є питання.
теорія

6

Якщо ви хочете, щоб тестування збережених процедур було виконано повністю на SQL, перегляньте сторінку http://tsqlt.org/

Він сумісний з MS SQL 2005 SP2 і вище, і перевага полягає в тому, що розробникам не потрібно знати C # або іншу мову для впровадження тестів.

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

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