Тестирование статических функций с CppUnit

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

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

9

Решение

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

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

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

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

debug_export void foo(void)
{
...
}

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

extern void foo(void);

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

6

Другие решения

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

#ifdef TEST
#define static
#endif

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

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

  • Мы можем иметь одно и то же имя переменной / функции, определенное как static в 2 отдельных файлах.
  • У нас может быть функция, которая содержит переменную, определенную как static.
4

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

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

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector