当前位置: 移动技术网 > IT编程>开发语言>C/C++ > C++类的完美单元测试方案——基于C++11扩展的friend语法

C++类的完美单元测试方案——基于C++11扩展的friend语法

2019年06月08日  | 移动技术网IT编程  | 我要评论

无限之我欲成魔,南京汽车站网上订票,漯河格瑞特国际小学

  版权相关声明:本文所述方案来自于《深入理解c++11—c++11新特性解析与应用》(michael wong著,机械工业出版社,2016.4重印)一书的学习。

  项目管理中,c语言工程做单元测试用例直接写就可以了,对于c++语言工程,曾经听到过“c++类的私有成员在外部无法访问没法写啊,就测测接口吧?”,对于项目管理人员与开发人员,作为c/c++语言使用者的你是否也有过这种烦恼?

  提案“单元测试用例以私有成员函数的形式写在被测类的里面,通过预处理宏开关,使得发布时不让单元测试编译链接进去”,方案在语法上可以,而且也没有破坏封装性,但是测试用例的量很庞大跟生产代码搞在一起好不爽有么有,不优雅,没有人会这么做会让自己的代码变成那样。

  提案“通过预处理宏开关,使得单元测试时将private替换为public”,看上去这个提案简单,但是也不完美,使用默认的private成员限制(如class footest : foo { int x;}),这个方案处理不了这个情形,另外这个方案要求你的程序中变量名和函数名中不能含有private子字符串。


  下面将介绍书中的类单元测试的完美解决方案:

   1.语法知识准备:“可以为类模板声明友元”(c++11新特性)

    template<typename t>

    class foo {

      friend t;

    }

  如果footest是类,那么foo<footest>会被实例化为一个定义了类footest为其友元的foo<footest>类。

  而若t为内置类型时,如foo<int>会被实例化为一个普通的没有友元定义的类型。

  2.生产代码中的类模板实例化

    template<typename t>

    class foot {

    public:

      friend t;

      void dosomthing(){}

    private:

      int m_data;

    }

    using foo = foot<int>;

    后续的生产代码可以直接使用foo,生产代码很优雅。

  3.测试代码中的设计(与原书稍有出入,根据自身需求调整)

    class footester;  //测试类

    using footestee = foot<footester>;   //被测试类

    class footester{

    public:

      void testcase1() {}

    }

    在footester类里面,我们可以测试footestee的私有或公有成员函数,可以访问footestee的私有成员变量进行验证。总之单元测试很优雅。


  学习了上面的完美方案,为c++11的新特性感到欢欣鼓舞,做一名重视单元测试的对自己有要求的c/c++工作者。感谢深入理解c++11这本书。

    

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网