Модульное тестирование модуля C статической переменной
У меня есть модуль C, и я хочу немного реорганизовать. Есть некоторые глобальные переменные и структуры, которые не скрыты (в файле module.h). Я использую эти переменные в каком-то тестовом примере, но нигде больше, поэтому я подумал, что было бы неплохо установить их статическими. В моих тестовых случаях я извлекаю эти переменные и заполняю тестовыми значениями. Но если они будут статическими переменными, я не смогу добраться до них из теста. Я не хочу писать методы получения и установки и помещать их в файл.h, потому что я хочу скрыть эти переменные.
Я знаю, что если я включу файл.c в свой тестовый пример, я смогу увидеть статические переменные. Есть ли другой способ заполнить эти переменные?
Я использую cygwin и gcc, тестовый фреймворк - CppUtest.
Заранее спасибо.
2 ответа
Есть две основные возможности:
- Сложность тестирования показывает, что интерфейс, предоставленный модулем, неполон.
- Ваше модульное тестирование подсматривает внутреннюю часть модуля так, как это никогда не понадобится потребителям.
Если проблема в неполном интерфейсе, вы можете добавить дополнительные интерфейсы, которые делают модуль более простым для тестирования и более удобным для использования. Например, если статические переменные являются какими-то счетчиками, вам может потребоваться добавить метод "сброса", чтобы обнулить счетчики, готовые к следующей части модульного тестирования, или (в более общем случае использования) чтобы обнулить статистику, чтобы вы могли накапливать статистику заново.
Если проблема заключается в модульном тестировании, требующем более глубокого исследования, чем потребителям, то я не вижу ничего плохого в тестовом коде, использующем #include "sourcecode.c"
, Содержит код модуля в чистоте для общего пользования; это позволяет модульному тесту исследовать более глубоко, чем было бы иначе. Он преобразует тестовый код из тестирования "черного ящика" в форму тестирования "белого ящика" - тест может увидеть больше тестируемого кода, чем обычный тест черного ящика. Но это иногда полезно. Часто это промежуточная стадия развития. После того, как вы проведете все испытания "черного ящика", вам, возможно, не придется беспокоиться о том, чтобы исследовать внутренние органы таким же образом - пока вы не внесете изменения.
Часто хорошей идеей является создание этих статических переменных в отдельном файле (некоторым нравится называть это скаффолдингом), чтобы вы могли избежать включения.c. Основная теория заключается в том, что если вы всегда включаете файлы.c, то быстро становится невозможным модульное тестирование, поскольку вся идея модульного тестирования заключается в детализации и тестировании одного бита кода, не зависящего от остального. Как только вы включаете все эти внешние.c файлы, вы этого не делаете.