Как вы интегрируете CMock/Unity с Automake?
Я впервые задаю вопрос здесь, поэтому, пожалуйста, дайте мне знать, если я могу улучшить свой вопрос..
Я ищу руководство о том, как аккуратно создавать модульные тесты, которые требуют замены исходных файлов проверенными версиями исходного файла, созданного CMock. Это необходимо, потому что CMock требует, чтобы код модульного теста, использующий макет, был связан с исходным кодом вместо исходного.
Например, если я тестирую функцию test_me(), которая вызывает foo() в тестовом исходном файле test.c, то для симуляции foo() мне придется скомпилировать test_test_me: test_me.c, Mockfoo.c, and test.c.
test_me() обычно компилируется как test_me: test_me.c and foo.c
Mockfoo.c генерируется с использованием сценария Ruby, предоставленного CMock с использованием foo.h.
Как вы видете, foo.c
должен быть заменен на Mockfoo.c
для того, чтобы создать тестовую программу, test_test_me
, Mockfoo.c необходим, чтобы test_test_me мог ссылаться на ложные вызовы foo, а не на исходный вызов foo. Замена источника становится сложной, когда количество зависимостей увеличивается.
Например, если test_me использует foo, bar и baz из библиотеки libfoo.a, которая состоит из foo.o, bar.o и baz.o, и я хочу просто смоделировать вызовы foo, тогда мне нужно собрать libfoo.a с модулями компиляции Mockfoo.o, bar.o и baz.o, чтобы затем ссылаться на мой test.o
который использует ложные вызовы foo. Это становится еще сложнее, когда у вас есть перестановки mocks (например, Mockfoo, Mockbar, но не baz) и большое дерево исходников с различными правилами automake, флагами и т. Д.
Кроме того, добавление макетов должно быть простым, поскольку макеты часто необходимы для наших модульных тестов.
Некоторый контекст:
Я заинтересован в использовании CMock/Unity для добавления модульных тестов в тех случаях, когда код подвергается рефакторингу или добавляется новый код в большой проект C, к которому я только что присоединился.
В настоящее время проект использует Automake в качестве инструмента для сборки, и он здесь, чтобы остаться.
Я новичок в Automake. Я знаком со SCons и CMock.
1 ответ
Вопрос был опубликован довольно давно. Я опубликую свое решение для всех, кто сталкивается с подобным вопросом.
Самый надежный способ взаимодействия с CMock/Unity - это использование rake, инструмента сборки на основе Ruby. Рейк можно вызвать с вашего Makefile.am. Цели могут быть созданы для вызова рейка для каждой фальшивой цели, указанной для построения ваших юнит-тестов.
В моем конкретном случае я не смог использовать rake из-за ограничений среды сборки. Вместо этого я решил использовать cmocka, которая имеет функциональность, предоставленную в CMock/Unity, и легко интегрируется с automake.