版權相關聲明:本文所述方案來自於《深刻理解C++11—C++11新特性解析與應用》(Michael Wong著,機械工業出版社,2016.4重印)一書的學習。函數
項目管理中,C語言工程作單元測試用例直接寫就能夠了,對於C++語言工程,曾經聽到過「C++類的私有成員在外部沒法訪問無法寫啊,就測測接口吧?」,對於項目管理人員與開發人員,做爲C/C++語言使用者的你是否也有過這種煩惱?單元測試
提案「單元測試用例以私有成員函數的形式寫在被測類的裏面,經過預處理宏開關,使得發佈時不讓單元測試編譯連接進去」,方案在語法上能夠,並且也沒有破壞封裝性,可是測試用例的量很龐大跟生產代碼搞在一塊兒好不爽有麼有,不優雅,沒有人會這麼作會讓本身的代碼變成那樣。學習
提案「經過預處理宏開關,使得單元測試時將private替換爲public」,看上去這個提案簡單,可是也不完美,使用默認的private成員限制(如class FooTest : Foo { int x;}),這個方案處理不了這個情形,另外這個方案要求你的程序中變量名和函數名中不能含有private子字符串。測試
下面將介紹書中的類單元測試的完美解決方案:spa
template<typename T>設計
class Foo {接口
friend T;項目管理
}開發
若是FooTest是類,那麼Foo<FooTest>會被實例化爲一個定義了類FooTest爲其友元的Foo<FooTest>類。字符串
而若T爲內置類型時,如Foo<int>會被實例化爲一個普通的沒有友元定義的類型。
template<typename T>
class FooT {
public:
friend T;
void DoSomthing(){}
private:
int m_data;
}
using Foo = FooT<int>;
後續的生產代碼能夠直接使用Foo,生產代碼很優雅。
class FooTester; //測試類
using FooTestee = FooT<FooTester>; //被測試類
class FooTester{
public:
void Testcase1() {}
}
在FooTester類裏面,咱們能夠測試FooTestee的私有或公有成員函數,能夠訪問FooTestee的私有成員變量進行驗證。總之單元測試很優雅。
學習了上面的完美方案,爲C++11的新特性感到歡欣鼓舞,作一名重視單元測試的對本身有要求的C/C++工做者。感謝深刻理解C++11這本書。