Код тестування побічних ефектів - важкий код


10

Я починаю писати код C ++, щоб запустити робота, і не знаю, як включити тестування одиниць, якщо дійсно можу. Мені була надана бібліотека, яка дозволяє створювати "команди" для роботи, які автоматично плануються та виконуються. Механізм створення цих команд є підклас команди базового класу вони надають, і здійснювати віртуальну void Initialize(), void Execute()і void End()методу. Ці функції виконуються виключно для їх побічних ефектів, які роблять справи роботові (запускають двигуни, подовжують поршні тощо). Через це я дійсно ніде не бачу прикріплювати тестові одиниці до коду, не маючи глузування над усією бібліотекою, щоб я міг перевірити віртуальний до і після станів робота. Чи є спосіб перевірити це, що не надто обтяжує?

Редагувати

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


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

1
Дуже погано, що бібліотека не використовувала композицію замість успадкування, тому що ви могли просто знущатися з класу команд, якби це було так.
Роберт Харві

@Neil Я не зовсім впевнений, про що ти питаєш. Чи можете ви перефразувати своє запитання?
Буде Кункель

Відповіді:


7

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

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

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

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

У продажі ви передасте справжній імпульс RobotControl командам, які ви реалізували.

Я не впевнений, чи це ви мали на увазі і вважаєте громіздким?

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


2
+1. Вам не подобається інтерфейс? Зробіть своє.
Ніл

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

0

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

Це вимагає окремої "тестової збірки" вашого коду.

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

Тоді у вас є команди, які ви можете кинути у свій власний тестовий фреймворк, який викликає ті самі методи, що і бібліотека роботи.

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

Зміна назви базового класу може бути здійснено за допомогою #define або, ймовірно, кращого типу typedef.

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