Google Test中不同容器类型的元素相等性检查方案咨询
不同类型容器元素一致性检查的GoogleTest方案
GoogleTest的ContainerEq匹配器要求左右两边的容器类型完全一致,因此std::array和std::vector无法直接用它比较。除了EXPECT_TRUE + std::equal,还有以下几种可行方案:
使用
ElementsAreArray匹配器
该匹配器支持接收数组、容器或迭代器范围,能验证目标容器的元素序列与给定序列完全一致,无需容器类型相同:TEST(TestExample, Example) { std::array<int, 4> ar = {1,2,3,4}; std::vector<int> v(ar.begin(), ar.end()); // 验证vector元素与array一致 EXPECT_THAT(v, ::testing::ElementsAreArray(ar)); // 反过来验证array元素与vector一致 EXPECT_THAT(ar, ::testing::ElementsAreArray(v)); }它会自动处理容器的元素遍历,只要两边元素类型可直接比较即可。
使用
Pointwise匹配器Pointwise配合元素级匹配器(如Eq),可逐个比较两个容器的对应元素,支持不同类型容器,只需元素数量相同且对应位置元素满足匹配条件:TEST(TestExample, Example) { std::array<int, 4> ar = {1,2,3,4}; std::vector<int> v(ar.begin(), ar.end()); EXPECT_THAT(ar, ::testing::Pointwise(::testing::Eq(), v)); }若需自定义元素比较逻辑,可将
Eq替换为其他匹配器(如DoubleNear用于浮点数精度比较)。临时转换容器类型后使用
ContainerEq
将其中一个容器临时转换为与另一个相同的类型,再用ContainerEq比较,适合需要复用ContainerEq原生逻辑的场景:TEST(TestExample, Example) { std::array<int, 4> ar = {1,2,3,4}; std::vector<int> v(ar.begin(), ar.end()); // 将array临时转为vector后比较 EXPECT_THAT(std::vector<int>(ar.begin(), ar.end()), ::testing::ContainerEq(v)); }自定义通用容器匹配器(进阶)
若需频繁比较不同类型容器,可基于GoogleTest的MatcherInterface实现通用匹配器,错误信息风格与原生匹配器一致:template<typename Container> class ContainerEqualMatcher : public ::testing::MatcherInterface<const Container&> { public: explicit ContainerEqualMatcher(const Container& expected) : expected_(expected) {} explicit ContainerEqualMatcher(Container&& expected) : expected_(std::move(expected)) {} bool MatchAndExplain(const Container& actual, ::testing::MatchResultListener* listener) const override { if (actual.size() != expected_.size()) { *listener << "size mismatch: actual has " << actual.size() << ", expected has " << expected_.size(); return false; } return std::equal(actual.begin(), actual.end(), expected_.begin()); } void DescribeTo(std::ostream* os) const override { *os << "is equal to container with elements: "; ::testing::PrintTo(expected_, os); } private: Container expected_; }; template<typename Container> ::testing::Matcher<const Container&> ContainerEqual(const Container& expected) { return ::testing::MakeMatcher(new ContainerEqualMatcher<Container>(expected)); } // 使用示例 TEST(TestExample, Example) { std::array<int, 4> ar = {1,2,3,4}; std::vector<int> v(ar.begin(), ar.end()); EXPECT_THAT(ar, ContainerEqual(v)); }
内容的提问来源于stack exchange,提问作者Mike van Dyke
相关产品推荐
相关产品推荐

