LINUX.ORG.RU
ФорумTalks

TDD. Рецепты

 ,


1

3

Всех приветствую.
Случилось у меня тут затишье. В очередной раз наследую чужой говнокод (практически обычная моя работа) для допиливания его до работоспособного состояния. И в связи с чем в пустую голову полезли всякие глупости типа TDD (точней на хабре прочитал в свежей статье).

Так как сам я этим не пользуюсь, хотел бы узнать у благородных донов (смердам и быдлам не беспокоится) как этим всем пользоваться. С теорией я вроде как знаком (я умею в википедию и там в поиск всякий). Но вот на практике как это делать чего-то мне не ясно.

Хотелось бы каких-то рецептов по правильной готовке. Желательно применимо к моей специфике. Обычно я все пишу на Си, и чаще всего для МК и всяких SoC. Опять же, чаще всего все завязано на всякие аппаратные интерфейсы и взаимодействие через них с внешним миром и всякими реакциями на внешние раздражители.

Вот к примеру. Начинаю я новый проект на малоизученном SoC-e. ARM, стандартные IP-core и т д. И надобно мне запилить протокол через UART, моргание лампочками через GPIO, управление периферией по I2C, опрос кнопочек и т д. Ну и начинаю я все это реализовывать. Идея есть, описание алгоритмов есть (по двойному нажатию кнопачки, три раза моргаем зеленым свистком, пишем в уарт «че нада», и по i2c отправляем 2 байта). Будет у меня файл main.c с вызовом всего и главным лупом. И куча файлов с «драйверами» для всех интерфейсов (ну там инициализации, обработчики прерываний и т.д.) Как теперь во все это воткнуть TDD?
Как все это будет выглядеть?
Как это запускать и куда смотреть результат?
пихать в рабочий код кучу ifdef с написанием тестов прям в боевом коде. Или писать еще один проект с отдельным main.c где буду дергать функции из боевого дерева?
Как это автоматически запускать и контролировать успешность выполнения?
Как писать тесты для инициализации аппаратной периферии?
как писать тесты для прерываний?

Или может это вся блаж только для жаболюбов? А для встаиваемых систем это ересь?

★★★★★
Ответ на: комментарий от tailgunner

Да, это так. Извини, что я не смог соответствовать уровню твоих запросов.

Ты всего лишь не смог соответствовать уровню своих запросов.
Так что проси прощение у зеркала.

yax123 ★★★★★
() автор топика

тебе нужен эмулятор твоего железа, причём можно не весь, а процессор + память + уарт. Потом уже в этом эмуляторе гоняешь неизменённый код. Можешь на основе qemu сварганить, только он не детерминистичный, можешь попробовать какой simics достать.

всякие эмуляторы верилогов лучше не использовать, это очень тормозно.

dimon555 ★★★★★
()
Ответ на: комментарий от dimon555

тебе нужен

Это диванная экспертиза или вы лично сами так делаете и можете поделиться конкретным личным опытом?

yax123 ★★★★★
() автор топика
Ответ на: комментарий от e1nste1n

За ссылку конечно спасибо, а нет такого же только с перламутровыми пуговицами, всмысле в виде текста и картинок. Сидеть целый час смотреть на лысого мужика желания нет.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от e1nste1n

релевантно?

немного на промотке посмотрел. в целом похоже релевантность под соточку. Правда это гад не выложил свои слайды в официальную репу.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от e1nste1n

ваше сечкунфу сильней моего. Спасибо.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от e1nste1n

хе-хе. слайды в видео по первой ссылке не совпадают со слайдами из второй.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от UVV

Если на плюсах, то чем гуглтест лучше того же Catch2 + Trompleoloel? Сколько раз на гуглтест не смотрел, всегда кажется жирным, многословным и излишним количеством бойлерплейта.

Tweaker ★★★★☆
()
Ответ на: комментарий от Tweaker

Catch2 + Trompleoloel?

а можно поподробней про Trompleoloel?

yax123 ★★★★★
() автор топика
Ответ на: комментарий от yax123

можете поделиться конкретным личным опытом?

Мой личный опыт достаточно старый, но мало что поменялось.

Во-первых, сперва пишутся тесты, затем код. Во-вторых, код должен быть четко разграничен: здесь играем, там рыбу заворачиваем. Взаимодействие с железом отдельно, логика отдельно. Четкое деление логики на блоки. Отдельно тесты «драйверов», отдельно всего остального. На каждый новый функционал пишутся свои тесты. Старые не выбрасываются, естественно.

Система сборки компилирует объектники, линкует каждый .o файл со своими тестами, запускает их, формирует отчеты. Если всё хорошо, собирается прошивка, в которой общение с внешним миром заменяется кодом, эмулирующим все предусмотренные штатные и аварийные режимы и льющим дамп в порт, заливается в контроллер на стенде, отклонения в дампе идут в отчет. Параллельно все «драйверы» линкуются со своей тестовой прошивкой и заливаются на другой стенд, где на входах тестовые сигналы с генераторов, выходы мониторятся. Где возможно, выход скоммутирован на вход: «зажигание лампочки» выставляет бит в другом порту или дергает прерывание, например. Вместо некоторой периферии (другие контроллеры, датчики, накопитель,…) подключены эмуляторы, ведущие свои логи. В конце собирается «боевая» прошивка, заливается в серийный контроллер на третьем стенде, где гоняется в разных режимах. По результатам — починка, допиливание, рефакторинг и новые тесты. У нас всё было автоматизировано уже через три месяца после запуска проекта. Понятно, что параллельно менялся и код, и ревизии железа, и стенды усложнялись вместе с развитием изделия.

Написание тестов и поддержание инфраструктуры сборки и тестирования отнимали в три–четыре раза больше времени, чем непосредственно работа над кодом изделия. Но это всё равно лучше, чем быстро написать говнокод, а потом пытаться допиливать его.

baka-kun ★★★★★
()
Ответ на: комментарий от Tweaker

Trompleoloel

Мой гугл ничего не показывает. Что это?

чем гуглтест лучше

Удобство интеграции с Cmake, mock'и и тесты в одном флаконе. Про catch2 слышал много хорошего, но моки всё равно отдельно лепить.

UVV ★★★★★
()
Ответ на: комментарий от baka-kun

У нас всё было автоматизировано уже через три месяца

ну наконец-то хоть кто-то кто сам это делал. А можно заглянуть в структуру проектов? Посмотреть на все это в живую и изнутри. Готов подписать NDA. Или на стажировку напроситься?

yax123 ★★★★★
() автор топика
Ответ на: комментарий от UVV

Название этой штуки невозможно запомнить.

https://github.com/rollbear/trompeloeil

Это удобная библиотека для мокинга. Так же как и кэтч - headeronly, поэтому встраивается куда угодно и как угодно, хорошо интегрируется с разными тест-фреймворками.

yax123 тебе не подойдет, потому что c++14 only.

Tweaker ★★★★☆
()
Ответ на: комментарий от Tweaker

тебе не подойдет, потому что c++14 only.

Как сказать. Mike Ritchie про нее упоминал применительно к STM32: https://youtu.be/XuHlDtWYeD8?t=610

Хотя понятно, если компилятор не поддерживает, то ничего не получится. Но кое-кто поддерживает. С другой стороны я с++14 не «поддерживаю». Это уже сложней.

yax123 ★★★★★
() автор топика

Моки на C делаются генераций библиотеки с подменяемой функций по тексту теста. А дальше эта библиотека и линкуется с тестируемым кодом (ну и плюс еще макросы\функции сравнения результата\ожидания и main для запуска всего этого). Да, тут уже получается сильная связь с системой сборки.

Ссылочки: https://club.shelek.ru/viewart.php?id=351 https://club.shelek.ru/viewart.php?id=337 https://club.shelek.ru/viewart.php?id=354

dvetutnev
()
Ответ на: комментарий от yax123

А можно заглянуть в структуру проектов?

Я ушел из проекта в 2001 году. :)

Но там ничего особенного не было: обычный хорошо структурированный C код с вкраплениями ассемблера и несколько Makefile. И SCCS в качестве системы контроля версий. :)

Билд-сервер раз в сутки забирал свежее древо и запускал make, остальное — цели сборки. Система тестирования — суровый инхаус, где самое главное представляли из себя стенды. Все эти эмуляторы цифровых и аналоговых датчиков, эмулятор ATA накопителя — для диагностики протоколов обмена (в изделии использовались CompactFlash и Microdrive). А также записи событий с реального объекта, в том числе аварийных.

baka-kun ★★★★★
()
Ответ на: комментарий от Tweaker

Спасибо за видео, познавательно.

у автора ссылки Билли Боб Тортон на аве.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от baka-kun

Я ушел из проекта в 2001 году. :)

Фига се. С другой стороны скорей всего с тех пор никто так больше не делает. Все равно спасибо.

yax123 ★★★★★
() автор топика
Ответ на: комментарий от dvetutnev

спасибо похоже то, что надо и без богомерзкого видео.

yax123 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.