<c++开发>测试工具 -之-GoogleTest

这篇具有很好参考价值的文章主要介绍了<c++开发>测试工具 -之-GoogleTest。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

<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下载如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
ubunt下载如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android

2.2 github下载压缩包

打开github网址:GoogleTest
选择自己需要的版本下载即可,笔者这里下载googletest-release-1.12.1
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
下载完后如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android

三、GoogleTest在VS2022中的使用

对于GoogleTest在Visual Studio 17 2022Visual Studio 16 2019中使用分三种情况;
第一种就是VS工程新建时就加入GoogleTest,这种比较方便,无需下载源码;
第二种情况就是在已有vs工程中加入GoogleTest(vs工程非cmake生成);
第三种情况就是在已有vs工程中加入GoogleTest(vs工程由cmake生成);
下面一一分析这几种情况。

3.1 VS工程新建时引入GoogleTest

打开vs2022,并点击”创建新项目“,如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
在右侧模板中找到GoogleTest,选中后点击”下一步“,如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
输入工程文件存放目录位置以及命名,然后点击”创建“,如下图
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android

选择GoogleTest的生成方式和链接方式,笔者这里选择 静态库 和 动态链接,读者根据自己选哟设定即可。选择完成后,点击”OK“,如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
等待创建完成,会自动打开工程,如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
可看到生成的代码已经自带了一个测试用例,我们只需直接点击运行即可看到测试输出效果,点击运行后如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
在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:

<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
googletest 编译命令如下:

mkdir build		//创建build,用来存放输出文件
cd build		//进入build目录下
cmake .. -DCMAKE_INSTALL_PREFIX=./install  //运行cmake命令,并指定安装目录位置

<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
即可生成vs的工程。我们接着用vs2022打开进行目标编译。
进入build文件夹,打开googletest-distribution.sln,如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
打开vs工程后,根据需要的版本进行配置,笔者这里选用release版本进行演示,如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
编译后输入如下图所示,我们只生成.lib库,并无实际的运行程序,所以会提示无法启动程序,这没关系。我们关注编译输出内容,只要都是成功的即可。
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
接着,我们把鼠标放到”INSTALL“,然后右击,在弹出的列表中选择”重新生成“,如下图:

<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
在INSTALL之后,会在我们运行”cmake … -DCMAKE_INSTALL_PREFIX=./install “时指定的”install“目录下安装对于的库文件 和头文件,如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
截至目前,我们VS工程需要的GoogleTest库已编译完成.

3.2.3 VS工程引用GoogleTest库

第一步:将install目录下的”include“ 和 ”lib“复制到VS工程中;
笔者为了方便版本管理,区分Debug 和Release,如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
----->googletest-distribution
--------------------|
--------------------Release
-------------------------|
-------------------------include
-------------------------lib
--------------------|
--------------------Debug
-------------------------|
-------------------------include
-------------------------lib

打已有vs工程,添加对应的路径,如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
添加应用的lib文件,如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
添加完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 编译

编译报错如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
报错原因:是由于GoogleTest的lib编译的生成方式 与引用的方式不同;

解决方法,
方法1:修改项目工程的引用库类型(一般不推荐,因为项目开发一般都稳定下来了,擅自更改,可能会引起其它错误。)
修改为MT如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
方法2:修改GoogleTest的lib编译的生成方式,四个都要选择与VS项目的一样,选DLL(/MD),,如下:(修改完成后重新编译Lib,并复制到项目中,参考 3.2.1小节)
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android

上述更改完成后,重新点击运行,输入如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
其中:绿色相关行输出为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();
}

并将生成的文件复制到同级目录下,如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android

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

运行效果如下图所示:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
在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位的可自行在链接的相关目录下查找。
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android

下载完成后将压缩包复制到 /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

<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android

5.4 编译测试程序

同样,将新编译的GoogleTest的include 和 lib放到应用程序中,参4.2小结。
在4.2小节的基础上,使用cmake编译时指定编译工具即可;
将5.2小节的“CrossCompile.cmake”文件复制到应用程序的同级目录下,如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
执行以下命令编译:

cd build
cmake ..  -DCMAKE_TOOLCHAIN_FILE=../CrossCompile.cmake
make
file main

<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
进入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

编译完成后输出内容如下:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
可看到编译生成的目标路径是: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

<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
运行water_gtest,命令如下:

./water_gtest

运行结果如下图:
<c++开发>测试工具 -之-GoogleTest,c++,c++,测试工具,android
运行结果与4.2.3小节的内容一致,所以android设备上的gtest使用验证完毕。

八总结

对于gtest的使用我们就分析那么多;在gtest是用来测试c++代码的,对c++版本有要求,必须是c++14版本已上才那能使用,否则编译可能会报错。
使用gtest是为了方便验证测试我们的功能函数或类。有助于我们开发代码的健全验证。
对于gtest的更多使用方法,读者可自行查阅资料学习使用。
如有疑问欢迎留言交流。文章来源地址https://www.toymoban.com/news/detail-521011.html

到了这里,关于<c++开发>测试工具 -之-GoogleTest的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 2023 年 18 种最佳 Android 测试工具

    随着时间的推移,应用程序市场变得竞争异常激烈。在竞争激烈的市场中,开发人员脱颖而出的一种方法是构建和生产功能强大、可靠且无错误的移动应用程序。虽然功能是开发人员需要解决的问题,但在移动自动化测试的帮助下制作无错误的应用程序变得越来越容易。 简而

    2024年02月08日
    浏览(37)
  • Android/iOS性能测试工具-SoloX

    SoloX - Android/iOS性能数据实时采集工具。支持收集被测应用CPU、内存、FPS、流量等性能数据,进行图表化展示。 官网:GitHub - smart-test-ti/SoloX: SoloX - Real-time collection tool for Android/iOS performance data.(Android性能测试android performanceiOS性能测试ios performance移动端性能测试mobile perform

    2024年02月03日
    浏览(37)
  • Android端自动化测试工具源码分享

    Hello啊各位老铁,许久不见,也忘了更新了,在上一篇的文章中,针对Android端的自动化测试框架做了一个简单的了解与使用,今天这篇文章呢,咱们就谈一谈具体的实现思路。 实话实说,针对这个1.0.0的版本,还是有着很多的瑕疵之处,奈何自己时间跟不上继续开发的步伐,

    2024年02月05日
    浏览(46)
  • 开发工具-压力测试工具 ab

    在学习ab工具之前,我们需了解几个关于压力测试的概念 吞吐率(Requests per second) 概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。 计算公式:

    2024年02月04日
    浏览(43)
  • 【APP渗透测试】Android APK常用测试工具(Drozer)安装及使用方法介绍

    本篇文章主要介绍 Drozer Android测试工具的安装以及简单使用,后续会持续更新更多使用方法。 Drozer 是 MWR Labs 开发的一款Android安全测试框架。是目前最好的Android安全测试工具之一。其官方文档说道: Drozer允许你一个普通Android应用的身份与其他应用和操作系统交互。 在Web世界

    2024年02月16日
    浏览(44)
  • 【测试开发】第五节.测试——自动化测试(Selenium工具)

    作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Java测试开发 每日一句: 人的一生,可以有所作为的时机只有一次,那就是现在!!! 前言 一、自动化测试的概念以及分类 二、Selenium—web自动化测试工具 2.1 自动化测试的一些前置工作 2.2 第一个自动化实例

    2024年02月04日
    浏览(62)
  • 【测试开发】Python+Django实现接口测试工具

    Python+Django接口自动化  引言:          最近被几个公司实习生整自闭了,没有基础,想学自动化又不知道怎么去学,没有方向没有头绪,说白了其实就是学习过程中没有成就感,所以学不下去。出于各种花里胡哨的原因,今天给大家整一个简单又有成就感的接口自动化学习

    2024年02月15日
    浏览(50)
  • 提升测试工具开发的思考

    本文针对测试部效率提升测试工具开发、管理、维护暴露出来的问题的一些思考以及一些个人改进观点。 写在前面   本文提到的效率提升测试工具不是指的部门中固有的自动化测试工具,这里提到的测试工具统一指测试人员在工作之余自主开发用于期望替代重复、繁琐、耗

    2024年02月04日
    浏览(33)
  • JAVA开发常用测试工具

    什么是junit JUnit 是一个用于编写和运行单元测试的开源框架,是Java 开发中最常用的单元测试框架之一。它为 Java 开发者提供了一种简单、灵活且可扩展的方式来编写自动化测试代码,并帮助开发者进行单元测试的管理和执行。 JUnit 提供了一组注解和断言方法,使开发者能够

    2024年04月25日
    浏览(53)
  • 软件外包开发测试工具

    软件测试是软件项目中非常重要的一个环节,在软件项目上线前必须要将问题测出来,否则上线后出现大量问题不但可能引起经济损失,而且也会失去客户的信任。今天和大家分享软件测试中常用的一些工具,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包