C++单元测试框架gtest使用

  1. 作用

    1. 作为代码编码人员,写完代码,不仅要保证编译通过和运行,还要保证逻辑尽量正确。单元测试是对软件可测试最小单元的检查和校验。单元测试与其他测试不同,单元测试可看作是编码工作的一部分,应该由程序员完成,也就是说,经过了单元测试的代码才是已完成的代码,提交产品代码时也要同时提交测试代码。测试部门可以作一定程度的审核。(来自百度百科
    2. 其作用可以归为四种:

      1. 验证:验证程序逻辑的正确性,即使后期升级,通过跑单元测试,也可以看到升级后是否会对旧逻辑有影响
      2. 设计:促使程序员写出可单独测试的代码,从而更容易解耦
      3. 文档:作为程序使用的sample
      4. 回归:应对程序升级,也可以集成到code review之前的编译,自动做回归,典型用法就是在DevOps的编译打包阶段,例如jeckins编译完成后,自动触发单元测试。
    3. gtest是google提供的一套针对C++的单元测试框架,本文主要阐述其原理和使用方法。

    4. 与gtest配套的框架叫gmock,用于打桩,后续有空再写一篇介绍gmock的使用
  2. 原理

    1. gtest主要由一系列的宏和事件实现。

      1. 宏:有TEST和TEST_F宏,TEST宏针对简单的测试用例,TEST_F宏针对需要做初始化和资源回收的测试用例,有点像类似C++的构造函数和析构函数,两个宏都是把参数展开后拼成一个类。
      2. 事件:分为三种事件

        1. C++单元测试框架gtest使用
        2. 测试程序:一个进程,全局事件在该层

        3. 测试套件:一系列测试用例的集合,SetUpTestCase事件在该层(注意,网上很多地方大部分写的是SetUpTestSuite,应该是老版本)

        4. 测试用例:一个测试用例的事件体现在每个用例前后的SetUp和TearDown

        5. 每个事件可用于下级时间的数据共享以及测试前后的数据处理

  3. 使用

    1. 如果时间充足,想整体了解,可以参考wiki
      1. TEST
        TEST(TestSuiteName, TestName) {
        ... statements ...
        }

      会生成TestSuiteName_TestName_,不同的TestSuiteName可以有相同的TestName,需要注意的是所有的名字都不能有下划线

      1. TEST_F
        TEST_F(TestFixtureName, TestName) {
        ... statements ...
        }

      固定的套件名字

      1. TEST_P
        TEST_P(MyTestSuite, DoesSomething) {
        ...
        EXPECT_TRUE(DoSomething(GetParam()));
        ...
        }

      支持传递参数

    2. 事件

      1. 全局事件:需要创建一个自己的类,然后继承testing::Environment类,分别实现成员函数SetUp()和TearDown(),同时在main函数内进行调用,即"testing::AddGlobalTestEnvironment(new MyEnvironment);",通过调用函数我们可以添加多个全局的事件机制。需要注意的是,全局事件在--gtest_repeat参数大于1的情况下(可以通过--help查看其他参数),会执行多次

        1. 代码:C++单元测试框架gtest使用C++单元测试框架gtest使用
          ```

        include

        include

        using namespace std;

        class MyEnvironment0 : public testing::Environment {
        public:
        virtual void SetUp() {
        cout << "Global event0 : start1" << endl;
        }

            virtual void TearDown() {
                cout << "Global event0 : end" << endl;
            }
        

        };

        class MyEnvironment1 : public testing::Environment {
        public:
        virtual void SetUp() {
        cout << "Global event1 : start" << endl;
        }

            virtual void TearDown() {
                cout << "Global event1 : end" << endl;
            }
        

        };

        TEST(GlobalTest0, test0) {
        EXPECT_EQ(1, 1);
        };

        TEST(GlobalTest0, test1) {
        EXPECT_EQ(1, 1);
        };

        TEST(GlobalTest1, test0) {
        EXPECT_EQ(1, 1);
        };

        int main(int argc, char *argv[]) {
        testing::AddGlobalTestEnvironment(new MyEnvironment0);
        testing::AddGlobalTestEnvironment(new MyEnvironment1);

        testing::InitGoogleTest(&argc, argv);
        
        return RUN_ALL_TESTS();
        

        }
        ```
        View Code

      2. 套件事件:继承testing::Test,实现两个静态函数SetUpTestCase()和TearDownTestCase(),测试套件的事件机制不需要像全局事件机制一样在main注册,而是需要将我们平时使用的TEST宏改为TEST_F宏

        1. 代码:C++单元测试框架gtest使用C++单元测试框架gtest使用
          ```

        include

        include

        using namespace std;

        class MyTestSuite0 : public testing::Test
        {
        protected:
        // 网上大部分写的是SetUpTestSuite,google后面升级版本了,改成SetUpTestCase
        // 相关讨论:https://stackoverflow.com/questions/54468799/google-test-using-setuptestsuite-doesnt-seem-to-work
        static void SetUpTestCase()
        {
        cout << "TestSuite event0 : start" << endl;
        }

            static void TearDownTestCase()
            {
                cout << "TestSuite event0 : end" << endl;
            }
        

        };

        class MyTestSuite1 : public testing::Test
        {
        protected:
        static void SetUpTestCase()
        {
        cout << "TestSuite event1 : start" << endl;
        }

            static void TearDownTestCase()
            {
                cout << "TestSuite event1 : end" << endl;
            }
        

        };

        // 必须用TEST实现,实现上是拼成一个类MyTestSuite0_test0
        TEST_F(MyTestSuite0, test0)
        {
        EXPECT_EQ(1, 1);
        }

        TEST_F(MyTestSuite1, test0)
        {
        EXPECT_EQ(1, 1);
        }

        TEST_F(MyTestSuite0, test1)
        {
        EXPECT_EQ(1, 1);
        }

        TEST_F(MyTestSuite1, test1)
        {
        EXPECT_EQ(1, 1);
        }

        //int main(int argc, char *argv[])
        //{
        // testing::InitGoogleTEST_F(&argc, argv);
        //
        // return RUN_ALL_TESTS();
        //}
        ```
        View Code

      3. 用例事件:测试用例的事件机制的创建和测试套件的基本一样,不同地方在于测试用例实现的两个函数分别是SetUp()和TearDown(),这两个函数不是静态函数了。SetUp()函数是在一个测试用例的开始前执行。TearDown()函数是在一个测试用例的结束后执行。

        1. 代码:C++单元测试框架gtest使用C++单元测试框架gtest使用
          ```

        include

        include

        using namespace std;

        class MyTestCase0 : public testing::Test
        {
        protected:
        virtual void SetUp()
        {
        cout << "TestCase event0 : start" << endl;
        }

            virtual void TearDown()
            {
                cout << "TestCase event0 : end" << endl;
            }
        

        };

        class MyTestCase1 : public testing::Test
        {
        protected:
        virtual void SetUp()
        {
        cout << "TestCase event1 : start" << endl;
        }
        virtual void TearDown()
        {
        cout << "TestCase event1 : end" << endl;
        }
        };

        TEST_F(MyTestCase0, test0)
        {
        EXPECT_EQ(1, 1);
        }

        TEST_F(MyTestCase0, test1)
        {
        EXPECT_EQ(1, 1);
        }

        TEST_F(MyTestCase1, test0)
        {
        EXPECT_EQ(1, 1);
        }

        TEST_F(MyTestCase1, test1)
        {
        EXPECT_EQ(1, 1);
        }

        int main(int argc, char *argv[])
        {
        testing::InitGoogleTest(&argc, argv);

        return RUN_ALL_TESTS();
        

        }
        ```
        View Code

  4. 代码

    1. 上传到个人github中:https://github.com/longbozhan/sample/tree/master/gtest
  5. 参考

    1. https://www.shuzhiduo.com/A/n2d9gnDgJD/
    2. https://google.github.io/googletest/

原文链接: https://www.cnblogs.com/longbozhan/p/15594573.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/215047

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午2:39
下一篇 2023年2月13日 上午2:40

相关推荐