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

标签 c++ unit-testing testing io

我正在研究单元测试。据我所知,几乎所有单元测试都使用返回值或输出参数作为其测试用例中的预期值。

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

例子:

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

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

最佳答案

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

关于c++ - 如何对写入 stdout/std::cout 的函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4191089/

相关文章:

java - 如何检查在测试方法中创建的对象的值?

c++ - 可以在 C++03 中有条件地声明友元类吗?

c++ - 这些IO功能可以换种方式完成吗?

python - Django @override_settings 不允许字典?

database - 在 Go 中模拟数据库/sql 结构

javascript - 用于多个脚本的单个 istanbul 命令(或组合覆盖率报告)

postgresql - Makefile:运行命令“go test./…”后终止

php - Yii2 扩展开发测试环境指南

c++ - 在C++中,是否有可能在父类(super class)中有一个方法,当每个子类调用该方法时,该方法会向该子类返回一个shared_ptr?

c++ - nlohmann json将.at()方法用于索引 vector