LINUX.ORG.RU

Тесты для plain C

 ,


1

3

Посоветуйте годную библиотеку для unit-тестирования plain C проекта.

Требования:

- Описываю набор функций напичканных различными assert, после сборки тестов получаю бинарник, который прогонит все тесты и расскажет какие упали (очень желательно, если прямо выведет пары ожидаемых значений и реально полученных значений), при этом не останавливаясь на первом упавшем тесте (было бы круто каждый тест запускать в отдельном процессе, чтобы даже сегфолт попал в отчёт тестирования, желательно со стектрейсом, если проект собран с отладочными символами).

- Поддержка CMake (чтобы просто подключить проект через add_subdirectory или вообще инклюд скрипта). Либо библиотека должна не иметь стадию конфигурирования и подключаться простым прописываанием include и добавлением нескольких исходных файлов в проект.

- Кроссплатформенность - то есть как минимум Linux и Windows.

- Не нужно ничего ставить в систему, всё должно собираться вместе со сборкой основного проекта

- Ещё бонусом было бы переопределить malloc (через weak/strong символы, ld preload, глобальный макрос, да хоть как) и, соответственно, после окончания теста проверять, что вся память освобождена. Но такое, наверное, вряд ли где-то реализовано. Разве что весь тестовый бинарник запускать под valgrind, но это вариант только для Linux, зато отловит и более сложные ошибки работы с памятью.

Да, на базовом уровне это пишется за 15 минут путём описания пары макросов (определения теста и сам ASSERT), но хочется всяких плюшек (та же обработка сегфолтов), а если в них углубляться, то уже далеко не на 15 минут выйдет.

★★★★★

Последнее исправление: KivApple (всего исправлений: 6)

Использую kyua/atf, форки в проекте FreeBSD так как оригинальный проект кажется заброшенным: https://github.com/freebsd/kyua + https://github.com/freebsd/atf, всем заявленным требованиям не соответствует, но это единственное что я нашёл для чистого C (так же поддерживает C++ и shell).

dsdqmhsx
()

Тоже ищу что-то, похожее, но для многопоточки — пока что пришлось тоже на коленке соображать самому. Мне хотя бы логирование сделать корректное, которое бы не вмешивалось в работу приложения — и то спасибо.

byko3y ★★★★
()

assert + static_assert.

Ничего больше не нужно…

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

все то же самое + ThreadSanitizer ?

логгер - хз какие у тебя задачи, и что такое " корректное, которое бы не вмешивалось в работу приложения".

olelookoe ★★★
()
  • Ещё бонусом было бы переопределить malloc (через weak/strong символы, ld preload, глобальный макрос, да хоть как) и, соответственно, после окончания теста проверять, что вся память освобождена. Но такое, наверное, вряд ли где-то реализовано. Разве что весь тестовый бинарник запускать под valgrind, но это вариант только для Linux, зато отловит и более сложные ошибки работы с памятью.
int tmpFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);
tmpFlag |= _CRTDBG_LEAK_CHECK_DF;
_CrtSetDbgFlag(tmpFlag);

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/crtsetdbgflag?view=msvc-160

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

все то же самое + ThreadSanitizer ?

Не работает на 32-битном x86, кстати.

логгер - хз какие у тебя задачи, и что такое " корректное, которое бы не вмешивалось в работу приложения"

Логирование через системный вызов или вывод в один канал с синхронизацией изменяет профиль выполнения приложения, таким образом в отладке и в проде оно выдаст разные ошибки.

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

Как вариант держать отдельный логгер на каждый тред, но обязательно логгировать метки времени (системный вызов получения текущего времени бесплатен на многих ОС за счёт маппинга ядерной памяти со счётчиком времени). А затем уже как-то в фоне всё это сливать в общий лог сортируя по меткам времени.

Интересно, есть ли уже такие либы для Си.

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

Как вариант держать отдельный логгер на каждый тред, но обязательно логгировать метки времени (системный вызов получения текущего времени бесплатен на многих ОС за счёт маппинга ядерной памяти со счётчиком времени)

Как я уже писал, на Delphi я именно это и сделал. Правда, сортировка по времени выполнялась через атомарный указатель, с помощью которого логируемый поток резервировал себе блок памяти для последующего заполнения в любом удобном ему ритме. Довольно много времени потратил на тестирование этой штуки, не особо горю желанием повторно это реализовывать на Си.

Интересно, есть ли уже такие либы для Си

Мне тоже очень интересно.

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

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

olelookoe ★★★
()
Последнее исправление: olelookoe (всего исправлений: 1)
Ответ на: комментарий от jhonathan

это тайные заклинания адептов разработки тестированием вперёд )))

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