Що таке Лондонська та Чиказька школи TDD?


88

Я чув про стиль Лондона проти Чикаго (іноді його називають стилем Детройту) розвитку Test Driven Development (TDD).

Семінар групи користувача Юта Екстремальне програмування:

TDD у стилі взаємодії також називають мокістським або лондонським стилем після лондонського клубу Extreme Tuesday, де він став популярним. Зазвичай він контрастує з стилем Детройту або класичним TDD, який базується на державі.

Майстерня Джейсона Гормана :

Семінар охоплює як чиказьку школу TDD (тестування поведінки та триангуляцію на основі штатів), так і лондонську школу , яка зосереджується більше на тестуванні взаємодії, глузуванні та завершенні TDD, з особливим акцентом на дизайні, керованому відповідальністю та Скажіть, не запитуйте підхід до ОО нещодавно ре-популяризований чудовою книжкою Стіва Фрімена та Ната Прийса, що зростає об'єктно-орієнтованим програмним забезпеченням, керованим тестами .

Повідомлення Classic TDD або "London School"? Джейсон Горман був корисним, але його приклади мене збентежили, оскільки він використовує два різні приклади замість одного прикладу з обома підходами. Які відмінності? Коли ви використовуєте кожен стиль?

Відповіді:


76

Припустимо, у вас є клас під назвою "головна книга" метод під назвою "обчислити", який використовує "Калькулятор", щоб робити різні типи обчислень залежно від аргументів, переданих "обчислити", наприклад "помножити (x, y)" або "відняти ( х, у) ".

Тепер, припустимо, ви хочете перевірити, що відбувається, коли ви телефонуєте ledger.calculate ("5 * 7").

У Лондонській школі / школі взаємодії ви б хотіли стверджувати, чи викликали Calculator.multiply (5,7). Для цього корисні різні глузуючі рамки, і це може бути дуже корисно, якщо, наприклад, у вас немає власності на об’єкт "Калькулятор" (припустимо, це зовнішній компонент або послуга, яку ви не можете перевірити безпосередньо, але ви робите знайте, вам потрібно зателефонувати певним чином).

Чиказька / державна школа дозволить вам стверджувати, чи є результат 35. Рамки jUnit / nUnit, як правило, спрямовані на це.

Обидва є дійсними та важливими тестами.


Дуже приємний приклад.
sevenseacat

1
Я додаю ще декілька причин використання кожної з них: якщо важливим є визначення того, що щось змінилося чи не змінилося на основі дії, що робиться (наприклад, призначається, що ledger.bucket.value стає 35, коли ledger.calculate ("5 * 7 ") називається), ви хочете використовувати державні твердження (Чиказька школа). Це найбільш корисно, коли ви маєте повний контроль над станом системи до виклику методу та коли ви фактично контролюєте те, що робить метод.
Меттью Флінн

1
Якщо важливо знати, що викликається другий метод (наприклад, Calculator.multiply (5, 7)), ви хочете використовувати твердження діяльності, як через макетний об'єкт. Це найбільш корисно, якщо викликаний метод має бажаний побічний ефект (наприклад, збереження даних, збільшення лічильника, надсилання повідомлення тощо), якщо ви не дуже контролюєте те, що робить метод, тому повернене значення може бути непослідовним . Крім того, якщо ви не можете легко контролювати стан системи, найкраще ви можете зробити визначення того, які дії відбуваються.
Меттью Флінн

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

1
Лондонський підхід також передбачає надання більш чітких сигналів зворотного зв’язку, оскільки, якщо Calculatorрегресує multiply, ви побачите два тести: тест книги та тест калькулятора, але лише один тест не вдається, якщо ви знущаєтесь з калькулятора. Це може полегшити точне визначення помилки, особливо якщо система складна.
Маттіас

30

Стаття « Знущання не є заглушками» Мартіна Фаулера - це хороший вступ до теми.

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

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

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

У другому випадку, оскільки більшість об'єктів навіть не повертають жодного результату (наприклад, voidметоди на Java), вас більше цікавить, як об’єкти спілкуються один з одним і чи передають вони правильні повідомлення за обставин, накладених тестом. Ці взаємодії зазвичай перевіряються за допомогою макетних рамок. Цей вид верифікації називається верифікацією на основі поведінки або взаємодії. Одним із її наслідків є техніка, яка називається Behavior Driven Development, за допомогою якої ви розробляєте клас, припускаючи, що його співпрацівники вже існують (навіть якщо вони ще не існували), тож ви можете кодувати їх інтерфейси.

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

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