1

我刚开始使用 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用户指南,但不知道您是否可以编写这样的自定义断言。作为替代方案,我可以编写一个 IsSorted 类并实现它的operator(). 然后我可以像这样编写测试:

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

  TS_ASSERT_PREDICATE(IsSorted, vec);
}

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

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

4

3 回答 3

1

您可以通过更改 cxxtest 头文件添加一些您自己的新宏。毕竟,它是开源的!确保您通过这些宏正确地使测试失败(请参阅 TS_ASSERT_EQUALS 的作用,这与 martiert 在此处给出的示例不同,该示例与 cxxtest 的工作方式不兼容)。

于 2011-01-23T22:27:58.790 回答
0

好吧,断言只是预处理器宏,因此您可以随意实现它们,然后为它们#define 一个宏。我认为最好使用不以 开头的名称TS_ASSERT_,这样您就不会混淆以后的代码读者。

谓词版本对我来说看起来并不那么笨拙——我可能会这样做,或者可能在你正在测试的类上实现一个 check_ 方法,然后从测试中调用它。无论如何,我经常最终需要验证类的内部结构以进行运行时调试和日志记录的方法......

于 2009-11-23T20:15:18.967 回答
-1

你可以使用#define


#define TS_ASSERT_PREDICATE( vec )\
    std::vector tmp = vec;\
    for(int i = 0; i  tmp[i+1]) \
            return false;\ 
    }\ 
    return true;\ 
}
于 2009-11-23T19:50:32.373 回答