GoogleTest笔记


官网:https://google.github.io/googletest/

Quickstart cmake: https://google.github.io/googletest/quickstart-cmake.html

推荐从primer文档开始:https://google.github.io/googletest/primer.html

Samples: https://google.github.io/googletest/samples.html

忍不住吐槽下,google test的文档不太给力。

基本概念

主要就是断言 assertions

两类断言:

  • ASSERT_* 遇到错误会停止;
  • EXPECT_* 遇到错误会继续;

VS+gtest

以官网sample1为例。

新建一个静态库项目,把sample1.h, sample1.cpp扔进去,编译生成sample1.lib.

不需要手动从github上下载gtest文件,新建Google Test工程时vs会自动把gtest库放在解决方案下的packages文件夹里。

选择要测试的项目sample1,vs会把它放到googletest工程的引用项里。
在这里插入图片描述

记着手动添加一下sample1项目的include目录。

在默认的test.cpp里加上sample1_unittest.cpp的代码,运行即可。

cmake+gtest

一般不会按照Quickstart那样用FetchContent_Declare把gtest源码down下来,而是提前下载下来。

在googletest目录下编译:

cmake -S . -B build
cd build && make && sudo make install

头文件安装到了/usr/local/include/gtest/

库文件在 /usr/local/lib/ 下, 它们分别是: libgtest.a 和 libgtest_main.a

然后以googletest提供的sample1为例。

直接编译,依赖库有libgtest_main.a和pthread:

g++ sample1_unittest.cc sample1.cc -lgtest -lgtest_main -lpthread -o sample1_unittest

执行sample1_unittest就可以了。

或者在sample1_unittest.cc里加上gtest_main.cc提供的main:

// Step 3. Call RUN_ALL_TESTS() in main().
//
// We do this by linking in src/gtest_main.cc file, which consists of
// a main() function which calls RUN_ALL_TESTS() for us.
//
// This runs all the tests you've defined, prints the result, and
// returns 0 if successful, or 1 otherwise.
//
// Did you notice that we didn't register the tests?  The
// RUN_ALL_TESTS() macro magically knows about all the tests we
// defined.  Isn't this convenient?
GTEST_API_ int main(int argc, char **argv) {
  printf("Running main() from %s\n", __FILE__);
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

如果调用了main,就不需要链接gtest_main了:

g++ sample1_unittest.cc sample1.cc -lgtest -lpthread -o sample1_unittest

但如果工程再大一些,用上了cmake,那就需要根据目录好好谢谢cmakelists了。

以下是我的目录树:

$ tree samples
samples
├── build
├── CMakeLists.txt
├── include
│   └── sample1.h
├── main.cc
└── src
    └── sample1
        ├── CMakeLists.txt
        ├── sample1.cc
        └── sample1_unittest.cc

/samples/CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(sample1)

# GoogleTest requires at least C++11
set(CMAKE_CXX_STANDARD 11)

MESSAGE(STATUS "Binary dir:" ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "Source dir:" ${PROJECT_SOURCE_DIR})


add_subdirectory(src/sample1)

# 开启测试
enable_testing()

# 添加到测试
add_test(NAME test_sample1 COMMAND ${PROJECT_BINARY_DIR}/src/sample1/sample1_unittest)

/samples/src/sample1/CMakeLists.txt:

set(LIB_STATIC_SRC sample1.cc)
set(LIB_STATIC_NAME static)
add_library(${LIB_STATIC_NAME} STATIC ${LIB_STATIC_SRC})
set_target_properties(${LIB_STATIC_NAME} PROPERTIES OUTPUT_NAME "sample1")


# 查找 GTest 库
find_package(GTest REQUIRED)

# GTest 的头文件
include_directories(${GTEST_INCLUDE_DIRS})

# 包含头文件
include_directories(${PROJECT_SOURCE_DIR}/include)
# 在build/src/sample1里搜索libsample1.a
link_directories(${PROJECT_BINARY_DIR}/src/sample1)

# 单元测试可执行文件
add_executable(sample1_unittest sample1_unittest.cc)

# 链接测试库
target_link_libraries( sample1_unittest
        ${GTEST_BOTH_LIBRARIES}     # google test 的两个库, 相当于下面两句
        # gtest_main  -lgtest -lgtest_main -lpthread    # 提供main, sample1_unittest里可以没有main
        # gtest      # 不提供main, sample1_unittest里要实现main

        pthread    # 依赖 pthread 库
        sample1    # 还有目标库
    )

编译:

mkdir build && cd build
cmake .. && make && make test

注意add_test必须放到根目录的CMakeLists.txt里,这样执行make test才能发现有效的测试目标。

Google Mock

https://google.github.io/googletest/gmock_for_dummies.html

另外还有GoogleTest配套的测试库Google Mock,文档说类似java中也有jMock,可以对类(或者说虚类,接口类)进行测试。

GoogleTest也可以测试类,但靠真实对象进行测试不太讲究。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值