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提供了运行期间的错误解决途径,单元测试则是设计途中设置的一些规则,提供了实现后检验成果的依据.
谷歌出品了一个gtest,boost也有一个boost单元测试.我这里介绍gtest.废话不多说了.下边言归正传
安装
在vcpkg帮助下安装gtest非常的简单.
输入指令vcpkg install gtest,等待它安装完毕,然后就可以使用了.安装成功提示如下
在vcpkg的帮助下,安装一个依赖包就是如此简单.
至于如何安装vcpkg,请参照我第一篇.
使用gtest
我打算从头建立一个gtest项目,系列文章中的第一篇已经介绍了如何使用vcpkg+cmake+clion组织项目,这里简单提提.项目建立好后,应该先去设置以下项目属性File-->settings
如上图红框处,先设置Deployment(目的是设置好远程主机),再设置Toolchains(目的是让clion发现远程主机里安装的各种工具),再设置CMake(主要设置Cmake options: -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake,目的是为了让cmake和vcpkg联动,注意CMAKE_TOOLCHAIN_FILE指向自己机器的vcpkg.cmake文件.)
好了,我目的是为了建立如下目录结构,以及它们的cmakelists.txt文件的主要功能.
目录结构如下,其中src是项目源码的主目录,而test是测试的主目录.cmake-build-debug-xxx是clion生成的构建目录,cmake使用它进行缓存编译等操作,这里不用管它.
根目录的CMakeLists.txt:
cmake_minimum_required(VERSION 3.14)
project(gtestsimple)
set(CMAKE_CXX_STANDARD 14)
add_subdirectory(src)
add_subdirectory(test)
src中的CMakeLists.txt内容如下
add_executable(gtest_simple_run main.cpp okkk.cpp okkk.h)
add_library(gtest_simple_lib STATIC main.cpp okkk.cpp okkk.h )
src项目生成了一个gtest_simple_lib 的静态库,目的是想着在test项目中链接的时候使用.
我打算针对src/okkk.cpp进行测试,它内容非常的简单的
int okkk::add(int x, int y) {
return x + y;
}
src其余的文件内容就忽略了.内容都非常的简单.
test项目的CMakefile.txt,内容如下
enable_testing()
find_package(GTest MODULE REQUIRED)#查找GTest
find_package(Threads)#查找Threads
#一些调试信息 message(gtest_include_dir=
G
T
E
S
T
I
N
C
L
U
D
E
D
I
R
)
m
e
s
s
a
g
e
(
g
t
e
s
t
l
i
b
r
a
r
y
<
/
s
p
a
n
>
=
<
s
p
a
n
s
t
y
l
e
=
"
c
o
l
o
r
:
r
g
b
a
(
0
,
0
,
0
,
1
)
"
>
{GTEST_INCLUDE_DIR}) message(gtest_library</span>=<span style="color: rgba(0, 0, 0, 1)">
G T E S T I N C L U D E D I R ) m e s s a g e ( g t e s t l i b r a r y < / s p a n > = < s p a n s t y l e = " c o l o r : r g b a ( 0 , 0 , 0 , 1 ) " > {GTEST_LIBRARY}) message(threads=${CMAKE_THREAD_LIBS_INIT})
#包含GTest的库文件 include_directories(${GTEST_INCLUDE_DIR})
#包含src的项目文件 include_directories(…/src)
add_executable(gtest_simple_test main.cpp okkk-test.cpp)
#链接gtest_simple_lib,这个是src项目生成的静态库 #链接KaTeX parse error: Expected 'EOF', got '#' at position 30: …},这个是gtest的库文件 #̲链接 {CMAKE_THREAD_LIBS_INIT},即-lpthread target_link_libraries(gtest_simple_test PUBLIC gtest_simple_lib ${GTEST_LIBRARY} ${CMAKE_THREAD_LIBS_INIT})
add_test(NAME gtest_simple_test COMMAND gtest_simple_test)
而test的测试也非常的简单,主体如下:
#include “okkk.h”
TEST(blaTest, test1) {
EXPECT_EQ (okkk::add(</span><span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>), <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
EXPECT_EQ (okkk::add(</span><span style="color: rgba(128, 0, 128, 1)">10</span>, <span style="color: rgba(128, 0, 128, 1)">10</span>), <span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)">);
EXPECT_EQ (okkk::add(</span><span style="color: rgba(128, 0, 128, 1)">40</span>, <span style="color: rgba(128, 0, 128, 1)">65</span>), <span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)">);
}
注意到其中第三个是一个错误.
main.cpp内容
//
// Created by LaoGao on 2019/10/6.
//
#include "gtest/gtest.h"
int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
这样就可以测试了.截图如下.注意其中有一个是失败的.
Clion也可以和gtest相互整合
如上图所示,点击一下,它会把对应的测试运行一遍,并生成一个总览.
小结
在vcpkg和clion的帮助下,使用cmake变得简单,同时管理依赖库也变得异常简单.以上添加gtest就简单一步.
如果想在现有的项目上引入gtest也是可以办到的.主要是编辑test文件夹里的cmakelists.txt文件.完成4项主要内容
1.找到gtest
2.找到src
3.组织test项目的文件
4.其他杂项指令
以上4步骤中,最麻烦的是步骤2,而步骤2是每一个项目引入单元测试都会遇到的问题.可以说它是固有难度.所以抛开固有难度,将gtest引入到既有的项目,难度非常低.
gtest是一个非常好的单元测试库,具体的使用还是非常的复杂,单元测试在实践过程中非常的重要,但是单元测试最忌讳陷入使用勾股定理证明勾股定理的窘境.还有两个非常好的单元测试卡,boost.test和catch.这里就不做介绍了.