Google Test 比较 STL 容器

Compare STL containers in Google Test

2018-10-23

Google Test 中比较 STL 容器,在网上直接搜,给出的方案大多是建议利用 Google Mock 提供的 ElementsAreContainerEq 等:

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_EQEXPECT_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_EQEXPECT_EQ 是一个宏,如果这样写 EXPECT_EQ(my_set, std::set<int>{1, 2}),预处理器会认为有三个参数(my_setstd::set<int>{2}),一定要找地方加个小括号:EXPECT_EQ(my_set, std::set<int>({1, 2}))EXPECT_EQ(my_set, (std::set{1, 2})) 都 OK。