【Kuiperinfer】筆記02 GoogleTest入門

文章目錄

  • Google Test
    • 基本概念
  • 編寫測試
    • 頭文件
    • Assertion
    • TEST
    • Test Fixture
    • Invoking the Tests
    • 編寫main()函數
  • 參考

Google Test

Google Test是用于編寫C++測試的框架,支持多種類型的測試,而不是只有單元測試(unit test)。

編寫測試的要求:

  • 測試應該是獨立且結果可重復的
  • 測試應該是有組織的(organized),并且能夠反映被測試代碼的結構
  • 測試應該是輕量(portable)且可重用的
  • 如果測試未通過,應盡可能返回更多信息
  • 測試框架應該能夠幫助測試者更多關注被測試的代碼,而不是過多關注如何編寫測試
  • 測試應該能夠快速運行

Test定義:使用特定的輸入,運行特定的程序,并驗證運行的結果。

基本概念

使用GoogleTest的第一步是編寫assertionassertion用來驗證某個條件是否為真,其結果可以是success,nonfatal failure或者是fatal failure。

如果測試報了fatal failure,則會中斷。

Test使用assertion來檢驗代碼是否如期運行,如果測試出現問題,則測試失敗。

Test suite(測試組)包含一個或多個測試,組織test suite應檔能夠反映被測試代碼的結構。如果測試組中有測試需要共享對象或者寫成,應當放進test fixture類中。

一個測試程序(test program)可包含多個測試組。

整體來說是個層級結構,從assertion開始寫,組成test,test組成suite,suite組成測試程序。

編寫測試

頭文件

需要聲明以下頭文件

#include <gtest/gtest.h>
#include <glog/logging.h>

Assertion

Assertion是一種宏。包括下面兩種:

  • ASSERT_*:如果fail,則產生fatal failures,并中斷當前函數。

  • EXPECT_*:如果fail,產生nonfatal failures,不中斷。

EXPECT_*能夠在一個test中報多個failure,通常來說更適合;當然,如果某個錯誤發生后,程序沒必要再繼續運行下去,則用ASSERT_*更好。

可以通過<<assertion后面添加額外的信息。

例子:

ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";
for(int i = 0; i < x.size(); ++i){EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}

所有可被流式輸出的內容都可以被放在assertion信息里。

除了EQ之外,還有很多種類型的assertion,可參考https://google.github.io/googletest/reference/assertions.html。

可能比較常用的:THAT,TRUE,FALSE,EQ,NE,LT,LE,GT,GE

在test1.cpp和axby.cpp中,用到了EQ和LE。

TEST

創建test的方法:

  1. 使用TEST()宏來定義和命名test函數;該函數是通常的C++函數,且不返回值
  2. 在函數中寫assertion
  3. test的結果取決于assertion,如果一個test內任意assertion報fail,則test報fail

TEST()的參數按general到specific排列,第一個參數是suite名,第二個參數是test名,名稱中不能有下劃線_

例子:

int f(int n); // 函數聲明
TEST(fTest, ZeroInput){EXPECT_EQ(f(0), 1);
} // TEST 1
TEST(fTest, PositiveInput){EXPECT_EQ(f(1), 1);EXPECT_EQ(f(8), 512);
} // TEST 2

上例中,fTest是suite名,ZeroInput和PositiveInput為Test名。

邏輯上相關的test應當放在同一個suite中,即TEST()的第一個參數應該相同。

Test Fixture

如果兩個或更多的test會使用同一個數據,則可以用test fixture來重用對象。

  1. testing::Test派生一個類,該類以protected:起始
  2. 在這個派生類中,聲明要使用的對象
  3. 編寫默認的constructor或者SetUp()函數來配置每個test中的對象。
  4. 編寫destructor或者TearDown()來釋放在SetUp()中alloc的內存。
  5. 定義test中要用的subroutine。

TEST_F()來代替TEST(),并將派生類的類名稱作為第一個傳參名稱。派生類要在TEST_F()之前定義。

例子。以一個隊列類Queue的測試為例,首先給出該類的接口:

template <typename E>
class Queue{public:Queue();void Enqueue(const E& element);E* Dequeue();size_t size() const;...
};

定義fixture class,習慣上命名為*Test*為要測試的類名稱

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

編寫test

TEST_F(QueueTest, IsEmptyInitially){EXPECT_EQ(q0_.size(), 0);
}
TEST_F(QueueTest, DqueueWorks){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 = q2_.Dequeue();ASSERT_NE(n, nullptr);EXPECT_EQ(*n, 2);EXPECT_EQ(q1_.size(), 1);delete ;
}

Invoking the Tests

在定義好test后,可以通過調用RUN_ALL_TESTS()來運行所有的test,如果所有的test都通過,則返回0,否則返回1。

該函數會測試所有可以關聯的test,包括不同test suite甚至不同文件中的test

編寫main()函數

通常情況可以不用寫main(),用gtest_main()就行。

如果需要在test之前做一些其他框架內沒法處理的操作,則可以自己寫個main(),并將返回值設為RUN_ALL_TESTS().

例子:

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

testing::InitGoogleTest()用于傳遞控制臺參數,使得用戶可以控制測試程序的行為,這部分可參考:https://google.github.io/googletest/advanced.html。

參考

  • 用戶手冊:https://google.github.io/googletest/
  • 入門:https://google.github.io/googletest/primer.html
  • GitHub:https://github.com/google/googletest/tree/main

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/697651.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/697651.shtml
英文地址,請注明出處:http://en.pswp.cn/news/697651.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

weblogic8版本修改控制臺密碼

weblogic的8.1老版本在控制臺界面上沒有修改密碼的按鈕選項&#xff0c;因此需要通過修改服務器配置文件來更新密碼。 步驟1&#xff1a; 備份域目錄下的DefaultAuthenticatorInit.ldift文件 通過find /域目錄 -name weblogic.jar 查到jar包&#xff0c;通過命令生成文件 …

css3的var()函數

css3的var()函數 變量要以兩個連字符--(橫桿)(減號)為開頭 變量可以在:root{}中定義, :root可以在css中創建全局樣式變量。通過 :root本身寫的樣式&#xff0c;相當于 html&#xff0c;但優先級比后者高。 在CSS3中&#xff0c;var()函數是一個用于插入CSS自定義屬性&#xff…

Vulhub 靶場訓練 DC-6解析

一、搭建環境 kali充當攻擊機 ip地址是&#xff1a;192.168.200.14 DC-6充當靶機 &#xff1a; IP地址暫時未知 注意&#xff1a;讓兩臺機器的使用同一種網絡適配器 二、信息收集 1、探索同網段存活的主機 ①第一種方法 arp-scan -l②第二種方法 netdiscover -i eth0 -…

Python內置函數67個語法、參數和用法詳解

要獲取Python解釋器中所有當前可用的內置函數和變量的完整列表,您可以在Python解釋器中使用dir(__builtins__)命令。這將返回一個包含所有內置函數、異常和其他內置對象的列表。 分為10類 數學運算(7): abs 絕對值divmod 商和余數max 最大min最小pow 指數冪round 取整sum 求…

npm/nodejs安裝、切換源

前言 發現自己電腦上沒有npm也沒有node很震驚&#xff0c;難道我沒寫過代碼么&#xff1f;不扯了&#xff0c;進入正題哈哈…… 安裝 一般沒有npm的話會報錯&#xff1a; 無法將“npm”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱而且報這個錯&#xff0c;我們執行…

【騎行新紀元】社交風暴來襲,你準備加入騎友圈了嗎?

當你的自行車輪輕輕滑過清晨的露水&#xff0c;你是否曾想與志同道合的騎友分享這一刻的喜悅&#xff1f;騎行&#xff0c;這個曾經只是簡單運動的代名詞&#xff0c;如今正在悄然轉變。隨著科技的進步和社交平臺的發展&#xff0c;騎行不再只是一種健身方式&#xff0c;它還帶…

【機器學習】是什么?——講解

機器學習 機器學習是人工智能&#xff08;AI&#xff09;的一個子領域&#xff0c;它提供了系統通過數據學習并改進其性能的能力&#xff0c;而不需要人為進行顯式編程&#xff0c;機器學習模型利用大量的數據樣本&#xff08;訓練數據&#xff09;來學習如何識別模式和關系&a…

C-指針-010

1指針 1.1語法&#xff1a; 【基類型*指針變量名】 【int *p&a】1.2語義&#xff1a; 【基類型】&#xff1a;指針變量指向的目標的數據類型 【*】&#xff1a;表示此時定義的變量是一個指針類型的變量 【&a】&#xff1a;一塊存放著int類型數據的空間的地址 【*p】…

slot全局屬性 <slot>標簽</slot> ::slotted()偽元素 筆記240223

slot全局屬性 標簽 ::slotted()偽元素 MDN HTML全局屬性 MDN HTML全局屬性 slot MDN HTML <slot>標簽元素 MDN CSS ::slotted()為元素 MDN 使用 templates and slots <slot>標簽 <slot>標簽是的 display 是 contents 在Web開發中&#xff0c;<s…

【高德地圖】Android搭建3D高德地圖詳細教

&#x1f4d6;Android搭建3D高德地圖詳細教程 &#x1f4d6;第1章 高德地圖介紹?了解高德地圖?2D地圖與3D地圖 &#x1f4d6;第2章 搭建3D地圖并顯示?第 1 步&#xff1a;創建 Android 項目?第 2 步&#xff1a;獲取高德Key?第 3 步&#xff1a;下載地圖SDK?第 4 步&…

照片上多余的人怎么處理?這幾種方法讓你的照片更完美!

照片怎么去掉多余人像&#xff1f;這是許多攝影愛好者經常遇到的問題。有時候&#xff0c;我們拍攝了一張非常美好的照片&#xff0c;但由于某些原因&#xff0c;照片中出現了不希望出現的人物。這時候&#xff0c;我們該如何處理呢&#xff1f;下面&#xff0c;我將分享幾種常…

2.5網安學習第二階段第五周回顧(個人學習記錄使用)

本周重點 ①多進程和多線程 1、進程和線程 2、多線程爆破 ②Redis數據庫 1、Redis的使用 2、Redis持久化 3、Redis未授權免密登錄 ③嗅探和Python攻擊腳本 1、嗅探&#xff08;端口掃描和IP掃描&#xff09; 2、SCAPY的應用 3、Python攻擊腳本&#xff08;SYN半連接…

【More Effective C++】條款22:采用op+=取代op+優勢

采用operator實現operator優點&#xff1a; 降低維護成本&#xff0c;只需要維護operator即可&#xff1b;如果operator為publicoperator不需要稱為class的友元&#xff1b;通過模板的方式自動實現operator版本&#xff1b;提供兩種操作方式&#xff0c;operator效率高&#x…

計算機網絡-局域網

文章目錄 局域網局域網拓撲結構以太網以太網傳輸介質以太網時隙提高傳統以太網帶寬的途徑以太網幀格式 局域網協議IEEE 802參考模型IEEE802.2協議LLC幀格式及其控制字段LLC提供的三種服務 IEEE 802.3協議IEEE 802.4協議IEEE 802.5協議 高速局域網100M以太網千兆以太網萬兆以太網…

沖突管理最佳實踐

任何團隊都無法避免沖突&#xff0c;如何有效管理沖突&#xff0c;將沖突轉化為團隊成長和凝聚的動力&#xff0c;是任何一個團隊管理者的必修課。原文: Best Practices for Managing Conflict in Engineering Management Obie Fernandez Unsplash 沖突在任何組織中都不可避免&…

計算機網絡中的與或非運算

三種基本邏輯運算關系 搭建中小公司網絡&#xff0c;根據網址計算&#xff0c;用戶的人數 需要ip和掩碼&#xff0c;確定可分配的ip數 與運算電路為串聯電路&#xff0c;的&#xff0c;A,B的組合情況 具體參考三種基本邏輯運算關系

圖片參考網站

攝圖網-正版高清圖片免費下載_商用設計素材圖庫 (699pic.com) AIGC數字藝術素材圖片-數字藝術-數字藝術圖片-攝圖網 (699pic.com) 花瓣網 - 陪你做生活的設計師&#xff08;創意靈感天堂&#xff0c;搜索、發現設計靈感、設計素材&#xff09; (huaban.com) 千圖網-免費在線…

python視頻流處理工具

在當今數字化的時代&#xff0c;視頻處理應用變得越來越普遍。無論是視頻流分析、實時視頻處理還是視頻流轉碼&#xff0c;都需要強大的工具來實現。Python Vidgear 庫就是這樣一個工具&#xff0c;它為開發人員提供了豐富的功能&#xff0c;用于處理實時視頻流。本文將深入探討…

Android中Transition過渡動畫的簡單使用

前些天發現了一個蠻有意思的人工智能學習網站,8個字形容一下"通俗易懂&#xff0c;風趣幽默"&#xff0c;感覺非常有意思,忍不住分享一下給大家。 &#x1f449;點擊跳轉到教程 一、布局xml文件代碼如下&#xff1a; <?xml version"1.0" encoding&quo…

Feign接口GET方式注意事項

1. GET請求方式&#xff0c;對于feign接口一定得用 RequestParam/SpringQueryMap等注解聲明是路徑參數&#xff0c;否則會自動識別為body params報錯(controller接口則可不用&#xff0c;springmvc會自動匹配相同字段名) demo: API 層controller接口&#xff1a; 前端傳參可直…