
本文共 2972 字,大约阅读时间需要 9 分钟。
Google C++ 测试框架(gtest)总结
gtest(Google Test)是一个强大的C++测试框架,由Google推出,广泛应用于软件开发领域。gtest 提供了两种主要库:gtest 和 gtest_main,分别适用于不同的测试场景。以下是gtest 的核心知识和使用技巧的总结。
gtest 基本使用
gtest 提供了两种主要的测试库:
gtest.lib:
当依赖gtest.lib 时,需要自定义测试程序的入口函数main
。开发者需实现 main
函数,引入gtest 的环境并运行所有测试案例。 int main(int argc, char* argv[]){ testing::AddGlobalTestEnvironment(new FooEnvironment); ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();}
gtest_main.lib:
当依赖gtest_main.lib 时,gtest 为测试程序提供一个默认的入口函数main
,无需手动编写 main
函数即可实现。只需在链接时添加依赖,编译时使用 -l gtest\_main
。 此外,gtest 提供了两个主要组件:
- gtest:用于定义和执行测试案例。
- gmock:用于单元测试中的动态 Mock 类编写。
gmock 编写
gmock 是gtest 的补充库,主要用于创建和验证 Mock 对象。以下是常用功能的总结:
创建 Mock 类:
Mock 类需继承自gtest 的抽象AbstractMock
类。可以通过 MOCK_METHOD
宏定义 Mock 类中的虚函数。 定义和验证方法:
使用EXPECT_CALL
宏定义 Mock 方法的预期调用方式,确保测试方法按照预期执行。 参数化方法:
当需要测试多种输入参数时,可以采用参数化测试的方式,减少代码冗余。例如:class TestSquare : public testing::TestWithParam {protected: int square(int a) { return a * a; } int a;};TEST_P(TestSquare, case1) { a = GetParam(); EXPECT_EQ(a * a, square(a));}INSTANTIATE_TEST_CASE_P(Square, TestSquare, testing::Values(1, 2, 3, 4));
事件机制
gtest 提供了丰富的事件机制,允许在测试案例执行前后自定义操作。事件分为全局事件和非全局事件两种。
全局事件
-
全局事件需继承自
testing::Environment
并实现SetUp()
和TearDown()
方法。SetUp()
:在所有测试案例执行前运行。TearDown()
:在所有测试案例执行后运行。
示例代码:
class FooEnvironment : public testing::Environment {public: virtual void SetUp(); virtual void TearDown();};void FooEnvironment::SetUp() { std::cout << "Foo FooEnvironment SetUP" << std::endl;}void FooEnvironment::TearDown() { std::cout << "Foo FooEnvironment TearDown" << std::endl;}
死亡测试
死亡测试用于验证程序在异常(如内存泄漏、指针错误等)时的崩溃模式。gtest 提供以下宏和功能:
-
ASSERT_DEATH 和
用于验证程序在处理错误时是否按预期退出。EXPECT\_DEATH
: -
_EXIT macro:
用于自定义退出函数,验证程序的退出代码和异常类型。示例代码:
void func(int c) { if (c <= 0) _exit(1); else _exit(2);}TEST(ExitDeathTest, Demo) { EXPECT_EXIT(func(-1), testing::ExitedWithCode(1), "");}TEST(Exit2DeathTest, Demo2) { EXPECT_EXIT(func(1), testing::ExitedWithCode(1), "");}
死亡测试在测试运行时会优先执行,返回结果为绿色“RUN”或红色“failed to die”。
运行参数
gtest 提供多种运行参数,支持通过命令行配置测试案例的行为:
系统环境变量:
测试程序可通过环境变量获取配置信息。命令行参数:
支持多种命令行选项,如--gtest_list_tests
和 --gtest_filter
,后者支持使用通配符筛选测试案例。 添加 compiler 标记:
在代码中使用#define
指令可自定义测试行为。 输出设置:
支持颜色输出、测试时间追踪,以及自定义结果存储路径等。自定义测试类
gtest 支持自定义测试类,用户可通过继承 testing::Test
类实现自定义功能。以下是一个示例:
class MyTestClass : public ::testing::Test {public: MyTestClass() {} virtual ~MyTestClass() {} virtual void SetUp() { pCal = std::unique_ptr(new Cal()); } virtual void TearDown() {}public: std::unique_ptr pCal;};TEST_F(MyTestClass, test_add) { pCal->setA(2); pCal->setB(3); EXPECT_TRUE(pCal->add() == 5);}TEST_F(MyTestClass, test_sub) { pCal->setA(2); pCal->setB(3); EXPECT_TRUE(pCal->sub() == -1);}
此外,gtest 提供了多种高级特性,如单元测试框架和异常处理。
结论
gtest 是一个功能强大的C++测试框架,支持模块化测试、参数化、事件处理、死亡测试和自定义测试类等功能。通过合理使用gtest 和 gmock,可以依据测试需求编写高效、可靠的测试代码。
发表评论
最新留言
关于作者
