C++類的完美單元測試方案——基於C++11擴展的friend語法

  版權相關聲明:本文所述方案來自於《深刻理解C++11—C++11新特性解析與應用》(Michael Wong著,機械工業出版社,2016.4重印)一書的學習。函數

  項目管理中,C語言工程作單元測試用例直接寫就能夠了,對於C++語言工程,曾經聽到過「C++類的私有成員在外部沒法訪問無法寫啊,就測測接口吧?」,對於項目管理人員與開發人員,做爲C/C++語言使用者的你是否也有過這種煩惱?單元測試

  提案「單元測試用例以私有成員函數的形式寫在被測類的裏面,經過預處理宏開關,使得發佈時不讓單元測試編譯連接進去」,方案在語法上能夠,並且也沒有破壞封裝性,可是測試用例的量很龐大跟生產代碼搞在一塊兒好不爽有麼有,不優雅,沒有人會這麼作會讓本身的代碼變成那樣。學習

  提案「經過預處理宏開關,使得單元測試時將private替換爲public」,看上去這個提案簡單,可是也不完美,使用默認的private成員限制(如class FooTest : Foo { int x;}),這個方案處理不了這個情形,另外這個方案要求你的程序中變量名和函數名中不能含有private子字符串。測試


  下面將介紹書中的類單元測試的完美解決方案:spa

   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這本書。

相關文章
相關標籤/搜索