Как выполнить модульный тест записи функции в stdout / std :: cout - PullRequest
9 голосов
/ 16 ноября 2010

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

Каким будет ожидаемое значение для функции, которая не имеет возвращаемого значения или выходного параметра?

Пример:

void unit_test()
{
  cout << "Hello" << endl;
}

Конечно, эта функция очень проста. Таким образом, эта функция не требует модульного тестирования. Но это всего лишь образец. Как вы думаете, функция unit_test имеет побочный эффект? Как бы вы это проверили?

Ответы [ 3 ]

15 голосов
/ 16 ноября 2010

Если вы пишете функцию, которую, как вы знаете, следует протестировать, вы должны разработать ее для тестирования в своей среде.Здесь, если ваше тестирование выполнено на уровне процесса, где вы можете проверить вывод процесса, тогда запись в std :: cout - это нормально.В противном случае вы можете захотеть сделать выходной поток параметром для функции, например:

void unit_test(std::ostream& os = std::cout) 
{ 
  os << "Hello" << endl; 
} 

Затем вы можете проверить его следующим образом:

std::ostringstream oss;
unit_test(oss);
assert(oss && oss.str() == "Hello");

Как это показано,Хорошо протестированное программное обеспечение требует небольшого количества компромиссов ... Требования к тестированию возвращаются к дизайну.

РЕДАКТИРОВАТЬ: если вам необходимо протестировать уже существующие функции, не меняя их, подумайте:

#include <sstream>
#include <iostream>

void f()
{
    std::cout << "hello world\n";
}

int main()
{
    std::ostringstream oss;
    std::streambuf* p_cout_streambuf = std::cout.rdbuf();
    std::cout.rdbuf(oss.rdbuf());

    f();

    std::cout.rdbuf(p_cout_streambuf); // restore

    // test your oss content...
    assert(oss && oss.str() == "hello world\n";
    std::cout << oss.str();
}
0 голосов
/ 16 ноября 2010

Как правило, вы не выполняете процедуры модульного тестирования (то есть фрагменты кода, такие как тот, который вы вставили, который не принимает никаких входных данных и не возвращает никаких значений). Для начала попробуйте протестировать что-то, что является функцией (принимает некоторые параметры и возвращает некоторые значения).

То есть вы тестируете побочные эффекты - единственным побочным эффектом предоставленной вами функции является вывод символов на консоль, что, вероятно, редко проверяется.

Посмотрите на этот учебник:

или этот:

0 голосов
/ 16 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...