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((std::unordered_set<int>{1, 2}), a);
}

不过有一个坑:ASSERT_EQEXPECT_EQ 是一个宏,如果这样写 EXPECT_EQ(set<int>{1, 2}, my_set),预处理器会认为有三个参数(set<int>{2}my_set),一定要找地方加个小括号:EXPECT_EQ(set<int>({1, 2}), my_set)EXPECT_EQ((set{1, 2}), my_set) 都 OK。