Gtest运行参数

可以通过系统环境变量设置GTEST_FLAG,可以通过内部代码testing::GTEST_FLAG(output)=””设定,后设置的生效。

  • –gtest_list_tests 输出所有用例
  • –gtest_filter 过滤用例,支持通配符
    • ?*-:(:”是或)
  • –gtest_repeat=[COUNT] 用例执行次数
    • -1为一直执行,默认出错依然执行,但是增加
  • –gtest_color=(yes/no/auto) 输出颜色
  • –gtest_print_time 打印执行时间
  • –gtest_output=后缀:路径\文件名
  • –gtest_break_on_failure 则出错后停止
  • –gtest_throw_on_failure 失败抛异常
  • –gtest_catch_exceptions 是否捕捉异常,只在Win有效

Gtest断言

ASSERT_系列:如果当前点检测失败则退出当前测试
EXPECT_系列:如果当前点检测失败则继续往下执行

  • *_TRUE(condition) 条件为true则通过
  • *_FALSE(condition) 条件为false则通过
  • *_EQ(expected, actual) ==
  • *_NE(val1, val2) !=
  • *_LT(val1, val2) <
  • *_LE(val1, val2) <=
  • *_GT(val1, val2) >
  • *_GE(val1, val2) >=
  • _STREQ(expected_str, actual_str) == 接收char wchar *
  • *_STRNE(str1, str2) !=
  • _STRCASEEQ(expected_str, actual_str) 忽略大小写== ,只接收char
  • _STRCASENE(str1, str2) 忽略大小写!= ,只接收char

  • *_THROW(statement, exception_type) 语句抛出指定类型的异常

  • *_ANY_THROW(statement) 抛出任何异常
  • *_NO_THROW(statement) 不抛出

  • *_FLOAT_EQ(expected, actual) 浮点对比

  • *_DOUBLE_EQ(expected, actual)
  • *_NEAR(val1, val2, abs_error) 近似对比

  • *_PRED1(pred1, val1) pred1表示函数名,val1是参数,验证返回值,最多可以到5,传5个参数。

  • *_PRED_FORMAT1(pred_format1, val1) 错误时可自定义输出,函数返回值 return testing::AssertionFailure(testring::Message())

  • *_HRESULT_SUCCEEDED(expression) 表达式是成功的

  • *_HRESULT_FAILED(expression)

  • SUCCEED() 用例成功,不往下走

  • FAIL() 用例失败,不往下走
  • ADD_FAILURE() 失败,但是往下走
  • testing::StaticAssertTypeEq<int, T> 判断模板是否为int

  • _DEATH(statement, regex) 语句crash,其regex匹配stderr中内容,实现其实就是调用了 _EXIT

  • *_DEATH_IF_SUPPORTED 系统不支持则不执行
  • *_EXIT(statement, predicate, regex) 其中predicate必须是接收int返回bool,可用系统
    • testing::ExitedWithCode(exit_code)如果程序正常退出并且退出码与exit_code相同则返回true
    • testing::KilledBySignal(signal_number) 被signal_number杀掉则为true
  • _DEBUG_DEATH(statement, regex) 在Debug中 实际是调用 _DEATH,否则只是执行statement
死亡测试注意
  • 可以在main中设置,也可以在用例中设置,用例完成会复原。
    • testing::FLAGS_gtest_death_test_style = “fast”;
    • testing::FLAGS_gtest_death_test_style = “threadsafe”;
  • 不要在死亡测试用例释放内存,在父进程释放内存,不要在程序中使用内存堆检查

Gtest事件

  • 全局事件
    • 全局事件需要继承testing::Environment类,实现SetUp和TearDown,类似构造与析构,然后在main中使用testing::AddGlobalTestEnvironment进行注册
  • TestSuite 每一组用例前后
    • 需要继承testing::Test类,实现SetUpTestCase和TearDownTestCase,在该组用例前和结束执行
  • TestCase 每个用例前后
    • 同上,实现SetUp()和TearDown()即可,在每个用例前后执行

Gtest测试宏

TEST(test_suite_name,test_name)宏

一个测试特例,套件名和样例名,构成一个测试用例,不能有_,因为会将其设置为专有的类名

TEST_F(test_fixture,test_name)宏

结合testing::Test使用

TEST_P宏

配合继承testing::TestWithParam的类使用,其中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename T>
class TestWithParam:public Test,public WithParamInterface<T>{};
static const T& GetParam(){}

//内部的参数由友元类修改,所以Getparam()可以获得新属性
template<class TestClass> friend class internal::ParameterizedTestFactor;

INSTANTIATE_TEST_CASE_P(test_pre_name,继承TestWithParam的类名,testing::Values());

//其中第三个可以使用Range(begin,end[,step])
//Values(v1,v2...,vN)
//ValuesIn(container) and ValuesIn(begin,end) 从容器或者迭代器取
//Bool() true和false
//Combine(g1,g2,...,gN) 排列组合传入,参数是Tuple

模板参数化

1
2
3
4
5
6
7
8
9
10
11
12
template <typename T>
class TemplateClass : public testing::Test {
}
typedef testing::Types<char, int, unsigned int> MyTypes;
TYPED_TEST_SUITE(TemplateClass, MyTypes);//验证TemplateClass是否支持MyTypes这些类型
TYPED_TEST(TemplateClass,TestName)

//或者
TYPED_TEST_CASE_P(TemplateClass)
TYPED_TEST_P(TemplateClass,TestName)
REGISTER_TYPED_TEST_CASE_P(TemplateClass,TestName,...)
INSTANTIATE_TYPED_TEST_CASE_P(test_pre_name, TemplateClass, MyTypes)