Чим відрізняється інтеграція від одиничних тестів?


307

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

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

Чи фактично ці тести стали інтеграційними тестами, оскільки вони зараз перевіряють інтеграцію цих двох класів, чи це просто одиничний тест, який охоплює 2 класи?

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

Я нерозумію інтеграційні тести, чи дійсно дуже незначна різниця між інтеграцією та одиничними тестами?

Відповіді:


300

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

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

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

Скажіть, у вас є такий спосіб десь такий:

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  Log.TrackTheFactYouDidYourJob();
  return someResults;
}

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

Feature: To be able to do something
  In order to do something
  As someone
  I want the system to do this thing

Scenario: A sample one
  Given this situation
  When I do something
  Then what I get is what I was expecting for

Немає сумнівів: якщо тест пройде, ви можете стверджувати, що ви постачаєте робочу функцію. Це те, що можна назвати Business Value .

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

На практиці ви робите щось на кшталт:

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  FakeAlwaysWorkingLog.TrackTheFactYouDidYourJob(); // Using a mock Log
  return someResults;
}

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

Припустимо, помилка Log.DoSomething(). На щастя, специфікація Gherkin знайде її, і ваші тести завершені не будуть.

Функція не буде працювати, тому що Logвона зламана, а не тому [Do your job with someInput], що не робить свою роботу. І, до речі, [Do your job with someInput]саме цей метод несе відповідальність.

Крім того, припустимо Log, використовується в 100 інших функціях, в 100 інших методах у 100 інших класах.

Так, 100 функцій не зможуть. Але, на щастя, 100 тестів, що завершуються, провалюються і виявляють проблему. І так, вони говорять правду .

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

Тим не менше, DoSomethingтест одиниці зелений, тому що він використовує підробку Log, побудовану для того, щоб ніколи не зламатися. І, так: це явно брехня . Це спілкування зламаної функції працює. Чим це може бути корисно?

(Якщо DoSomething()тест блоку не вдався, будьте впевнені: [Do your job with someInput]є деякі помилки.)

Припустимо, це система з розбитим класом: Система зі зламаним класом

Один помилка порушить кілька функцій, і кілька тестів на інтеграцію не вдасться.

Один помилка порушить кілька функцій, і кілька тестів на інтеграцію не вдасться

З іншого боку, та сама помилка порушить лише один тест на одиницю.

Один і той самий помилка порушить лише один одиничний тест

Тепер порівняйте два сценарії.

Один і той самий помилка порушить лише один одиничний тест.

  • Усі ваші функції використання зламаного Logкольору - червоного кольору
  • Всі ваші тести одиниці зелені, лише тест на одиницю Log- червоний

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

Різниця

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

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

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

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


6
Справді гарна відповідь! Однак я просто хочу додати, що глузування не призначене лише для тестування одиниць. Це також може бути дуже корисним у багатьох тестових випадках інтеграції.
n.Stenvang

1
Чудова відповідь! Я просто не згоден з двома пунктами: 1) тести інтеграції "не мають жодної користі в здогадуванні, де може бути проблема"; і 2) що "тест з одиницею ніколи не повинен охоплювати 2 класи". Я створив безліч тестів на інтеграцію, і коли вони порушуються, зазвичай не важко точно визначити джерело проблеми, за умови, що ви отримаєте повний слід стека або одне невдале твердження (у такому випадку знайти джерело може бути важче, але не стільки, скільки тест на інтеграцію надає контекст для налагодження). (продовжується)
Rogério

5
Одиничні тести можуть проводити кілька класів, за умови, що вони не є загальнодоступними заняттями, які повинні мати власні окремі тести. Один випадок, коли тестувальний клас для громадськості використовує інші непублічні допоміжні класи, які існують лише для підтримки громадського класу; у цьому випадку "підрозділ" включає два або більше класів. Інший випадок полягає в тому, що більшість класів використовують сторонні класи (клас String / string, класи колекції тощо), з яких не має сенсу глузувати або ізолювати; ми просто розглядаємо їх як стабільні та надійні залежності, які виходять за межі тестування.
Rogério

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

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

62

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

Після того, як я написав одиничні тести, щоб переконатися, що Sentence веде себе правильно, коли він взаємодіє зі Word на основі інтерфейсу Word, тоді я пишу тест на інтеграцію, щоб переконатися, що мої припущення щодо взаємодій були правильними. Для цього я постачаю фактичні об'єкти і пишу тест, який виконує функцію, яка в кінцевому підсумку використовує як Sentence, так і Word.


43

Мої 10 біт: D

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

Інтеграційні тести - це наступний крок, який містить один або декілька компонентів і переконайтеся, що вони працюють разом, як слід. Тоді ви вище тонкощів переживань щодо того, як компоненти працюють індивідуально, але коли ви вводите html у свій HtmlEditControl , це якось магічно знає, чи є його дійсним чи ні ..

Це справжня рухома лінія .. Я б краще зосередитися на тому, щоб проклятий код працював на повній зупинці ^ _ ^


23

Одиничні тести використовують макети

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


Я знаю, що це старий пост, але я просто натрапив на нього. Що робити, якщо у вас був третій клас під назвою Font, з яким взаємодіє клас Sentence, і ви хочете перевірити функціональність між класом Word та Sentence, тоді вам довелося б знущатися над класом Font, але це не зробить його одиничним тестом. Тож, що я говорю, це те, що використання макетів не обов'язково робить це одиничним тестом, макети також можна використовувати в інтеграційних тестах.
n.Stenvang

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

17

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

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

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


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

2
Це справжнє seske - важливим бітом є вміння підтримувати залежності до абсолютного мінімуму.
Джон Лім’яп

-1, тест одиниці не перевіряє жодну функцію, а одну функцію або клас програмного забезпечення, тобто перевіряє логічну одиницю програмного забезпечення.
CharlesB

12

використовуючи дизайн єдиної відповідальності, її чорно-білий дизайн. Більше 1 відповідальності, її інтеграційний тест.

За тестом на качок (виглядає, трясе, вадить, його качка), його просто одиничне випробування з більш ніж 1 новим предметом у ньому.

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


10

Характер ваших тестів

Тест одиниці модуля X - це тест, який очікує (і перевіряє) проблеми лише в модулі X.

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

Подумайте про характер ваших тестів наступними термінами:

  • Зменшення ризику : саме для цього тести. Лише комбінація тестових одиниць та інтеграційних тестів може забезпечити повне зменшення ризику, оскільки, з одного боку, тестові одиниці можуть по суті не перевіряти належну взаємодію між модулями, а з іншого боку інтеграційні тести можуть використовувати лише функцію нетривіального модуля незначною мірою.
  • Пробне письмове зусилля : інтеграційні тести можуть заощадити зусилля, тому що вам може не знадобитися писати заглушки / підробки / макети. Але одиничні тести можуть також заощадити зусилля, коли впроваджувати (і підтримувати!) Ці заглушки / підробки / макети буває простіше, ніж налаштування тестової установки без них.
  • Затримка виконання тесту : Інтеграційні тести, що включають важкі операції (наприклад, доступ до зовнішніх систем, таких як БД або віддалені сервери), як правило, повільні (помилки). Це означає, що одиничні тести можна виконувати набагато частіше, що зменшує зусилля налагодження, якщо щось не вдасться, оскільки ви краще уявляєте, що ви змінили тим часом. Це стає особливо важливим, якщо ви використовуєте тестові розробки (TDD).
  • Налагодження зусиль : Якщо тест на інтеграцію не вдається, але жоден з одиничних тестів не робить, це може бути дуже незручно, оскільки існує стільки коду, який може містити проблему. Це не є великою проблемою, якщо ви раніше змінили лише кілька рядків - але оскільки інтеграційні тести працюють повільно, ви, можливо, не запускали їх за такі короткі проміжки часу ...

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

Прагматичний підхід до використання обох

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


10

Під час одиничного тестування ви випробовуєте кожну окрему частину: введіть тут опис зображення

в тесті інтеграції ви протестуєте багато модулів вашої системи:

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

і ось що відбувається, коли ви використовуєте лише тести одиниць (як правило, обидва вікна працюють, на жаль, не разом):

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

Джерела: source1 source2


У вас три зображення, але лише два джерела.
gerrit

1
@gerrit погляньте на перше джерело - звідти дві фотографії
Michu93

1
Люблю цю відповідь 👏
H.

8

На мою думку, відповідь "Чому це важливо?"

Це тому, що одиничні тести - це те, що ти робиш, а тести на інтеграцію - те, чого ти не робиш? Або навпаки? Звичайно, ні, ви повинні спробувати зробити і те, і інше.

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

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

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

Це не має ніякого значення.

Тестування є важливим, ПЕРШИЙ важливий, розщеплення волосся щодо визначень - це марна трата часу, яка лише заплутує новачків у тестуванні.


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

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

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

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

4

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

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

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


4

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

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

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


4

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

Інтеграційне тестування - це фаза тестування програмного забезпечення, в якій окремі програмні модулі поєднуються і тестуються як група.

Вікіпедія визначає одиницю як найменшу тестовану частину програми, що в Java / C # є методом. Але у вашому прикладі класу Word та Sentence я, мабуть, просто напишу тести на речення, оскільки, мабуть, вважаю зайвим використовувати клас макету слів, щоб перевірити клас речень. Таким чином, речення було б моєю одиницею, а слово - це деталь реалізації цього блоку.


4

Інтеграційні тести: Надійність бази даних перевірена.
Тестові одиниці: глузується доступ до бази даних. Методи кодування перевірені.


3

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

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

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


2

Я називаю одиничні тести ті тести, які в білій коробці перевіряють клас. Будь-які залежності, яких потрібен клас, замінюються фальшивими (макетами).

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

Я б не називав тести інтеграції Controller, якщо одна з їх залежностей не є реальною (тобто не підробленою) (наприклад, IFormsAuthentication).

Розділення двох типів тестів корисно для тестування системи на різних рівнях. Крім того, інтеграційні тести, як правило, довгоживучі, а одиничні тести повинні бути швидкими. Відмінність швидкості виконання означає, що вони виконуються по-різному. У наших розробних процесах при тестуванні проводяться одиничні тести (що добре, оскільки вони дуже швидкі), а інтеграційні тести проводяться один / два рази на день. Я намагаюсь запускати інтеграційні тести якомога частіше, але зазвичай потрапляння в базу даних / запис у файли / створення rpc / і т.д. сповільнює.

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


2

Просте пояснення з аналогіями

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

Інтеграційні тести

Інтеграційні тести перевіряють, чи все працює разом. Уявіть собі, що гвинтики працюють разом у вахті. Інтеграційним тестом було б: чи годинник вказує правильний час? Це все-таки повідомляє правильний час за 3 дні?

Все, що вам каже, - чи працює загальний твір. Якщо він не вдається: він не каже вам точно, де він не працює.

Тестові одиниці

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

Приклад: Давайте детально розробимо цей момент на прикладі:

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

Використання заглушок

  • Припустимо, тест на інтеграцію вашого автомобіля не вдався. Це не їздить успішно до Ечуки. Де проблема?

  • Тепер припустимо, що ваш двигун використовує спеціальну систему вприскування палива і що цей тест блоку двигуна також не вдався. Іншими словами, і тест інтеграції, і випробування блоку двигуна не вдалося. Де тоді проблема? (Дайте собі 10 секунд, щоб отримати відповідь.)

  • Чи проблема з двигуном чи системою вприскування палива?

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


1

Трохи академічне це питання, чи не так? ;-) Моя точка зору: для мене тест на інтеграцію - це перевірка всієї частини, а не якщо дві частини з десяти збираються разом. Наш тест на інтеграцію показує, якщо майстер-збірка (містить 40 проектів) матиме успіх. Для проектів у нас є тонни одиниць тестів. Найголовніше, що стосується одиничних тестів для мене, це те, що одна одинична перевірка не повинна залежати від іншої одиничної перевірки. Тож для мене обидва описані вище тесту є одиничними тестами, якщо вони незалежні. Для інтеграційних тестів це не має бути важливим.


1

Чи фактично ці тести стали інтеграційними тестами, оскільки вони зараз перевіряють інтеграцію цих двох класів? Або це просто одиничний тест, який охоплює 2 класи?

Я думаю, що так і так. Ваш тест одиниці, який охоплює 2 класи, став тестом на інтеграцію.

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

Приклад реальної різниці може бути наступним: 1) Масив з 1 000 000 елементів легко перевіряється одиницею і працює добре. 2) BubbleSort легко перевіряється на макетному масиві з 10 елементів, а також працює добре. 3) Інтеграційне тестування показує, що щось не так добре.

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


1

Крім того, важливо пам’ятати, що як одиничні тести, так і інтеграційні тести можна автоматизувати і записати, використовуючи, наприклад, JUnit. У тестах інтеграції JUnit можна використовувати org.junit.Assumeклас для перевірки наявності елементів середовища (наприклад, підключення до бази даних) або інших умов.


0

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

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

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