我可以在CxxTest中编写自定义断言吗?

时间:2009-11-23 19:40:26

标签: assertions cxxtest

我刚开始使用CxxTest并想测试std :: vector是否已正确排序。到目前为止,这是我的测试:

void testSort() {
  std::sort(vec.begin(), vec.end()); // This could be any sorting function

  for (unsigned int i = 0; i < vec.size() - 1; ++i) {
    TS_ASSERT(vec[i] <= vec[i + 1]);
  }
}

显然,CxxTest不提供TS_ASSERT_SORTED断言,但有没有办法编写自定义断言?这将允许我这样做:

void testSort() {
  std::sort(vec.begin(), vec.end()); // This could be any sorting function

  TS_ASSERT_SORTED(vec);
}

当用这种方式编写时,更容易看到测试的意图。

我查看了CxxTest user's guide,但无法弄清楚是否可以编写这样的自定义断言。作为替代方案,我可以编写一个IsSorted类并实现其operator()。然后,我可以像这样编写测试:

void testSort() {
  std::sort(vec.begin(), vec.end()); // This could be any sorting function

  TS_ASSERT_PREDICATE(IsSorted, vec);
}

我猜这是正确的做法。但是,如果我这样做,我应该将class IsSorted的定义放在它自己的头文件中,与我的测试套件分开吗?我仍然试图找出与单元测试相关的最佳实践,特别是在这个框架中。

最后一个问题:我应该在setUp()方法或测试本身中对向量进行排序吗?

3 个答案:

答案 0 :(得分:1)

您可以通过更改cxxtest头文件来添加自己的一些新宏。它是开源的,毕竟!确保从这些宏中正确地通过测试(请参阅TS_ASSERT_EQUALS执行的操作,不像martiert给出的示例,这与cxxtest的工作方式不兼容)。

答案 1 :(得分:0)

好吧,断言只是预处理器宏,所以你可以根据需要实现它们,然后为它们#define一个宏。我认为使用不以TS_ASSERT_开头的名称会更好,这样您就不会混淆后来的代码读者。

谓词版本对我来说看起来并不笨拙 - 我可能会使用它,或者可能在您正在测试的类上实现check_方法,并从测试中调用它。我经常最终需要一些方法来验证类的内部结构,以便进行运行时调试。记录,无论如何...

答案 2 :(得分:-1)

您可以使用#define


#define TS_ASSERT_PREDICATE( vec )\
    std::vector tmp = vec;\
    for(int i = 0; i  tmp[i+1]) \
            return false;\ 
    }\ 
    return true;\ 
}