如何将函数单元测试写入stdout / std :: cout

时间:2010-11-16 03:55:13

标签: c++ unit-testing testing io

我正在研究单元测试。从我所看到的情况来看,几乎所有单元测试都使用返回值或输出参数作为测试用例中的预期值。

没有返回值或输出参数的函数的期望值是什么?

示例:

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

当然,这个功能非常简单。所以,这个功能似乎不需要单元测试。但这只是一个样本。你认为unit_test函数有副作用吗?你会如何测试它?

3 个答案:

答案 0 :(得分:15)

如果您正在编写一个您应该测试的函数,那么您应该将其设计为在您的框架中可测试。在这里,如果您的测试是在可以验证进程输出的进程级别完成的,那么写入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();
}

答案 1 :(得分:0)

单元测试返回void的函数通常涉及发送输入并捕获函数在传递错误数据时可能抛出的任何异常。你的函数不接受任何输入,因此单元测试似乎是不必要的,除非你想在调用函数时测试极端条件,如耗尽内存。

答案 2 :(得分:0)

一般情况下,您不会对单元测试程序进行单元测试(即您所放置的代码片段不会接受任何输入且不返回任何值)。对于初学者,尝试测试一些函数(获取一些参数并返回一些值)。

也就是说,你测试副作用 - 你提供的功能的唯一副作用是输出到控制台的字符,这可能很少被测试。

看看这个入门书:

或者这个: