当前位置:网站首页 > 技术博客 > 正文

gtest c语言



不积跬步,无以至千里;不积小流,无以成江海。夯实基础,成就高楼大厦。

在一项c++工程中,会存在很多类,很多功能方法,如果每个对外的接口方法都通过在业务中发现问题,是一件相当糟糕的事儿,而且效率低下。如果针对每个接口都设计一个主函数进行验证,需要运行很多程序,为解决这个问题,单元测试模块应运而生,本期探讨下由google开发的单元测试模块gtest的使用方法。

gtest目前已经开源,可以通过github进行下载

使用cmake进行安装,如何使用cmake进行第三方库文件安装,可自行百度,本篇着重介绍gtest的使用方法。

gtest目前提供有TEST、TEST_F、TEST_P三个宏,常用的断言有强断言ASSERT_*,弱断言EXPECT_*.

强断言之后,不在继续进行验证,一般用于第一个测试用例如果失效后,后面测试就没有意义的断言。

弱断言之后,会报错,程序继续往下运行,一版用于测试相互独立的测试用例。

有关断言的类型有很多,相等,不相等,大于,大于等于,小于等于等等,具体可以参考

先写测试文本,再进行一一解释。

首先,我们先写我们的功能函数,此时还没有gtest的任何事情,专注于开发,比如我们设计一个计算器。

功能实现为:

至此我们已经写了一个简单的计算器,能够实现基础的加法运算和一个和自身相乘的运算;接着我们写测试用例,新建文件为calculation_test.cc,这个文件名一般命名规则为[类名]_test.cc,名字没有特殊规定,只是约定俗成,方便观察是针对哪个文件的测试用例文件。

新建calculation_test.cc

编写可执行程序主函数

新建test_main.cc

cmake文件编写,新建CMakeLists.txt,并写到

编译会生成test_exe文件,运行后会执行所有的测试用例。本例子的输出为:

TEST函数内有两个参数,假如TEST(a,b),a指的是测试主体,b可以指测试具体的方法,这两个参数可以随便写,但是不能有两个完全一样的TEST(a,b)。在运行测试用例的时候,输出会指出是在运行哪个测试用例下运行的。比如测试用例中的TEST(addDouble,Mytest)和TEST(addint,Mytest),会在生成中注明a.b的形式

当遇到测试时候我们需要进行比较复杂的初始化且多个测试case都需要依赖同一个初始化时,重复在TEST宏中进行初始化操作会增大代码的冗余,此时可以通过TEST_F实现。

第一步:新建一个类继承于testing::Test,并在里面包含有一个测试主体Calculation

第二步:编写TEST_F宏,宏中两个参数,第一个参数一定是第一步中的新建类名,第二个参数可以根据自己的需求自行定义。

第三步:编写构造函数,里面默认有两个SetUp函数和TearDown函数,分别调用发生在构造函数之后,测试执行之前执行语句 和 测试结束后执行语句,在析构函数执行前执行。

可以注意到,因为在test1中我们已经将base_num进行赋值,所以在test2中进行DotSelf的时候,就认为已经赋过值了。

问题1:是否一定需要自己手写main函数?

答:否,gtest已经内嵌有main函数,可以在动态链接库链接的时候进行对gtest_main函数的依赖,这样就可以不用写main函数了

问题2:失败的案例分析有何提示?

我们尝试写一个错误的案例,分析下gtest的输出,我们把6更改为7

输出为:

版权声明


相关文章:

  • 测试cpu的性能指标2025-05-08 09:30:00
  • 文本文件对比工具2025-05-08 09:30:00
  • js 序列化和反序列化2025-05-08 09:30:00
  • ps中高斯模糊之后怎么弄清晰2025-05-08 09:30:00
  • linux停止ntp服务2025-05-08 09:30:00
  • python中py文件在哪里2025-05-08 09:30:00
  • if0 endif2025-05-08 09:30:00
  • 深度优先遍历栈实现2025-05-08 09:30:00
  • java集合类框架基本接口2025-05-08 09:30:00
  • 读取yml的值2025-05-08 09:30:00