gtest 常用命令

Test selection

命令行

  1. --gtest_filter 指定需要执行的测试用例名称,支持通配符和正则表达式。e.g. --gtest_filter=prefix/test_suite_name.test_name
    • 过滤多个测试用例,用冒号:分隔。e.g.:--gtest_filter="FooTest.*:BarTest.case1:OtherTest.case2"
    • 过滤不想测试的用例,用符号-。e.g.:--gtest_filter="FooTest.*:-FooTest.case1" 运行FooTest套件中除了case1之外的所有用例
    • 模糊匹配用例,用符号:。e.g.:--gtest_filter="*dhu*:*IHU*" 运行全名包含“dhu”或“IHU”的用例
  2. --gtest_list_tests 列出所有测试用例名称,但不会执行测试用例
  3. --gtest_also_run_disabled_tests 执行被禁止的测试用例

自定义的main函数

  1. testing::FLAGS_gtest_filter = "*" ; 过滤用例,支持通配符和正则表达式
    • 过滤多个测试用例,用冒号:分隔。e.g.:testing::FLAGS_gtest_filter = "FooTest.*:BarTest.case1:OtherTest.case2;"
    • 过滤不想测试的用例,用符号-。e.g.:testing::FLAGS_gtest_filter ="FooTest.*:-FooTest.case1;" 运行FooTest套件中除了case1之外的所有用例
    • 模糊匹配用例,用符号:。e.g.:testing::FLAGS_gtest_filter = "*dhu*:*IHU*;" 运行全名包含“dhu”或“IHU”的用例
  2. testing::FLAGS_gtest_list_tests = 1 | 0; 是否列出所有测试用例名称,但不会执行测试用例
  3. testing::FLAGS_gtest_also_run_disabled_tests = true | false; 是否执行被禁止的测试用例

Test execution

命令行

  1. --gtest_repeat=[count] 用于重复执行测试用例,可以指定重复次数;e.g. --gtest_repeat=10
  2. --gtest_shuffle 随机化测试用例的执行顺序
  3. --gtest_random_seed 随机种子用于打乱测试顺序

自定义的main函数

  1. testing::FLAGS_gtest_repeat=[count];
  2. testing::FLAGS_gtest_shuffle = 1; // 1: shuffle, 0: no shuffle
  3. testing::FLAGS_gtest_random_seed = 0; // 0: use random seed, 1: use fixed seed
  4. testing::FLAGS_gtest_stack_trace_depth = 1; // 1: stack trace depth, 0: no stack trace

Test output

  1. --gtest_color 开启或关闭测试结果的颜色输出 e.g. --gtest_color=yes|no|auto
  2. --gtest_print_time=0 不打印每次测试的运行时间
  3. --gtest_output=(json|xml)[:DIRECTORY_PATH/|:FILE_PATH 输出xml/json格式的报告 e.g. --gtest_output=“xml:…/report/output.xml”
  4. --gtest_stream_result_to=HOST:PORT 将测试结果流传输到给定的服务器

自定义的main函数

  1. testing::FLAGS_gtest_output = "xml:../report/TestReport.xml";
  2. testing::FLAGS_gtest_stream_result_to = host:port;
  3. testing::FLAGS_gtest_print_time = 1; // 1: print time, 0: no print time
  4. testing::FLAGS_gtest_color = "yes"; // “yes” or “no”

Assertion behavior

命令行

  1. --gtest_death_test_sytle=(fast|threadsafe) 设置默认的死亡测试类型
  2. --gtest_break_on_failure=0|1 失败之后是否停止测试,1-停止,0=不停止 【Linux系统】
  3. --gtest_throw_on_failure 将断言失败转换为c++异常,供外部测试框架使用

自定义的main函数

  1. testing::FLAGS_gtest_death_test_style = "threadsafe"; // “threadsafe” or “fast”
  2. testing::FLAGS_gtest_break_on_failure = 1; // 1: break on failure, 0: continue on failure
  3. testing::FLAGS_gtest_throw_on_failure = 1; // 1: throw on failure, 0: continue on failure
  4. testing::FLAGS_gtest_stack_trace_depth = 1; // 1: stack trace depth, 0: no stack trace

跳过用例的方法

  1. GTEST_SKIP()
  2. TestName前加DISABLED_ e.g. DISABLED_testname

gtest参数化测试

创建参数化测试

  1. 多重继承自:testing::Test 以及 testing::WithParamInterface (pure interface).
  2. 继承封装好的类:testing::TestWithParam

用法说明:

  • 类内部通过 GetParam() 成员函数调用传入的参数.
  • 设置 test suite 时,后缀_P。 e.g. TEST_P(test_suite_name, test_name)
  • TEST_P 如果没有 INSTANTIATE_TEST_SUITE_P 会导致测试 suite 结果 FAIL 。如果故意设置为空的话,可以使用GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(FooTest);特殊标记,不会报 FAIL 进行测试.

单参数

class DebugTest: public Test, WithParamInterface<int>{};

TEST_P(DebugTest, case1){
//获取参数
int a = GetParam();
//其他测试步骤
}
INSTANTIATE_TEST_SUITE_P(prefix_1, DebugTest, 
	Values(1, 2, 3)
 );

多参数

Values 的使用

Values(v1, v2, ..., vN) 组合为元组 {v1, v2, …, vN}

class DebugTest: public Test, WithParamInterface<int, int>{};

TEST_P(DebugTest, case2){
//获取参数
int a = std::get<0>(GetParam());		// 1, 3
int b = std::get<1>(GetParam());		// 2, 4
//其他测试步骤
}
INSTANTIATE_TEST_SUITE_P(prefix_2, DebugTest, 
	Values(
		std::make_tuple(1, 2),
		std::make_tupel(3, 4)
	)
 );

Combine 的使用

Combine(g1, g2, ..., gN) 对于给定的 n个 generators g1, g2, …, gN进行笛卡尔乘积得到std::tuple

class DebugTest: public TestWithParam<int, int>{};

TEST_P(DebugTest,  case3){
//获取参数
int a = std::get<0>(GetParam());		//  1,1,2,2
int b = std::get<1>(GetParam());		//  3,4,3,4
//其他测试步骤
}
INSTANTIATE_TEST_SUITE_P(prefix_2, DebugTest, 
	Combine(
        Values(1, 2 ), 
        Values(3, 4) 
    )
 );

先更新这些…

其他的陆续更新…

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐