С модульный тест С распространенная практика
Например, мой производственный код (скажем, он выполняет сборку в исполняемый файл) имеет
file_a.c (sub_module A)
int func_a() {
....
}
file_b.c (module B)
func_b () {
...
ret = func_a();
...
}
Для модульного теста я использую CppUTest. Если я проверю B с реальным кодом A, то
- Мне нужна реальная реализация A,
- мы не сможем получить все возможные результаты из func_a().
- если func_a () вызывает функции другого модуля, трудно обнаружить / настроить все случаи глубоко внутри цепочек вызовов функций.
- mabybe, это слишком экстремально, но я не могу убедить ppl, чем этот подход отличается от объединения всего кода и простого тестирования из main()?
Но если я буду издеваться над func_a () во время тестирования B, то компоновщик будет жаловаться на несколько определений, как только я начну тестировать A, поскольку теперь реальная реализация будет связана. Для этой проблемы я вижу два пути
- создайте отдельный исполняемый файл теста для каждого file_a.c и file_b.c. Но это приведет к тому, что по мере роста производства будет создаваться столько исполняемых файлов, а также возникнут сложности, если понадобятся некоторые "реальные" и "фиктивные" комбинированные тесты.
- скомпилировать производственный код в качестве разделяемой библиотеки и связать его с исполняемым файлом теста, а затем использовать временные связи, чтобы перехватывать вызовы функций для реальной реализации.
Так что же является обычной практикой для таких сценариев? Я уверен, что это очень распространенный сценарий для модульного тестирования кода c.
Спасибо,