gtest运行参数

1、简介

  使用gtest编写的测试案例通常本身就是一个可执行文件,因此运行起来非常方便。同时,gtest也为我们提供了一系列的运行参数(环境变量、命令行参数或代码里指定),使得我们可以对案例的执行进行一些有效的控制。对于运行参数,gtest提供了三种设置的途径:
  1)系统环境变量
  2)命令行参数
  3)代码中指定FLAG

  因为有3种方式,因此会有优先级的问题存在。原则是:最后设置的那个会生效。比较理想的优先级是:命令行参数 > 代码中指定FLAG > 系统环境变量
  编写的测试案例能够处理这些命令行参数的原因是:在main函数中,将命令行参数交给了gtest,由gtest来搞定命令行参数的问题即是:testing::InitGoogleTest(&argc, argv);这样拥有了接收和响应gtest命令行参数的能力。

  如果需要在代码中指定FLAG,可以使用testing::GTEST_FLAG这个宏来设置。比如相对于命令行参数--gtest_output,可以使用testing::GTEST_FLAG(output) = "xml:";来设置。这样就不需要加--gtest前缀。同时,最好将这句放置InitGoogleTest之前,这样就可以使得对于同样的参数,命令行参数优先级高于代码中指定。

2、系统环境变量设置

2.1 注意点

  1) 系统环境变量全大写,比如对于--gtest_output,响应的系统环境变量为:GTEST_OUTPUT
  2)有一个命令行参数例外,那就是--gtest_list_tests,它是不接受系统环境变量的。(只是用来罗列测试案例名称)

3、参数列表

  想要获得详细的命令行说明,直接运行你的案例,输入命令行参数:/? 或 --help 或 -help。

3.1 测试案例集合

命令行参数                       说明
--gtest_list_tests              使用这个参数时,将不会执行里面的测试案例,而是输出一个案例的列表。

--gtest_filter                对执行的测试案例进行过滤,支持通配符
?                      单个字符
*                      任意字符

-                       排除,如-a 表示除了a
:                      或,如a:b 表示a或b

                      示例:
                      ./foo_test 没有指定过滤条件,运行所有案例
                      ./foo_test --gtest_filter=* 使用通配符*,表示运行所有案例
                      ./foo_test --gtest_filter=FooTest.* 运行所有“测试案例名称(testcase_name)”为FooTest的案例
                      ./foo_test --gtest_filter=*Null*:*Constructor* 运行所有“测试案例名称(testcase_name)”或“测试名称(test_name)”包含Null或Constructor的案例。
                      ./foo_test --gtest_filter=-*DeathTest.* 运行所有非死亡测试案例。
                      ./foo_test --gtest_filter=FooTest.*-FooTest.Bar 运行所有“测试案例名称(testcase_name)”为FooTest的案例,但是除了FooTest.Bar这个案例

--gtest_also_run_disabled_tests        执行案例时,同时也执行被置为无效的测试案例。关于设置测试案例无效的方法为:
                       在测试案例名称或测试名称中添加DISABLED前缀,比如:

                      // Tests that Foo does Abc.
                      TEST(FooTest, DISABLED_DoesAbc) { }

                      class DISABLED_BarTest : public testing::Test { };

                      // Tests that Bar does Xyz.
                      TEST_F(DISABLED_BarTest, DoesXyz) { }

--gtest_repeat=[COUNT]            设置案例重复运行次数.比如:
                      --gtest_repeat=1000 重复执行1000次,即使中途出现错误。
                      --gtest_repeat=-1 无限次数执行
                      --gtest_repeat=1000 --gtest_break_on_failure 重复执行1000次,并且在第一个错误发生时立即停止。这个功能对调试非常有用。
                      --gtest_repeat=1000 --gtest_filter=FooBar 重复执行1000次测试案例名称为FooBar的案例。

3.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.3 对案例的异常处理

命令行参数                        说明
--gtest_break_on_failure             调试模式下,当案例失败时停止,方便调试
--gtest_throw_on_failure             当案例失败时以C++异常的方式抛出
--gtest_catch_exceptions             只在Windows下有效。是否捕捉异常。gtest默认是不捕捉异常的,因此假如你的测试案例抛了一个异常,很可能会弹出一个对话框,这非常的不友好,同时也阻碍了测试案例的运行。如果想不弹这个框,可以通过设置这个参数来实现。如将--gtest_catch_exceptions设置为一个非零的数。

3.4 XML报告输出格式

<?xml version="1.0" encoding="UTF-8"?>
<testsuites tests="17" failures="4" disabled="0" errors="0" time="0.575" name="AllTests">
  <testsuite name="CTest" tests="1" failures="0" disabled="0" errors="0" time="0.012">
    <testcase name="Init" status="run" time="0.011" classname="CTgPluginManager" />
  </testsuite>
  <testsuite name="CGtestFile" tests="5" failures="1" disabled="0" errors="0" time="0.016">
    <testcase name="UnInit" status="run" time="0" classname="CGtestFile" />
    <testcase name="Start" status="run" time="0" classname="CGtestFile" />
    <testcase name="Stop" status="run" time="0" classname="CGtestFile" />
    <testcase name="GetVersion" status="run" time="0" classname="CGtestFile" />
    <testcase name="QueryClientObject" status="run" time="0.009" classname="CGtestFile">
      <failure message="Value of: nRet&#x0A; Actual: false&#x0A;Expected: true" type=""><![CDATA[e:\xxx\cglobalevent.cpp:51
Value of: nRet
Actual: false
Expected: true]]></failure>
    </testcase>
  </testsuite>
</testsuites>

  从报告里可以看出,我们之前在TEST等宏中定义的测试案例名称(testcase_name)在xml测试报告中其实是一个testsuite name,而宏中的测试名称(test_name)在xml测试报告中是一个testcase name
  当检查点通过时,不会输出任何检查点的信息。当检查点失败时,会有详细的失败信息输出来failure节点。当同时设置了--gtest_filter参数时,输出的xml报告中还是会包含所有测试案例的信息,只不过那些不被执行的测试案例的status值为“notrun”。

4、总结

1)比较常用的运行参数是

  --gtest_filter
  --gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]
  --gtest_catch_exceptions

  能通过命令行参数的方式设置最好使用命令行参数设置,可以避免一些使用代码设置的问题。

猜你喜欢

转载自www.cnblogs.com/Sheenagh/p/12215479.html