天天看點

googletest初探(一) 源碼中的例子前言運作源碼帶的例子

前言

最近打算在項目中使用gtest來做一些移動端接口自動化的測試,在網上查了一些資料,最詳細的是玩轉Google開源C++單元測試架構Google Test系列,但基本上沒有介紹如何在移動端使用gtest的。于是決定把自己學習的過程記錄下來。

運作源碼帶的例子

從github上下載下傳源碼,不再多說連結。

我們先在windows上學習一下gtest的運作。

  1. 打開googletest/msvc,使用visual studio打開gtest .sln。我裝的是vs2013,打開時會提示将工程更新,确認即可。
  2. 打開以後,在項目空間裡共有4個工程。
    googletest初探(一) 源碼中的例子前言運作源碼帶的例子
    在解決方案上編譯,會得到四個編譯産物:
    googletest初探(一) 源碼中的例子前言運作源碼帶的例子
    其中gtestd.lib就是gtest架構的編譯産物。我們在自己的項目中使用gtest,就需要引用這個庫以及頭檔案。這裡我們先介紹google自帶的例子。
  3. 先看gtest_main這個工程,工程裡隻有一個gtest_main.cc檔案,内容也很簡單,就是一個main函數。
    GTEST_API_ int main(int argc, char **argv) {
        printf("Running main() from gtest_main.cc\n");
        testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }
               
    再看工程的配置檔案,引用了gtest工程生成的靜态連結庫。
    googletest初探(一) 源碼中的例子前言運作源碼帶的例子
    這個工程的編譯産物也并不是可執行檔案,而是靜态連結庫。
    googletest初探(一) 源碼中的例子前言運作源碼帶的例子
    簡單的了解,這個工程引用了gtest工程生成的靜态庫,同時提供了main函數,在編寫測試case時,可以直接引用這個庫,google給的例子就是這麼做的。
  4. 再看gtest_prod_test這個工程。production的類就是例子裡的測試對象,先不多說。在gtest_prod_test.cc中,編寫了兩組針對production的測試case,也是這個工程執行的對象。
    TEST(PrivateCodeTest, CanAccessPrivateMembers) {
      PrivateCode a;
      EXPECT_EQ(0, a.x_);
      a.set_x(1);
      EXPECT_EQ(1, a.x_);
    }
    
    typedef testing::Test PrivateCodeFixtureTest;
    
    // Tests that private members can be accessed from a TEST_F declared
    // as a friend of the class.
    TEST_F(PrivateCodeFixtureTest, CanAccessPrivateMembers) {
      PrivateCode a;
      EXPECT_EQ(0, a.x_);
      a.set_x(2);
      EXPECT_EQ(2, a.x_);
    }
               

你可能會覺得奇怪,這個工程沒有main函數,怎麼能夠執行。答案在上節中已經揭曉。打開工程配置,可以看到引用了gtest_main工程的編譯産物。gtest_maind.lib提供了gtest架構的庫和main函數,是以這個工程隻需要引用測試對象,以及編寫測試case就可以運作。

googletest初探(一) 源碼中的例子前言運作源碼帶的例子

我們可以參照例子的工程結構,但更普遍的是直接引用gtestd.lib,自己編寫main函數。

繼續閱讀