Чи насправді варто одиничне тестування клієнта API?


38

Це те, що мене певний час турбує. Чи насправді варто одиничне тестування клієнта API?

Скажімо, ви створюєте невеликий клас для абстрагування відклику викликів до програмного забезпечення REST API. Зоомагазин - це дуже простий API, і він має базовий набір методів:

  • listProducts()
  • getProductDetails(ProductID)
  • addProduct(...)
  • removeProduct(ProductID)

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

Я майже впевнений, що мені щось не вистачає, чи я неправильний кінець палиці, або я не бачу деревини для дерев. Чи може хтось поставити мене на правильний шлях?


1
Якби це був не такий простий API з основними методами, ви відчували б себе по-різному? Навіть сарай повинен стояти до снігу.
JeffO

Відповіді:


31

Завдання віддаленого клієнта API - видавати певні дзвінки - ні більше, ні менше. Тому його тест повинен підтвердити, що він видає ці дзвінки - ні більше, ні менше.

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

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


Ммм, не впевнений, що я згоден. Ви можете перевірити те, що foo()телефонує раніше bar(), але це не означає, що дзвонити foo()раніше, bar()це правильно. тест одиничного типу, який би пройшов, навіть якщо код неправильний. І якщо це все, що робить клієнт, налаштування макетів, які перевіряють, чи foo()не викликається раніше, bar()є досить клопітким щодо того, що можна перевірити побіжним поглядом на код клієнта.
Doval

1
Ви можете перевірити, що add()метод додає два числа правильно, але це не означає, що додавання - це правильно робити в цей момент в алгоритмі - add()тест одиниці мав би успіх, навіть якщо ваша програма неправильна. Якщо це не те, то ваш levenshteinDistance()метод винен, а НЕ add()метод. Це точно так само. Точка , що має код поділяється на методи завжди , що кожен метод має тільки дбати про те , щоб одна річ правильно.
Кіліан Фот

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

2
"Тому його тест повинен підтвердити, що він видає ці дзвінки". Я думаю, що це така перспектива, яку я не бачив. Спасибі!
Філіп Б Олдхем,

1
Так, наприклад, мій модульний тест міг би перевірити, що, зважаючи на певні параметри, тіло запиту, про яке йдеться, є правильним?
Марія Інес Парнісарі

9

Коротка відповідь:

Усі методи повинні бути перевірені одиницею.

Довга відповідь:

Так. Воно того варте.

Ось деякі елементи тестування тих методів виклику API, які слід перевірити:

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

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


Ви кажете "знущалися чи ні" ... так це добре перевіряти реальний API? Чи можу я назвати це тест на інтеграцію, навіть якщо це схоже на тестовий блок? Або є інша річ, щоб це назвати? Я хотів би перевірити, що моя обгортка API так чи інакше робить те, що говорить,
Dan Rosenstark

1
@DanRosenstark Я думаю, що якщо сервіс API не знущається, це інтеграційний тест.
Tulains Córdova

Хіба ви не дізнаєтесь через 5 секунд, якщо ви отримуєте відповідні дані належним чином під час фактичного виклику в API? Оскільки макети API не є реальними дзвінками, єдиним способом їх виходу з ладу є те, якщо вони змінять API ... у такому випадку ваші макетні тести пройдуть, але реальні дзвінки не зможуть. Здається безглуздим
MattE

5

Це не будуть одиничні тести, оскільки ви тестуєте вхід і вихід вашої системи, більше схожі на обмежені тести інтеграції.

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

Помилка, яку ви робите тут, полягає у винаході коліс: Здійснення дзвінків до віддалених служб та API - це дуже поширений сценарій, тому є кілька досить хороших інструментів, які допоможуть вам перевірити це. Востаннє я працював над додатком, який підключався до віддалених сервісів, я використовував SoapUIякий може переглядати службу і або робити знущальні дзвінки до цієї служби, або поводитись як локальна копія сервера, на яку можна робити тестові дзвінки та відстежувати запити та відповіді. Налаштувати декілька хвилин, а також дуже швидко оновилося, якщо змінився віддалений інтерфейс. Я не використовував його в сценарії REST, але навіть якщо він не працює для цього (або, можливо, хтось читає цю відповідь у майбутньому, коли існуватимуть кращі інструменти), ви повинні мати змогу знайти інструмент, який може знущатися. послуга для вас, і коли настане час розгорнути свій код, ви будете раді, що зробили.

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