Google Test(GTest)使用方法和源码解析——私有属性代码测试技术分析
生活随笔
收集整理的這篇文章主要介紹了
Google Test(GTest)使用方法和源码解析——私有属性代码测试技术分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ? ? 有些時候,我們不僅要測試類暴露出來的公有方法,還要測試其受保護的或者私有方法。GTest測試框架提供了一種方法,讓我們可以測試類的私有方法。但是這是一種侵入式的,會破壞原來代碼的結構,所以我覺得還是謹慎使用。(轉載請指明出于breaksoftware的csdn博客)
? ? ? ? 我們先看個例子
// This class has a private member we want to test. We will test it
// both in a TEST and in a TEST_F.
class Foo {public:Foo() {}private:int Bar() const { return 1; }// Declares the friend tests that can access the private member// Bar().FRIEND_TEST(FRIEND_TEST_Test, TEST);FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
};// Tests that the FRIEND_TEST declaration allows a TEST to access a
// class's private members. This should compile.
TEST(FRIEND_TEST_Test, TEST) {ASSERT_EQ(1, Foo().Bar());
}// The fixture needed to test using FRIEND_TEST with TEST_F.
class FRIEND_TEST_Test2 : public Test {protected:Foo foo;
};// Tests that the FRIEND_TEST declaration allows a TEST_F to access a
// class's private members. This should compile.
TEST_F(FRIEND_TEST_Test2, TEST_F) {ASSERT_EQ(1, foo.Bar());
}
? ? ? ? Foo類擁有一個名叫Bar的私有成員函數。我們需要通過FRIEND_TEST宏來新增該類的友元類(其實也能想象出來,就是通過友元類來訪問私有成員,所以這是一種侵入式的——修改了原來類的結構)
#define FRIEND_TEST(test_case_name, test_name)\
friend class test_case_name##_##test_name##_Test
? ? ? ? 上例中給了兩種訪問私有變量的方式:
- 一種是FRIEND_TEST(FRIEND_TEST_Test, TEST);聲明的類,然后通過TEST(FRIEND_TEST_Test, TEST)實現測試特例實體,于是該實體中需要使用Foo的構造函數構造一個對象,然后調用其私有的Bar方法。
- 一種是FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);聲明的類。它使用到了Test Fixtures技術(詳見《Google Test(GTest)使用方法和源碼解析——預處理技術分析和應用》)。在FRIEND_TEST_Test2類中,聲明了一個Foo對象。然后TEST_F(FRIEND_TEST_Test2, TEST_F)類直接使用了該成員變量調用Bar方法。TEST_F(FRIEND_TEST_Test2, TEST_F)既繼承于FRIEND_TEST_Test2,又是Foo的友元類。
? ? ? ? 這塊技術沒有什么深奧的,大家只要是知道它是通過友元特性實現,是一種侵入式測試就行了。
總結
以上是生活随笔為你收集整理的Google Test(GTest)使用方法和源码解析——私有属性代码测试技术分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Google Test(GTest)使用
- 下一篇: Google Test(GTest)使用