Методи тестування блоку, які викликають постачальників веб-сервісів


10

У мене є клас з одним публічним методом Send()та кількома приватними методами. Він викликає пару веб-служб і обробляє відповідь. Обробка проводиться приватними методами.

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

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

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

Вибачте, якщо це основне питання, я досить новий для одиничного тестування.

Я використовую c # та VS2010


Якщо ви не тестуєте приватний метод, як дізнатися, чи працює він?
Брайан Оуклі

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

@Bryan Oakley дивіться за посиланням
Tom Squires

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

Відповіді:


18

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

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


3

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


3

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

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

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

Для хорошого допису в різних C # глузливих структурах див наступну тему SO:

/programming/37359/what-c-mocking-framework-to-use

РЕДАКТУВАННЯ: Для відверто чутливих я вважаю, що я нехтував згадкою про DbUnit або інші транзакційні інструменти, які можуть повернути зміни бази даних в кінці тесту. Вони також є повторюваними і можуть бути агностичними для оточуючих з генерованими тестовими даними, тому глузлива рамка в цьому випадку не потрібна.


Чи може хтось пояснити сутичку? Я не зірвав на базі даних PHP, ROR, NoSQL, Javascript на сервері, продуктах Apple або будь-якій іншій тенденції, але я все одно отримав зворотне зниження: S
maple_shaft

Напевно, комусь не сподобалось, що їхні одиничні тести називаються "зовсім не одиничні тести" (не я) :)
Daniel B
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.