Функции тестовой печати в C — модульных тестах, проверьте

#c #unit-testing #printing #void

Вопрос:

Я пытаюсь написать модульный тест для кода на C с помощью check. Тем не менее, я наткнулся на тесты для методов void без операторов return, которые используют только printf(). Как я могу проверить результат этих методов? Есть ли какой-либо способ перенаправить вывод на массив символов, которые я могу сравнить? Я нашел несколько ответов для Python, но ни одного для C.

Ответ №1:

Может быть, попробовать freopen() ?

 // untested, no guarantees
START_TEST(test_silentfunction) {
    // redirect stdout to file
    freopen("/tmp/OBSCURITY_fb78trerbwedftwefnwdfyutew.txt", "w", stdout);
    silentfunction();
    // return stdout to default tty output
    freopen("/dev/tty", "w", stdout);

    // check contents of file /tmp/OBSCURITY_fb78trerbwedftwefnwdfyutew.txt
    remove("/tmp/OBSCURITY_fb78trerbwedftwefnwdfyutew.txt");
}
END_TEST
 

Комментарии:

1. Если бы кто-то хотел восстановить stdout то, что было раньше (в случае, если это было не "/dev/tty" так), какие-нибудь идеи?

2. Поскольку stdout имеет файловый дескриптор 1 , можно использовать этот фрагмент кода, чтобы узнать, что stdout такое перед использованием freopen() : int get_stdout_filepath(char* output, size_t output_size) { ssize_t res = readlink("/proc/self/fd/1", output, output_size); return (res > 0 amp;amp; res < (ssize_t) output_size) ? 1 : 0; } . Этот код не является переносимым (требуется <unistd.h> и readlink() функционирует) и возвращается 1 при успешном выполнении и 0 при сбое.