C++ 如何对写入stdout/std::cout的函数进行单元测试

C++ 如何对写入stdout/std::cout的函数进行单元测试,c++,unit-testing,testing,io,C++,Unit Testing,Testing,Io,我正在学习单元测试。从我所看到的,几乎所有的单元测试都使用返回值或输出参数作为测试用例中的期望值 没有返回值或输出参数的函数的期望值是多少 例如: void unit_test() { cout << "Hello" << endl; } void单元测试() { cout单元测试返回void的函数通常包括向其发送输入,并捕获传递坏数据时函数可能引发的任何异常。您的函数不接受任何输入,因此单元测试似乎没有必要,除非您想测试极端情况,如调用函数时内存不足。 一般来说,

我正在学习单元测试。从我所看到的,几乎所有的单元测试都使用返回值或输出参数作为测试用例中的期望值

没有返回值或输出参数的函数的期望值是多少

例如:

void unit_test()
{
  cout << "Hello" << endl;
}
void单元测试()
{

cout单元测试返回
void
的函数通常包括向其发送输入,并捕获传递坏数据时函数可能引发的任何异常。您的函数不接受任何输入,因此单元测试似乎没有必要,除非您想测试极端情况,如调用函数时内存不足。

一般来说,您不需要单元测试过程(即,您输入的代码片段不接受任何输入,也不返回任何值)。对于初学者,请尝试测试函数(接受一些参数并返回一些值)

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

看看这本入门读物:

或者这个:


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

void unit_test(std::ostream& os = std::cout) 
{ 
  os << "Hello" << endl; 
} 
如图所示,制作经过良好测试的软件需要一点互通有无……测试需求反馈到设计中

编辑:如果必须在不更改现有函数的情况下测试这些函数,请考虑:

#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();
}
#包括
#包括
void f()
{

std::cout assert(oss&&oss.str()=“Hello”)怎么样我同意你的意见。你说TDD,好吗?但是,我开始了单元测试。我们的程序也完成了开发。不幸的是我们的程序没有TDD。因此,单元测试很难,因为我们的程序在设计时没有考虑单元测试。这个问题在我的头脑中攻击!!!!!(无论如何,谢谢你的回答!哇!这是个好主意!这种方式将用于我们程序中的某些功能。:)
#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();
}