不积跬步,无以至千里;不积小流,无以成江海。夯实基础,成就高楼大厦。
在一项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
输出为:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/9033.html