Ортогональність одиничних випробувань порівняно з точністю одиничних випробувань


14

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

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

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

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

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

Тож зараз я страждаю на когнітивний дисонанс. Який найкращий спосіб структурувати ці тести?


... не впевнений, що є магічна відповідь. В основному ви перевіряєте речі, які можуть зламатися. Тому в ідеалі ви хоч якось магічно зможете сказати, які випробування низького рівня вже будуть достатньо покриті тестами високого рівня, що їм не потрібні власні одиничні тести нижчого рівня. Ще один спосіб поглянути на це: від часу тестування до моменту, коли розробник виправить проблему, скільки часу пройде? Ви хочете, щоб цей час був низьким. Якби ви не робили одиниці, а лише досконалі функціональні тести (повне висвітлення на високому рівні), цей час все одно був би занадто високим. Спробуйте використовувати це як евристичний посібник.
Calphool

Відповіді:


10

В ідеальному світі ви справді мали б набір ідеально ортогональних одиничних тестів, все на одному рівні абстракції.

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

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


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

2

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

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

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


0

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

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


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