Этим летом я работал над встроенной системой, написанной прямо на C. Это был существующий проект, который перешла к компании, в которой я работаю. Я привык к написанию модульных тестов в Java с использованием JUnit, но не знал, как лучше написать модульные тесты для существующего кода (который требует рефакторинга), а также для добавления нового кода в систему.
Существуют ли какие-либо проекты, которые делают модульное тестирование простым C-кодом столь же простым, как модульное тестирование Java-кода с помощью JUnit? Будем весьма благодарны за любые идеи, которые будут относиться конкретно к встраиваемой разработке (кросс-компиляция на платформу arm-linux).
c
unit-testing
testing
embedded
Пол Осборн
источник
источник
Ответы:
Один из модулей модульного тестирования в C - это Check ; список фреймворков для модульного тестирования на C можно найти здесь и воспроизвести ниже. В зависимости от того, сколько стандартных функций библиотеки имеет ваша среда выполнения, вы можете или не сможете использовать одну из них.
Больше рамок:
CMocka
CMocka - это тестовая среда для C с поддержкой фиктивных объектов. Это просто в использовании и настройке.
Смотрите домашнюю страницу CMocka .
критерий
Criterion - это кроссплатформенная инфраструктура модульного тестирования C, поддерживающая автоматическую регистрацию тестов, параметризованные тесты, теории и способная выводить данные в несколько форматов, включая TAP и JUnit XML. Каждый тест выполняется в своем собственном процессе, поэтому при необходимости можно сообщать о сигналах и сбоях.
Смотрите домашнюю страницу Критерий для получения дополнительной информации.
HWUT
HWUT - это общий инструмент модульного тестирования с отличной поддержкой C. Он может помочь создавать Make-файлы, генерировать массивные тестовые примеры, закодированные в минимальных «таблицах итераций», проходить по конечным автоматам, генерировать C-заглушки и многое другое. Общий подход довольно уникален: вердикты основаны на «хороший стандартный вывод / плохой стандартный вывод». Функция сравнения, однако, является гибкой. Таким образом, любой тип сценария может быть использован для проверки. Это может быть применено к любому языку, который может производить стандартный вывод.
Смотрите домашнюю страницу HWUT .
CGreen
Современный, переносимый, кросс-языковой модуль для тестирования и макетирования C и C ++. Он предлагает дополнительную нотацию BDD, библиотеку-макет, возможность запустить ее в одном процессе (для облегчения отладки). Доступен тестовый прогон, который автоматически обнаруживает функции теста. Но вы можете создавать свои собственные программно.
Все эти функции (и многое другое) описаны в руководстве CGreen .
Википедия дает подробный список платформ для модульного тестирования в разделе « Список платформ для модульного тестирования»: C
источник
0.11.0
выпущена 17 декабря 2016 года .Лично мне нравится Google Test Framework .
Реальная трудность в тестировании кода C состоит в нарушении зависимостей от внешних модулей, чтобы вы могли изолировать код в единицах. Это может быть особенно проблематично, когда вы пытаетесь провести тестирование унаследованного кода. В этом случае я часто использую компоновщик для использования функций-заглушек в тестах.
Это то, что люди имеют в виду, когда говорят о « швах ». В C ваш единственный вариант - использовать препроцессор или компоновщик для макетирования ваших зависимостей.
Типичный набор тестов в одном из моих проектов на C может выглядеть так:
Обратите внимание, что вы на самом деле включаете файл C, а не файл заголовка . Это дает преимущество доступа ко всем статическим элементам данных. Здесь я макет своего логгера (который может быть в logger.o и дает пустую реализацию. Это означает, что тестовый файл компилируется и связывается независимо от остальной части кода и выполняется изолированно.
Что касается кросс-компиляции кода, чтобы это работало, вам нужны хорошие средства на цели. Я сделал это с помощью googletest, скомпилированного для Linux на архитектуре PowerPC. Это имеет смысл, потому что у вас есть полная оболочка и ОС для сбора ваших результатов. Для менее богатых сред (которые я классифицирую как что-либо без полноценной ОС) вы должны просто собрать и запустить на хосте. Вы должны сделать это в любом случае, чтобы вы могли запускать тесты автоматически как часть сборки.
Я считаю, что тестирование кода C ++, как правило, намного проще из-за того, что ОО-код в целом гораздо менее связан, чем процедурный (конечно, это сильно зависит от стиля кодирования). Также в C ++ вы можете использовать приемы, такие как внедрение зависимостей и переопределение методов, чтобы получить швы в код, который инкапсулируется в противном случае.
У Майкла Фезерса есть отличная книга о тестировании устаревшего кода . В одной главе он описывает методы работы с не-OO-кодом, которые я настоятельно рекомендую.
Изменить : я написал сообщение в блоге о процедурном коде модульного тестирования, с источником, доступным на GitHub .
Редактировать : есть новая книга, выходящая от прагматичных программистов, которая специально посвящена модульному тестированию кода C, который я очень рекомендую .
источник
Minunit - это невероятно простая структура модульного тестирования. Я использую его для модульного тестирования кода микроконтроллера для AVR.
источник
В настоящее время я использую среду модульного тестирования CuTest:
http://cutest.sourceforge.net/
Он идеально подходит для встроенных систем, поскольку он очень легкий и простой. У меня не было проблем, чтобы заставить его работать на целевой платформе, а также на рабочем столе. В дополнение к написанию модульных тестов все, что требуется, это:
Система должна поддерживать кучу и некоторую функциональность stdio (что есть не во всех встроенных системах). Но код достаточно прост, чтобы вы могли работать в альтернативах этим требованиям, если у вашей платформы их нет.
При некотором разумном использовании внешних блоков "C" {} он также прекрасно поддерживает тестирование C ++.
источник
Before
иAfter
звонит. В общем, это мило.Я говорю почти так же, как ratkok, но если у вас есть встроенный поворот для модульных тестов, то ...
Unity - Настоятельно рекомендуемая среда для модульного тестирования кода C.
Примеры в книге, упомянутой в этом потоке TDD для встроенного C , написаны с использованием Unity (и CppUTest).
источник
Возможно, вы также захотите взглянуть на libtap , среду тестирования C, которая выводит протокол Test Anything Protocol (TAP) и, таким образом, хорошо интегрируется с различными инструментами, выходящими для этой технологии. Он в основном используется в динамическом мире языков, но он прост в использовании и становится очень популярным.
Пример:
источник
ok(TESTING==IsSimple(), "libtap is super easy to use")
Существует элегантная среда модульного тестирования для C с поддержкой фиктивных объектов, называемая cmocka . Для этого требуется только стандартная библиотека C, она работает на различных вычислительных платформах (включая встроенные) и с разными компиляторами.
Он также поддерживает различные форматы вывода сообщений, такие как Subunit, Test Anything Protocol и отчеты jUnit XML.
cmocka была создана для работы на встроенных платформах, а также имеет поддержку Windows.
Простой тест выглядит так:
API полностью документирован и несколько примеров являются частью исходного кода.
Для начала работы с cmocka вы должны прочитать статью на LWN.net: Модульное тестирование с фиктивными объектами в C
cmocka 1.0 была выпущена в феврале 2015 года.
источник
Я не стал долго тестировать устаревшее приложение C, прежде чем начал искать способ имитации функций. Мне были нужны насмешки, чтобы изолировать C-файл, который я хочу проверить, от других. Я дал cmock попытку, и я думаю, что приму это.
Cmock сканирует заголовочные файлы и генерирует фиктивные функции на основе найденных им прототипов. Насмешки позволят вам протестировать файл C в полной изоляции. Все, что вам нужно сделать, это связать ваш тестовый файл с макетами вместо ваших реальных объектных файлов.
Еще одним преимуществом cmock является то, что он будет проверять параметры, передаваемые имитируемым функциям, и позволит вам указать, какое возвращаемое значение должно предоставлять mocks. Это очень полезно для проверки различных потоков исполнения в ваших функциях.
Тесты состоят из типичных функций testA (), testB (), в которых вы строите ожидания, вызываете функции для тестирования и проверки утверждений.
Последний шаг - создание бегуна для ваших тестов с единством. Cmock связан со структурой тестирования единства. Unity так же легко изучить, как и любой другой фреймворк для модульных тестов.
Стоит попробовать и довольно легко понять:
http://sourceforge.net/apps/trac/cmock/wiki
Обновление 1
Еще одна структура, которую я исследую, - это Cmockery.
http://code.google.com/p/cmockery/
Это чистый C-фреймворк, поддерживающий юнит-тестирование и макет Он не зависит от ruby (в отличие от Cmock) и очень мало зависит от внешних библиотек.
Для настройки макетов требуется немного больше ручной работы, потому что он не генерирует код. Это не представляет большой работы для существующего проекта, так как прототипы не сильно изменятся: если у вас есть макеты, вам не нужно будет их менять некоторое время (это мой случай). Дополнительный набор текста обеспечивает полный контроль над макетами. Если есть что-то, что вам не нравится, вы просто меняете свой макет.
Нет необходимости в специальном тесте. Вам нужно только создать массив тестов и передать его в функцию run_tests. Здесь немного больше ручной работы, но мне определенно нравится идея автономной автономной структуры.
Кроме того, он содержит некоторые изящные трюки C, которых я не знал.
В целом, Cmockery нужно немного больше понимать, что такое макеты, чтобы начать. Примеры должны помочь вам преодолеть это. Похоже, что он может сделать работу с более простой механикой.
источник
Как новичок в C, мне показались очень полезными слайды под названием « Разработка через тестирование на C» . По сути, он использует стандарт
assert()
вместе с&&
доставкой сообщений без каких-либо внешних зависимостей. Если кто-то привык к фреймворку полного стека, это, вероятно, не сработает :)источник
assert
без каких-либо дополнительных библиотек или инфраструктуры. Я думаю, если вы новичок, это может стать отправной точкой.Мы написали CHEAT (размещенный на GitHub ) для простоты использования и мобильности.
Он не имеет зависимостей и не требует установки или настройки. Необходим только заголовочный файл и контрольный пример.
Тесты компилируются в исполняемый файл, который заботится о запуске тестов и сообщении об их результатах.
У него тоже красивые цвета.
источник
Есть CUnit
А Embedded Unit - это модуль модульного тестирования для Embedded C System. Его дизайн был скопирован с JUnit и CUnit и более, а затем несколько адаптирован для Embedded C System. Встроенный модуль не требует стандартных библиотек. Все объекты размещены в постоянной области.
А Тесси автоматизирует модульное тестирование встроенного программного обеспечения.
источник
embunit
и был разочарован этим.Я не использую фреймворк, я просто использую autotools "check" target support. Реализуйте "main" и используйте assert (s).
Мой тестовый каталог Makefile.am выглядит так:
источник
В книге Майкла Фезера «Эффективная работа с устаревшим кодом» представлено множество методов, специфичных для модульного тестирования во время разработки на Си.
Существуют методы, связанные с внедрением зависимостей, специфичные для C, которых я больше нигде не видел.
источник
CppUTest - Настоятельно рекомендуемый фреймворк для модульного тестирования C-кода.
Примеры в книге, упомянутой в этом потоке TDD для встроенного C , написаны с использованием CppUTest.
источник
Я использую CxxTest для встроенной среды c / c ++ (прежде всего C ++).
Я предпочитаю CxxTest, потому что у него есть скрипт на perl / python для сборки тестового прогона. После небольшого уклона, чтобы его настроить (еще меньше, так как вам не нужно писать тестовый прогон), его довольно легко использовать (включает примеры и полезную документацию). Большая часть работы заключалась в настройке «аппаратного обеспечения», к которому обращается код, чтобы я мог эффективно тестировать модуль / модуль. После этого легко добавить новые тестовые случаи.
Как упоминалось ранее, это среда модульного тестирования C / C ++. Так что вам понадобится компилятор C ++.
CxxTest Руководство пользователя CxxTest Wiki
источник
кроме моего очевидного уклона
http://code.google.com/p/seatest/
хороший простой способ для модульного тестирования C-кода. подражает xUnit
источник
Прочитав Minunit, я подумал, что лучше использовать тестовый макрос в assert, который я часто использую, например, метод защитной программы. Поэтому я использовал ту же идею Minunit, смешанную со стандартным assert. Вы можете увидеть мой фреймворк (хорошее имя может быть NoMinunit) в блоге k0ga
источник
cmockery на http://code.google.com/p/cmockery/
источник
У Google отличная система тестирования. https://github.com/google/googletest/blob/master/googletest/docs/primer.md
И да, насколько я вижу, он будет работать с простым C, то есть не требует функций C ++ (может потребоваться компилятор C ++, не уверен).
источник
Cmockery - это недавно запущенный проект, который состоит из очень простой в использовании библиотеки C для написания модульных тестов.
источник
Сначала посмотрите здесь: http://en.wikipedia.org/wiki/List_of_unit_testing_frameworks#C
У моей компании есть библиотека C, которую используют наши клиенты. Мы используем CxxTest (библиотека модульных тестов C ++) для тестирования кода. CppUnit также будет работать. Если вы застряли в C, я бы порекомендовал RCUNIT (но CUnit тоже хорош).
источник
Если вы знакомы с JUnit, то я рекомендую CppUnit. http://cppunit.sourceforge.net/cppunit-wiki
Это предполагает, что у вас есть компилятор c ++ для выполнения модульных тестов. если нет, то я должен согласиться с Адамом Розенфилдом, что чек - это то, что вы хотите.
источник
Я использовал RCUNIT для проведения модульного тестирования встроенного кода на ПК перед тестированием на целевой машине . Хорошая абстракция аппаратного интерфейса важна, иначе регистры с порядком байтов и отображением памяти убьют вас.
источник
попробуйте lcut! - http://code.google.com/p/lcut
источник
API Sanity Checker - тестовая среда для библиотек C / C ++:
Примеры:
источник
Один из способов - разработать код модульного теста с помощью инфраструктуры C ++ xUnit (и компилятора C ++), сохраняя исходный код целевой системы в виде модулей C.
Убедитесь, что вы регулярно компилируете исходный код C под свой кросс-компилятор, автоматически с вашими модульными тестами, если это возможно.
источник
LibU ( http://koanlogic.com/libu ) имеет модуль модульных тестов, который позволяет явно устанавливать зависимости между набором тестов и кейсами , изоляцией тестов, параллельным выполнением и настраиваемым форматером отчетов (стандартные форматы xml и txt).
Библиотека имеет лицензию BSD и содержит много других полезных модулей - сети, отладки, часто используемых структур данных, конфигурации и т. Д. - если они понадобятся вам в ваших проектах ...
источник
Я удивлен, что никто не упомянул Cutter (http://cutter.sourceforge.net/). Вы можете протестировать C и C ++, он легко интегрируется с autotools и имеет действительно хороший учебник.
источник
Если вы ориентируетесь на платформы Win32 или режим ядра NT, вам стоит взглянуть на cfix .
источник
Если вы все еще в поиске тестовых сред, CUnitWin32 - один из них для платформы Win32 / NT.
Это решает одну фундаментальную проблему, с которой я столкнулся в других средах тестирования. А именно глобальные / статические переменные находятся в детерминированном состоянии, потому что каждый тест выполняется как отдельный процесс.
источник