Google Test
googletest 是一个类似 JUnit 或 PyUnit,用于 C++ 开发的测试框架。
断言
gtest 提代了两种断言机制:
ASSERT_XX
当断言发生时,不再进行当前测试用例的后续步骤。EXPECT_XX
当断言发生时,继续执行后续步骤的测试,仍报告失败的结果。
子例程(子函数)中使用断言:
ASSERT_NO_FATAL_FAILURE
orASSERT_NO_FATAL_FAILURE_ON_ALL_THREAD
捕获子例程产生的断言,阻止继续进行后续的测试步骤。SCOPED_TRACE(message)
一个类似boost.log
的机制,在子例程中追加调用栈信息,便于区分断言发生的路径。
常用的断言形式:
ASSERT_TRUE / FALSE
ASSERT_EQ / LE
ASSERT_FLOAT_EQ / LE
ASSERT_NEAR
ASSERT_STREQ / STRLE
ASSERT_PRED1 / PRED2
ASSERT_PRED_FORMAT1 / FORMAT2
ASSERT_THAT
(gmock
)ASSERT_THROW / ANY_THROW / NO_THROW
ASSERT_DEATH / EXIT
其它的形式:
SUCCEED / FAIL
AssertionResult / 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
为后缀,使用其最优先进行。