Gtest

概述

GTest是一个跨平台的C++单元测试框架,由google公司发布。gtest是为了在不同平台上为编写C++单元测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化等等测试所需的宏,以及全局测试,单元测试组件。

使用

头文件

1
#include <gtest/gtest.h>

框架初始化接口

1
testing::InitGoogleTest(&argc, argv);

调用测试样例

1
RUN_ALL_TESTS();

CMake

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cmake_minimum_required(VERSION 3.10)

project(main)

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++17" COMPILER_SUPPORTS_CXX17)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)

# check results and add flag
if(COMPILER_SUPPORTS_CXX17)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
elseif(COMPILER_SUPPORTS_CXX11)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++17 support.")
elseif(COMPILER_SUPPORTS_CXX0X)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support.")
else()
message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++0x support. Please use a different C++ compiler.")
endif()

add_executable(main.exe main.cpp)

target_link_libraries(main.exe gtest pthread)

TEST宏

1
2
3
这里不需要双引号,且同测试下多个测试样例不能同名 TEST(测试名称, 测试样例名称
TEST(测试名称, 测试样例名称)
TEST_F(test_fixture,test_name)
  • TEST:主要用来创建一个简单测试, 它定义了一个测试函数, 在这个函数中可以使用任何C++代码并且使用框架提供的断言进行检查。
  • TEST_F:主要用来进行多样测试,适用于多个测试场景如果需要相同的数据配置的情况,即相同的数据测不同的行为。

断言宏

GTest中的断言的宏可以分为两类:

  • ASSERT_X系列:如果当前点检测失败则退出当前函数
  • EXPECT_X系列:如果当前点检测失败则继续往下执行
    下面是经常使用的断言介绍
1
2
3
4
5
6
7
8
// bool值检查 ASSERT_TRUE(参数),期待结果是true
ASSERT_FALSE(参数),期待结果是false 数值型数据检查
ASSERT_EQ(参数1,参数2),传入的是需要比较的两个数 equal
ASSERT_NE(参数1,参数2)not equal,不等于才返回true
ASSERT_LT(参数1,参数2),less than,小于才返回true
ASSERT_GT(参数1,参数2),greater than,大于才返回true
ASSERT_LE(参数1,参数2),less equal,小于等于才返回true
ASSERT_GE(参数1,参数2),greater equal,大于等于才返回true

举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <gtest/gtest.h>
#include <iostream>

int Add(int num1, int num2)
{
return num1 + num2;
}

TEST(AddTest, AddTestName)
{
ASSERT_EQ(Add(10, 20), 30);
ASSERT_LT(Add(20, 20), 50);
}

TEST(StringTest, StringTestName)
{
std::string str = "hello";
ASSERT_EQ(str, "hello");
ASSERT_EQ(str, "Hello");
}

int main(int argc, char* argv[])
{
// 单元测试框架初始化
testing::InitGoogleTest(&argc, argv);

// 开始所有的单元测试
return RUN_ALL_TESTS();
}