Скільки насмішок - це «правильно»?


10

Я назвав це питання жартома, бо впевнений, що "це залежить", але у мене є конкретні питання.

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

Тому я був здивований, що Рой Ошерово запропонував у цьому відео, що вам слід використовувати глузування лише щось на зразок 5% часу. Я б здогадався, що ми сидимо десь між 70-90%. Час від часу я також бачив інші подібні вказівки .

Я повинен визначити, що я вважаю двома категоріями "інтеграційних тестів", які настільки виразні, що їм дійсно слід присвоювати різні назви: 1) Тести в процесі роботи, що інтегрують декілька модулів коду, і 2) Тести поза процесом, які говорять до баз даних, файлових систем, веб-служб і т. д. Мене хвилює тип №1, тести, які інтегрують кілька модулів коду в усі процеси.

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

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

Дано об'єктну модель наступним чином:

введіть тут опис зображення

... Також врахуйте, що глибина залежності нашого додатка йде набагато глибше, ніж я міг би поміститися на цьому зображенні, так що між 2-4 шаром та 5-13 шаром є кілька шарів N.

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

В іншому випадку мені знадобиться побудувати конкретні екземпляри з 2, 3 та 4. Це може бути складніше, ніж просто додаткове введення тексту. Часто до 2, 3 і 4 будуть вимоги до конструктора, які можуть бути складними для задоволення, і відповідно до графіка (і відповідно до реальності нашого проекту) мені потрібно будувати конкретні екземпляри від N до 13, щоб задовольнити конструкторів 2, 3 і 4.

Ця ситуація стає більш складною, коли мені потрібно 2, 3 або 4 поводитись певним чином, щоб я міг перевірити просте логічне рішення у №1. Мені може знадобитися зрозуміти та "розумово міркувати" про весь графік / дерево об'єкта відразу, щоб отримати 2, 3 або 4, щоб поводитись необхідним чином. Часто здається, що набагато простіше зробити myMockOfModule2.Setup (x => x.GoLeftOrRight ()) .Повертає (новий Right ()); перевірити, що модуль 1 відповідає так, як очікувалося, коли модуль 2 скаже, що він повинен рухатися правильно.

Якби я перевіряв конкретні екземпляри 2 ... N ... 13 разом, тестові установки були б дуже великими і переважно дублювались. Невдачі тесту можуть не дуже вдало визначити місця відмов регресії. Тести не були б незалежними ( ще одна підтримка ).

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

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


Мені здається, ніби ваша програма могла б отримати користь від нещільного зчеплення. en.wikipedia.org/wiki/Loose_coupling
Роберт Харві

1
Or is there perhaps some assumption in typical unit testing guidance that the layers of dependency in most applications will be shallow enough that it is indeed reasonable to test all of the code modules integrated together (making our case "special")? <- Це.
Роберт Харві

Також варто відзначити: мета регресійних тестів (особливо інтеграційного тестування) - довести, що ваше програмне забезпечення все ще працює, а не обов'язково визначати, де воно працює. Це можна зробити за допомогою усунення несправностей, виправити проблему, а потім покрити конкретну поломку додатковими тестами.
Роберт Харві

Я повинен був бути зрозумілішим в початковому дописі, сказати, що модуль 1 знає лише I2, I3 та I4. Модуль 2 знає лише I5, I6 та I7. Тільки сумнівна мета тестування без використання макетів могла б дати конкретні 2, 3 та 4 до 1, що призвело б до описаних мною викликів. Інакше ми закінчуємо макетами набагато більше 5% часу.
ardave

Я якось пожартував, коли наш випадок був "особливим", прочитавши публікацію в блозі про багато команд, які відмовилися від цінних конвенцій, оскільки вони неправильно вважали, що їх ситуація "особлива". Але якщо це насправді наш випадок, це пояснило б невідповідність між деякими прочитаними вказівками громади та деяким реальним досвідом моєї команди. (5% проти 70-90%)
ardave

Відповіді:


4

Чи наша команда зловживає знущаннями?

Не на перший погляд.

Якщо у вас є модулі 1..13, то кожен повинен мати свої одиничні тести, і всі (нетривіальні, ненадійні) залежності повинні бути замінені тестовими версіями. Це може означати знущання, але деякі люди є педантичними з іменуванням, тому підробки, прокладки, нульові об'єкти ... деякі люди відносять усі тестові реалізації як "макети". Це може бути джерелом плутанини щодо того, наскільки це "правильно".

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


Тоді мені було б цікаво, чи є якісь загальні вказівки щодо того, коли найкраще тестувати кодові модулі в ізоляції порівняно з тестуванням більш ніж одного модуля коду, інтегрованого разом. Схоже, що коли я інтегрую будь-які два модулі, які я міг би бути інакше ізольованим, я відкриваюся перед низкою небажаних питань: відсутність точного визначення причин регресії / декілька тестів, які не вдаються до однієї регресії, надмірних налаштувань тесту тощо. У мене є власне інтуїтивне відчуття ("слухайте тести"), але це залишило мене на рівні 70-90% макетів.
ardave

1
@nono - З мого досвіду, ви повинні перевірити все ізольовано, з тих причин, які ви згадали. Єдине, що ви не ізолюєте тест - це речі, які ви не можете, оскільки вони суперечать якійсь файловій системі чи іншому зовнішньому ресурсу ( щось це має робити).
Теластин

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