玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
一、前言
使用gtest编写的测试案例通常本身就是一个可执行文件,因此运行起来非常方便。同时,gtest也为我们提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。
二、基本介绍
前面提到,对于运行参数,gtest提供了三种设置的途径:
1. 系统环境变量
2. 命令行参数
3. 代码中指定FLAG
因为提供了三种途径,就会有优先级的问题, 有一个原则是,最后设置的那个会生效。不过总结一下,通常情况下,比较理想的优先级为:
命令行参数 > 代码中指定FLAG > 系统环境变量
为什么我们编写的测试案例能够处理这些命令行参数呢?是因为我们在main函数中,将命令行参数交给了gtest,由gtest来搞定命令行参数的问题。
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
这样,我们就拥有了接收和响应gtest命令行参数的能力。如果需要在代码中指定FLAG,可以使用testing::GTEST_FLAG这个宏来设置。比如相对于命令行参数--gtest_output,可以使用testing::GTEST_FLAG(output) = "xml:";来设置。注意到了,不需要加--gtest前缀了。同时,推荐将这句放置InitGoogleTest之前,这样就可以使得对于同样的参数,命令行参数优先级高于代码中指定。
{
testing::GTEST_FLAG(output) = "xml:";
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
最后再来说下第一种设置方式-系统环境变量。如果需要gtest的设置系统环境变量,必须注意的是:
1. 系统环境变量全大写,比如对于--gtest_output,响应的系统环境变量为:GTEST_OUTPUT
2. 有一个命令行参数例外,那就是--gtest_list_tests,它是不接受系统环境变量的。(只是用来罗列测试案例名称)
三、参数列表
了解了上面的内容,我这里就直接将所有命令行参数总结和罗列一下。如果想要获得详细的命令行说明,直接运行你的案例,输入命令行参数:/? 或 --help 或 -help
1. 测试案例集合
命令行参数 | 说明 |
--gtest_list_tests | 使用这个参数时,将不会执行里面的测试案例,而是输出一个案例的列表。 |
--gtest_filter |
对执行的测试案例进行过滤,支持通配符 ? 单个字符 * 任意字符 - 排除,如,-a 表示除了a : 取或,如,a:b 表示a或b 比如下面的例子: ./foo_test 没有指定过滤条件,运行所有案例 |
--gtest_also_run_disabled_tests |
执行案例时,同时也执行被置为无效的测试案例。关于设置测试案例无效的方法为: 在测试案例名称或测试名称中添加DISABLED前缀,比如: // Tests that Foo does Abc. class DISABLED_BarTest : public testing::Test { }; // Tests that Bar does Xyz. |
--gtest_repeat=[COUNT] |
设置案例重复运行次数,非常棒的功能!比如: --gtest_repeat=1000 重复执行1000次,即使中途出现错误。 |
2. 测试案例输出
命令行参数 | 说明 |
--gtest_color=(yes|no|auto) | 输出命令行时是否使用一些五颜六色的颜色。默认是auto。 |
--gtest_print_time | 输出命令行时是否打印每个测试案例的执行时间。默认是不打印的。 |
--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH] |
将测试结果输出到一个xml中。 1.--gtest_output=xml: 不指定输出路径时,默认为案例当前路径。 2.--gtest_output=xml:d:\ 指定输出到某个目录 3.--gtest_output=xml:d:\foo.xml 指定输出到d:\foo.xml 如果不是指定了特定的文件路径,gtest每次输出的报告不会覆盖,而会以数字后缀的方式创建。xml的输出内容后面介绍吧。 |
3. 对案例的异常处理
命令行参数 | 说明 |
--gtest_break_on_failure | 调试模式下,当案例失败时停止,方便调试 |
--gtest_throw_on_failure | 当案例失败时以C++异常的方式抛出 |
--gtest_catch_exceptions |
是否捕捉异常。gtest默认是不捕捉异常的,因此假如你的测试案例抛了一个异常,很可能会弹出一个对话框,这非常的不友好,同时也阻碍了测试案例的运行。如果想不弹这个框,可以通过设置这个参数来实现。如将--gtest_catch_exceptions设置为一个非零的数。 注意:这个参数只在Windows下有效。 |
四、XML报告输出格式
<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="3" failures="1" errors="0" time="35" name="AllTests">
<testsuite name="MathTest" tests="2" failures="1"* errors="0" time="15">
<testcase name="Addition" status="run" time="7" classname="">
<failure message="Value of: add(1, 1) Actual: 3 Expected: 2" type=""/>
<failure message="Value of: add(1, -1) Actual: 1 Expected: 0" type=""/>
</testcase>
<testcase name="Subtraction" status="run" time="5" classname="">
</testcase>
</testsuite>
<testsuite name="LogicTest" tests="1" failures="0" errors="0" time="5">
<testcase name="NonContradiction" status="run" time="5" classname="">
</testcase>
</testsuite>
</testsuites>
从报告里可以看出,我们之前在TEST等宏中定义的测试案例名称(testcase_name)在xml测试报告中其实是一个testsuite name,而宏中的测试名称(test_name)在xml测试报告中是一个testcase name,概念上似乎有点混淆,就看你怎么看吧。
当检查点通过时,不会输出任何检查点的信息。当检查点失败时,会有详细的失败信息输出来failure节点。
在我使用过程中发现一个问题,当我同时设置了--gtest_filter参数时,输出的xml报告中还是会包含所有测试案例的信息,只不过那些不被执行的测试案例的status值为“notrun”。而我之前认为的输出的xml报告应该只包含我需要运行的测试案例的信息。不知是否可提供一个只输出需要执行的测试案例的xml报告。因为当我需要在1000个案例中执行其中1个案例时,在报告中很难找到我运行的那个案例,虽然可以查找,但还是很麻烦。
五、总结
本篇主要介绍了gtest案例执行时提供的一些参数的使用方法,这些参数都非常有用。在实际编写gtest测试案例时肯定会需要用到的时候。至少我现在比较常用的就是:
1. --gtest_filter
2. --gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]
3. --gtest_catch_exceptions
最后再总结一下我使用过程中遇到的几个问题:
1. 同时使用--gtest_filter和--gtest_output=xml:时,在xml测试报告中能否只包含过滤后的测试案例的信息。
2. 有时,我在代码中设置 testing::GTEST_FLAG(catch_exceptions) = 1和我在命令行中使用--gtest_catch_exceptions结果稍有不同,在代码中设置FLAG方式有时候捕捉不了某些异常,但是通过命令行参数的方式一般都不会有问题。这是我曾经遇到过的一个问题,最后我的处理办法是既在代码中设置FLAG,又在命令行参数中传入--gtest_catch_exceptions。不知道是gtest在catch_exceptions方面不够稳定,还是我自己测试案例的问题。
玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数相关推荐
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
一.前言 上一篇我们分析了gtest的一些内部实现,总的来说整体的流程并不复杂.本篇我们就尝试编写一个精简版本的C++单元测试框架:nancytest ,通过编写这个简单的测试框架,将有助于我们理解g ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest
一.前言 "深入解析"对我来说的确有些难度,所以我尽量将我学习到和观察到的gtest内部实现介绍给大家.本文算是抛砖引玉吧,只能是对gtest的整体结构的一些介绍,想要了解更多细节 ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化
一.前言 在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况.我们之前的做法通常是写一个通用方法,然后编写在测试案例调用它.即使使用了通用方法,这样的工作也是有很多重复性的,程序员都懒,都希望 ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试
一.前言 "死亡测试"名字比较恐怖,这里的"死亡"指的的是程序的崩溃.通常在测试过程中,我们需要考虑各种各样的输入,有的输入可能直接导致程序崩溃,这时我们就需要 ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
一.前言 本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo工程,以及编写一个最简单的测试案例. 二.下载 如果不记得网址, 直接在google里搜gtest,第一个 ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
一.前言 gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作.总结一下gtest的事件一共有3种: 1. 全局的,所有案例执行前后. 2. TestSuite级别的,在某一批案例中第 ...
- 玩转Google开源C++单元测试框架Google Test系列
http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
- 玩转Google开源C++单元测试框架
玩转Google开源C++单元测试框架Google Test系列(gtest)(总) 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我 ...
最新文章
- 函数声明末尾的“ const”是什么意思? [重复]
- NXT节点搭建(二)环境搭建
- 使用Mybatis的Generator可能导致的一个错误
- epoll nio区别_【总结】两种 NIO 实现:Selector 与 Epoll
- [LibTorch] 参数注册 模块注册
- 黄聪:UEditor如何在wordpress中调用
- 企业如何做好EDM-企业做EDM的方案设计
- 100个高质量Java开发者博客 【转】
- CAM350对比电路图方法
- WPF中使用Chart控件
- 如何用Easy CHM制作CHM格式电子书(帮助文档)
- 控制装置与仪表随堂练习答案及知识点总结01
- 计算机应该怎样复制桌面,电脑全屏复制快捷键是什么(史上最全电脑快捷键集合)...
- python的文件操作、模块操作、os模块、time、datatime模块以及模块的制作
- 宝妈每天一小时,在家用手机做情感励志短视频,收益稳定200多
- 【Excel】Excel学习笔记 -- 通配符的使用与定位条件
- png照片太大怎么压缩?三步轻松搞定
- 证件照怎么换底色?Excel就能快速搞定,超简单
- 浅析IDC行业的前景
- 如何解决安卓手机抓包显示无网络/网络异常
热门文章
- 反射获取空参数构造方法并运行
- 工程搭建:搭建子工程之搭建实体类模块和lombok插件
- 数组的定义格式二_静态初始化
- spring的aop注解配置(了解)
- 工厂方法 coding
- jconsole工具检测堆内存变化
- 分布式存储与服务器虚拟化,超融合架构与分布式存储+虚拟化软件的融合架构究竟区别有多大?...
- __I、__O、__IO什么意思和处于keil里面什么位置
- 【AngularJS】—— 8 自定义指令
- cxgrid实现分组统计和添加Footer