Тестовий розрив між одиницею та інтеграцією: інтеграція у малі тести інтеграції компонентів та одиниць


9

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

Частий сценарій з'являється, коли Aі Bобидва використовують компонент C. Однак Aі Bмають дещо інші вимоги до, і висловлюють дещо різні припущення щодо C. Якщо я розробник, Aяк і де я перевіряю свої припущення C?

Очевидно, що тестування в одиницях Aз глузливими припущеннями Cє чудовим для тестування поодиноко A, але воно не перевіряє самі припущення.

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

Для обрамлення цього на конкретнішому прикладі: Припустимо, що це вузольна програма. A, і Bзалежать від того, Cщоб прочитати файл (серед іншого) та зберегти вміст файлу в переданому об’єкті C. Спочатку всі файли, які Cобробляють, є невеликими, і їх можна читати синхронно без істотного блокування. Однак розробник Bрозуміє, що його файли стають величезними, і йому потрібно перейти Cна читання асинхронізації. Це призводить до помилки синхронної синхронізації A, яка, як і раніше, передбачає Cчитання файлів синхронно.

Це тип помилки, який, як відомо, важко відстежити від повних інтеграційних тестів і може взагалі не потрапити в інтеграційні тести. Це також не зачеплене As-тестовими одиницями, оскільки Aприпущення s є глузуючими. Однак це може бути легко спіймане "міні" інтеграційним тестом, який здійснює просто Aта C.

Я знайшов лише кілька посилань на цей тип тестування. Інтеграція в малому , компонентному інтеграційному тестуванні , одиничному інтеграційному тестуванні. Це також дещо стосується напряму тестування BDD, а не формального тестування TDD-одиниць.

Як заповнити цей пробіл для тестування? Конкретно - куди я ставлю такі тести? Як я знущаюся над введеннями Aта C"міні" інтеграційними тестами? І скільки зусиль потрібно докласти для розмежування проблем тестування між цими тестами та одиничними тестами? Або є кращий спосіб заповнити тестовий пробіл?


1
Чи розглядали ви версію модулів змінного струму та використовувати якусь форму управління залежностями?
miraculixx


1
@gnat Дякую за пораду. Я зробив питання менш розпливчастим.
mjhm

@miraclixx Дякуємо за вашу пропозицію. Не могли б ви детальніше? Якщо ви маєте на увазі щось на зразок blog.nodejitsu.com/package-dependitions-done-right - я думаю, що це вирішує іншу проблему, ніж я про це прошу. Компоненти, про які я маю на увазі, як правило, занадто малі для незалежної версії як модуль вузла - наприклад, файл компонентів Model або Controller. Крім того, версія має лише підказки щодо безпеки та джерел збоїв, а не явне тестування конкретних проблем.
mjhm

Відповіді:


6

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

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

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

Інтеграційні тести не повинні бути "цілою програмою", хоча вони часто такі налаштовані. Вони можуть бути тестовою установкою, яка запускає A і C разом, не запускаючи решти програми (або якнайменше, ніж ви можете уникнути). На даний момент я не можу надавати рекомендації, оскільки це залежить від того, що роблять ці компоненти та як вони взаємодіють з іншою частиною вашої програми, але, як правило, ви можете написати тестову установку, яка забезпечує тестове покриття обох компонентів. Чи варто докладати зусиль для цього, чи ефективніше інтеграція перевірити всю програму як єдину (навіть якщо ви запускаєте підмножину тестів на інтеграцію) - це щось, на що ви можете відповісти. Більшість тестів на інтеграцію складаються з багатьох розділів, тому, сподіваємось, ви зможете запустити лише ті, що стосуються цих 2 компонентів (а якщо ні,


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

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