0


使用gtest做cpp的单元测试并查看代码覆盖率

1 前言

  1. 由于工作需要,要使用googletest做单元测试,本文记录下搭建gtest单元测试环境,并查看代码覆盖率的方法,以备不时之需。

2 准备工作

2.1 编译gtest

克隆gtest源码:

  1. git clone https://github.com/google/googletest.git
  1. 使用缺省分支main,并在googletest源码当前目录创建一个编译的build目录:
  1. mkdir -p build && cd build
  1. 进入到build目录下,执行如下命令:
  1. cmake .. && make -j9 && make install DESTDIR=./
  1. 编译安装完成,gtest相关头文件在以下目录,其中libusr目录在googletest根目录:
  1. ├── lib
  2. ├── libgmock.a
  3. ├── libgmock_main.a
  4. ├── libgtest.a
  5. └── libgtest_main.a
  6. └── usr
  7. └── local
  8. ├── include
  9. ├── gmock
  10. └── gtest
  11. └── lib
  12. ├── cmake
  13. ├── libgmock.a
  14. ├── libgmock_main.a
  15. ├── libgtest.a
  16. ├── libgtest_main.a
  17. └── pkgconfig

2.2 安装lcov

  1. macOS下需要使用**lcov**来生成单元测试的覆盖率报告,用brew下载即可:
  1. brew install lcov

3 跑demo

3.1 建qt工程

  1. 至此, 万事俱备,现在使用qt创建一个c++的工程:

  1. 进入到demo的工程根目录,将googletest编译安装之后的**include**和**lib**文件copydemo的当前根目录下,注意**gtest**目录下便是依赖文件:
  1. mingo@localhost:~/Applications/workspace/tools/unit_test$tree -L 3
  2. .
  3. ├── build-cpp-unit-test-Desktop_arm_darwin_generic_mach_o_64bit-Debug
  4. ├── CMakeCache.txt
  5. ├── CMakeCache.txt.prev
  6. ├── CMakeFiles
  7. ├── 3.26.0
  8. ├── CMakeConfigureLog.yaml
  9. ├── TargetDirectories.txt
  10. ├── cmake.check_cache
  11. ├── cpp-unit-test.dir
  12. ├── pkgRedirects
  13. └── rules.ninja
  14. ├── Testing
  15. └── Temporary
  16. ├── build.ninja
  17. ├── cmake_install.cmake
  18. ├── cpp-unit-test
  19. ├── output
  20. ├── Users
  21. ├── amber.png
  22. ├── cmd_line
  23. ├── emerald.png
  24. ├── gcov.css
  25. ├── glass.png
  26. ├── index-sort-f.html
  27. ├── index-sort-l.html
  28. ├── index.html
  29. ├── ruby.png
  30. ├── snow.png
  31. ├── updown.png
  32. └── v1
  33. ├── qtcsettings.cmake
  34. └── test.info
  35. ├── cpp-unit-test
  36. ├── CMakeLists.txt
  37. ├── CMakeLists.txt.user
  38. └── main.cpp
  39. └── gtest
  40. ├── include
  41. ├── gmock
  42. └── gtest
  43. └── lib
  44. ├── libgmock.a
  45. ├── libgmock_main.a
  46. ├── libgtest.a
  47. └── libgtest_main.a
  48. 17 directories, 29 files

3.2 编写CMakeLists

  1. 然后编写CMakeLists构建脚本:
  1. cmake_minimum_required(VERSION 3.5)
  2. project(cpp-unit-test LANGUAGES CXX)
  3. set(CMAKE_CXX_STANDARD 17)
  4. set(CMAKE_CXX_STANDARD_REQUIRED ON)
  5. # lcov相关编译选项
  6. #SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O0 -coverage -fprofile-arcs -ftest-coverage")
  7. SET(GCC_COVERAGE_COMPILE_FLAGS "-g -O0 -fprofile-arcs -ftest-coverage")
  8. #SET(GCC_COVERAGE_LINK_FLAGS "-coverage -lcov")
  9. #SET(GCC_COVERAGE_LINK_FLAGS "-coverage")
  10. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}")
  11. SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
  12. set(GTEST_ROOT_DIR ${PROJECT_SOURCE_DIR}/../gtest)
  13. set(GTEST_INCLUDE_DIR ${GTEST_ROOT_DIR}/include)
  14. set(GTEST_LIB_DIR ${GTEST_ROOT_DIR}/lib)
  15. message("dir=${PROJECT_SOURCE_DIR}")
  16. include_directories(${GTEST_INCLUDE_DIR})
  17. #link_libraries(${GTEST_LIB_DIR})
  18. set(GTEST_LIBS ${GTEST_LIB_DIR}/libgtest.a ${GTEST_LIB_DIR}/libgtest_main.a ${GTEST_LIB_DIR}/libgmock.a ${GTEST_LIB_DIR}/libgmock_main.a)
  19. #target_link_libraries(cpp-unit-test gcov)
  20. add_executable(cpp-unit-test main.cpp)
  21. target_link_libraries(cpp-unit-test PRIVATE ${GTEST_LIBS})
  22. install(TARGETS cpp-unit-test
  23. LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
  1. 写一个最简单的测试用例:
  1. #include <iostream>
  2. using namespace std;
  3. #include "gtest/gtest.h"
  4. #include "gmock/gmock.h"
  5. TEST(mytest, mytest1) {
  6. EXPECT_TRUE(1);
  7. }
  8. int main()
  9. {
  10. cout << "Hello World!" << endl;
  11. return RUN_ALL_TESTS();
  12. }

3.3 运行

4 代码覆盖率

  1. 在上图的qt工程命令行里,可以看到用例的通过数和失败数,但还不够直观,此处使用**lcov**来生成**html**网页形式查看**代码覆盖率**:
  2. 进入到demo的构建目录下:
  1. mingo@localhost:~/Applications/workspace/tools/unit_test/build-cpp-unit-test-Desktop_arm_darwin_generic_mach_o_64bit-Debug$ll
  2. total 3352
  3. drwxr-xr-x 16 mingo staff 512 6 15 14:29 ./
  4. drwxr-xr-x 5 mingo staff 160 6 15 13:30 ../
  5. drwxr-xr-x 3 mingo staff 96 6 15 13:30 .cmake/
  6. -rw-r--r-- 1 mingo staff 149532 6 15 14:26 .ninja_deps
  7. -rw-r--r-- 1 mingo staff 383 6 15 14:26 .ninja_log
  8. drwxr-xr-x 4 mingo staff 128 6 15 13:30 .qtc_clangd/
  9. -rw-r--r-- 1 mingo staff 13148 6 15 13:30 CMakeCache.txt
  10. -rw-r--r-- 1 mingo staff 13148 6 15 13:30 CMakeCache.txt.prev
  11. drwxr-xr-x 9 mingo staff 288 6 15 14:26 CMakeFiles/
  12. drwxr-xr-x 3 mingo staff 96 6 15 13:30 Testing/
  13. -rw-r--r-- 1 mingo staff 11042 6 15 14:26 build.ninja
  14. -rw-r--r-- 1 mingo staff 2238 6 15 13:30 cmake_install.cmake
  15. -rwxr-xr-x 1 mingo staff 1416352 6 15 14:26 cpp-unit-test*
  16. drwxr-xr-x 15 mingo staff 480 6 15 14:29 output/
  17. -rw-r--r-- 1 mingo staff 52 6 15 14:26 qtcsettings.cmake
  18. -rw-r--r-- 1 mingo staff 25803 6 15 14:28 test.info
  1. 然后执行如下命令:
  1. lcov -c -o test.info -d .
  1. 报了如下错:
  1. geninfo: ERROR: (inconsistent) "gtest-internal.h":454: function _ZN7testing8internal15TestFactoryImplI19mytest_mytest1_TestEC1Ev end line 444 less than start line 454. Cannot derive function end line. See lcovrc man entry for 'derive_function_end_line'.
  2. (use "geninfo --ignore-errors inconsistent ..." to bypass this error)
  1. 解决办法:
  1. lcov -c -o test.info -d . --ignore-errors inconsistent
  1. 可以看到,执行成功之后,会在当前目录下生成test.info文件:
  1. test.info
  1. 然后,在当前目录下创建output目录,用来存放覆盖率报告相关的html文件:
  1. mkdir -p output && genhtml test.info -o ./output --ignore-errors inconsistent
  1. 以上命令执行成功,会在如下output目录下产生html相关的文件:
  1. mingo@localhost:~/Applications/workspace/tools/unit_test/build-cpp-unit-test-Desktop_arm_darwin_generic_mach_o_64bit-Debug$tree -L 2
  2. .
  3. ├── CMakeCache.txt
  4. ├── CMakeCache.txt.prev
  5. ├── CMakeFiles
  6. ├── 3.26.0
  7. ├── CMakeConfigureLog.yaml
  8. ├── TargetDirectories.txt
  9. ├── cmake.check_cache
  10. ├── cpp-unit-test.dir
  11. ├── pkgRedirects
  12. └── rules.ninja
  13. ├── Testing
  14. └── Temporary
  15. ├── build.ninja
  16. ├── cmake_install.cmake
  17. ├── cpp-unit-test
  18. ├── output
  19. ├── Users
  20. ├── amber.png
  21. ├── cmd_line
  22. ├── emerald.png
  23. ├── gcov.css
  24. ├── glass.png
  25. ├── index-sort-f.html
  26. ├── index-sort-l.html
  27. ├── index.html
  28. ├── ruby.png
  29. ├── snow.png
  30. ├── updown.png
  31. └── v1
  32. ├── qtcsettings.cmake
  33. └── test.info
  34. 10 directories, 22 files
  1. 进入到output目录下,执行如下命令:
  1. open index.html

标签: 单元测试

本文转载自: https://blog.csdn.net/weixin_41255248/article/details/139702332
版权归原作者 老中医的博客 所有, 如有侵权,请联系我们删除。

“使用gtest做cpp的单元测试并查看代码覆盖率”的评论:

还没有评论