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

car*_*dbt 9 c++ testing io unit-testing

这些天,我学习单元测试.几乎单元测试使用返回值或参考值作为测试用例中的预期值.如果它在函数中没有返回值和参考值.预期值是多少?

exsample-

void unit_test()
{
  cout << "Hello" << endl;
}
Run Code Online (Sandbox Code Playgroud)

当然,unit_test功能很简单.所以,这个功能似乎不需要单元测试.但是,这只是样本.你认为unit_test功能有副作用吗?

谢谢大家,请理解我的傻瓜英语.

Ton*_*roy 16

如果您正在编写一个您应该测试的函数,那么您应该将其设计为在框架中可测试.在这里,如果您的测试是在可以验证进程输出的进程级别完成的,那么写入std :: cout就可以了.否则,您可能希望将输出流作为函数的参数,如下所示:

void unit_test(std::ostream& os = std::cout) 
{ 
  os << "Hello" << endl; 
} 
Run Code Online (Sandbox Code Playgroud)

然后你可以测试它:

std::ostringstream oss;
unit_test(oss);
assert(oss && oss.str() == "Hello");
Run Code Online (Sandbox Code Playgroud)

如图所示,制作经过良好测试的软件需要一些给予和考虑......测试要求反馈到设计中.

编辑:如果您必须测试预先存在的功能而不更改它们,请考虑:

#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();
}
Run Code Online (Sandbox Code Playgroud)