【问题标题】:Unit testing operator<< in C++C++ 中的单元测试运算符<<
【发布时间】:2012-10-14 22:34:43
【问题描述】:

我正在尝试找出一种很好的方法来对我在 C++ 中对 operator&lt;&lt; 的实现进行单元测试。我有一个实现运算符的类,并给定一个具有特定状态的实例,我想检查输出是否是我想要的。

这是我的代码(头文件):

class Date {
    virtual int year() const { return 1970; };
    virtual int month() const { return 1; };
    virtual int day() const { return 1; };
    friend  std::ostream &operator<<(std::ostream &os, const Date &d);
};

std::ostream &operator<<(std::ostream &os, const Date &d) {
    os << d.year() << "-" << d.month() << "-" << d.day();
    return os;
};

现在,在我的单元测试方法中,我可以执行 Date d; cout &lt;&lt; d; 并在运行测试时验证输出是否正确。但是,我更愿意以编程方式验证这一点,因此我不必多看测试输出,而只需查看最终报告(希望显示“0 次测试失败!”)。

我对 C++ 还很陌生,所以除了输入和输出之外,我从来没有真正使用过流。

我该如何做到这一点?

【问题讨论】:

标签: c++ unit-testing iostream


【解决方案1】:

您可以使用std::stringstream 来保存结果,然后在其上调用str() 以获取字符串:

#include "Date.h"

#include <iostream>
#include <sstream>

int main() {
    Date d;
    std::stringstream out;
    out << d;
    if(out.str() == "1970-1-1") {
        std::cout << "Success";
    } else {
        std::cout << "Fail";
    }
}

注意:我花了很长时间在 C++ 中寻找一个体面的单元测试框架,当时我找到的最好的是 googletest——以防你还没有选择框架。

【讨论】:

  • 谢谢!这正是我想要的。我们已经在使用 cxxtestgen(一个基于 python 的框架),我自己没有选择,但目前已经足够了。不过,感谢您的提示 - 下次我选择测试框架时,我一定会看看 googletest!
  • @BrendanLong 如果你最近没有看过(过去一个月左右),我发布了一个新的unit testing framework,我相信它超过了gtest。 OTOH,如果您已经看过 xUnit++ 并且仍然更喜欢 gtest,您介意告诉我为什么吗?我欢迎所有反馈。
  • @moswald 看起来真的很酷。在下一个需要新测试框架的情况下,我可能会尝试这样做。我喜欢事实/理论的东西。
猜你喜欢
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2018-07-07
  • 2021-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多