玩转Google单元测试框架gtest系列之七:深入解析gtest

发表于:2010-4-12 14:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:CoderZh    来源:www.cnblogs.com/coderzh

  上面看到了我们前面讲到的对象工厂fatory,通过fatory的CreateTest()方法,创建Test对象,然后执行案例又是通过Test对象的Run()方法:

void Test::Run() {
    
if (!HasSameFixtureClass()) return;

    
internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
    impl
->os_stack_trace_getter()->UponLeavingGTest();
    __try {
        
// Yeah!每个案例的SetUp事件在这里调用
        SetUp();
    } __except(
internal::UnitTestOptions::GTestShouldProcessSEH(
        GetExceptionCode())) {
        AddExceptionThrownFailure(GetExceptionCode(), 
"SetUp()");
    }

    
// We will run the test only if SetUp() had no fatal failure.
    if (!HasFatalFailure()) {
        impl
->os_stack_trace_getter()->UponLeavingGTest();
        __try {
            
// 哈哈!!千辛万苦,我们定义在TEST宏里的东西终于被调用了!
            TestBody();
        } __except(
internal::UnitTestOptions::GTestShouldProcessSEH(
            GetExceptionCode())) {
            AddExceptionThrownFailure(GetExceptionCode(), 
"the test body");
        }
    }

    impl
->os_stack_trace_getter()->UponLeavingGTest();
    __try {
        
// 每个案例的TearDown事件在这里调用
        TearDown();
    } __except(
internal::UnitTestOptions::GTestShouldProcessSEH(
        GetExceptionCode())) {
        AddExceptionThrownFailure(GetExceptionCode(), 
"TearDown()");
    }
}

  上面的代码里非常极其以及特别的兴奋的看到了执行测试案例的前后事件,测试案例执行TestBody()的代码。仿佛整个gtest的流程在眼前一目了然了。

  五、总结

  本文通过分析TEST宏和RUN_ALL_TEST宏,了解到了整个gtest运作过程,可以说整个过程简洁而优美。之前读《代码之美》,感触颇深,现在读过gtest代码,再次让我感触深刻。记得很早前,我对设计的理解是“功能越强大越好,设计越复杂越好,那样才显得牛”,渐渐得,我才发现,简单才是最好。我曾总结过自己写代码的设计原则:功能明确,设计简单。了解了gtest代码后,猛然发现gtest不就是这样吗,同时gtest也给了我很多惊喜,因此,我对gtest的评价是:功能强大,设计简单,使用方便。

  总结一下gtest里的几个关键的对象:

  1. UnitTest 单例,总管整个测试,包括测试环境信息,当前执行状态等等。

  2. UnitTestImpl UnitTest内部具体功能的实现者。

  3. Test    我们自己编写的,或通过TEST,TEST_F等宏展开后的Test对象,管理着测试案例的前后事件,具体的执行代码TestBody。

  4. TestCase 测试案例对象,管理着基于TestCase的前后事件,管理内部多个TestInfo。

  5. TestInfo  管理着测试案例的基本信息,包括Test对象的创建方法。

  6. TestInfoImpl TestInfo内部具体功能的实现者 。

  本文还有很多gtest的细节没有分析到,比如运行参数,死亡测试,跨平台处理,断言的宏等等,希望读者自己把源码下载下来慢慢研究。如本文有错误之处,也请大家指出,谢谢!


相关链接:

玩转Google单元测试框架gtest系列之六:运行参数

玩转Google单元测试框架gtest系列之五:死亡测试

玩转Google单元测试框架gtest系列之四:参数化

玩转Google单元测试框架gtest系列之三:事件机制

玩转Google单元测试框架gtest系列之二:断言

玩转Google单元测试框架gtest系列之一:初识gtest

1010/10<12345678910
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号