Параметризовані тести - Коли і для чого ви їх використовуєте?


15

Останнім часом на роботі у нас виникли певні розбіжності щодо параметризованого тестування . Зазвичай ми використовуємо стиль TDD (або принаймні намагаємось), тому я розумію переваги цього підходу. Однак я намагаюся бачити тести, які параметризують коефіцієнт посилення. Для довідки, ми працюємо над сервісом і його бібліотеками, які відкриваються через інтерфейс RESTful.

Я бачив поки що тести, які, принаймні, використовують JUnit в межах Eclipse:

  • Недолік деталей - коли тест не вдається, дуже важко побачити параметри, які спричинили його збій
  • Часто складно створити
  • Як правило, створюється після написання коду - строго не є недоліком як таким, але чи люди ставлять перед собою параметризовані тести на увазі, коли вони починають фрагмент коду?

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


1
Проблема не в ідеї, а в незграбній бібліотеці. У C # синтаксис зручніший, коли використовується скажіть MbUnit. Так, це гарна ідея. Додайте власний код, щоб полегшити цей процес - читайте матеріали з файлів - що б не працювало. Подивіться також, як MsTest впорається з цим.
Робота

Ми (Площа) написали Burst, щоб вирішити деякі з цих питань Parameterized. Це, як правило, додає менше котла, і дає зрозуміти, де тест не вдався.
Даніель Любаров

Відповіді:


4

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

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

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

Підхід DOE дає вам систематичний спосіб вибору значень параметрів для зміни.


Надане посилання розривається.
Джош Густ

1
@JoshGust Легко виправляється за допомогою Google. Дякую за голову вгору
Пітер К.

4

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


2

Існують щонайменше два смаки параметризованих тестів, принаймні, у JUnit 4.8. Це: Параметризовані тести ( @RunWith(Parameterized.class)), для яких потрібне джерело даних, яке генерує / зчитує заздалегідь задані конфігурації параметрів, і Теорії ( @RunWith(Theories.class)), які, даючи один або більше наборів можливих входів для кожного типу аргументів, можуть здійснювати специфікацію заданих методів. Це виглядає більш-менш так:

  • укажіть деякі можливі значення ( @DataPoints) для аргументів рядків (наприклад null, порожня рядок, не порожня рядок, дійсно довга рядок)
  • задайте деякі можливі значення ( @DataPoints) для аргументів класу Animal (наприклад null, Dogекземпляр, Catекземпляр, Birdекземпляр)
  • підготувати @Theoryякий приймає Stringпараметр і Animalпараметр. він буде виконуватися при будь-якій можливій комбінації можливих значень параметрів (у наведеному прикладі, що має бути 4х4 = 16 комбінацій, включаючи ( null, null))
  • якщо тестований метод не може прийняти якусь комбінацію, використовуйте Assume.assumeThatстатичний імпорт, щоб відфільтрувати недійсні комбінації (наприклад, коли ви хочете перевірити поведінку методу на непорожні рядки, одним із перших рядків буде "припустити, що це не нуль"

Як було написано раніше - не має сенсу перевіряти кожну можливу комбінацію кожного методу (вона вибухає тестові набори, уявіть тестування методу з 5 параметрами, кожен з яких має лише 5 можливих значень: 5 ** 5 -> понад 3000 тестових пробігів !), але для критично важливих для місії методів (наприклад, методів API) я б заохочував це, просто щоб бути в безпеці ...


1

Загальний приклад:

  • Методи з аргументами рядків. Використовуйте параметризовані тести для тестування різних входів та очікуваних результатів. Набагато практичніше мати список пар (вхідні, очікувані), ніж писати ТС для кожної пари.

  • Застосовуйте один і той же сценарій до різних аргументів. У нас є сценарій , який працює з Animalоб'єктом і мати багато підкласів , такі як Dog, Cat, Bird. Створіть список доступних тварин і протестуйте сценарій на них.

Бетон для веб-сервісу:

  • З наведеного вище прикладу аргументів. Перевірте, що відбувається з різними аргументами одного типу, але різними значеннями.

0

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

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


1
Чому параметри не повинні використовуватись як зручність для запису менше коду? Немає великої чесноти в наданні вичерпного переліку великого набору тестових випадків.
Джонатан Юніс

1
Як ваша відповідь надає більше інформації, ніж інші 5 відповідей?
Адам Цукерман

-2

Один випадок, коли я використовую безліч параметризованих тестів в TDD-ish манері - це написання парсерів - я можу почати зі списку, якщо введення та очікуваний вихід, а потім написати код, щоб він пройшов усі тестові випадки.

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


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