<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【C++】GoogleTest入門指南

      參考:
      GoogleTest官網

      基本概念

      要使用GoogleTest,需要包含header gtest/gtest.h

      斷言Assertions

      斷言是檢查條件是否為真的語句,其結果可能是成功或失敗,失敗分為非致命失敗和致命失敗兩種,后者會終止當前運行,前者則會繼續運行。
      GoogleTest中,斷言類似于函數調用的宏,斷言失敗時,GoogleTest會輸出斷言的源文件和行號位置以及失敗消息(所有斷言都可以使用<<輸出自定義失敗消息)

      ASSERT_*

      會拋出致命失敗故障的斷言,斷言失敗時中止當前測試函數的運行(不是中斷整個TEST)。

      ASSERT_EQ(x.size(),y.size()) << "x與y的大小不相同"
      

      EXPECT_*

      會拋出非致命失敗故障的斷言,不會停止當前函數運行,而是繼續往下運行下去

      EXPECT_EQ(x,y) << "x與y不相等"
      

      斷言分類

      前綴都會是ASSERT_或者EXPECT_,它們的區別上面已經進行了說明,所以以下都用X_來略寫

      基本斷言

      • X_TRUE(condition):斷言condition為True
      • X_FALSE(condition):斷言condition為False

      普通比較型斷言

      • X_EQ(v1,v2):==
      • X_NE(v1,v2):!=
      • X_LT(v1,v2):<
      • X_LE(v1,v2):<=
      • X_GT(v1,v2):>
      • X_GE(v1,v2):>=

      C字符串比較型斷言

      • X_STREQ(s1,s2):s1==s2
      • X_STRNE(s1,s2):s1!=s2
      • X_STRCASEEQ(s1,s2):忽略大小寫,s1==s2
      • X_STRCASENE(s1,s2):忽略大小寫,s1!=s2
        注意:
      • Null指針和空字符""是不相同的
      • 假如char *s1 = "abc",char *s2 = "abc",那么X_EQ(s1,s2)不通過,因為s1與s2實際上是地址指針,不相同;X_STREQ(s1,s2)通過,因為字符串相同

      浮點數比較型斷言

      對于浮點數,斷言只是判斷幾乎相等

      • X_FLOAT_EQ(f1,f2):f1和f2兩個float值幾乎相等
      • X_DOUBLE_EQ(f1,f2):f1和f2兩個double值幾乎相等
      • X_NEAR(v1,v2,abs_error):v1和v2兩個浮點數的值差的絕對值不超過abs_error

      明確的成功與失敗

      • SUCCEED():生成一個成功,放行,但是并不代表整個測試成功
      • FAIL():生成致命錯誤,立即終止當前測試
      • ADD_FAILURE():生成非致命錯誤,繼續運行測試
      • ADD_FAILURE_AT("file_path",line_number):生成非致命錯誤,輸出文件名和行號
      • GTEST_SKIP():直接結束當前測試
        明確的成功與失敗相較于前面的斷言更適合判斷條件復雜的情況,因為判斷條件復雜不適合寫成一個表達式condition用于判斷。例如if...else if...else if... else...

      異常斷言

      用于驗證一段代碼是否拋出給定類型的異常

      • X_THROW(statement,exception_type):statement代碼會拋出exception_type的異常
      • X_ANY_THROW(statement):statement代碼會拋出異常,不限異常類型
      • X_NO_THROW(statement):statement代碼不會拋出任何類型異常

      自定義布爾函數斷言(謂詞斷言)

      • X_PREDn(fun,v1,v2...):擁有n個參數的函數fun會返回True
        例如有一個函數equal(a,b),那么就是ASSERT_PRED2(equal,a,b)
        與ASSERT_EQ、ASSERT_TRUE()這些斷言的區別在于輸出的錯誤信息不同,同時它的功能更加強大

      謂詞格式化程序斷言

      普通的斷言輸出信息的內容是預定好的,如果想要自定義輸出的內容,可以使用謂詞格式化程序斷言
      具體接口使用可參考:EXPECT_PRED_FORMAT
      為了避免新的斷言宏爆炸式增長,GoogleTest提供了很多謂詞格式函數,它們可以使用謂詞斷言的方式組裝成需要的斷言,例如浮點數的小于等于

      using ::testing::FloatLE;
      using ::testing::DoubleLE;
      ...
      EXPECT_PRED_FORMAT2(FloatLE, val1, val2);
      EXPECT_PRED_FORMAT2(DoubleLE, val1, val2);
      

      匹配器斷言

      • X_THAT(value, matcher):value的值滿足matcher的要求

        #include "gmock/gmock.h"

        using ::testing::AllOf;
        using ::testing::Gt;
        using ::testing::Lt;
        using ::testing::MatchesRegex;
        using ::testing::StartsWith;

        ...
        EXPECT_THAT(value1, StartsWith("Hello"));
        EXPECT_THAT(value2, MatchesRegex("Line \d+"));
        ASSERT_THAT(value3, AllOf(Gt(5), Lt(10)));

      關于matcher的具體接口文檔,詳見matchers

      類型斷言

      調用函數::testing::StaticAssertTypeEq<T1,T2>();
      用于斷言T1和T2是同一種類型,如果斷言滿足,該函數什么也不做,如果不同,函數調用會無法編譯并報錯T1 and T2 are not the same type
      注意:如果是在類模板或者函數模板中使用時,僅當該函數被實例化(被調用)時才會生效報錯,否則不會報錯

      斷言使用的位置

      除了在測試代碼中使用斷言外,在任何C++函數中也都可以使用斷言。但是注意,產生致命錯誤的斷言只能用在返回void的函數(構造與析構函數不是返回void的函數)

      測試

      簡單測試

      • 使用TEST()宏定義和命名測試函數,這個函數是不返回值的普通C++函數

      • 函數中可以包含任何有效的C++語句以及各種GoogleTest斷言來檢查值

      • 測試的結果由斷言決定,如果測試時沒有任何斷言失?。ㄖ旅蚍侵旅┗蛘邷y試程序崩潰,則測試成功

      • 第一個參數是測試套件的名稱,第二個參數是測試套件中的測試名稱,這兩個名稱都必須是有效的C++標識符,并且不能含有任何下劃線。測試的全名由測試套件和測試名稱組成,不同測試套件的測試可以有相同的測試名稱

        TEST(TestSuiteName, TestName){
        ... test body ...
        }

      舉個栗子

      函數funA有一個輸入n,返回n^2,兩個測試都屬于FunATests測試套件,名字分別是HandlesZeroInput和HandlesPositiveInput用于測試不同的情況

      int funA(int n);
      
      TEST(FunATests, HandlesZeroInput){
          EXPECT_EQ(funA(0), 0);
      }
      TEST(FunATests, HandlesPositiveInput){
          EXPECT_EQ(funA(1), 1);
          EXPECT_EQ(funA(2), 4);
          ...
      }
      

      測試夾具

      如果發現自己編寫了兩個或多個對相似數據進行操作的測試,可以使用測試夾具,它允許我們為多個不同的測試重用相同的對象配置

      創建并使用夾具

      • 從::tesing::Test派生一個類,它的主體內容設置為protected,因為我們要從子類中訪問夾具成員
      • 在類中,聲明計劃使用的所有對象數據
      • 如有必要,編寫一個默認構造函數或者SetUp()函數來為每個測試準備對象
      • 如有必要,編寫一個析構函數或者TearDown()函數來釋放測試對象數據
      • 如有需要,編寫函數供使用該測試夾具的測試內使用
      • 注意,GoogleTest不會在多個測試中重用同一個測試夾具對象。對于每個TEST_F,GoogleTest會創建一個新的測試夾具對象并立刻調用SetUp(),運行測試主題結束后調用TearDown(),最后刪除測試夾具對象
      • 使用測試夾具的時候,用TEST_F代替TEST,TEST_F的第一個參數不再是測試套件名,而是測試夾具類名,具體見下方樣例

      舉個栗子

      假設我們有一個類Queue需要進行測試,它長這樣:

      template <typename E>  // E is the element type.
      class Queue {
      public:
          Queue();
          void Enqueue(const E& element);
          E* Dequeue();  // Returns NULL if the queue is empty.
          size_t size() const;
      ...
      };
      

      定義它的測試夾具類,一般情況下測試夾具類名=類名+Test

      class QueueTest : public ::testing::Test {
      protected:
          void SetUp() override {
              q1_.Enqueue(1);
              q2_.Enqueue(2);
              q2_.Enqueue(3);
          }
      
          // void TearDown() override {}
      
          Queue<int> q0_;
          Queue<int> q1_;
          Queue<int> q2_;
      };
      

      在這里,TearDown()并不需要,因為我們并不需要進行任何清理工作,直接析構就可以了

      使用測試夾具進行測試

      TEST_F(QueueTest, IsEmptyInitially) {
        EXPECT_EQ(q0_.size(), 0);
      }
      
      TEST_F(QueueTest, DequeueWorks) {
        int* n = q0_.Dequeue();
        EXPECT_EQ(n, nullptr);
      
        n = q1_.Dequeue();
        ASSERT_NE(n, nullptr);
        EXPECT_EQ(*n, 1);
        EXPECT_EQ(q1_.size(), 0);
        delete n;
      
        n = q2_.Dequeue();
        ASSERT_NE(n, nullptr);
        EXPECT_EQ(*n, 2);
        EXPECT_EQ(q2_.size(), 1);
        delete n;
      }
      

      在這個栗子里,第一個TEST_F創建一個QueueTest對象t1,t1.SetUp()后進入測試內容進行使用。測試結束后t1.TearDown()然后銷毀。對于第二個TEST_F進行相同的過程

      調用測試

      TEST()和TEST_F都會自動的隱式注冊到GoogleTest,所以并不需要為了測試再重新列舉所有定義的測試
      在定義測試之后,可以直接使用RUN_ALL_TESTS()來運行所有測試,如果所有測試都通過了,它會返回0。注意,RUNN_ALL_TESTS()會運行所有測試,哪怕這些測試來源于不同的測試套件、不同的源文件。

      運行測試的過程

      • 保存所有googletest標志的狀態
      • 為第一個測試創建測試夾具對象,通過SetUp()初始化
      • 使用測試夾具對象運行測試
      • 測試結束,調用TearDown()清理夾具然后銷毀夾具對象
      • 恢復所有googletest標志的狀態
      • 對下一個測試重復以上步驟,直到所有測試都運行結束
        注意:不能忽略RUN_ALL_TESTS()的返回值,否則會產生編譯器錯誤。自動化測試服務根據退出代碼來判斷測試是否通過,而不是通過stdout/sederr來判斷,所以main()函數必須返回RUN_ALL_TESTS();

      main()的編寫

      大部分情況下,我們并不需要自己編寫main方法,而是直接鏈接gtest_main(注意不是gtest),這個鏈接庫定義了合適的接入點會幫我們進行測試
      如果想自行書寫main方法,它需要返回RUN_ALL_TESTS()的返回值

      int main(int argc, char **argv) {
        ::testing::InitGoogleTest(&argc, argv);
        return RUN_ALL_TESTS();
      }
      

      在這段代碼里,InitGoogleTest()的作用是解析命令行里GoogleTest的指令參數,這允許用戶控制測試程序的行為。它必須在RUN_ALL_TESTS之前調用,否則命令行參數不會生效
      在舊版本里,使用的是ParseGUnitFlags(),但是目前它已經被棄用,需要使用InitGoogleTest()

      后續可填坑

      gMock

      posted @ 2022-09-21 20:51  縉云燒餅  閱讀(1750)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 在线视频不卡在线亚洲| 国产亚洲精品日韩av在| 2021亚洲国产精品无码| 中文在线最新版天堂| 亚洲av无码专区在线亚| 人人妻人人澡人人爽| 亚洲AV无码专区亚洲AV紧身裤| 广元市| 色8久久人人97超碰香蕉987| 91精品国产色综合久久不| 亚洲欧洲自拍拍偷午夜色| 国产永久免费高清在线| 色综合视频一区二区三区| 国产精品99中文字幕| 欧美三级a做爰在线观看| 亚洲中文字幕第二十三页| 99久久精品国产熟女拳交| 日韩精品一区二区三区视频| av一区二区中文字幕| 亚洲欧美色综合影院| 国产精品视频一区二区亚瑟| 日本国产精品第一页久久| 亚洲自在精品网久久一区| 久久久久无码精品国产AV| 欧美成人精品手机在线| 日本熟妇浓毛| 蜜芽亚洲AV无码精品国产午夜 | 久久精品国产福利一区二区| 屁屁影院ccyy备用地址| 国产精品麻豆欧美日韩ww| 国产av一区二区不卡| 精品久久久久久无码人妻蜜桃| 国产在线98福利播放视频| 国产精品一亚洲av日韩| 欧洲精品色在线观看| 99热精品毛片全部国产无缓冲 | 天天做天天躁天天躁| 亚洲va中文字幕无码久久不卡| 中文字幕国产精品自拍| 久久精品国产99国产精品| 视频一区视频二区在线视频|