首页/新闻资讯/正文详情

Gtest

发布时间:2026/11/7 9:59:18 来源:云帆数科 栏目:资讯中心
Gtest
一、初始Gtest和框架搭建1.4 DemointFoo(inta,intb){if(a0||b0){throwdont do that;}intca%b;if(c0)returnb;returnFoo(b,c);}#includegtest/gtest.hTEST(FooTest,HandleNoneZeroInput){EXPECT_EQ(2,Foo(4,10));EXPECT_EQ(6,Foo(30,18));}二、断言2.1 前言GTest中断言的宏可以理解为分为两类一类是ASSERT系列一类是EXPECT系列。一个直观的解释就是ASSERT_*系列的断言当检查点失败时退出当前函数注意并非退出当前testcaseEXPECT_*系列的断言当检查点失败时继续往下执行2.2 自定义提示信息实例未使用自定义提示for(inti0;ix.size();i){EXPECT_EQ(x[i],y[i]);}#结果无法看出出错时到底是循环到哪里了/* g:\myproject\c\gtestdemo\gtestdemo\gtestdemo.cpp(25): error: Value of: y[i] Actual: 4 Expected: x[i] Which is: 3 */使用操作符自定义提示输出for(inti0;ix.size();i){EXPECT_EQ(x[i],y[i])Vectors x and y differ at index i;}/* g:\myproject\c\gtestdemo\gtestdemo\gtestdemo.cpp(25): error: Value of: y[i] Actual: 4 Expected: x[i] Which is: 3 Vectors x and y differ at index 2 */2.3 bool值类型检查ASSERTEXPECT检查失败退出函数检查失败继续往下执行ASSERT_TRUE(condition);EXPECT_TRUE(condition);ASSERT_FALSE(condition);EXPECT_FALSE(condition);2.4 数值型检查Fatal assertionNonfatal assertionVerifiesASSERT_EQ(expected, actual);EXPECT_EQ(expected, actual);expected actualASSERT_NE(val1, val2);EXPECT_NE(val1, val2);val1 ! val2ASSERT_LT(val1, val2);EXPECT_LT(val1, val2);val1 val2ASSERT_LE(val1, val2);EXPECT_LE(val1, val2);val1 val2ASSERT_GT(val1, val2);EXPECT_GT(val1, val2);val1 val2ASSERT_GE(val1, val2);EXPECT_GE(val1, val2);val1 val22.5 字符串检查Fatal assertionNonfatal assertionVerifiesASSERT_STREQ(expected_str,actual_str);EXPECT_STREQ(expected_str,actual_str);same contentASSERT_STRNE(str1, str2);EXPECT_STRNE(str1, str2);the two C strings have different contentASSERT_STRCASEEQ(expected_str, actual_str);EXPECT_STRCASEEQ(expected_str, actual_str);same content, ignoring caseASSERT_STRCASENE(str1,str2);EXPECT_STRCASENE(str1,str2);different content, ignoring case2.6 显示返回成功或失败直接返回成功SUCCEED()返回失败Fatal assertionNonfatal assertionFAIL();ADD_FAILURE();TEST(ExplicitTest,Demo){ADD_FAILURE()Sorry;// None Fatal Asserton继续往下执行。//FAIL() Sorry!; // Fatal Assertion不继续往下执行该案例。SUCCEED();}2.7 异常检查Fatal assertionNonfatal assertionVerifiesASSERT_THROW(statement,exception_type);EXPECT_THROW(statement,exception_type);statement throws an exception of the given typeASSERT_ANY_THROW(statement);EXPECT_ANY_THROW(statement);statement throws an exception of any typeASSERT_NO_THROW(statement);EXPECT_NO_THROW(statement);statement doesn’t throw any exceptionintFoo(inta,intb){if(a0||b0){throwdont do that;}intca%b;if(c0)returnb;returnFoo(b,c);}TEST(FooTest,HandleZeroInput){EXPECT_ANY_THROW(Foo(10,0));EXPECT_THROW(Foo(0,5),char*);}2.8 Predicate Assertions是对ASSERT_TRUE和EXPECT_TRUE的改进使其不仅判断TRUE和FALSE而且能显示其他信息比如输入的参数内容。如下分别是一个输入参数和两个输入参数的使用。Fatal assertionNonfatal assertionVerifiesASSERT_PRED1(pred1, val1);EXPECT_PRED1(pred1, val1);pred1(val1) returns trueASSERT_PRED2(pred2, val1, val2);EXPECT_PRED2(pred2, val1, val2);pred2(val1, val2) returns trueboolMutuallyPrime(intm,intn){returnFoo(m,n)1;}TEST(PredicateAssertionTest,Demo){intm5,n6;EXPECT_PRED2(MutuallyPrime,m,n);}/* 当失败时返回错误信息 error: MutuallyPrime(m, n) evaluates to false, where m evaluates to 5 n evaluates to 6 */2.9 浮点型检查Fatal assertionNonfatal assertionVerifiesASSERT_FLOAT_EQ(expected, actual);EXPECT_FLOAT_EQ(expected, actual);the two float values are almost equalASSERT_DOUBLE_EQ(expected, actual);EXPECT_DOUBLE_EQ(expected, actual);the two double values are almost equal2.9.1 相近数比较Fatal assertionNonfatal assertionVerifiesASSERT_NEAR(val1, val2, abs_error);EXPECT_NEAR(val1, val2, abs_error);the difference between val1 and val2 doesn’t exceed the given absolute error2.10 Windows HRESULT 检查Fatal assertionNonfatal assertionVerifiesASSERT_HRESULT_SUCCEEDED(expression);EXPECT_HRESULT_SUCCEEDED(expression);expression is a success HRESULTASSERT_HRESULT_FAILED(expression);EXPECT_HRESULT_FAILED(expression);expression is a failure HRESULTCComPtr shell;ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(LShell.Application));CComVariant empty;ASSERT_HRESULT_SUCCEEDED(shell-ShellExecute(CComBSTR(url),empty,empty,empty,empty));2.11 类型检查templatetypenameTclassFooType{public:voidBar(){testing::StaticAssertTypeEqint,T();}};TEST(TypeAssertionTest,Demo){FooTypeboolfooType;fooType.Bar();}三、事件机制3.1 前言事件在案例执行之前或之后做的一些操作。共有三个粒度全局级别的。在所有案例的第一个执行前和所有案例最后一个执行后。TestSuite级别的。在某一批案例中的第一个案例前最后一个案例执行后。TsetCase级别的。每个TestCase前后。特别需要注意区分粒度。粒度解释全局有50个testcaseSetUp在第1个testcase前执行TearDown在第50个testcase后执行。TestSuite有50个testcase其中针对这一个TestSuite的testcase是第20-30个则此SetUpTestCase在第20个testcase前执行TearDownTestCase在第30个testcase后执行。TestCaseSetUp使用此事件的每一个testcase前执行一次TearDown在 使用此事件的每一个testcase后执行一次3.2 全局级别要实现全局级别的事件写一个类继承testing::Environment类实现SetUp和TearDown在main函数中通过testing::AddGlobalTestEnvironment把事件挂进来。我们有50个testcaseSetUp在第1个testcase前执行TearDown在第50个testcase后执行。3.2.1 实现SetUP和TearDownclassFooEnvironment:publictesting::Environment{public:virtualvoidSetUp(){std::coutFoo FooEnvironment SetUPstd::endl;}virtualvoidTearDown(){std::coutFoo FooEnvironment TearDownstd::endl;}public:intdwRet;};3.2.2 挂载事件int_tmain(intargc,_TCHAR*argv[]){testing::AddGlobalTestEnvironment(newFooEnvironment);testing::InitGoogleTest(argc,argv);returnRUN_ALL_TESTS();}3.3 TestSuite事件要实现TestSuite级别(某一批)的事件写一个类继承testing::Test类实现静态方法SetUpTestCase和TearDownTestCase我们有50个testcase其中针对这一个TestSuite的testcase是第20-30个则此SetUpTestCase在第20个testcase前执行TearDownTestCase在第30个testcase后执行。classFooTest:publictesting::Test{protected:staticvoidSetUpTestCase(){shared_resource_new;}staticvoidTearDownTestCase(){deleteshared_resource_;shared_resource_NULL;}staticT*shared_resource_;};在编写测试案例时我们需要使用TEST_F这个宏第一个参数必须是我们上面类的名字代表一个TestSuiteTEST_F(FooTest,Given_When_Then){// you can refer to shared_resource here}TEST_F(FooTest,Given_When_Then){// you can refer to shared_resource here}3.4 TestCase事件TestCase是在每个testcase执行前执行也在每个testcase执行后执行。classTEST_Command_Parse:publictesting::Test{public:CoreInfo*coreInfo;2.在main函数中通过testing::AddGlobalTestEnvironment把事件挂进来。public:virtualvoidSetUp(){coreInfoInitCoreNetwork();}virtualvoidTearDown(){CloseCoreNetwork(coreInfo);}};#includegtest/gtest.hGTEST_API_intmain(intargc,char**argv){testing::InitGoogleTest(argc,argv);returnRUN_ALL_TESTS();}四、死亡测试//暂缺五、运行参数5.1 命令行参数gtest同样能够处理命令行参数因为在main函数中我们把命令行参数交给了gtest。int_tmain(intargc,_TCHAR*argv[]){testing::InitGoogleTest(argc,argv);returnRUN_ALL_TESTS();}由gtest来搞定命令行问题这样就可以使用命令行参数来使得gtest达到我们想要的效果比如参数作用–gtest_list_tests使用这个参数时将不会执行里面的测试案例而是输出一个案例的列表。5.2 代码中指定FLAGgtest提供了不止一种设置运行参数的方法命令行参数代码中指定FLAG系统环境变量优先级为命令行参数 代码中指定FLAG 系统环境变量代码指定FLAGtesting::GTEST_FLAG(output) xml:代码中指定FLAG可以使用testing::GTEST_FLAG这个宏来设置推荐将这句放在InitGoogleTest之前这样就可以使得对于同样的参数命令行参数优先级高于代码指定。int_tmain(intargc,_TCHAR*argv[]){testing::GTEST_FLAG(output)xml:;testing::InitGoogleTest(argc,argv);returnRUN_ALL_TESTS();}5.3 列表命令行参数说明–gtest_list_tests–gtest_filter–gtest_also_run_disabled_tests–gtest_repeat[COUNT]–gtest_color(yes\no\auto)–gtest_print_time–gtest_outputxml[:DIRECTORY_PATH|:FILE_PATH]异常处理异常处理–gtest_break_on_failure调试模式下当案例失败时停止方便调试–gtest_throw_on_failure–gtest_catch_exceptions5.4 总结本篇主要介绍了gtest案例执行时提供的一些参数的使用方法这些参数都非常有用。在实际编写gtest测试案例时肯定会需要用到的时候。至少我现在比较常用的就是–gtest_filter//运行所有测试./my_test--gtest_filter*//只运行 MathOperations 套件下的所有测试./my_test--gtest_filterMathOperations.*–gtest_outputxml[:DIRECTORY_PATH|:FILE_PATH]–gtest_catch_exceptions最后再总结一下我使用过程中遇到的几个问题:同时使用–gtest_filter和–gtest_outputxml:时在xml测试报告中能否只包含过滤后的测试案例的信息。有时我在代码中设置 testing::GTEST_FLAG(catch_exceptions) 1和我在命令行中使用–gtest_catch_exceptions结果稍有不同在代码中设置FLAG方式有时候捕捉不了某些异常但是通过命令行参数的方式一般都不会有问题。这是我曾经遇到过的一个问题最后我的处理办法是既在代码中设置FLAG又在命令行参数中传入–gtest_catch_exceptions。不知道是gtest在catch_exceptions方面不够稳定还是我自己测试案例的问题。

相关推荐

MyBatis(随笔2 : Sql映射文件 )
MyBatis(随笔2 : Sql映射文件 )

Sql文件映射 这里只是笔记,属性详情,关键还是要多练 ——实例代码 MyBatisDemo MyBatis 真正的强大在于映射语句,专注于SQL,功能强大,SQL映射的配置却是相当简单 SQL映射文件的几个顶级元素 name详情mappernamespace: 命名空间cache配置给… · 2026/11/7 9:59:17

MyBatis(随笔: 动态SQL映射文件)
MyBatis(随笔: 动态SQL映射文件)

动态SQL 我们可以用mybatis执行sql的形式来对数据的表进行增删改查操作,不过遇到比较复杂的业务需要写复杂的sql时(比如说sql的条件不确定,可能有一个条件或者多个), 我们就需要动态sql来提高sql的灵活性。 基于OGNL… · 2026/11/6 4:49:50

powershell自动化操作AD域、Exchange邮箱系列(7)—get-aduser/get-user获取信息 取值方法及区别
powershell自动化操作AD域、Exchange邮箱系列(7)—get-aduser/get-user获取信息 取值方法及区别

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 4:49:50

郑州新郑电工证怎么报名外省证能转吗
郑州新郑电工证怎么报名外省证能转吗

郑州新郑电工证怎么报名外省证能转吗 之前考的证在外省能不能转过来?这是很多在外地考了电工证的朋友最关心的问题。尤其是像漯河应届工程类毕业生,刚毕业就准备进工地或者企业上班,手里一张“郑州新郑电工证”能直接影响就业机会。那到底外省的电工证能不… · 2026/11/7 9:58:59

吉安电工证考试报名怎么准备?考前押题帮你稳过实操考试
吉安电工证考试报名怎么准备?考前押题帮你稳过实操考试

吉安电工证考试报名怎么准备?考前押题帮你稳过实操考试 实操考试心里没底怕挂科?吉安电工证考试报名流程复杂,考前押题成了很多人的救命稻草。特别是对于周口房建工程从业者来说,电工证不仅是上岗的“通行证”,更是保障施工安全的“底线”。但很多人对考… · 2026/11/7 9:58:59

株洲市电工证免费培训全攻略:郑州报考避坑指南怎么避开黑中介
株洲市电工证免费培训全攻略:郑州报考避坑指南怎么避开黑中介

株洲市电工证免费培训全攻略:郑州报考避坑指南怎么避开黑中介 你是不是也担心不知道哪里报名、怕被中介坑?尤其是在株洲市电工证免费培训这条路上,信息太多反而让人更迷茫。今天咱们就从头聊起,帮你理清楚怎么报名、怎么备考、怎么避开那些打着“免费”旗… · 2026/11/7 9:58:59

钢结构施工所需特种工千万别踩坑,别让培训费打水漂
钢结构施工所需特种工千万别踩坑,别让培训费打水漂

钢结构施工所需特种工千万别踩坑,别让培训费打水漂 怕考不过白交培训费?钢结构施工所需特种工考试真的很难?别担心,今天我以许昌培训机构学员的身份,来跟你聊聊这些事儿。说实话,这证考过的人不少,但真正知道怎么考、怎么准备的不多,很多人就是踩坑了… · 2026/11/7 9:58:59

郑州新郑电工证真实经历:怕考不过白交培训费?这几点必须知道
郑州新郑电工证真实经历:怕考不过白交培训费?这几点必须知道

郑州新郑电工证真实经历:怕考不过白交培训费?这几点必须知道 怕考不过白交培训费?我身边就有朋友因为没搞清楚郑州新郑电工证的实操考试内容,结果培训费打了水漂。今天就从真实经历出发,讲讲这个证到底值不值得考,以及它背后隐藏的薪资前景和职业发展机… · 2026/11/7 9:58:59

国企单位什么是特种工?真实经历告诉你怎么考
国企单位什么是特种工?真实经历告诉你怎么考

国企单位什么是特种工?真实经历告诉你怎么考 你是不是也遇到过这种情况:明明是国企单位的岗位,但入职前非要你提供一张特种作业操作证,还说不交就别来上班?结果你连特种工是什么都不清楚,更别提怎么考了。别急,我来给你讲讲,这事儿到底咋整,也给你点… · 2026/11/7 9:57:59

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41

电工作业提示版通过率揭秘:怎么考才能一次过?
电工作业提示版通过率揭秘:怎么考才能一次过?

电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41

电工证年审报名千万别踩坑 外省证转过来要搞清这几点
电工证年审报名千万别踩坑 外省证转过来要搞清这几点

电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码