• gtest概念应用及原理


    概念

    gtest是单元测试库可以测试一个函数,也可以测试一个类。

    应用和原理

    1. //被测试类
    2. class MyClass{
    3.     FRIEND_TEST(MyClassTest, private); //test private //为了gtest新增加的一行代码
    4.     void init(string);
    5.     void process(void*,void*);
    6.     void release();
    7. }
    1. #define FRIEND_TEST(test_case_name, test_name) \
    2.     friend class test_case_name##_##test_name##_Test
    3. 展开之后: friend class MyClassTest_private_test

    ##############################################
    gtest测试代码:

    1. class MyClassTest : public ::testing::Test
    2. {
    3. protected:
    4.     MyClass *_myclass;
    5.     virtual void SetUp()
    6.     {
    7.         cout << __FUNCTION__ << " Enter";
    8.         _myclass = new MyClass("a", "b");
    9.     }
    10.     virtual void TearDown()
    11.     {
    12.         cout << __FUNCTION__ << " Enter";
    13.         delete _myclass;
    14.     }
    15. };
    16. TEST_F(MyClassTest, private)
    17. {
    18. //_myclass初始化之后,执行3次,销毁
    19.     _myclass->init(R"(...)");
    20.     for (int i = 0; i < 3; i++)
    21.     {
    22.         _myclass->process(NULL, NULL);
    23.     }
    24.     _myclass->release();
    25. }

    原理分析:

    1. #define TEST_F(test_fixture, test_name) \
    2.     GTEST_TEST_(test_fixture, test_name, test_fixture, ::testing::internal::GetTypeId())
    3. #define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \
    4.     test_suite_name##_##test_name##_Test
    5. #define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id)        \
    6.     static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1,                \
    7.                   "test_suite_name must not be empty");                         \
    8.     static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1,                      \
    9.                   "test_name must not be empty");                               \
    10.     class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                    \
    11.         : public parent_class                                                   \
    12.     {                                                                           \
    13.     public:                                                                     \
    14.         GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                      \
    15.         () {}                                                                   \
    16.                                                                                 \
    17.     private:                                                                    \
    18.         virtual void TestBody();                                                \
    19.         static ::testing::TestInfo *const test_info_ GTEST_ATTRIBUTE_UNUSED_;   \
    20.         GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \
    21.                                                                test_name));     \
    22.     };
    23. #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \
    24.     type(type const &) = delete;              \
    25.     GTEST_DISALLOW_ASSIGN_(type)
    26. #define GTEST_DISALLOW_ASSIGN_(type) \
    27.     void operator=(type const &) = delete
    28. 展开之后:
    29. static_assert(sizeof("MyClassTest")) > 1,                
    30.                 "MyClassTest must not be empty");                         
    31. static_assert(sizeof("private")) > 1,                              
    32.                 "private must not be empty");    
    33. class MyClassTest_private_test
    34.     : public MyClassTest
    35. {                                                                                 
    36. public:
    37.     MyClassTest_private_test() {}                                       
    38. private:
    39.     virtual void TestBody();
    40.     static ::testing::TestInfo *const test_info_ __attribute__((unused));
    41.     MyClassTest_private_test(MyClassTest_private_test const &) = delete;
    42.     void operator=(type const &) = delete;
    43. };

    结论

    1.通过上面展开分析FRIEND_TEST(MyClassTest, private);和TEST_F(MyClassTest, private)
    两对名字相同友缘类才能真正生效。

    2.单元测试gtest内置一个main函数,需要搭建main需要的开发环境

    3.gtest测试一个类,原理是使用了friend class,这样可以访问private

    4.如果没有gtest,被测试类增加一个新建一个类并增加friend class权限,主流程可以执行到这个类,依然可以达到gtest的效果。

    5.不知道其中的原理,只是按固定流程走,就是计算机迷信,迷信1和迷信2没有区别。

  • 相关阅读:
    Java修仙传之神奇的ES2(巧妙的查询及结果处理篇)
    如何配置Postgres的自动扩展功能以应对数据增长
    敲了几万行源码后,我给Mybatis画了张“全地图”
    Java并发编程的艺术笔记-Java并发容器和框架
    07 | @Entity 之间的关联关系注解如何正确使用?
    mongodb数据库操作
    C#语言实例源码系列-实现输入框焦点变色和窗体拖拽改变大小
    【SLAM】IMU预积分的理解、手把手推导(2/4)
    Linux之IO多路复用
    【面试题精讲】构造方法有哪些特点?是否可被 override?
  • 原文地址:https://blog.csdn.net/crazyeveryday/article/details/132725959