目录
Floating_Point Comparison(浮点型数值比较)
前言
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、可以同时编写多个测试名称的函数,如下所示。