gtest测试用例,gtest测试类
Gtest简介Gtest是Google的一个开源框架,主要用来编写单元测试,检查你自己的程序是否符合预期的行为。它可以在多种平台上使用(包括Linux、Mac OS X、Windows、Cygwin和Symbian)。它提供了丰富的断言、致命和非致命故障判断,并可以执行值参数测试、类型参数测试和“死亡测试”。
下载相关地址:
http://googletest.googlecode.com/files/gtest-1.3.0.zip
GitHub-Google/Google test:Google test-Google测试和模拟框架
推荐在windows下使用vcpkg工具下载安装,安装非常简单。
默认下载和安装是32位,如果需要64位,则指定64位。\ vcpkg.exe安装gt est: x64-Windows。\vcpkg.exe安装gtest相关功能一、断言
一般来说,要测试一个方法(函数)是否正常执行,可以提供一些输入数据。调用这个方法(函数)后得到输出数据,然后检查输出数据是否与我们预期的结果一致。如果一致,这个方法的逻辑是正确的;不然就有问题了。
在检查输出结果的时候,Gtest给我提供了一系列用于代码测试的断言。这些宏有点类似于函数调用。当断言失败时,Gtest将打印出源文件和断言时错误行的位置以及附加的失败信息。这些输出附加信息用户可以通过""直接跟随这些断言宏。
在Gtest中,断言宏可以理解为两类,一类是ASSERT系列,一类是EXPECT系列。
ASSERT_断言系列(致命断言):
当检查点失败时,退出当前功能(注意:不是退出当前情况)。
EXPECT_ series断言(非致命断言):
当检查点失败时,继续下一个检查点(每个断言代表一个测试点)。
通常情况下,EXPECT_应该是首选,因为ASSERT_*在报告错误后不会清理,可能会导致内存泄漏。
断言提供了以下检查方法:
布尔类型检查
二元检验
字符串检查
异常检查
浮点检查
关闭值检查
二。宏观测试
测试系统
测试宏的第一个参数是test_suite_name,第二个参数是test_name。
测试用例是为特定目标而编译的一组测试输入、执行条件和预期结果,目的是测试程序路径或验证它是否满足特定要求。
测试用例是测试套件下的(组)测试。
测试套件名称和测试异常名称不能有下划线(_)。因为GTest源代码需要用下划线把它们连接成一个独立的类名。“测试套件名称和特例名称”3354不能有相同的组合,或者类名不一致。
测试用例名称和测试用例名称的分离使得我们编写的测试代码有了更清晰的结构。
TEST_F宏
在使用TEST_F之前,需要创建一个固件类,它继承了testing: test类。
使用public或protected来描述它在一个类中的成员,并且它的成员变量可以用来确保实际执行的测试子类。我们需要构造的数据可以在构造函数或者继承自:testing:Test类的SetUp方法中实现。一些资源释放的代码可以在继承自:testing:Test类的析构函数或TearDown方法中实现。
第一个参数是测试套件名(必须与创建的固件类名一致),第二个参数是测试名,可以任意取。
TEST_F宏的实现与TEST宏类似,但TEST_F宏的封装更加开放,扩展了TEST宏的功能。
TEST_F和TEST的区别在于TEST_F提供了一个初始化函数(SetUp)和一个清理函数(TearDown)。TEST_F中使用的变量可以在初始化函数SetUp中初始化,在TearDown中销毁。的所有TEST_F都是相互独立的,都是初始化后才开始运行的。一个TEST_F不会影响另一个TEST_F使用的数据,当多个测试场景需要相同的数据配置时使用TEST_F。
TEST_P宏
在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法然后编写在测试案例调用它。即使使用了通用方法,这样的工作也是有很多重复性的。
用试验这个宏,需要编写如下的测试案例,每输入一个值就需要写一个测试点,这还只是在一个测试中,如果把每个测试点单独创建一个测试,工作量就更大。使用测试_P这个宏,对输入进行参数化,就简单很多。
预处理事件机制测试框架提供了多种预处理事件机制,方便我们在测试之前或之后做一些操作。
1.全局的,所有测试执行前后。
2.测试集级别的,在某测试套件中第一个测试前,最后一个测试执行后。
3.测试案例级别的,每个测试前后。
1.全局事件
要实现全局事件,必须写一个类继承测试:环境类,实现里面的设置和拆卸方法。
1.设置()方法在所有案例执行前执行。
2.拆卸()方法在所有案例执行后执行。
还需要在主要的函数中通过调用testing:AddGlobalTestEnvironment这个函数将事件挂进来,也就是说,我们可以写很多个这样的类,然后将他们的事件都挂上去,添加全球测试环境这个函数要放在运行所有测试之前。
2.测试套件事件
需要写一个类,继承测试:测试,然后实现两个静态方法
1.SetUpTestCase()方法在第一个测试案例之前执行。
2.TearDownTestCase()方法在最后一个测试案例之后执行。
3.测试案例事件
测试案例事件是挂在每个案例执行前后的,实现方式和测试套件的几乎一样,不过需要实现的是设置方法和拆卸方法:
1.设置()方法在每个测试案例之前执行。
2.拆卸()方法在每个测试案例之后执行。
测试用例入口
int main(int argc,char *argv[])
{
testing:InitGoogleTest( argc,argv);
返回RUN _ ALL _ TESTS();
}cmake工程中使用查找包(需要测试框架配置)
target _ link _ libraries($ { PROJECT _ NAME } PRIVATE gt est:gt est gt est gt est:gt est _ main gt est:gmock gt est:gmock _ main)附个简单的第一种工程模板:
cmake _ minimum _ required(3.12版)
项目(mygtest版本0.0.1)
集合(CMAKE_CXX_STANDARD 11)
################ QT依赖关系############
#set(CMAKE_CXX_STANDARD 11)
#set(CMAKE_AUTOMOC ON)
#set(CMAKE_AUTORCC ON)
#set(CMAKE_AUTOUIC ON)
#set(QT_VERSION 5)
#设置(必需_LIBS核心)
#设置(必需_ LIBS _合格Qt5:核心)
##################设置输出目录#########
set(BUILD _ DIR $ { CMAKE _ CURRENT _ SOURCE _ DIR }/BUILD)
设置(库目录$ {构建目录}/发布)
set(LIB_FIX)
if (CMAKE_BUILD_TYPE与"调试"匹配)
set(LIB_DIR ${BUILD_DIR}/Debug)
集合(库_修复_d)
endif()
get _ filename _ component(ABSOLUTE _ PATH $ { LIB _ DIR } ABSOLUTE)
set(LIB_DIR ${ABSOLUTE_PATH})
set(CMAKE _ ARCHIVE _ OUTPUT _ DIRECTORY $ { LIB _ DIR }/LIB)
set(CMAKE _ LIBRARY _ OUTPUT _ DIRECTORY $ { LIB _ DIR }/LIB)
set(CMAKE _ PDB _输出_目录$ { LIB _目录}/lib)
set(CMAKE _ RUNTIME _ OUTPUT _ DIRECTORY $ { LIB _ DIR }/LIB)
set(LIB_DIR_FIX ${LIB_DIR}/bin)
选项(USE_VS_BUILD "使用可视化工作室生成"关闭)
如果(使用对构建)
set(LIB _ DIR _ FIX $ { LIB _ DIR }/bin/Debug)
endif()
###################设置包含路径##########
set(SRC_PATH
${CMAKE_CURRENT_SOURCE_DIR}/
)
包含目录(
${SRC_PATH}
${BUILD_DIR}/./包含
)
添加定义(
)
###################扫描源文件##########
foreach(路径${SRC_PATH})
辅助源目录(${path} SRC_FILES)
endforeach()
##################版本配置###########
#configure_file(${BUILD_DIR}/.$ { CMAKE _ CURRENT _ BINARY _ DIR }/plugin _ version。h)中的/include/version.h
# include _ directory($ { CMAKE _ CURRENT _ BINARY _ DIR })
#if (MSVC)
# set(MY _ version info _ RC $ { CMAKE _ CURRENT _ BINARY _ DIR }/版本信息。RC’)
# configure _ file($ { CMAKE _ CURRENT _ SOURCE _ DIR }/resource。RC。在
# ${MY_VERSIONINFO_RC} )
#endif()
#添加库($ {项目名称}共享$ { SRC _ FILES } $ { MY _ version info _ RC })
添加可执行文件($ {项目名称} $ {资源文件})
###################设置目标属性###########
set _ target _ PROPERTIES($ { PROJECT _ NAME } PROPERTIES DEBUG _ POSTFIX _ d)
###################设置目标相关性###########
查找包(需要测试框架配置)
#find_package(Qt${QT_VERSION}组件$ {必填_LIBS}必需)
集(第三_LIBS
# $ {必填_ LIBS _合格}
#${LOGGING_LIB}
)
target _ link _ libraries($ { PROJECT _ NAME } PRIVATE $ { THIRD _ LIBS })
target _ link _ libraries($ { PROJECT _ NAME } PRIVATE gt est:gt est gt est gt est:gt est _ main gt est:gmock gt est:gmock _ main)在继电器的项目中还需要配置:
-DC制造前缀路径=D:\ Qt 5。12 .11 \ Qt 5。12 .11 \ 5 .12 .11 \ msvc 2015 _ 64 \ lib \ cmake-DC make _ tool chain _ FILE=F:\ VC pkg \ scripts \ build systems \ VC pkg。cmak-Wno-dev若使用命令行下尝试,则推荐使用管理员脚本,附个示例:
$ VcpkgPath= F:/VC pkg/scripts/build systems/VC pkg。 cmake
#if (($result=Read-Host 输入vcpkg.cmake的完整路径[默认值:F:/VC pkg/scripts/build systems/VC pkg。cmake])-eq ){ } else { $ VcpkgPath=$ result }
write-Host ` n VcpkgPath:$ VcpkgPath -前景色黄色
推送位置" C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ common 7 \ Tools "
cmd /c vsvars32.bat set
ForEach-Object {
if ($_ -match =) {
$v=$_ .拆分(=);set-item-force-path ENV:\ $($ v[0])-value $($ v[1])
}
}
弹出位置
“编写主机”` nVisual Studio 2015命令提示符变量集-前景颜色黄色
写主机 n生成此模块项目。-前景颜色绿色
cmake .-B BUILD-DC make _ BUILD _ TYPE=RelWithDebInfo-DC make _ tool chain _ FILE= $ VcpkgPath -Wno-dev-G NMake Makefiles
设置位置构建
编译器
# n进行安装
设置位置.简单示例#包括输入输出流
使用命名空间标准
#包含gtest/gtest.h
我的班级类{
公共:
int add(int a,int b){
返回a b;
}
int del(int a,int b){
返回a-b;
}
};
//class MyClassTest:public testing:Test { }
类MyClassTest:公共测试* TestWithParam int {
公共:
静态void SetUpTestCase()
{
cout SetUpTestCase endl
}
静态void TearDownTestCase()
{
cout TearDownTestCase endl
}
虚拟void SetUp()//测试跑之前会执行设置
{
cout 设置结束
}
虚拟无效拆除()//测试跑完之后会执行拆卸
{
cout“拆卸”结束
}
我的班级我的班级
};
INSTANTIATE_TEST_SUITE_P(PARAM,MyClassTest,testing:Values(3,5,7,9));
int Abs(int x)
{
返回x 0?x:-x;
}
测试(IsAbsTest,MyTest)
{
ASSERT _ TRUE(Abs(1)==1) Abs(1)=1 ;//ASSERT_TRUE期待结果是真的,操作员输出一些自定义的信息
ASSERT _ TRUE(Abs(-1)==1)“Abs(-1)=1”;
ASSERT _ FALSE(Abs(-2)==-2);//期待结果是错误的
ASSERT_EQ(Abs(1),Abs(-1));
ASSERT_NE(Abs(-1),0);
ASSERT_LT(Abs(-1),2);
ASSERT_GT(Abs(-1),0);
ASSERT_LE(Abs(-1),2);
ASSERT_GE(Abs(-1),0);
}
//此时使用的是测试_P宏
TEST_P(MyClassTest,AddTest)
{
auto out=myClass.add(1,2);
//ASSERT_NE(out,3);
int n=get param();
ASSERT_EQ(out,3);
ASSERT_EQ(out,n);
}
//此时使用的是测试_F宏
TEST_F(MyClassTest,Add)
{
auto out=myClass.add(1,2);
ASSERT_EQ(out,3);
}
TEST_F(MyClassTest,del)
{
ASSERT_EQ(myClass.del(4,3),1);
}
int main(int argc,char *argv[])
{
testing:InitGoogleTest( argc,argv);
返回RUN _ ALL _ TESTS();
}运行结果:
引用手把手教你使用测试框架写单元测试(1/2) - 知乎
测试框架总结_胡斯特593的博客
测试框架的介绍和使用_临海1028的博客
玩转谷歌开源C单元测试框架谷歌测试系列(gtest)之四-参数化-科德兹
谷歌C单元测试框架谷歌测试(总) - 超超男孩
编写优美的测试框架测试案例-科德兹
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。