Модульное тестирование для выхода () в C - PullRequest
0 голосов
/ 17 января 2019

Я использую фреймворк CUnit для отображения результатов тестирования. (Я новичок в области программирования & S.O., поэтому пошаговые ответы очень ценятся).

Можно ли как-нибудь использовать ту же платформу CUnit, когда я тестирую функции, которые ожидаю выхода ()? Мне так не кажется, но я все равно хотел бы спросить - он будет отображать результат «успешно / неудачно» вместе с другими моими тестами CUnit, поэтому его идеал.

Если нет, я искал другие дружественные по отношению к noob решения (например, этот пост ), но я не могу использовать GOTO / setjmp / longjmp. Решение также должно быть переносимым.

Я использую командную строку Mac & gcc для запуска этого кода.

EDIT Одним из предложенных решений является использование директивы C Pre-Processor (CPP) / «mocking» , что выглядит идеально? Я использовал следующий код в моем файле test.c:

#define ERROR(PHRASE) {fprintf(stderr,"Fatal Error %s occurred in %s, line %d\n",PHRASE, FILE, LINE); exit(2);} 
#ifdef ERROR(PHRASE)
#define ERROR(PHRASE) {printf("In test phase");} 
#endif 
#ifndef ERROR(PHRASE #define ERROR(PHRASE) {printf("Not In test phase");} 
#endif

Вот сообщение об ошибке, которое мне выдает терминал:

test.c:30:9: warning: 'ERROR' macro redefined [-Wmacro-redefined]
#define ERROR(PHRASE) {printf("In test phase");}
        ^
test.c:26:9: note: previous definition is here
#define ERROR(PHRASE) {fprintf(stderr,"Fatal Error %s occured in %s, lin...
        ^
test.c:32:14: warning: extra tokens at end of #ifndef directive
      [-Wextra-tokens]
#ifndef ERROR(PHRASE) {printf("Not In test phase");}

Удаление (PHRASE) по-прежнему приводит к тем же ошибкам.

EDIT Если насмешка с использованием #ifdef была полезна для всех остальных, это был самый простой способ решить эту проблему в конце. Этот сайт тоже был полезен.

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Один аспект, который может быть рассмотрен при наличии проблем / повышенных усилий в отношении тестирования, заключается в том, есть ли возможность изменить тестируемую программу каким-либо образом, что помогло бы с тестированием без существенного увеличения сложности кода.

В этом случае есть ли возможность заменить вызовы exit () на коды возврата ошибок из функций, чтобы вызывающие могли выполнить такие действия, как приведение в порядок или состояние журнала, перед фактическим выходом? Если это так, то это одновременно упрощает тестирование и, вероятно, упростит поиск ошибок, когда код фактически используется в выпуске / производстве, так как может быть довольно сложно понять, почему программа просто «взлетает» и умирает, особенно если код спрятан в библиотечной функции!

0 голосов
/ 17 января 2019

Просто чтобы вы знали, что искать, то, что вы хотите сделать, это «подделать» вызов exit(). Основная идея состоит в том, чтобы выбрать другую реализацию для функции выхода, как правило, во время компиляции. Честно говоря, C не делает это особенно легко, но есть несколько вариантов с различными уровнями переносимости и навязчивости.

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

Для чего-то потенциально менее навязчивого, но и гораздо менее переносимого, в этой статье есть пара идей (я думаю, что оба будут работать на MacOS). Здесь вы получаете компоновщик для перенаправления вызова exit() в другую функцию, которую вы предоставляете. Хорошей новостью является то, что он не требует каких-либо изменений в вашем коде. Плохая новость заключается в том, что он требует сотрудничества с компоновщиком и не будет работать везде (LD_PRELOAD не будет работать в Windows, а AFAIK --wrap требует GNU ld или что-то совместимое).

...