<c++开发>测试工具 -之-GoogleTest
一、前言
GoogleTest 是测试技术团队根据 Google 的特定要求和限制开发的测试框架。无论您在 Linux、Windows 还是 Mac 上工作,如果您编写 C++ 代码,GoogleTest 都可以为您提供帮助。它支持任何类型的测试,而不仅仅是单元测试。Google Test 是由 Google 推出的 C++ 测试框架,具有稳定、跨平台、快速等特点,能够为 C++ 开发人员提供有效的单元测试和集成测试工具。Google Test 支持 Linux、macOS 和 Windows 操作系统,同时支持 gcc、clang 和 MSVC 等多种编译器和构建系统。Google Test 还提供了大量的失败信息,方便开发人员排查问题。
Features(特点)
*一个xUnit测试框架。
*测试发现。
*一套丰富的断言。
*用户定义的断言。
*死亡测试。
*致命和非致命故障。
*值参数化测试。
*类型参数化测试。
*运行测试的各种选项。
*XML测试报告生成。
Operating Systems(操作系统)
*Linux
*macOS
*Windows
Compilers(编译器)
*gcc 5.0+
*clang 5.0+
*MSVC 2015+
官网介绍:GoogleTest
github网址:master分支
二、GoogleTest下载
2.1 使用git命令下载
ubuntu/windows下打开命令行终端,输入以下命令:
git clone https://github.com/google/googletest.git
完成后就会在当前目录下载googletest源码了。
windows下载如下图:
ubunt下载如下图:
2.2 github下载压缩包
打开github网址:GoogleTest
选择自己需要的版本下载即可,笔者这里下载googletest-release-1.12.1
下载完后如下:
三、GoogleTest在VS2022中的使用
对于GoogleTest在Visual Studio 17 2022
或 Visual Studio 16 2019
中使用分三种情况;
第一种就是VS工程新建时就加入GoogleTest,这种比较方便,无需下载源码;
第二种情况就是在已有vs工程中加入GoogleTest(vs工程非cmake生成);
第三种情况就是在已有vs工程中加入GoogleTest(vs工程由cmake生成);
下面一一分析这几种情况。
3.1 VS工程新建时引入GoogleTest
打开vs2022,并点击”创建新项目“,如下图:
在右侧模板中找到GoogleTest,选中后点击”下一步“,如下图:
输入工程文件存放目录位置以及命名,然后点击”创建“,如下图
选择GoogleTest的生成方式和链接方式,笔者这里选择 静态库 和 动态链接,读者根据自己选哟设定即可。选择完成后,点击”OK“,如下:
等待创建完成,会自动打开工程,如下图:
可看到生成的代码已经自带了一个测试用例,我们只需直接点击运行即可看到测试输出效果,点击运行后如下:
在vs的控制台输出中可以看到GoogleTest的测试输出内容。
后续开发c++相关内容和自行添加,并按照GoogleTest语法进行添加测试代码。语法在文章后面会讲解。
3.2 已有vs工程中加入GoogleTest(vs工程非cmake生成)
在现有vs工程中加入GoogleTest需要我们先编译GoogleTest得到相应的lib文件然后添加到工程中。
3.2.1 window下编译GoogleTest
将第2.2节下载的压缩包解压,或第2.1节下载源码。使用cmd命令进入到源码目录如下:
笔者这里就用下载的压缩包了;
cd F:\GoogleTest\googletest-release-1.12.1
F:
googletest 编译命令如下:
mkdir build //创建build,用来存放输出文件
cd build //进入build目录下
cmake .. -DCMAKE_INSTALL_PREFIX=./install //运行cmake命令,并指定安装目录位置
即可生成vs的工程。我们接着用vs2022打开进行目标编译。
进入build文件夹,打开googletest-distribution.sln,如下:
打开vs工程后,根据需要的版本进行配置,笔者这里选用release版本进行演示,如下:
编译后输入如下图所示,我们只生成.lib库,并无实际的运行程序,所以会提示无法启动程序,这没关系。我们关注编译输出内容,只要都是成功的即可。
接着,我们把鼠标放到”INSTALL“,然后右击,在弹出的列表中选择”重新生成“,如下图:
在INSTALL之后,会在我们运行”cmake … -DCMAKE_INSTALL_PREFIX=./install “时指定的”install“目录下安装对于的库文件 和头文件,如下图:
截至目前,我们VS工程需要的GoogleTest库已编译完成.
3.2.3 VS工程引用GoogleTest库
第一步:将install目录下的”include“ 和 ”lib“复制到VS工程中;
笔者为了方便版本管理,区分Debug 和Release,如下:
----->googletest-distribution
--------------------|
--------------------Release
-------------------------|
-------------------------include
-------------------------lib
--------------------|
--------------------Debug
-------------------------|
-------------------------include
-------------------------lib
打已有vs工程,添加对应的路径,如下图:
添加应用的lib文件,如下图:
添加完Lib的引用后,就可以在源码中添加GoogleTest的代码了。
3.2.4 VS工程添加GoogleTest测试用例
本次原VS工程,是一个”Hello World!“例程如下:
#include <iostream>
int main()
{
std::cout << "Hello World!\n";
}
添加完测试代码如下:
#include <iostream>
#include <gtest/gtest.h>
int add(int a, int b) {
return a + b;
}
TEST(testCase, test0) {
EXPECT_EQ(add(2, 3), 5);
}
int main()
{
std::cout << "Hello World!\n";
testing::InitGoogleTest();
return RUN_ALL_TESTS();
}
3.2.5 编译
编译报错如下:
报错原因:是由于GoogleTest的lib编译的生成方式 与引用的方式不同;
解决方法,
方法1:修改项目工程的引用库类型(一般不推荐,因为项目开发一般都稳定下来了,擅自更改,可能会引起其它错误。)
修改为MT如下:
方法2:修改GoogleTest的lib编译的生成方式,四个都要选择与VS项目的一样,选DLL(/MD),,如下:(修改完成后重新编译Lib,并复制到项目中,参考 3.2.1小节)
上述更改完成后,重新点击运行,输入如下:
其中:绿色相关行输出为GoogleTest的测试输出。
3.3 已有vs工程中加入GoogleTest(vs工程由cmake生成)
在已有vs工程中加入GoogleTest(vs工程由cmake生成),步骤与3.2节基本一致,主要是引用时有差异。在 3.2.3小节中,引用GoogleTest时,需要在项目的属性中添加对应的路径和lib。而已有vs工程中加入GoogleTest(vs工程由cmake生成),只需在cmake中添加对应的路径即可,添加如下内容:
include_directories(../../googletest-distribution/Debug/include)
include_directories(../../googletest-distribution/Debug/gtest)
include_directories(../../googletest-distribution/Debug/gtest/internal)
include_directories(../../googletest-distribution/Debug/gtest/internal/custom)
include_directories(../../googletest-distribution/Debug/gmock)
include_directories(../../googletest-distribution/Debug/gmock/internal)
include_directories(../../googletest-distribution/Debug/gmock/internal/custom)
include_directories(../../googletest-distribution/Debug/lib)
include_directories(../../googletest-distribution/Release/include)
include_directories(../../googletest-distribution/Release/gtest)
include_directories(../../googletest-distribution/Release/gtest/internal)
include_directories(../../googletest-distribution/Release/gtest/internal/custom)
include_directories(../../googletest-distribution/Release/gmock)
include_directories(../../googletest-distribution/Release/gmock/internal)
include_directories(../../googletest-distribution/Release/gmock/internal/custom)
include_directories(../../googletest-distribution/Release/lib)
target_link_libraries(main debug ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-distribution/Debug/lib/gtest.lib)
target_link_libraries(main debug ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-distribution/Debug/lib/gtest_main.lib)
target_link_libraries(main debug ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-distribution/Debug/lib/gmock.lib)
target_link_libraries(main debug ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-distribution/Debug/lib/gmock_main.lib)
target_link_libraries(main optimized ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-distribution/Release/lib/gtest.lib)
target_link_libraries(main optimized ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-distribution/Release/lib/gtest_main.lib)
target_link_libraries(main optimized ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-distribution/Release/lib/gmock.lib)
target_link_libraries(main optimized ${CMAKE_CURRENT_SOURCE_DIR}/../../googletest-distribution/Release/lib/gmock_main.lib)
其余内容与3.2节完全一致。
四、GoogleTest在ubuntu中的使用
如果需要在ubuntu的等linux的PC上使用GoogleTest,可按照以下方法。
4.1 编译GoogleTest
参考第二节的内容下载好GoogleTest源码后,输入以下命令:
cd googletest
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=./install
make
sudo make install
编译命令在不同平台基本一致,有差异也可能是编译参数不同而已。
4.2 ubuntuPC测试GoogleTest
4.2.1 创建c++源文件
创建main.cpp,并输入以下内容:
#include <stdio.h>
#include <gtest/gtest.h>
int add(int a,int b){
return a+b;
}
int subtraction(int a,int b){
return a-b;
}
TEST(testCase,test0){
EXPECT_EQ(add(2,3),5);
}
TEST(testCase,test1){
EXPECT_EQ(add(2,3),4);
}
TEST(testCase,test2){
EXPECT_EQ(subtraction(18,5),13);
}
TEST(testCase,test3){
EXPECT_EQ(subtraction(18,5),7);
}
int main(int argc,char **argv){
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
并将生成的文件复制到同级目录下,如下:
4.2.2 编译
我们通过cmake来编译项目,在main.cpp同级目录新建CMakeLists.txt,并输入以下内容:
#限制cmake最低版本
cmake_minimum_required(VERSION 3.5)
#项目名称
project(main)
#查找thread所需的资源
find_package(Threads REQUIRED)
#包含GoogleTest的头文件路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
#包含GoogleTest的库文件路径
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
#设置编译所需的源码文件
set(SRC_LIST main.cpp)
#添加编译目标-目标执行文件名为main
add_executable(main ${SRC_LIST})
#目标所连接的库,注意GoogleTest需要链接线程库
target_link_libraries(main gmock gmock_main gtest gtest_main Threads::Threads)
# 链接库target_link_libraries 需要放在 add_executable 后面,否则编译报错
# 使用链接线程前 需要搜索对应的资源,否则会报错
编写一个简单的cmake来编译项目,关于cmake的相关介绍可查阅笔者的cmake有关文章。
Cmake相关文章如下:
<Linux开发> linux开发工具-之-CMake简单例程[初见]
<Linux开发> linux开发工具-之-CMake简单例程[再见]
<Linux开发> linux开发工具-之-CMake语法[细见1]
<Linux开发> linux开发工具-之-CMake语法[细见2]
<Linux开发> linux开发工具-之-CMake语法[细见3]
编写完cmake后输入以下命令进行编译:
cmake ..
make
编译输出如下:
water@Tower-PC:~/work2/GoogleTest/testcode/build$ cmake ..
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ts/work2/GoogleTest/testcode/build
water@water-Tower-PC:~/work2/GoogleTest/testcode/build$
water@water-Tower-PC:~/work2/GoogleTest/testcode/build$
water@water-Tower-PC:~/work2/GoogleTest/testcode/build$ make
Consolidate compiler generated dependencies of target main
[ 50%] Linking CXX executable main
[100%] Built target main
4.2.3 运行验证
编译完成后可输入以下命令进行运行:
./main
运行效果如下图所示:
在main.cpp中我们设置了4个测试案例;
案例0:比较add(2,3)的返回值 与 5 是否相等;
案例1:比较add(2,3)的返回值 与 4 是否相等;
案例2:比较subtraction(18,5)的返回值 与 13 是否相等;
案例3:比较subtraction(18,5)的返回值 与 7 是否相等;
根据运行输出的内容我们可以看到,
对于test0,add函数的返回值 与 期待值5是相等的,所以EXPECT_EQ测试命令提示OK;
对于test1,add函数的返回值 与 期待值4是不相等的,所以EXPECT_EQ测试命令提示FAILED;
对于test2,subtraction函数的返回值 与 期待值13是相等的,所以EXPECT_EQ测试命令提示OK;
对于test3,subtraction函数的返回值 与 期待值7是不相等的,所以EXPECT_EQ测试命令提示FAILED;
根据运行输出的信息,我们就可以知道相关函数方法是否符合涉及要求了。
对于GoogleTest相关测试语法说明后面内容会分析。
五、GoogleTest在设备中的使用
对于GoogleTest在设备上使用的方法与在ubuntu等pc上使用方法基本一样,主要差异在于,编译工具不同。在设备上运行的程序我们需要使用交叉编译工具来编译目标。
5.1 准备交叉工具链
在第四节的基础上,我们需要在准备交叉工具链;
交叉工具分64位 和 32位;笔者这里使用的是64位的。
交叉工具链接:linaro
需要使用32位的可自行在链接的相关目录下查找。
下载完成后将压缩包复制到 /usr/local/arm/
目录下并解压,该目录,读者可自行存放。
sudo cp gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar /usr/local/arm/ -f
cd /usr/local/arm/
sudo tar -vxf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar
5.2 准备cmake所需工具链文件
当我们需要指定cmake使用的编译工具链时,我们单独新建的.cmake文件,并在运行“cmake …”命令时指定工具链参数即可。
在GoogleTest的源码顶级目录下新建“CrossCompile.cmake”文件,并输入以下内容:
set(CMAKE_TOOLCHAIN_FILE "CrossCompile.cmake")
SET(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_SYSTEM_VERSION 1)
#指定交叉编译工具的目录
set(tools /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin)
#指定c编译交叉编译工具
SET(CMAKE_C_COMPILER ${tools}/aarch64-linux-gnu-gcc)
#指定c++编译交叉编译工具
SET(CMAKE_CXX_COMPILER ${tools}/aarch64-linux-gnu-g++)
#指定交叉工具链接的库路径
SET(CMAKE_FIND_ROOT_PATH /usr/local/arm/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu//aarch64-linux-gnu/libc)
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")
SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")
SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} --sysroot=${CMAKE_FIND_ROOT_PATH}")
# Search for programs only in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH)
# Search for libraries and headers only in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
SET(CMAKE_ARM_COMPILATION 1)
#linux编译时候加上参数 -DCMAKE_TOOLCHAIN_FILE=../CrossCompile.cmake
5.3 重新编译GoogleTest
我们需要指定工具链,编译命令如下:
cd googletest
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=./install -DCMAKE_TOOLCHAIN_FILE=../CrossCompile.cmake
make
sudo make install
5.4 编译测试程序
同样,将新编译的GoogleTest的include 和 lib放到应用程序中,参4.2小结。
在4.2小节的基础上,使用cmake编译时指定编译工具即可;
将5.2小节的“CrossCompile.cmake”文件复制到应用程序的同级目录下,如下:
执行以下命令编译:
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=../CrossCompile.cmake
make
file main
进入build目录执行cmake编译,生成Makefile后,在执行make命令编译;然后使用file命令查看执行文件main的文件信息;
将编译出来的执行文件main放到64位Linux开发板上运行,可在终端查看输出信息,输出信息内容与 4.2.3小节的内容一致。
六、Assertions宏
在前面的GoogleTest代码中我们使用到了EXPECT_EQ()宏;其实在GoogleTest中提供了很多类似的断言语法宏;详细可参考官网:Assertions Reference。
6.1、Assertions宏分类
在通过断言测试一个函数或者类的行为。出现错误时,googletest会打印源文件、代码行数和错误信息(如先前 4.2.3 小节所示)。
结果只有三种,分别是成功,非致命错误,致命错误,即success, nonfatal failure, fatal failure。非致命错误不会终止当前函数,致命错误会终止测试程序并且退出,也就是说接下来的测试就不会运行了。
一般使用EXPECT_*前缀的非致命宏,这样可以跑完整个测试程序。
宏的格式有两种:
宏前缀 | 效果 |
---|---|
ASSERT_* | 致命错误 |
EXPECT_* | 非致命错误 |
一般情况使用 EXPECT_类的比较多,毕竟需要测试案例有很多个,除非某一测试按键是非常关键的则使用ASSERT_。
6.2、Boolean 条件
对于某些函数或类方法的返回值是bool类型的,则使用Boolean 条件宏。
宏类型 | 语法格式 | 结果 |
---|---|---|
致命错误 | ASSERT_TRUE(condition); | 条件为真,验证OK,否则FAILED |
致命错误 | ASSERT_FALSE(condition); | 条件为假,验证OK,否则FAILED |
非致命错误 | EXPECT_TRUE(condition); | 条件为真,验证OK,否则FAILED |
非致命错误 | EXPECT_FALSE(condition); | 条件为假,验证OK,否则FAILED |
6.3、二进制比较
对于某些函数或类方法的返回值是int等数值型时,则使用二进制比较宏。
宏类型 | 语法格式 | 结果 |
---|---|---|
致命错误 | ASSERT_EQ(val1,val2); | val1 == val2,验证OK,否则FAILED |
致命错误 | ASSERT_NE(val1,val2); | val1 != val2,验证OK,否则FAILED |
致命错误 | ASSERT_LT(val1,val2); | val1 < val2,验证OK,否则FAILED |
致命错误 | ASSERT_LE(val1,val2); | val1 <= val2,验证OK,否则FAILED |
致命错误 | ASSERT_GT(val1,val2); | val1 > val2,验证OK,否则FAILED |
致命错误 | ASSERT_GE(val1,val2); | val1 >= val2,验证OK,否则FAILED |
非致命错误 | EXPECT_EQ(val1,val2); | val1 == val2,验证OK,否则FAILED |
非致命错误 | EXPECT_NE(val1,val2); | val1 != val2,验证OK,否则FAILED |
非致命错误 | EXPECT_LT(val1,val2); | val1 < val2,验证OK,否则FAILED |
非致命错误 | EXPECT_LE(val1,val2); | val1 <= val2,验证OK,否则FAILED |
非致命错误 | EXPECT_GT(val1,val2); | val1 > val2,验证OK,否则FAILED |
非致命错误 | EXPECT_GE(val1,val2); | val1 >= val2,验证OK,否则FAILED |
6.4、字符串比较
对于某些函数或类方法的返回值是字符串时,则使用字符串比较宏。
宏类型 | 语法格式 | 结果 |
---|---|---|
致命错误 | ASSERT_STREQ(str1,str2); | 验证str1和str2是否具有相同的内容,验证OK,否则FAILED |
致命错误 | ASSERT_STRNE(str1,str2); | 验证str1和str2是否具有不同的内容,验证OK,否则FAILED |
致命错误 | ASSERT_STRCASEEQ(str1,str2); | 验证str1和str2是否具有相同的内容,忽略大小写,验证OK,否则FAILED |
致命错误 | ASSERT_STRCASENE(str1,str2); | 验证str1和str2是否具有不同的内容,忽略大小写,验证OK,否则FAILED |
非致命错误 | EXPECT_STREQ(str1,str2); | 验证str1和str2是否具有相同的内容,验证OK,否则FAILED |
非致命错误 | EXPECT_STRNE(str1,str2); | 验证str1和str2是否具有不同的内容,验证OK,否则FAILED |
非致命错误 | EXPECT_STRCASEEQ(str1,str2); | 验证str1和str2是否具有相同的内容,忽略大小写,验证OK,否则FAILED |
非致命错误 | EXPECT_STRCASENE(str1,str2); | 验证str1和str2是否具有不同的内容,忽略大小写,验证OK,否则FAILED |
6.5、浮点数比较
对于某些函数或类方法的返回值是浮点数时,则使用浮点数比较宏。
宏类型 | 语法格式 | 结果 |
---|---|---|
致命错误 | ASSERT_FLOAT_EQ(val1,val2); | 验证两个单精度值val1和val2是否大致相等,彼此相差不超过4 ULP,验证OK,否则FAILED |
致命错误 | ASSERT_DOUBLE_EQ(val1,val2); | 验证两个双精度值val1和val2是否大致相等,彼此相差不超过4 ULP,验证OK,否则FAILED |
致命错误 | ASSERT_NEAR(val1,val2); | 验证val1和val2之间的差值是否不超过绝对误差范围abs_error,验证OK,否则FAILED |
非致命错误 | EXPECT_FLOAT_EQ(val1,val2); | 验证两个浮点值val1和val2是否大致相等,彼此相差不超过4 ULP,验证OK,否则FAILED |
非致命错误 | EXPECT_DOUBLE_EQ(val1,val2); | 验证两个双精度值val1和val2是否大致相等,彼此相差不超过4 ULP,验证OK,否则FAILED |
非致命错误 | EXPECT_NEAR(val1,val2); | 验证val1和val2之间的差值是否不超过绝对误差范围abs_error,验证OK,否则FAILED |
由于舍入错误,两个浮点值不太可能完全匹配,因此EXPECT_EQ不适用。一般来说,为了使浮点比较有意义,用户需要仔细选择误差范围。
GoogleTest还提供了使用基于最后位置单元(ULP)的默认错误绑定的断言。要了解有关ULP的更多信息,请参阅官网介绍。
6.6、Exception Assertions(异常断言)
以下断言验证一段代码是否抛出或不抛出异常。用法要求在生成环境中启用异常。
请注意,测试中的代码段可以是一个复合语句,例如:
EXPECT_NO_THROW({
int n = 5;
DoSomething(&n);
});
宏类型 | 语法格式 | 结果 |
---|---|---|
致命错误 | ASSERT_THROW(statement,exception_type); | 验证语句是否引发exception_type类型的异常,验证OK,否则FAILED |
致命错误 | ASSERT_ANY_THROW(statement); | 验证该语句是否引发任何类型的异常。,验证OK,否则FAILED |
致命错误 | ASSERT_NO_THROW(statement); | 验证该语句没有引发任何异常,验证OK,否则FAILED |
非致命错误 | EXPECT_THROW(statement,exception_type); | 验证语句是否引发exception_type类型的异常,验证OK,否则FAILED |
非致命错误 | EXPECT_ANY_THROW(statement); | 验证该语句是否引发任何类型的异常。,验证OK,否则FAILED |
非致命错误 | EXPECT_NO_THROW(statement); | 验证该语句没有引发任何异常,验证OK,否则FAILED |
6.7、小结
本节分析了几种类型的断言格式,更多内容可自行查阅官方文档:assertions。
七 扩展-android中的使用
笔者之前开发Android的GNSS HAL是就用到的googletest的功能。在andorid 10之后的版本包含有googletest功能了,具体什么版本开始支持的,这个作者没探索过。
对于android源码中带的googletest源码路径是:LINUX/android/external/googletest/
笔者大致总结了一下在android 中使用googletest功能的方法。
7.1 编写测试单元
找一个路径新建目录,并完成以下内容:
笔者路径:/android/vendor/onefu/prebuild/water_gtest/
新建文件:water_gtest.cpp
路径:/android/vendor/onefu/prebuild/water_gtest/water_gtest.cpp
#include <stdio.h>
#include <gtest/gtest.h>
int add(int a,int b){
return a+b;
}
int subtraction(int a,int b){
return a-b;
}
TEST(testCase,test0){
EXPECT_EQ(add(2,3),5);
}
TEST(testCase,test1){
EXPECT_EQ(add(2,3),4);
}
TEST(testCase,test2){
EXPECT_EQ(subtraction(18,5),13);
}
TEST(testCase,test3){
EXPECT_EQ(subtraction(18,5),7);
}
我们将测试代码放到vendor目录下;
从water_gtest.cpp的内容中我们可以看到,无需用户编写main函数 和 testing::InitGoogleTest(&argc,argv);
等操作了。这是由于andorid内部集成gtest时已经处理了这些内容。 用户只需要写测试单元即可。
7.2 测试单元编译
我们需要编译测试单元代码,在water_gtest.cpp的同级目录新建 Android.bp文件,并输入以下内容:
路径:android/vendor/onefu/prebuild/water_gtest/Android.bp
cc_test {
name: "water_gtest",
srcs: [
"*.c",
"*.cc",
"*.cpp",
],
shared_libs : [
"liblog",
"libhidlbase",
"libutils",
"libcutils",
"libhardware",
],
gtest: true,
vendor: true,
compile_multilib: "64",
cppflags: ["-fexceptions", "-Wno-error"]
}
Android.bp文件与Android.mk文件一样,都是用来编译用的。
Android.bp文件中的gtest: true,
就是使能gtest功能。
编写完上述内容后我们可在 andorid的顶级目录编译,编译命令如下:
cd android
source build/envsetup.sh
lunch xxx (xxx 对应使用的设备)
make water_gtest
编译完成后输出内容如下:
可看到编译生成的目标路径是:out/target/product/msmnile_au/data/nativetest64/vendor/water_gtest/water_gtest
我们只需要把该执行文件push到设备运行即可。
7.3 运行验证
使用如下命令push到设备:
adb root
adb remount
adb push out/target/product/msmnile_au/data/nativetest64/vendor/water_gtest/water_gtest /vendor/
使用adb命令进入设备,并给予执行权限:
adb shell
cd vendor
chmod 777 water_gtest
运行water_gtest,命令如下:
./water_gtest
运行结果如下图:
运行结果与4.2.3小节的内容一致,所以android设备上的gtest使用验证完毕。文章来源:https://www.toymoban.com/news/detail-521011.html
八总结
对于gtest的使用我们就分析那么多;在gtest是用来测试c++代码的,对c++版本有要求,必须是c++14版本已上才那能使用,否则编译可能会报错。
使用gtest是为了方便验证测试我们的功能函数或类。有助于我们开发代码的健全验证。
对于gtest的更多使用方法,读者可自行查阅资料学习使用。
如有疑问欢迎留言交流。文章来源地址https://www.toymoban.com/news/detail-521011.html
到了这里,关于<c++开发>测试工具 -之-GoogleTest的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!