GoogleTest测试框架使用详解(从零到精通,最详细版)

目录

前言

Assertions Reference

Boolean Conditions(bool类型判断) 

Binary Comparison(值比较)

String Comparison(字符串比较)

Floating_Point Comparison(浮点型数值比较)

Exception Assertions(异常抛出检测)

小结

测试示例(vs2022)


前言

GoogleTest是一款由Google开发的C++测试框架,具有快速、简洁、可靠、跨平台等优点,可以帮助C++开发人员更好的测试代码。本文将根据谷歌官方资料,全面介绍GoogleTest测试框架的使用,并在vs2022上进行验证。本文旨在从零开始学习GoogleTest测试框架,适合没有GoogleTest相关知识的学习者和想全面了解该框架使用的学习者。

GoogleTest的结构较为简单,跟着本文进行学习定会在短时间内掌握其使用!

vs2022自带GoogleTest测试框架,是否安装可通过Visual Studio Installer进行查看,如图所示。

Assertions Reference

参考来源:https://github.com/google/googletest/blob/main/docs/reference/assertions.md

本部分介绍assertion(断言)的相关知识,GoogleTest中Assertion类似于函数宏(此处不用细究什么是宏,知道这回事就行),可使用其测试类或函数,当断言执行失败时,GoogleTest会打印输出相关信息。使用前请添加#include <gtest/gtest.h>

#include <gtest/gtest.h>

assertion(断言)的使用中分别有EXPECT_和ASSERT_的变体形式,两者的区别在于当代码测试失败时,EXPECT_生成非致命失败,并允许当前函数继续运行,而ASSERT_生成致命失败,并终止当前函数。此外,所有断言都支持通过“<<”操作符自定义失败提示信息,如下所示,“<<”操作符的使用类似于"cout<<"输出控制台相关信息。

/ 任何可以流入ostream 的内容都可以流入断言宏中,直接类比cout的使用即可
EXPECT_TRUE(my_condition) << "自定义提示信息";

下面将介绍各类assertion(断言)的含义和使用。

SUCCEED() 

表示成功的断言,当测试执行过程中没有任何断言失败,测试才会被认为成功。目前,GoogleTest的版本不会输出SUCCEED()断言的信息,但更新版本可能会包含此功能。

FAIL() 

表示一个致命失败,立即终止当前函数,只能在返回类型为void的函数中使用。

ADD_FAILURE() 

表示一个非致命失败,继续运行当前函数,适用于出现失败时继续执行后续代码的情况,有助于在一次测试中捕获多个错误。

ADD_FAILURE_AT( file_path , line_number) 

表示在指定的文件和行号处生成一个非致命失败,可以更精确地定位失败的原因,有助于更快地发现和修复问题。

本部分的断言可以使用匹配器来验证值。

EXPECT_THAT( value , matcher )

ASSERT_THAT( value , matcher )

用于验证value是否符合给定的匹配器matcher,示例如下:

#include <gmock/gmock.h>
using ::testing::StartsWith;

EXPECT_THAT(value1, StartsWith("Hello"));    / 验证value1是否以“Hello”开头

Boolean Conditions(bool类型判断) 

本部分的断言可以测试bool类型的条件

EXPECT_FALSE( condition )

ASSERT_FALSE( condition )

用来验证condition是否为假。

EXPECT_TRUE( condition )

ASSERT_TRUE( condition )

用来验证condition是否为真。

Binary Comparison(值比较)

本部分断言用来比较两个值,值也可以是string类型。

EXPECT_EQ( val1 , val2 )

ASSERT_EQ( val1 , val2 )

用来验证val1和val2是否相等。

EXPECT_NE( val1 , val2 )

ASSERT_NE( val1 , val2 )

用来验证val1和val2是否不相等。

EXPECT_LT( val1 , val2 )

ASSERT_LT( val1 , val2 )

用来验证val1< val2是否成立。

EXPECT_LE( val1 , val2 )

ASSERT_LE( val1 , val2 )

用来验证val1<= val2是否成立。

EXPECT_GT( val1 , val2 )

ASSERT_GT( val1 , val2 )

用来验证val1> val2是否成立。

EXPECT_GE( val1 , val2 )

ASSERT_GE( val1 , val2 )

用来验证val1>= val2是否成立。

String Comparison(字符串比较)

本部分断言用来比较两个C strings,如果比较两个string对象,请使用EXPECT_EQ和EXPECT_NE。C strings是字符数组的形式,string是C++标准库提供的字符串类。

EXPECT_STREQ( str1 , str2 )

ASSERT_STREQ( str1 , str2 )

用来验证两个C strings是否有相同的内容。

EXPECT_STRNE( str1 , str2 )

ASSERT_STRNE( str1 , str2 )

用来验证两个C strings是否有不同的内容。

EXPECT_STRCASEEQ( str1 , str2 )

ASSERT_STRCASEEQ( str1 , str2 )

用来验证两个C strings是否有相同的内容,忽略大小写。

EXPECT_STRCASENE( str1 , str2 )

ASSERT_STRCASENE( str1 , str2 )

用来验证两个C strings是否有不同的内容,忽略大小写。

Floating_Point Comparison(浮点型数值比较)

需注意的是浮点型数值存在舍入误差,无法被精确表示,因此两浮点型数值相等的情况十分罕见,使用时需仔细选择误差范围,GoogleTest提供的误差范围是基于ULPs的,1个ULP表示两个连续的浮点数之间的最小距离,取决于浮点数的精度。

EXPECT_FLOAT_EQ( val1 , val2 )

ASSERT_FLOAT_EQ( val1 , val2 )

用来验证浮点型数值val1和val2是否近似相等(4个ULPS)。

EXPECT_DOUBLE_EQ( val1 , val2 )

ASSERT_DOUBLE_EQ( val1 , val2 )

用来验证double数值val1和val2是否近似相等(4个ULPS)。

EXPECT_NEAR( val1 , val2 , abs_error )

ASSERT_NEAR( val1 , val2 , abs_error )

用来验证数值val1和val2的差值没有超过绝对误差abs_error。

Exception Assertions(异常抛出检测)

本部分用来验证代码片段是否抛出异常,被测试的代码片段可以是复合语句,如下:

EXPECT_NO_THROW({
  int n = 5;            / 测试内部这些代码运行是否会抛出异常
  DoSomething(&n);
});

EXPECT_THROW( statement , exception_type )

ASSERT_THROW( statement , exception_type )

用来验证某个语句(statement)是否抛出指定类型(exception_type)的异常。

EXPECT_ANY_THROW( statement )

ASSERT_ANY_THROW( statement )

用来验证某个语句(statement)是否抛出任何类型的异常。

EXPECT_NO_THROW( statement )

ASSERT_NO_THROW( statement )

用来验证某个语句(statement)是否没有抛出任何类型的异常。

小结

掌握了以上语法,基本可以满足日常使用。下一小节将给出具体的测试案例以供读者学习。

测试示例(vs2022)

1、使用TEST()宏来定义和命名一个测试函数,这些都是普通的C++函数,不返回值。

2、在这个测试函数中,除了任何你想包含的有效的C++语句之外,还可以使用各种GoogleTest的断言来检查值。

TEST(TestSuiteName, TestName) {
  ... 测试主体 ...
}

TEST()中参数TestSuiteName表示测试套件的名称,TestName表示测试套件中的测试名称,这两个参数名称必须是有效的C++标识符,并且它们不应该包含任何下划线(_)。测试的完整名称包括其所属的测试套件和其具体的测试名称,来自不同测试套件的测试可以具有相同的名称。

GoogleTest按测试套件对测试结果进行分组,因此逻辑相关的测试应该放在同一个测试套件中;换句话说,它们的TEST()的第一个参数应该是相同的。

有了测试的相关基础知识,下面开始具体实践。

1、首先新建一个GoogleTest项目,测试项目配置按照默认即可。

2、新建好的测试项目默认结构如下所示。

 3、修改pch.h和.cpp文件内容如下。

 4、 在TEST()测试函数的主体写入判断函数值是否相等的断言,运行后控制台信息显示如下。

 5、可以同时编写多个测试名称的函数,如下所示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想躺平的点云工程师

感谢各位看官!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值