【测试开发】使用vs code + gtest进行单元测试 - 初体验

MACOS下各种版本:

gcc : Apple clang version 11.0.3 (clang-1103.0.32.62)
cmake : version 3.19.1

现在,有两个问题:

  1. 如何为该项目运行样本测试?

  2. 如何调试这些测试和项目的源代码?

初体验(gtest非安装使用)

1. 创建一个干净的文件夹

/Users/apple/Desktop/cUnittest

2. 添加cmake文件(即CMakeLists.txt)到当前目录下,及测试文件,如下:

└─cUnittest/
    ├─ CMakeLists.txt
    ├─ myfunctions.h
    └─ mytests.cpp

3. 添加单元测试依赖的包googletest 到当前目录下

这里需要说明下,gtest可以使用cmake安装的,默认安装到目录/usr/local/include/gtest

使用git命令下载gtest:

git clone https://github.com/google/googletest.git -b release-1.10.0

这时目录下结构:

└─cUnittest/
	├─ googletest/
    ├─ CMakeLists.txt
    ├─ myfunctions.h
    └─ mytests.cpp

4. 编辑CMakeLists.txt内容

cmake官网 mac下安装(brew install cmake

# cmake的最小版本号,对应的还有max, 设置项目的cmake最低要求版本
cmake_minimum_required(VERSION 3.12) 

# 项目名称:倒没什么影响,但是cmake会默认设置一些变量,所以
project(gUnittest)

# 包含GTest的库文件, 这里是个相对路径
add_subdirectory(googletest) 

# 包含的目录,这样就能用 #include , 这里可以对比find_package()方法,有技巧的哦
include_directories(googletest/include) 

# 添加一个测试:名称和可执行文件
add_executable(mytests mytests.cpp) 

# 链接库文件,必须在上一句的后面,会有依赖关系的 
target_link_libraries(mytests PRIVATE gtest) 

5. myfunctions.h文件内容

#ifndef _ADD_H
#define _ADD_H

int add(int a, int b)
{
    return a + b;
}
#endif

6. mytests.cpp文件内容

#include 
#include "myfunctions.h"

TEST(myfunctions, add)
{
    GTEST_ASSERT_EQ(add(10, 22), 32);
}

int main(int argc, char* argv[])
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

现在可以尝试这去运行测试文件,因为是配合vs code使用,用它打开文件夹/Users/apple/Desktop/cUnittest
进行编译操作,命令行打开,创建文件夹build

mkdir build

这是个时候目录为:

└─cUnittest/
	├─ build/
	├─ googletest/
    ├─ CMakeLists.txt
    ├─ myfunctions.h
    └─ mytests.cpp

打开文件CMakeLists.txt,编辑器会有提示,安装一个插件CMake Tools extension for VS Code, 安装完毕后,在当前目录下会多一个文件夹.vscode,点击打开目录下的 settings.json文件,在里面添加一句下面的内容:

 "cmake.configureSettings": { "gtest_build_samples": "ON" }

留意一下编辑器下边栏有一排按钮:
在这里插入图片描述
可以点击按钮进行build和run了。

最后

  1. vscode 安装完插件后,在文件CMakeLists.txt编辑状态下,ctrl + s就会自动build;
  2. 如果改动测试用例很多的情况下,记录删除build目录下的内容;
  3. vscode插件其实都是执行命令行命令,可看具体的日志,命令参数什么都可以通过CMakeLists.txt配置;
  4. 个人觉得比较好的组织代码的方式是有三个目录:
└─ MyGtest/
	├─ src								# 项目源码
	│   ├── CMakeLists.txt   			# 组织源码相关的数据,包含了动态链接库文件什么的
	│   ├── functions.cpp
	│   ├── methods.h
	├─ test								# 测试目录
	│   ├── CMakeLists.txt				# 解决gtest库依赖、关联src源码、组织test代码、一些特殊的编译运行指令等等
	│   ├── test_func_a.cpp
	│   ├── test_func_b.cpp
	│   └── main.cpp
    └─ CMakeLists.txt 					# 管理src和test项目目录

备注一个新的CMakeLists.txt

# version can be different 设置项目的cmake最低要求版本
cmake_minimum_required(VERSION 3.12) 

# 因为gtest用了c++11,编译的时候一定要加c++11
set(CMAKE_CXX_COMPILER "c++")
set(CMAKE_CXX_FLAGS "-std=c++11 -stdlib=libc++")

project(gUnittest) 

#包含GTest的库文件
add_subdirectory(googletest) 
include_directories(googletest/include)

#一些调试信息
message(gtest_include_dir=${GTEST_INCLUDE_DIR})
message(gtest_library=${GTEST_LIBRARY})
message(threads=${CMAKE_THREAD_LIBS_INIT})

add_executable(mytests test_call.cpp test_inner.cpp) 

#链接gtest_simple_lib,这个是src项目生成的静态库
#链接${GTEST_LIBRARY},这个是gtest的库文件
#链接${CMAKE_THREAD_LIBS_INIT},即-lpthread
target_link_libraries(mytests PUBLIC gtest ${CMAKE_THREAD_LIBS_INIT}) 

加了c++11相关指令,为了避免问题:

error: no member named 'tuple' in namespace 'std'

你可能感兴趣的:(研发效能提升,cmake,gtest)