Google Test
googletest 是一个类似 JUnit 或 PyUnit,用于 C++ 开发的测试框架。
断言
gtest 提代了两种断言机制:
ASSERT_XX当断言发生时,不再进行当前测试用例的后续步骤。EXPECT_XX当断言发生时,继续执行后续步骤的测试,仍报告失败的结果。
子例程(子函数)中使用断言:
ASSERT_NO_FATAL_FAILUREorASSERT_NO_FATAL_FAILURE_ON_ALL_THREAD捕获子例程产生的断言,阻止继续进行后续的测试步骤。SCOPED_TRACE(message)一个类似boost.log的机制,在子例程中追加调用栈信息,便于区分断言发生的路径。
常用的断言形式:
ASSERT_TRUE / FALSEASSERT_EQ / LEASSERT_FLOAT_EQ / LEASSERT_NEARASSERT_STREQ / STRLEASSERT_PRED1 / PRED2ASSERT_PRED_FORMAT1 / FORMAT2ASSERT_THAT(gmock)ASSERT_THROW / ANY_THROW / NO_THROWASSERT_DEATH / EXIT
其它的形式:
SUCCEED / FAILAssertionResult / AssertionSuccess()StaticAssertTypeEq<T1, T2>()
另,可使用 RecordProperty(key, value) 记录日志信息。
测试用例
gtest 由多个测试套件(TEST SUIT)组成,每个测试套件由多个测试用例(TEST)组成。
TEST(suit_name, test_name)
TEST(FooTest, TestName)
{
ASSERT_EQ(2, 2);
}
TEST_F(TestFixtureName, TestName)编写固定装置实现同一测试套件的初始化和释放操作。
class FooTest : public ::testing::Test
{
protected:
void SetUp() override;
void TearDown() override;
};
TEST_F(FooTest, TestName)
{
ASSERT_EQ(2, 2);
}
TEST_P(TestFixtureName, TestName实现值参数化。
class FooTest : public ::testing::TestWithParam<int>
{
};
TEST_P(FooTest, TestName)
{
auto value = GetParam();
}
INSTANTIATE_TEST_SUIT_P(instance_name, FooTest, ::testing::Values(1, 2, 3));
TYPED_TEST(TestFixtureName, TestName)类型模板测试。
template <class T>
class FooTest : public ::testing::Test
{
};
TYPED_TEST(FooTest, TestName)
{
using Type = TypeParam;
}
TYPED_TEST_P(TestFixtrueName, TestName)类型参数化测试。
template <class T>
class FooTest : public ::testing::Test
{};
TYPED_TEST_SUIT_P(FooTest);
TYPED_TEST_P(FooTest, TestName)
{
}
REGIST_TYPED_TEST_SUIT_P(FooTest, TestName, ...);
using Types = ::testing::Types<int, double>; // 必须用类型别名
INSTANTIATE_TYPED_TEST_SUIT_P(instance_type, FooTest, Types);
共享测试数据
- 重载
Environment::SetUp()全局共享
class Environment : public ::testing::Environment
{
protected:
void SetUp() override;
void TearDown() override;
};
auto shared = ::testing::AddGlobalTestEnvironment(new Environment());
- 实现静态成员
static SetUp/TearDownTestSuit()测试用例共享
class FooTest : public ::testing::Test
{
protected:
static void SetUpTestSuit();
static void TearDownTestSuit();
};
其它
进行死亡测试套件命名以 DeathTest 为后缀,使用其最优先进行。