我刚刚开始使用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()方法中还是在测试本身中对向量进行排序?
发布于 2011-01-24 06:27:59
您可以通过更改cxxtest头文件来添加一些自己的新宏。毕竟,它是开源的!确保从这些宏中正确地测试失败(请参阅TS_ASSERT_EQUALS做了什么,不像这里的martiert给出的示例与cxxtest的工作方式不兼容)。
发布于 2009-11-24 04:15:19
这些断言只是预处理器宏,所以你可以随心所欲地实现它们,然后为它们定义一个宏。我认为最好使用不以TS_ASSERT_开头的名称,这样就不会让后来的代码读者感到困惑。
在我看来,谓词版本看起来并不那么笨拙--我可能会这样做,或者可能在您正在测试的类上实现一个check_方法,然后从测试中调用它。不管怎样,我经常需要一些方法来验证类的内部结构,以进行运行时调试和日志记录。
发布于 2009-11-24 03:50:32
您可以使用#define
#define TS_ASSERT_PREDICATE( vec )\
std::vector tmp = vec;\
for(int i = 0; i tmp[i+1]) \
return false;\
}\
return true;\
}https://stackoverflow.com/questions/1785467
复制相似问题