Переписывание или разрыв связи функций для модульного тестирования на C во время компиляции - PullRequest
0 голосов
/ 11 ноября 2011

Для модульного тестирования в C я хотел бы создать два объектных файла (A и B) в производственных источниках, которые вызывают функции друг в друге. Затем для модульного тестирования предоставьте ложные / фиктивные реализации A и B, которые можно включать и выключать во время выполнения для модульного тестирования.

Что я хочу сделать, это связать вместе A, B, fake_A и fake_B в один большой тестовый двоичный файл, который может переключаться между производственной и поддельной реализацией модуля во время выполнения для модульного тестирования обоих. Это потому, что было бы неплохо избегать создания нескольких различных двоичных файлов теста для каждого случая и необходимости консолидировать результаты.

Я буду компилировать A и B специально для модульного теста, поэтому могу принудительно использовать дополнительные заголовки, определения, флаги компилятора и т. Д., Которые не будут присутствовать во время выполнения.

Мне интересно, можно ли разорвать связь между функциями в A и B с помощью какого-либо переписывания или трюков во время компоновки.

Позвольте мне попытаться проиллюстрировать. Допустим, у меня есть файлы a.c, b.c, fake_a.c и fake_b.c:

a.c

void a_work(void) {
  b_work();
}

b.c

void b_work(void) {
  do_some_work();
}

fake_b.c

/* for test, when a_work() calls b_work() I want this to be run */
void b_work(void) {
  if (fake_b_enabled)
    do_fake_b_work();
  else
    // call the real b_work() somehow
}

Обычно вызов a_work () для b_work () связан с реальным b_work () во время соединения, это то, что я хочу перехватить или переписать.

Я думаю о какой-то оболочке со слоем указателя на функцию, но я не знаю, как это сделать.

1 Ответ

0 голосов
/ 11 ноября 2011

Использование общих объектов (в * nix или DLL в Windows). Реализуйте свои функции как тестовыми, так и производственными способами, но создайте по одной общей библиотеке для каждого. Затем, если вы хотите, чтобы один двоичный файл переключался между ними, используйте LD_LIBRARY_PATH, чтобы двоичный файл загружался не тем, с которым вы его построили.

...