我正在使用Boost Test对一些C++代码进行单元测试。
我有一个值 vector ,需要将其与预期结果进行比较,但我不想在循环中手动检查这些值:
BOOST_REQUIRE_EQUAL(values.size(), expected.size());
for( int i = 0; i < size; ++i )
{
BOOST_CHECK_EQUAL(values[i], expected[i]);
}
主要问题是循环检查不打印索引,因此需要进行一些搜索才能找到不匹配的地方。
我可以在两个 vector 上使用
std::equal
或std::mismatch
,但这也需要很多样板。有没有更清洁的方法可以做到这一点?
最佳答案
使用 BOOST_CHECK_EQUAL_COLLECTIONS
。这是test_tools.hpp
中的宏,它需要两对迭代器:
BOOST_CHECK_EQUAL_COLLECTIONS(values.begin(), values.end(),
expected.begin(), expected.end());
它将报告索引和不匹配的值。如果大小不匹配,它也会报告该错误(并且不会超出 vector 的结尾)。
请注意,如果您想将
BOOST_CHECK_EQUAL
或BOOST_CHECK_EQUAL_COLLECTIONS
与非POD类型一起使用,则需要实现bool YourType::operator!=(const YourType &rhs) // or OtherType
std::ostream &operator<<(std::ostream &os, const YourType &yt)
分别用于比较和记录。
传递给
BOOST_CHECK_EQUAL_COLLECTIONS
的迭代器的顺序确定!=
比较中的哪个是RHS和LHS-第一个迭代器范围将是比较中的LHS。