c++ - 如何测试函数调用顺序

标签 c++ unit-testing tdd

考虑这样的代码:

class ToBeTested {
public:
  void doForEach() {
    for (vector<Contained>::iterator it = m_contained.begin(); it != m_contained.end(); it++) {
       doOnce(*it);
       doTwice(*it);
       doTwice(*it);
    }
  }
  void doOnce(Contained & c) {
    // do something
  }
  void doTwice(Contained & c) {
    // do something
  }

  // other methods
private:
  vector<Contained> m_contained;
}

我想测试一下,如果我用 3 个值填充 vector ,我的函数将以正确的顺序和数量被调用。例如,我的测试看起来像这样:

tobeTested.AddContained(one);
tobeTested.AddContained(two);
tobeTested.AddContained(three);

BEGIN_PROC_TEST()
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)
SHOULD_BE_CALLED(doOnce, 1)
SHOULD_BE_CALLED(doTwice, 2)

tobeTested.doForEach()
END_PROC_TEST()

您建议如何对此进行测试?有没有办法用 CppUnit 或 GoogleTest 框架来做到这一点?也许其他一些单元测试框架允许执行此类测试?

我知道如果不从这些函数调用任何调试函数,这可能是不可能的,但至少可以在某些测试框架中自动完成。我不喜欢扫描跟踪日志并检查它们的正确性。

UPD:我不仅要检查对象的状态,还要检查执行顺序以避免性能问题尽可能早的阶段(通常我想知道我的代码是否完全按照我的预期执行)。

最佳答案

您应该能够使用任何良好的模拟框架来验证对协作对象的调用是否按特定顺序完成。

但是,您通常不会测试一个方法对同一类上的其他方法进行一些调用...为什么要这样做?

通常,当您测试一个类时,您只关心测试其公开可见的状态。如果你测试 否则,您的测试将阻止您以后进行重构。

我可以提供更多帮助,但我认为您的示例不一致(AddContained 方法的实现在哪里?)。

关于c++ - 如何测试函数调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/78723/

相关文章:

c++ - 有一个与命名空间同名的变量是否正确

unit-testing - Jacoco覆盖率报告,从覆盖范围中排除方法

ruby - bundle exec rake test 什么都不做

project-management - BDD都来自业务层面

laravel - 如何使用 Laravel 伪造图像上传以使用干预图像包进行测试

c++ - 如何更新 CMFCPropertyGridCtrl 的属性?

java - 变换矩阵集属性

c++ - 如何在c中找到两次之间的差异?

c# - 如何检查当前单元测试是否具有特定属性

ios - 从 Xcode 项目中删除单元测试?