2016-08-31 3 views
6

Я попытаюсь сделать это чисто минимальным примером, чтобы быть применимым как можно большему числу людей, а также защитить любой доступ кодов, который может нарушить NDA. Надеюсь, все в порядке!CppUTest Unit Testing Framework Множественное определение исключения

Я использую CppUTest и CppUMock (компиляция с gcc/g ++ и make-файлы, созданные с помощью CMake) в сочетании с программным обеспечением Gitlab Continuous Integration для создания единичной тестовой среды для будущих коммитов и выпуска программного обеспечения. Однако я столкнулся с проблемой. Скажем, у меня есть следующие настройки папки (что у меня есть минимальная возможность изменять, кроме содержимого папки/тесты):

+-- src 
    +-- driver1.c 
    +-- driver2.c 
+-- inc 
    +-- driver1.h 
    +-- driver2.h 
+-- tests 
    +-- test_driver1.cpp 
    +-- test_driver2.cpp 
    +-- main.cpp 
    +-- cmakelists.txt 

Файл CMakeLists будет содержать в том числе папки ИНК, составление ЦСИ папке и компиляции папки тестов. Однако предположим, что driver2.c опирается на методы, определяемые driver1.c. Это нормально, если нет никакой насмешливой настройки, потому что вы можете просто проверить результаты вызовов для методов driver2 в обычном режиме. Однако скажите, что я хочу издеваться над функцией method1 driver1, чтобы я мог правильно проверить метод driver1 метода method1 (используя CppUMock). Как правило, это было бы хорошо, если бы драйвер1 не компилируется, но добавляя что-то вроде так файл test_driver2.cpp:

void method1(int n) { 
    mock().actualCall("method1").withParameter("n", n); 
} 

Вызовет столкновение с реальным method1 в driver1.c с ошибкой линкера, как так:

CMakeFiles/Tests.dir/.../src/driver1.c:(.text+0x11d): multiple definition of 'method1' 
CMakeFiles/Tests.dir/.../src/test_driver2.cpp:(.text+0x0): first defined here 

по просьбе комментатора, здесь является то, что включают в себя структуру, как:

driver1.c includes driver1.h (obviously) 
driver2.c includes driver2.h (obviously) 
driver2.h includes driver1.h (for calling method1) 
test cpp files include their respective .h files 
(test_driver1.cpp -> driver1.h and test_driver2.cpp -> driver2.h) 

method1 объявлен в driver1.h и определены в driver1.c. Я не могу редактировать эти файлы.

Я рад добавить детали по мере необходимости.

Каков наилучший способ обойти эту насмешливую проблему?

+0

Вам необходимо показать (по крайней мере, выдержки) часть, в которой вы определяете метод1, и как вы # включаете различные заголовки в источники – TemplateRex

+0

Добавлен @TemplateRex. method1 - это любой старый метод в файле driver1.c с объявлением в файле driver1.h. – Jeffrey

+0

вы не можете добавить еще один 'method1()' в файл driver2.cpp и связать его вместе с driver2.cpp в тестовом драйвере. Если вы хотите высмеять, вы должны сказать, что CMake не компилировать driver1.cpp в качестве зависимости для test_driver2.cpp – TemplateRex

ответ

3

Если вы хотите, чтобы дразнить method1 от driver1.h, просто добавьте высмеивал определение в отдельном mock_driver1.cpp, а затем в вашем CMakeLists.txt:

add_executable(target1 test_driver1.cpp driver1.cpp) 
add_executable(target2 test_driver2.cpp driver2.cpp mock_driver1.cpp) 

После того, как вы закончите насмешливый, замените mock_driver1.cpp зависимость с driver1.cpp.

Все это предполагает, что для каждого тестового драйвера имеется отдельный исполняемый файл.

Однако, если вы хотите иметь одну большую основную программу, в которой все драйверы связаны друг с другом, тогда вы не сможете иметь как настоящие method1, так и насмешливое method1 совместно. Для этого я бы рекомендовал обернуть насмешливое method1 в пространстве имен mock или что-то в этом роде и позвонить только mock::test1 в test_driver2.cpp.

+0

Спасибо! Я добавлю возможность для моего скрипта сборки python просто запускать все исполняемые файлы в каталоге, а не только test.exe, так что я могу иметь несколько сборок, например 2501. Вернется с + 1 и примет ответы, если я смогу получить это изменение. – Jeffrey

+0

+1 Отлично работает! То, что мне не хватало, было просто наличие нескольких единиц компиляции для каждого теста, что намного проще, чем пытаться заставить их всех в одном. – Jeffrey

+0

@ Джеффри отлично помог – TemplateRex