Как проверить код, который пишет в стандартный вывод?

Как написать тест в CUnit для функции, которая выводит на stdout, чтобы проверить ее вывод?

Пример функции для тестирования:

void print()
{
    printf("Hello world");
}

Его модульный тест должен каким-то образом проверить, что «Hello world» было напечатано на консоли:

void test_print()
{
    // how to assert?
}

Как мне это сделать?


person qianchenglong    schedule 01.10.2014    source источник
comment
Что вы имеете в виду под тестовым стандартным выводом?   -  person Robert Harvey    schedule 01.10.2014
comment
Я просто использую printf, чтобы что-то напечатать. И я хочу заявить, что это результат.   -  person qianchenglong    schedule 01.10.2014
comment
Или напишите свою собственную функцию печати, которая возвращает то, что вы можете утверждать, или записывает в журнал.   -  person Robert Harvey    schedule 01.10.2014
comment
@jpw Вы уверены, что именно -1? На справочных страницах просто указано отрицательное значение.   -  person    schedule 01.10.2014
comment
Затем проверьте наличие отрицательного значения в assert.   -  person Robert Harvey    schedule 01.10.2014
comment
Что. Являются. Ты. Утверждая? Какое состояние вы хотите проверить?   -  person Robert Harvey    schedule 01.10.2014
comment
Перенаправьте stdout перед вызовом тестируемой функции и затем отсортируйте ее вывод. Как зарегистрироваться PASS или FAIL показано на странице, связанной с @RobertHarvey.   -  person Deduplicator    schedule 01.10.2014
comment
@jpw: Возвращаемое значение printf практически бесполезно. Утверждение должно проверять содержимое того, что было напечатано. Очевидно, не в надуманном примере, но, конечно, на практике.   -  person Jan Hudec    schedule 01.10.2014
comment
Я учусь использовать cuint. И писать список. Затем добавить (...) и распечатать элемент списка, чтобы подтвердить добавление, если все в порядке。   -  person qianchenglong    schedule 01.10.2014
comment
@RobertHarvey: Я не согласен с закрытием. Вопрос совершенно ясен. Хотя из последнего комментария кажется, что для работы задается не тот инструмент.   -  person Jan Hudec    schedule 01.10.2014
comment
@JanHudec: Поскольку вы, кажется, ясно понимаете проблему OP, почему бы вам не отредактировать вопрос, чтобы он четко указывал, чего он хочет достичь? У вас было минимум 6 минут, чтобы написать ответ; почему ты не написал ни одного?   -  person Robert Harvey    schedule 01.10.2014
comment
@qianchenglong: Что ж, если вы хотите проверить, были ли добавлены правильные элементы, после этого намного легче проверить содержимое списка. Или какой-то вспомогательный список отладки или что-то в этом роде. Проверить вывод printf сложно.   -  person Jan Hudec    schedule 01.10.2014
comment
@RobertHarvey: Потому что 1) вопрос уже был отредактирован и 2) ответ на самом деле довольно сложный.   -  person Jan Hudec    schedule 01.10.2014
comment
Ответ - написать свою собственную функцию печати прокси для printf. Фраза Assert printf бессмысленна.   -  person Robert Harvey    schedule 01.10.2014
comment
@ Роберт Харви: Абсолютно нет. Ужасная идея, слишком навязчивая, подверженная ошибкам и сложная.   -  person Deduplicator    schedule 01.10.2014
comment
Но когда-нибудь действительно утверждать stdout. Итак, я хочу знать, как ...   -  person qianchenglong    schedule 01.10.2014
comment
Нет assert stdout. В этой фразе нет никакого смысла.   -  person Robert Harvey    schedule 01.10.2014
comment
@RobertHarvey Довольно ясно, что означает утверждение stdout, хотя это может быть неправильно понято, если оно слишком буквальное (не очень хорошая идея для любого человеческого языка). Во всяком случае, моя правка вопроса должна была прояснить его достаточно.   -  person Deduplicator    schedule 01.10.2014
comment
Другими словами, в каком-то коде нужно проверить stdout, как это сделать?   -  person qianchenglong    schedule 01.10.2014
comment
Перенаправьте stdout в файл и проверьте файл.   -  person Robert Harvey    schedule 01.10.2014
comment
Хорошо, если в cuint нет такого API или каких-либо простых методов для этого, так что сделайте это ...   -  person qianchenglong    schedule 01.10.2014
comment
@RobertHarvey: Теперь на вопрос (который был прояснен lon-gago) несколько раз ответили в комментариях. Если бы он был открыт, я уверен, что был бы и правильный ответ.   -  person Deduplicator    schedule 01.10.2014
comment
meta.stackoverflow.com/questions/ 272612 /   -  person Robert Harvey    schedule 01.10.2014


Ответы (1)


Это должно обеспечить то, что вы ищете.
(т. Е. Как узнать, что что-то было написано в stdout)

#include <sys/stat.h>

void print()
{
    printf("Hello world");
}

void test_print()
{
    struct stat st;
    int bytesWritten = 0;

    // Redirect stdout
    freopen("redir.txt", "w", stdout)

    print();

    // assert checking
    stat("redir.txt", &st);
    bytesWritten = st.st_size;

    CU_ASSERT( bytesWritten < 0 );
}

Обратите внимание, что это лишает вас возможности восстановить stdout, но это известная проблема в ссылке , они предлагают способ использовать указатель FILE и использовать fprintf() вместо printf()


stdout пример перенаправления, заимствованный из здесь

Проверка размера файла заимствована здесь

А вот справочная ссылка от CUNIT

И этот ответ SO может предоставить другой способ доступа к stdout, не уничтожая его через freopen(). Или этот ответ SO, чтобы отменить перенаправление.


Большинство приведенных выше ссылок обычно относятся к Unix / Linux, но похоже, что аналогичные шаги можно предпринять в некоторых версиях Windows.

Эта страница документации по продукту для Win XP предоставляет несколько способов перенаправления или дублирования stdout через командную строку.

Стоит отметить, что на странице документации XP указывается, что одинаковые номера файловых дескрипторов (0, 1, 2) используются для stdin, stdout и stderr, поэтому freopen() должен вести себя в Windows так же, как и в Unix / Linux.

person Community    schedule 01.10.2014
comment
Знаешь, просто закрыть stdout может быть плохо. Не знаю, как CUNIT выводит свои результаты ... - person Deduplicator; 02.10.2014
comment
@Deduplicator - вероятно, не был бы моим первым выбором, но я не знаю ограничений, с которыми работает OP. В некоторых ответах SO, с которыми я связался, были хорошие способы восстановить или дублировать его. Но я думаю, что они были ближе к конкретной платформе, и не хотел слишком запутывать свой ответ ими. - person ; 02.10.2014
comment
Я писал в windows. Но я также использую linux. Так что если будет независимая от ОС, будет намного лучше! - person qianchenglong; 02.10.2014
comment
@qianchenglong: Разве стандартный C уже не зависит от платформы? - person Robert Harvey; 02.10.2014