Google Test 比较 STL 容器
Compare STL containers in Google Test
2018-10-23
Google Test 中比较 STL 容器,在网上直接搜,给出的方案大多是建议利用 Google Mock 提供的 ElementsAre
、ContainerEq
等:
ASSERT_THAT(v, ElementsAre(5, 10, 15));
EXPECT_THAT(test1, ContainerEq(test2));
(如 https://stackoverflow.com/a/2797990 https://stackoverflow.com/a/12340578 )
这种方法一来多一个依赖,二来也不够直观。
事实上,STL 容器都定义了比较操作符 operator ==
operator !=
,而 C++11 又可以使用初始化列表(initializer_list
)方便地构造容器,所以更简洁的写法是直接使用 ASSERT_EQ
和 EXPECT_EQ
:
#include <gtest/gtest.h>
#include <unordered_set>
TEST(MyTest, Test1) {
std::unordered_set<int> a;
a.insert(1);
a.insert(2);
a.insert(1);
EXPECT_EQ(a, (std::unordered_set<int>{1, 2}));
}
不过有一个坑:ASSERT_EQ
和 EXPECT_EQ
是一个宏,如果这样写 EXPECT_EQ(my_set, std::set<int>{1, 2})
,预处理器会认为有三个参数(my_set
、std::set<int>{
、2}
),一定要找地方加个小括号:EXPECT_EQ(my_set, std::set<int>({1, 2}))
或 EXPECT_EQ(my_set, (std::set
都 OK。