найкраща практика при одиничному тестуванні на вбудовану розробку


45

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

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

Оновлення

Я натрапив на систему тестування на С, яка, здається, є досить успішною при тестуванні вбудованих проектів. Він використовує ідеї глузування з обладнання. Ознайомтеся з Unity , CMock та, можливо, Ceedling .

Оновлення 06 липня 2016 року

Натрапив на cmocka - здається, більш активно працював.


1
За подібних обставин ми поїхали до Cmocka
Mawg

Відповіді:


28

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

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

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


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

3
Кожен окремий продукт, який ми виготовляємо, має апаратний рівень абстракції з реалізацією драйверів для цільової платформи та ПК. Це дозволяє нам легко запускати одиничні тести. Інші переваги: ​​ми також можемо виконувати швидкі тести на систему та розробляти більшість програмного забезпечення без будь-якого обладнання (як це доступно пізніше).
MaR

15

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

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

Використовуючи TeraTerm як інжектор сигналу послідовного порту та записуючи деякі макроси TeraTerm (займає близько 20 хвилин), існує величезний набір автоматизованих тестів, які можна виконати проти будь-якої частини вбудованої системи - будь то драйверний шар, O / S, шар 4-5 тощо. TeraTerm: http://en.sourceforge.jp/projects/ttssh2/

Якщо послідовний порт недоступний у вбудованій системі, використовуйте апаратний інструмент для перетворення даних USB / послідовного порту в цифрові сигнали (також недорогий і простий у досягненні). Коли ви читаєте це, я використовую плату мікроконтролера на суму 30 доларів (UBW: http://www.schmalzhaus.com/UBW32/ ) для тестування вбудованої системи для виробництва шляхом введення стимулу через макроси TeraTerm, які надсилаються через USB / серійний мікроконтроллер, який працює з модифікованою прошивкою, яка здійснює цифрові входи та контролює цифрові виходи цільової вбудованої системи. У поєднанні з цим ми розробили сценарій python (використовує pyserial та pexpect) для автоматизації введення даних та перевірки даних. Жодне з них не є важким і жодне з них не є дорогим. На мій досвід, менеджери витрачають великі гроші (наприклад, на тестове обладнання в розмірі $ 30 000), коли команда випробувальників недосвідчена і не може осмислити ці прості рішення - на жаль, обладнання загального призначення з великим залізам часто не включає тестові справи які сприймають найгірші терміни / тощо цільової системи. Тож недорогий метод є кращим для тестового покриття. Хочеш - вір, хочеш - ні.


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

2
Просто не запускайте мене в LabView .. це зазвичай жахливі речі.
Джонатан Клайн IEEE

1
Наші інженери-тестові обожнюють LabView, я сам цього не дуже розумію.
tehnyit

Це досить близько до того, що я роблю для різних тестувань, тільки я використовую Python та їх послідовну бібліотеку. Тоді я міг би підключити мої тести низького рівня до тестерів одиниць Python разом із чимось на зразок Flask / Qt, щоб також було зручним фронтенд.
radix07

5

Це дуже складна проблема.

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

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


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

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

4

Редагувати: моя відповідь близька до mattnz, я думаю ...


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

Тестування однієї зовнішньої операції

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

Ці тести:

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

Тестування логіки (код, алгоритм), що з'єднує зовнішні операції

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

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


3

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

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

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

Існує кілька емуляторів ARM з відкритим кодом, які запускають одну підпрограму, яка сама може викликати інші підпрограми, які можна використовувати для налагодження налаштування продуктивності підпрограм, які не залежать від апаратного доступу. Я з великим успіхом використав один із них, щоб оптимізувати шифр AES для ARM7TDMI.

Ви можете написати простий тестовий джгут на C або C ++, зв’язати з ним клас або підпрограму, яку перевіряють, а потім запустити в тренажері.

Я багато років обмірковував подібну проблему, як встановити тест коду ядра Linux або Mac OS X. Це повинно бути можливо, але я ніколи насправді не намагався. Можливо, це створити повне ядро, а не тестувати свій код окремо, при цьому тестова рамка блоку пов'язана безпосередньо у вашому ядрі. Потім ви знімете тестові пристрої з якогось зовнішнього інтерфейсу.

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


3

Як і у випадку з TDD, що не вбудовується, об'єкти знущань , безумовно, є вашим другом.

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

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

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

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


+1 для нанесення макетних предметів на тарілку, @mark. Одна з проблем полягає в тому, що забезпечення точності макетних об'єктів, що означає розуміння об'єкта, що підлягає знущанню, має бути досить глибоким. Це добре, оскільки змушує розробника розуміти поведінку зовнішніх об'єктів, з якими він взаємодіє.
tehnyit

1

У вбудованому розробці ви часто робите граничне сканування, щоб перевірити, чи працює вся програма (включаючи обладнання). Також див. JTAG для в налагодженні системи.

Тестування чистих програмних програм без посилання на апаратне забезпечення можна виконати за допомогою стандартного фреймворку C Test Test, наприклад Check . Але остерігайтесь обмежень пам’яті (особливо стека простору тощо на невеликих пристроях). Знайте свої договори! Ви також можете спробувати абстрагувати програмне забезпечення від апаратного забезпечення, щоб отримати ширше покриття тесту, але це, як правило, дорого з точки зору продуктивності на вбудованих пристроях, таких як невеликі PIC або AVR. Однак ви можете знущатися з апаратними портами, щоб досягти більшого покриття (і, звичайно, ви можете перевірити і цей макет).

Можна також спробувати використовувати емулятори для мікросхеми чи мікросимулятори, але такі інструменти дорогі (особливо в комбінації) і складні.


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