單元測試工具 GTest/Gmock(一)

編譯安裝

  • 配置編譯工具
    • 編譯Google Test 需要cmake2.6 版本以及上。
      yum list | grep cmake # 
      cmake --version  # 查看 cmake 版本
      
    • 支持C++11

這里以Gtest 1.8.0 安裝為例,項目地址:https://github.com/google/googletest/

  • 獲取源碼
    wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz
    tar -zxvf release-1.8.0.tar.gz
    
  • 編譯安裝
    cmake .  
    make && make install
    
    安裝默認會將:
    -- Installing: /usr/local/lib/libgmock.a
    -- Installing: /usr/local/lib/libgmock_main.a
    -- Installing: /usr/local/lib/libgtest.a
    -- Installing: /usr/local/lib/libgtest_main.a
    
  • 測試:
    • 測試代碼
      #include <stdio.h>
      #include <gtest/gtest.h>
      
      int add(int a, int b)  {  return a+b;  }
      
      TEST(MyTest, AddTest) {  EXPECT_EQ(add(1, 2), 3);  }
      
      int main(int argc, char *argv[]) {
          ::testing::InitGoogleTest(&argc, argv);
          return RUN_ALL_TESTS();
      }
      
    • 編譯
      g++ -o test test.cpp -lgtest -lgtest_main -lpthread
      
    • 運行輸出
      [==========] Running 1 test from 1 test case.
      [----------] Global test environment set-up.
      [----------] 1 test from MyTest
      [ RUN      ] MyTest.AddTest
      [       OK ] MyTest.AddTest (0 ms)
      [----------] 1 test from MyTest (0 ms total)
      
      [----------] Global test environment tear-down
      [==========] 1 test from 1 test case ran. (0 ms total)
      [  PASSED  ] 1 test.
      

jenkins 集成

GTest結(jié)果可以輸出為xml文件的形式,配合第三方工具可以將其轉(zhuǎn)為html網(wǎng)頁形式??梢耘浜蟡enkins使用實現(xiàn)測試報告可視化。


基本使用介紹

官方文檔:https://github.com/google/googletest/blob/master/googletest/docs/primer.md

如果局部測試使用了EXPECT系列函數(shù),它將保證本次局部測試結(jié)果不會影響之后的流程。但是ASSERT系列在出錯的情況下,當前測試特例中剩下的流程就不走了。

Testsuit 和 Testcase
斷言
  • 布爾值類型檢查

    Fatal assertion Nonfatal assertion Verifies
    ASSERT_TRUE(condition); EXPECT_TRUE(condition); condition is true
    ASSERT_FALSE(condition); EXPECT_FALSE(condition); condition is false
  • 數(shù)值類型檢查

    Fatal assertion Nonfatal assertion Verifies
    ASSERT_EQ(expected, actual); EXPECT_EQ(expected, actual); expected == actual
    ASSERT_NE(val1, val2); EXPECT_NE(val1, val2); val1 != val2
    ASSERT_LT(val1, val2); EXPECT_LT(val1, val2); val1 < val2
    ASSERT_LE(val1, val2); EXPECT_LE(val1, val2); val1 <= val2
    ASSERT_GT(val1, val2); EXPECT_GT(val1, val2); val1 > val2
    ASSERT_GE(val1, val2); EXPECT_GE(val1, val2); val1 >= val2
  • 字符串類型檢查

    Fatal assertion Nonfatal assertion Verifies
    ASSERT_STREQ(expected_str, actual_str); EXPECT_STREQ(expected_str, actual_str); the two C strings have the same content
    ASSERT_STRNE(str1, str2); EXPECT_STRNE(str1, str2); the two C strings have different content
    ASSERT_STRCASEEQ(expected_str, actual_str); EXPECT_STRCASEEQ(expected_str, actual_str); the two C strings have the same content, ignoring case
    ASSERT_STRCASENE(str1, str2); EXPECT_STRCASENE(str1, str2); the two C strings have different content, ignoring case
  • 異常檢查

  • 類型檢查

自定義輸出
事件

gtest提供了多種事件機制,非常方便可以在測試前后做些自定義的動作。

  1. 全局的,所有案例執(zhí)行前后。
  2. TestSuite級別的,在某一批案例中第一個案例前,最后一個案例執(zhí)行后。
  3. TestCase級別的,每個TestCase前后。
  • 全局
    要實現(xiàn)全局事件,必須寫一個類,繼承testing::Environment類,實現(xiàn)里面的SetUp和TearDown方法。

    class FooEnvironment : public testing::Environment
    {
    public:
        virtual void SetUp()  {  std::cout << "Foo FooEnvironment SetUP" << std::endl;  }
        virtual void TearDown()  {  std::cout << "Foo FooEnvironment TearDown" << std::endl;  }
    };
    
    TEST(GlobalTest0, test00)  {  EXPECT_EQ(1, 1);  };
    TEST(GlobalTest0, test01)  {  EXPECT_EQ(1, 1);  };
    TEST(GlobalTest1, test10)  {  EXPECT_EQ(1, 1);  };
    
    int main(int argc, char**argv)
    {
        testing::AddGlobalTestEnvironment(new FooEnvironment);
        testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }
    
    1.png
  • TestSuit

    class MyTestSuite0 : public testing::Test
    {
    protected:
        static void SetUpTestSuite()  {  cout << "TestSuite event0 : start" << endl;  }
        static void TearDownTestSuite()  {  cout << "TestSuite event0 : end" << endl;  }
    };
    
    TEST_F(MyTestSuite0, test0) {  EXPECT_EQ(1, 1);  }
    TEST_F(MyTestSuite0, test1) {  EXPECT_EQ(1, 1);  }
    TEST_F(MyTestSuite0, test2)  {  EXPECT_EQ(1, 1);  }
    
    int main(int argc, char** argv)
    {
        testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }
    

    在編寫測試案例時,我們需要使用TEST_F這個宏,第一個參數(shù)必須是我們上面類的名字,代表一個TestSuite。

  • TestCase

    class MyTestCase0 : public testing::Test
    {
    protected:
        virtual void SetUp()  {  cout << "TestCase event0 : start" << endl;  }
        virtual void TearDown()  {  cout << "TestCase event0 : end" << endl;  }
    };
    
    TEST_F(MyTestCase0, test0)  {  EXPECT_EQ(1, 1);  }
    TEST_F(MyTestCase0, test1)  {  EXPECT_EQ(1, 1);  }
    TEST_F(MyTestCase1, test0)  {  EXPECT_EQ(1, 1);  }
    
    int main(int argc, char** argv)
    {
        testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
    }
    
    3.png
參數(shù)化
死亡測試
運行測試
gmock

參考資料

  1. http://hh-yzm.com/index.php/archives/30/
  2. https://zhuanlan.zhihu.com/p/34497162
  3. http://www.ibm.com/developerworks/cn/linux/l-cn-cppunittest/
  4. http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
  5. http://www.ibm.com/developerworks/cn/linux/l-cn-cppunittest/>
  6. http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容