相关文章推荐
直爽的上铺  ·  在Excel中使用VBA ...·  5 月前    · 
风流的松树  ·  Git 2.37 ...·  1 年前    · 
慷慨大方的汤圆  ·  vscode gdb ...·  1 年前    · 

0. 前言

  • 场景很简单:自己的项目中创建了一系列单元测试,如何引入 GTest,如何执行测试。

  • 准备工作:

git clone https://github.com/google/googletest.git
cd googletest
mkdir build && cd build && cmake .. && make -j4
sudo make install
sudo ldconfig
 

1. 方式一:完全不使用CMake特殊语法

  • 所谓特殊语法,就是 CMake 中的 add_test 等。

  • 如何引入:默认通过 sudo make install 后,头文件和静态链接库也都在系统路径下了。

add_executable(tests ${PROJECT_SOURCE_DIR}/tests/tests.cc)
target_link_libraries(tests gtest_main gmock_main pthread)
  • 如何进行测试:直接当做普通可执行文件执行即可,如 ./tests

2. 方式二:ctest

  • ctest 是 CMake 提供的测试工具。
  • 引入测试相关特殊语法主要包括
    • enable_testing:必须要有该语句,后续才能添加测试,即 add_test
    • add_test:添加测试用例,格式如下。
add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
         [WORKING_DIRECTORY dir]
         COMMAND <command> [arg1 [arg2 ...]])
  • 从上面的格式可以看出,add_test 对应了一个 COMMAND。
    • 换句话说,所有测试用例都基于其各自的 COMMAND。
    • 那我们需要通过 add_executable 来创建一个 COMMAND,包含所有测试的方法。
enable_testing()
add_executable(test_example test.cpp)
target_link_libraries(test_example example_lib)
add_test(NAME test_example1 COMMAND test_example --arg1=a --arg2=b)
add_test(NAME test_example2 COMMAND test_example --arg1=c --arg2=d)
  • ctest与gtest联合使用的实例(参考这里
cmake_minimum_required(VERSION 2.8)
add_executable(add-test main.cpp)
target_link_libraries(add-test
    gtest
    gtest_main
    pthread
add_test(
    NAME add
    COMMAND $<TARGET_FILE:add-test>
# run with: ctest -L lib
set_property(
    TEST add
    PROPERTY LABELS lib add
  • 执行测试用例(三选一)
make test
cmake --build . --target test
ctest

3. 方式三:find_package

find_package(GTest)
include_directories(${GTEST_INCLUDE_DIRS})
MESSAGE(${GTEST_INCLUDE_DIRS})
MESSAGE(${GTEST_BOTH_LIBRARIES})
MESSAGE(${GTEST_LIBRARIES})
MESSAGE(${GTEST_MAIN_LIBRARIES})
add_executable(tests ${PROJECT_SOURCE_DIR}/src/tests.cc)
target_link_libraries(tests ${GTEST_BOTH_LIBRARIES} pthread)
# target_link_libraries(tests GTest::GTest GTest::Main pthread)
# target_link_libraries(tests gmock_main gtest_main pthread)

4. 方式四:使用 CMake 中 GTest 相关的特殊语法

cmake_minimum_required(VERSION 3.14)
project(my_project)
# GoogleTest requires at least C++11
set(CMAKE_CXX_STANDARD 11)
include(FetchContent)
FetchContent_Declare(
  googletest
  URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
# 开启测试
enable_testing()
add_executable(
  hello_test
  hello_test.cc
target_link_libraries(
  hello_test
  gtest_main
# 下面两句 enable CMake’s test runner to discover the tests included in the binary, using the GoogleTest CMake module
include(GoogleTest)
gtest_discover_tests(hello_test)
  • 编译、执行过程
cmake -S . -B build
cmake --build build
cd build && ctest
  • 主要语法就是
    • gtest_add_tests:搜索源码中的 GTest 相关宏
    • gtest_discover_tests:搜索测试可执行文件(二进制文件)中的测试用例
文章目录0. 前言1. 方式一:完全不使用CMake特殊语法2. 方式二:ctest3. 方式三:find_package4. 方式四:使用 CMake 中 GTest 相关的特殊语法0. 前言场景很简单:自己的项目中创建了一系列单元测试,如何引入 GTest,如何执行测试。准备工作:git clone https://github.com/google/googletest.gitcd googletestmkdir build &amp;&amp; cd build &amp;& - 测试并不是一个独立的工作, 它是开发工作的一部分, 伴随着整个开发过程 - 质量不等于测试, 为了质量, 需要你把开发工作和测试结合到一起, 搅拌它们, 直到分不清你我为止 - 测试 ok 不等于高质量,但是测试不 ok,确实万万不行的 - 通过把测试工作一定程度的融合到开发过程,我们极大的降低了一些本来被认为会写很多有问题的代码的人的出错机会 项目结构 项目结构基本上是一个带有两个静态库的主项目。 洞察力是 Foo 是您正在从事并作为产品交付的某种项目。 这个 Foo 产品依赖于两个静态库 A 和 B,它们是没有外部依赖的独立库。 ├── CMakeLists.txt ├── README.md ├── include ├── libs │   ├── A │   │   ├── CMakeLists.txt │   │   ├── include │   │   │   └── A │   │   │   └── A.h │   │   ├── src │   │   │   └── A.cpp │   │ 
本指南将向您展示如何通过Google的测试框架使用CMake单元测试来设置新的C ++项目。 通过此设置,您可以立即开始使用C ++进行测试驱动的开发。 弄清楚如何将gtest添加到现有项目并开始在旧的(现有)代码库上进行TDD也很简单。 环境:win10 子系统linux ubuntu18.04 确保已经安装了cmake(3.10以上),g++,gcc等基本环境。 最后的效果图: set(CMAKE_PREFIX_PATH "/path/to/gtest/install/path/cmake/path" ${CMAKE_PREFIX_PATH}) enable_testing() set(GTEST_ROOT "/path/to/gtest/install/path") find_package(GTest R
因此在CMakeLists可以简单写成: find_package(GTEST REQUIRED) include_directories(${GTEST_INCLUDE_DIRS}) target_link_libraries(untitled ${GTEST_LIBRARIES}) 当然最好还是别这么搞~ 2. 断言 3. 例子
Gtest介绍 Gtest是Google的一个开源框架,它主要用于写单元测试,检查真自己的程序是否符合预期行为。可在多个平台上使用(包括Linux, Mac OS X, Windows, Cygwin和Symbian),它提供了丰富的断言、致命和非致命失败判断,能进行值参数化测试、类型参数化测试、“死亡测试”。 相关地址: http://googletest.googlecode.com/files/gtest-1.3.0.zip GitHub - google/googletest:.
最近在写so库相关的项目,由于so是针对接口的代码编程,因此需要写大量的测试代码,因此使用gtest来进行测试自己的代码是很好的一个方式。 当然测试还可以使用valgrind测试代码是否有内存泄露。总之很爽。 操作系统为Debian操作系统。 需要安装gtest sudo apt-get install libtest-dev 动态库编写 新建项目 项目目录如下:
下载google test 下载地址:https://github.com/google/googletest/tree/v1.10.x (我用的是1.10.x版本) main.cc #include #include “gtest/gtest.h” int Add(int a, int b) { return a + b; int Sub(int a, int b){ return a - b; TEST(testCase, test0){ EXPECT_EQ(14, Add(4, 10)); TEST(testCase, test1){ 管道用于运行测试。 简而言之,您会看到一个使用google test作为git子模块并集成了travis CI管道的C ++项目。 我的灵感来自部分的项目,并且在sime时需要对此进行改进:目标是使用git子模块,以避免在当前存储库复制google test。 cmake项目文件 头文件( *.h ) 源文件( *.cpp ) 测试文件( *.cpp ) 克隆项目 使用git clone --recursive ...下载项目及其git子模块。 否则,需要从项目根存储库下载子模块: git submodule update --init 。 建立项目 按照标准的cmake步骤创建可执行文件: mkdir b
googletest googletest 是一个由 Google 的测试技术团队开发的测试框架,它考虑到了谷歌的特定需求和限制。无论你使用的是 Linux、Windows 还是 Mac,只要你编写 C++ 代码,googletest 都可以帮到你。它支持任何类型的测试,不只是单元测试googletest安装 #下载gtest,release-1.8.0 git clone https://github.com/google/googletest # gtest编译 cd googletest #生成Makefile文件(先安装cmake,brew install cmake),继续输入命
https://www.cnblogs.com/gaopang/p/11630110.html 这是系列文章的第三篇,前两篇https://www.cnblogs.com/gaopang/p/11243367.html和https://www.cnblogs.com/gaopang/p/11588683.html. 为了保证软件质量,除去使用gdb进行事后调试,以及使用sanitize进行必要的提示以外,再就是单元测试了. Sanitize提供了关键性问题的提示,gdb提供了运行期间的错误解决途径,单元测
add_test(NAME <name> COMMAND <command> [<arg>...] [CONFIGURATIONS <config>...] [WORKING_DIRECTORY <dir>] [COMMAND_EXPAND_LISTS]) 今天占个位,等有时间再更新说明和使用案例 ```cmake add_executable(my_executable my_source.cpp) target_link_libraries(my_executable my_dll_library) 其,`my_executable` 是你要编译的可执行文件名,`my_source.cpp` 是你的源代码,`my_dll_library` 是你要链接的 DLL 库名。 如果 DLL 库的路径不在默认搜索路径,你需要使用 `link_directories` 命令指定路径,例如: ```cmake link_directories("path/to/my_dll_library") 如果你需要在 Windows 上链接导入库(.lib 文件),你需要使用 `target_link_libraries` 命令指定导入库名,例如: ```cmake add_executable(my_executable my_source.cpp) target_link_libraries(my_executable my_dll_library my_import_library) 其,`my_import_library` 是你要链接的导入库名。注意,导入库名通常是 DLL 库名加上后缀 .lib。