1. 初体验
- 编译googletest
- 下载googletest
https://github.com/google/googletest
cd googletest
mkdir build
建编译目录cd build
cmake ..
生成makefilemake
编译后生成libgmock.a libgmock_main.a libgtest.a libgtest_main.a
sudo make install
将头文件导入到/usr/local/include
, 静态库导入到/usr/local/lib64
- 下载googletest
- 使用
- 创建main文件
#include <gtest/gtest.h> #include <iostream> using namespace std; int add(int a, int b) { return a + b; } // 注意使用TEST TEST(testTT2, abc) { EXPECT_EQ(add(2,3), 5); } int main() { testing::InitGoogleTest(); return RUN_ALL_TESTS(); }
- g++编译:
g++ test2.cc -o out1 -lgtest -lpthread
- cmake编译
cmake_minimum_required(VERSION 3.14.1) project(gtest_project) find_package(GTest CONFIG REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -g -Wall -O0") #link_directories(/usr/local/lib64) #include_directories(/usr/local/include) set(SRC test2.cc) add_executable(out1 ${SRC}) target_link_libraries(out1 gtest pthread) # 链接gtest
- 执行生成的可执行文件
./out1
- 创建main文件
2. Gtest功能函数解释
2.1 初始化SetUpTestCase/TearDownTestCase,SetUp/TearDown
以下函数使用需要定义测试套类继承::testing::Test
,重新对应函数,使用TEST_F
代替上面的TEST
(TEST_F: Test fixture
, 多个测试用例需要用相同数据配置时,可以声明一个类继承Test,在类中定义数据,然后使用类名作为TEST_F
的测试套名; TEST
可以不自定义类,但同时也没法重载初始化函数)
SetUpTestCase:static
测试套级别,运行测试套第一个用例前执行TearDownTestCase: static
测试套级别,运行测试套最后一个用例后执行SetUp:virtual
测试套中每个测试用例开始时执行TearDown:virtrual
测试套中每个测试用例运行后执行
class TestSuit1 : public ::testing::Test {
public:
static void TearDownTestCase()
{
std::cout << "TearDownTestCase" << std::endl;
}
static void SetUpTestCase()
{
std::cout << "SetUpTestCase" << std::endl;
}
virtual void SetUp()
{
std::cout << "SetUp" << std::endl;
}
virtual void TearDown()
{
std::cout << "TearDown" << std::endl;
}
};
int testFunc(int a, int b)
{
return a + b;
}
// 注意TEST_F
TEST_F(TestSuit1, testCase1)
{
std::cout << testFunc(1, 3) << std::endl;;
}
TEST_F(TestSuit1, testCase2)
{
std::cout << testFunc(2, 3) << std::endl;;
}
- 备注:
- 另外一种方法实现全局
SetUp
和TearDown
,也就是全局的测试用例在执行前后都会执行的函数 - 使用:
- 自定义类继承
::testing::Environment
, 在类中重写SetUp
和TearDown
方法,定义类对象 - 在
RUN_ALL_TESTS
前调用testing::AddGlobalTestEnvironment
注册全局环境
class MyEnvironment : public testing::Environment; ::testing::AddGlobalTestEnvironment(new MyEnvironment()); RUN_ALL_TESTS();
- 自定义类继承
- 另外一种方法实现全局
2.2 断言
- 布尔断言:单参断言
ASSERT_TRUE、ASSERT_FALSE、EXPECT_TRUE、EXPECT_FALSE
- 数值断言:双参
ASSERT_EQ、ASSERT_NE、ASSERT_LT、ASSERT_LE、ASSERT_GT、ASSERT_GE
EXPECT_EQ、EXPECT_NE、EXPECT_LT、EXPECT_LE、EXPECT_GT、EXPECT_GE
- 字符串断言
ASSERT_STREQ、ASSERT_STRCASEEQ
2.3 运行参数
-
过滤只跑某些测试套:
--gtest_filter=只需要运行的用例名正则*
-
不执行但列出测试用例:
--gtest_list_tests =
-
返回结果:
--gtest_output=xml/json
按照xml或者json格式返回结果--gtest_output=json:/ussr/local
指定格式和目录
-
备注:参数生效前提是在RUN_ALL_TESTS要继承main函数的argc和argv