Тестирование статических функций с помощью CppUnit

Мой проект содержит файлы C. И в некоторых файлах у меня есть функции, определенные как статические.

Я использую CppUnit в своих модульных тестах и ​​хочу протестировать эти статические функции. Я знаю, что вызов функции из-за пределов файла (где она определена) не допускается. Есть ли решение, позволяющее избежать этой проблемы, чтобы вызывать эти статические функции из моего тестового файла C++?


person MOHAMED    schedule 16.04.2013    source источник


Ответы (3)


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

Если вы определяете символ DEBUG во всех отладочных сборках, то что-то вроде:

#ifdef DEBUG
#define debug_export 
#else
#define debug_export static
#endif

а затем определите свои статические функции, подобные этому

debug_export void foo(void)
{
...
}

и либо включите объявления условно в файл заголовка, либо вручную импортируйте их в файл модульного теста:

extern void foo(void);

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

person Will    schedule 16.04.2013
comment
Спасибо, я вдохновил решение, основанное на вашем ответе. см. мой ответ для более подробной информации - person MOHAMED; 17.04.2013

У меня есть общий заголовочный файл, который я включаю во все исходные файлы своих проектов. Я добавил эти строки, и проблема решена:

#ifdef TEST
#define static
#endif

Я даже могу не добавлять приведенный выше код в исходный код C. Я мог бы добавить флаг -Dstatic= в команду gcc, и я обнаружил, что это тоже работает.

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

  • У нас может быть одно и то же имя переменной/функции, определенное как статическое в двух отдельных файлах.
  • У нас может быть функция, которая содержит переменную, определенную как статическая.
person MOHAMED    schedule 17.04.2013

Есть ли способ реорганизовать код, чтобы устранить необходимость в статических методах? С точки зрения объектно-ориентированного дизайна, статика — это глобальная переменная в овечьей шкуре.

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

person John Deters    schedule 17.04.2013