V1_6_FAQ 提示和常見問題關(guān)于谷歌 c + + 測試框架
Posted on 2011-09-26 20:53 RTY 閱讀(501) 評論(0) 編輯 收藏 引用 所屬分類: 質(zhì)量保障搜索 |
V1_6_FAQ 提示和常見問題關(guān)于谷歌 c + + 測試框架 由zhanyong...@gmail.com更新的2011 年 4 月 18 日
如果你找不到在這里,你的問題的答案,你讀過底漆和AdvancedGuide,則將其發(fā)送到 googletestframework@googlegroups.com。 為什么應(yīng)該的我最喜歡的 c + + 測試框架而不是使用 Google 測試?首先,讓我們說清楚我們不想要進(jìn)入的 c + + 的測試框架是最佳的辯論。存在許多精細(xì)框架編寫 c + + 的測試中,和我們有巨大的開發(fā)人員和用戶他們尊重。我們認(rèn)為不存在 (或者將) 最好的單一框架-您必須選擇合適的工具為您正在處理的特定任務(wù)。 因?yàn)槲覀冋也坏秸_的功能和便利條件組合在一個(gè)現(xiàn)有的框架,以滿足我們的需要,我們創(chuàng)建了谷歌測試。以下是一個(gè)列表的事情,我們喜歡谷歌測試。我們不要為我們宣稱他們是唯一谷歌測試-相反,他們使谷歌測試組合的選擇。我們希望此列表可以幫助您決定是否為您太。
谷歌測試將您修復(fù)它們進(jìn)行編譯時(shí)收到警告?我們的努力減少谷歌測試生成編譯器警告。發(fā)布一個(gè)新版本之前, 我們測試以確保它不會生成 Windows、 Linux、 Mac OS 上使用它的 CMake 腳本在編譯時(shí)警告。 不幸的是,這并不意味著你保證就看到?jīng)]有任何警告,谷歌測試您的環(huán)境中進(jìn)行編譯時(shí):
它并不總是可能使谷歌測試無預(yù)警的每個(gè)人。或者,它可能不可取如果很少啟用警告并修復(fù)侵犯行為會使代碼更復(fù)雜。 如果谷歌測試進(jìn)行編譯時(shí),您會看到警告,我們建議您在使用-isystem標(biāo)志 (假設(shè)你使用 GCC) 來標(biāo)記為系統(tǒng)標(biāo)題谷歌測試頭。這會取消警告從谷歌測試郵件頭。 為什么應(yīng)該不測試用例名稱和測試名稱包含下劃線?下劃線 (_) 是特殊的情況下,c + + 儲備由編譯器和標(biāo)準(zhǔn)庫使用下列:
用戶代碼是禁止使用這樣的標(biāo)識符。 現(xiàn)在讓我們看看這意味著測試和TEST_F. 目前測試 TestName TestCaseName) ,將生成一個(gè)名為TestCaseName_TestName_Test類。如果包含TestCaseName或TestName ,會發(fā)生什么_?
TestCaseName和TestName不能開始或結(jié)束_與如此清晰 (事實(shí)上, TestCaseName可以開始_ — — 只要_不跟著大寫字母。但是,變得更復(fù)雜。所以為了簡單起見,我們只是說它不能以開始_.). 它可能是TestCaseName和TestName ,包含在中間_好的。但是,考慮這: TEST(Time, Flies_Like_An_Arrow) { ... } 現(xiàn)在,兩個(gè)測試s 都將生成相同的類 (Time_Files_Like_An_Arrow_Test)。這不是好的。 所以為了簡單起見,我們只是要求用戶,以避免在TestCaseName和TestName _ 。規(guī)則是不必要的更多限制,但它既簡單又容易記住。它還使谷歌測試以防其執(zhí)行需要在將來會改變一些發(fā)展的空間。 如果您違反此規(guī)則,有可能不會馬上的后果,但您的測試可能 (只是 5 月) 與新的編譯器 (或新版本的編譯器使用的) 或新版本的谷歌測試中斷。因此最好遵循的規(guī)則。 它為什么不推薦將安裝谷歌測試預(yù)編譯的副本 (例如,為 /usr/local)?在最初的時(shí)候,我們說過你也可以安裝已編譯的谷歌測試庫使用使安裝的*nix 系統(tǒng)。然后每個(gè)用戶的計(jì)算機(jī)中,可以編寫測試,無需重新編譯谷歌測試。 這看起來像是一個(gè)好主意,但它有了茶: 每個(gè)用戶需要編譯使用同一編譯器標(biāo)志用于編譯安裝的谷歌測試庫 ; 他測試否則他可能遇到未定義的行為 (即測試可以奇怪的行為和甚至可能會崩潰,沒有明顯的原因)。 為什么會這樣?因?yàn)?c + + 都有這種東西叫做一個(gè)定義規(guī)則: 如果兩個(gè) c + + 源文件包含不同定義的同一類/功能/變量,并且您將它們鏈接在一起,你違反規(guī)則。鏈接器可能或不可能捕獲錯(cuò)誤 (在許多情況下它不需要由 c + + 標(biāo)準(zhǔn)趕上違反)。如果不是,你會得到奇怪的運(yùn)行時(shí)行為,是意外,很難調(diào)試。 如果您編譯谷歌測試和測試代碼使用不同的編譯器標(biāo)志,他們可能會看到不同的定義的同一類/功能/變量 (如, # if谷歌測試中使用)。因此,頭腦清楚,我們建議以避免安裝預(yù)編譯的谷歌測試庫。相反,每個(gè)項(xiàng)目應(yīng)編譯谷歌測試本身,這樣它可以肯定的是同一標(biāo)志用于谷歌測試和測試。 我如何生成 64 位二進(jìn)制文件在 Windows 上 (使用 Visual Studio 2008)?(由特雷弗 · 羅賓遜回答) 加載提供的 Visual Studio 解決方案文件,或msvc\gtest md.sln或msvc\gtest.sln。經(jīng)過遷移向?qū)нw移到 Visual Studio 2008 的解決方案和項(xiàng)目文件。從生成菜單中選擇配置管理器 … … 。從活動解決方案平臺下拉列表中選擇> < 新 … … 。從新的平臺下拉列表中選擇x 64 ,將從此處復(fù)制設(shè)置設(shè)置保留為Win32和創(chuàng)建新的項(xiàng)目平臺選中此選項(xiàng),然后單擊確定。現(xiàn)在,您有Win32和x64平臺配置,可以選擇從標(biāo)準(zhǔn)工具欄上,使您可以構(gòu)建 32 位或 64 位的二進(jìn)制文件 (或兩者在一次使用批量生成) 之間切換。 為了防止覆蓋另一個(gè)生成輸出文件,您需要更改所有項(xiàng)目之間的中間目錄設(shè)置為新創(chuàng)建的平臺配置。為此,多選操作 (如使用按住 shift 鍵單擊) 的所有項(xiàng)目 (但不是解決辦法)解決方案資源管理器中。用鼠標(biāo)右鍵單擊其中之一,并選擇屬性。在左窗格中,選擇配置屬性,并從配置下拉列表中,選擇所有配置。請確保選定的平臺是x 64。中間目錄設(shè)置,更改從$(PlatformName)\$(ConfigurationName)到$(OutDir)\$(ProjectName)的值。單擊確定,然后生成解決方案。生成完成時(shí),64 位二進(jìn)制文件將在msvc\x64\Debug目錄中。 可以在 MinGW 上使用谷歌測試嗎?我們沒有測試此自己,但每個(gè)亞伯拉罕森報(bào)告說他是能夠編譯和安裝谷歌測試成功地使用這個(gè)軟件從 MinGW 時(shí)。您需要將其與配置: 配置路徑/TO/CC ="海灣合作委員會 mno-這個(gè)軟件"CXX ="g + +-mno-這個(gè)軟件" 您應(yīng)該能夠取代-mno-這個(gè)軟件選項(xiàng)以直接鏈接到真正的 MinGW 二進(jìn)制文件,但我們還沒試過。 注意事項(xiàng):
我們亦在 Linux 上包含站點(diǎn)上使用這些說明成功交叉編譯的谷歌測試 MinGW 二進(jìn)制文件的報(bào)告。 請如果您有興趣提高對 MinGW 的支持,聯(lián)系googletestframework@googlegroups.com 。 為什么谷歌測試支持 EXPECT_EQ ptr NULL) 和 ASSERT_EQ ptr NULL) 但不是 EXPECT_NE ptr NULL) 和 ASSERT_NE ptr NULL)?由于 c + + 的一些特性,它需要一些非普通模板元編程技巧,支持使用NULL作為參數(shù)的EXPECT_XX()和ASSERT_XX()宏。因此我們只能做到哪里最需要 (否則我們讓谷歌測試執(zhí)行難維持與比必要多出錯(cuò))。 EXPECT_EQ()宏需要作為其第一個(gè)參數(shù)的預(yù)期值和實(shí)際值作為第二個(gè)。這是合理的有人想要寫EXPECT_EQ NULL some_expression),并確實(shí)要求這樣做幾次。因此我們執(zhí)行它。 EXPECT_NE ptr NULL)需要并不是幾乎一樣強(qiáng)壯。當(dāng)斷言失敗時(shí),您已經(jīng)知道該ptr必須為空,因此它不會添加任何信息,在此情況下打印 ptr。這意味著, EXPECT_TRUE(ptr!NULL)同樣適用。 如果我們支持EXPECT_NE ptr NULL),我們將不得不支持EXPECT_NE (ptr,NULL)以及一致性,作為與EXPECT_EQ,不同的是我們還沒有一項(xiàng)公約EXPECT_NE的兩個(gè)參數(shù)的順序。這意味著使用模板元編程技巧在執(zhí)行兩次,使其更難以理解和維護(hù)。我們相信效益并不證明成本。 最后,隨著谷歌模仿和圖書館的增長,我們鼓勵(lì)人們更經(jīng)常在測試中使用統(tǒng)一的EXPECT_THAT (值) 和語法。研究方法的一個(gè)顯著的優(yōu)勢是匹配可以輕松地結(jié)合形式新匹配,而是EXPECT_NE等,宏不能輕松地組合。因此,我們希望更多投資比匹配,在EXPECT_XX()宏。 谷歌測試支持并行運(yùn)行測試嗎?測試賽跑者往往緊耦合與生成/測試環(huán)境,和谷歌測試不會嘗試解決問題以并行方式運(yùn)行測試。相反,我們試圖使谷歌測試與試驗(yàn)賽跑者很好地工作。例如,谷歌測試 XML 報(bào)表包含對每個(gè)測試,花費(fèi)的時(shí)間,其gtest_list_tests和gtest_filter的標(biāo)志可用于拆分到多個(gè)進(jìn)程執(zhí)行的測試方法。這些功能可以幫助并行運(yùn)行的測試的測試運(yùn)行。 為什么不要谷歌測試運(yùn)行不同的線程中的測試速度的東西?很難寫線程安全的代碼。大多數(shù)測試線程安全,不會寫入,因此可能無法正常工作在多線程環(huán)境中。 如果你想一想,它已經(jīng)難使您的代碼時(shí)你知道其他線程做什么工作。它是艱難得多,有時(shí)甚至是不可能的以使您的代碼時(shí),你不知道的其他線程正在做工作 (記住可以添加、 刪除或修改之后寫入您的測試試驗(yàn)方法)。如果您要運(yùn)行的測試的同時(shí),你會在不同的進(jìn)程中更好地運(yùn)行它們。 為什么谷歌測試斷言不執(zhí)行使用異常?我們的原始動機(jī)是為了能夠禁用例外的項(xiàng)目中使用谷歌測試。后來我們意識到這種方法的一些額外的好處:
try { ... ASSERT_TRUE(...) ... } 上面的代碼會通過即使ASSERT_TRUE拋出。雖然有人寫此測試中的機(jī)會不大,很可能會遇到這種模式,當(dāng)你寫下測試的代碼的調(diào)用的回調(diào)的斷言。 不使用異常的缺點(diǎn)在于ASSERT_ * (實(shí)施使用返回) 將只中止當(dāng)前函數(shù),不當(dāng)前測試. 為什么我們兩個(gè)不同的宏用測試與無固定裝置?不幸的是,c + + 的宏觀系統(tǒng)不允許我們?yōu)檫@兩種情況使用相同的宏。一種可能性是以提供測試夾具、 只有一個(gè)宏,要求用戶有時(shí)定義為空的夾具: class FooTest : public ::testing::Test {}; 或 typedef ::testing::Test FooTest; 然而,很多人認(rèn)為這是一條線太多。:-)我們的目標(biāo)是使它真的很容易寫測試,所以我們試圖使瑣碎創(chuàng)建簡單的測試。這意味著需要為此類測試使用一個(gè)單獨(dú)的宏。 我們認(rèn)為這兩種方法是理想的但其中一方是合理的。最后,它可能并不重要太多。 我們?yōu)槭裁床焕媒Y(jié)構(gòu)作為測試夾具?我們要表示被動的數(shù)據(jù)時(shí),才使用結(jié)構(gòu)。這種結(jié)構(gòu)和類之間的區(qū)別是良好記錄的代碼作者的意圖。由于測試夾具如SetUp()和TearDown()的邏輯,它們更好地定義為類。 死亡測試試驗(yàn)轉(zhuǎn)輪和使用斷言作為實(shí)施為什么呢?我們的目標(biāo)是使死亡測試,方便用戶可能是 c + + 允許。特別是:
if (FooCondition()) { 如果您希望一個(gè)死亡測試每個(gè)測試方法,您可以編寫您的測試中那種風(fēng)格,但我們不想,強(qiáng)加給用戶。更少的人工限制越好。
const int count = GetCount(); // Only known at run time. 基于轉(zhuǎn)輪的方法往往是更為靜態(tài)和不夠靈活,或需要更多的用戶作出努力,得到這種靈活性。 ASSERT_DEATH另一個(gè)有意思的一點(diǎn)是它調(diào)用fork()創(chuàng)建一個(gè)子進(jìn)程運(yùn)行死亡測試。這減輕快速、 fork()使用寫入時(shí)復(fù)制頁面,并會導(dǎo)致幾乎為零的開銷,并從用戶提供語句直接跳過所有全局和本地初始化和給定的語句導(dǎo)致任何代碼啟動的子進(jìn)程。如果您啟動子進(jìn)程從零開始,它可以秒只加載的一切并開始運(yùn)行如果測試動態(tài)鏈接到許多圖書館。 我的死亡測試修改某些狀態(tài),但死亡測試完成后,更改好像是迷路了。為什么會這樣?執(zhí)行死刑測試 (EXPECT_DEATH等) 在子流程世倜預(yù)期的崩潰不會殺死測試程序 (即父進(jìn)程)。因此,他們承擔(dān)任何內(nèi)存中副作用是流星雨在它們各自的子流程,但不是在父進(jìn)程。你可以把它們看作運(yùn)行的平行宇宙,更多或更少。 編譯器抱怨"未定義的引用"到一些靜態(tài)的 const 成員變量,但我確實(shí)在類體中定義它們。怎么了?如果您的類有一個(gè)靜態(tài)數(shù)據(jù)成員: // foo.h 您還需要在foo.cc中定義它以外的類的主體: const int Foo::kBar; // No initializer here. 否則為你的代碼是無效的 c + +,并以出乎意料的方式可能會中斷。特別是,在谷歌測試比較斷言 (EXPECT_EQ等) 中使用它將生成一個(gè)"未定義的引用"鏈接器錯(cuò)誤。 我必須具有幾個(gè)實(shí)現(xiàn)的接口。可以一次寫入一組測試和所有實(shí)現(xiàn)都重復(fù)他們嗎?Google Test doesn't yet have good support for this kind of tests, or data-driven tests in general. We hope to be able to make improvements in this area soon. Can I derive a test fixture from another?Yes. Each test fixture has a corresponding and same named test case. This means only one test case can use a particular fixture. Sometimes, however, multiple test cases may want to use the same or slightly different fixtures. For example, you may want to make sure that all of a GUI library's test cases don't leak important system resources like fonts and brushes. In Google Test, you share a fixture among test cases by putting the shared logic in a base test fixture, then deriving from that base a separate fixture for each test case that wants to use this common logic. You then use TEST_F() to write tests using each derived fixture. Typically, your code looks like this: // Defines a base test fixture. If necessary, you can continue to derive test fixtures from a derived fixture. Google Test has no limit on how deep the hierarchy can be. 完整的示例,使用派生的試驗(yàn)裝置,請參見sample5. 我的編譯器抱怨"無效值不忽視,應(yīng)該是"。這是什么意思?你可能不返回void函數(shù)中用ASSERT_*() 。ASSERT_*()可以只用void函數(shù)中。 我的死亡測試掛起 (或賽格故障)。如何解決呢?在谷歌測試中,死亡測試運(yùn)行在一個(gè)子進(jìn)程中,他們的工作的方式是微妙。寫你確實(shí)需要了解他們是如何死亡的測試。請確保您已經(jīng)閱讀這。 特別是,死亡測試不喜歡父進(jìn)程中有多個(gè)線程。所以您可以嘗試的第一件事是消除創(chuàng)建線程以外的EXPECT_DEATH(). 有時(shí)這是不可能,您必須使用一些圖書館可能會創(chuàng)建線程之前甚至達(dá)到main () 。在這種情況下,您可以嘗試通過移動盡可能多的活動在EXPECT_DEATH()內(nèi)盡可能減少沖突的可能性 (極端情況下,您希望移動內(nèi)部的一切),或離開它盡可能多的東西。另外,可以將死亡測試樣式設(shè)置為"線程",而是更安全,但速度較慢,請嘗試并查看是否它會幫助。 如果你去使用線程安全死亡測試,請記住它們會重新運(yùn)行測試程序從子進(jìn)程中開始。因此請確保您的程序可以運(yùn)行肩并肩與本身是確定性。 最后,要?dú)w結(jié)為好的并發(fā)編程。你要確保這是沒有爭用條件或死鎖在你的程序中。沒有銀彈-對不起 ! 應(yīng)該使用構(gòu)造函數(shù)/析構(gòu)函數(shù)測試夾具或設(shè)置上/淚下功能嗎?要記住的第一件事是谷歌測試不會重用相同的測試夾具對象在多個(gè)測試。每個(gè)TEST_F,谷歌測試將創(chuàng)建新測試夾具對象,立即調(diào)用SetUp(),運(yùn)行測試,調(diào)用TearDown(),然后立即刪除測試夾具的對象。因此,有不需要編寫SetUp()或TearDown()函數(shù)如果構(gòu)造函數(shù)或析構(gòu)函數(shù)已經(jīng)完成的工作。 您仍可能需要使用SetUp()/TearDown()在以下情況中:
編譯器抱怨"沒有匹配的調(diào)用的函數(shù)"何時(shí)使用 ASSERT_PREDn。如何解決呢?如果您使用ASSERT_PRED *或EXPECT_PRED *中的謂詞函數(shù)重載或模板,編譯器將有麻煩弄哪一個(gè)重載的版本,它應(yīng)該使用。ASSERT_PRED_FORMAT *和EXPECT_PRED_FORMAT *沒有這個(gè)問題。 如果您看到此錯(cuò)誤,您可能要切換到(ASSERT|期待) _PRED_FORMAT *,它也會給你更好的失敗消息。如果,不過,這不是一個(gè)選項(xiàng),您可以通過明確告訴編譯器來挑哪個(gè)版本來解決問題。 例如,假設(shè)您有 bool IsPositive(int n) { 如果你寫,你將得到編譯器錯(cuò)誤。 EXPECT_PRED1(IsPositive, 5); 不過,這會工作: EXPECT_PRED1(*static_cast<bool (*)(int)>*(IsPositive), 5); ( Static_cast運(yùn)算符尖括號里面的東西是int函數(shù)指針的類型- IsPositive()版.) 另一個(gè)例子是,當(dāng)你有一個(gè)模板函數(shù) template <typename T> 您可以使用它在謂詞的斷言,像這樣: ASSERT_PRED1(IsNegative*<int>*, -5); 東西都更有趣,如果您的模板有多個(gè)參數(shù)。不會編譯: ASSERT_PRED2(*GreaterThan<int, int>*, 5, 0); 作為 c + + 預(yù)處理器認(rèn)為你給ASSERT_PRED2 4 參數(shù),這是一個(gè)超過預(yù)期。解決方法是將謂詞函數(shù)的包裝中括號: ASSERT_PRED2(*(GreaterThan<int, int>)*, 5, 0); 我的編譯器抱怨"忽略返回值"當(dāng)我打電話 RUN_ALL_TESTS()。為什么會這樣?有些人所忽略的返回值RUN_ALL_TESTS()。也就是說,而不是 return RUN_ALL_TESTS(); 他們寫道 RUN_ALL_TESTS(); 這是錯(cuò)誤和危險(xiǎn)的。測試轉(zhuǎn)輪需要看到RUN_ALL_TESTS()的返回值,以確定是否測試通過。如果您的main ()函數(shù)將忽略它,您的測試將被視為成功即使有谷歌測試斷言失敗。很差。 為了幫助用戶避免這種危險(xiǎn)的 bug, RUN_ALL_TESTS()的執(zhí)行導(dǎo)致 gcc 提高此警告,當(dāng)返回值將被忽略。如果您看到此警告,此修復(fù)程序很簡單: 只需確保其值用作main ()的返回值. 我的編譯器抱怨構(gòu)造函數(shù) (或析構(gòu)函數(shù)) 不能返回值。這是怎么回事?由于 c + +,為了支持流媒體消息ASSERT_ *,如語法的一個(gè)特色, ASSERT_EQ(1, Foo()) << "blah blah" << foo; 我們不得不放棄使用ASSERT *和失敗 * (但不是期望 * ADD_FAILURE *) 中構(gòu)造函數(shù)和析構(gòu)函數(shù)。解決方法是將構(gòu)造函數(shù)/析構(gòu)函數(shù)的內(nèi)容移至私人無效成員函數(shù),或如果切換到EXPECT_*() 。本節(jié)中的用戶指南解釋了它。 不是我的設(shè)置功能。為什么會這樣?C + + 是區(qū)分大小寫。它應(yīng)拼寫為SetUp()。你拼寫它作為Setup()? 同樣地,有時(shí)拼寫為SetupTestCase() SetUpTestCase()的人,不知道為什么它永遠(yuǎn)不會被稱為。 我如何做直接在 Emacs 失敗的行跳?谷歌測試失敗的郵件格式是 Emacs 和許多其他 Ide,像 acme 和 XCode 理解。如果在編譯緩沖區(qū)中 Emacs 谷歌測試郵件,則可點(diǎn)擊。你現(xiàn)在可以打上一條消息要跳轉(zhuǎn)到對應(yīng)的源代碼,輸入或使用C x ' 要跳轉(zhuǎn)到下一次的失敗。 我有幾個(gè)測試用例,共享相同的測試夾具邏輯,有一個(gè)新的測試夾具類定義為每個(gè)嗎?這看起來非常繁瑣。你不必。而不是 class FooTest : public BaseTest {}; 您可以只是typedef測試夾具: typedef BaseTest FooTest; 谷歌測試輸出,埋在一大堆的日志消息。我該怎么辦?谷歌測試輸出注定要簡明和人性化的報(bào)告。如果您的測試生成的文本輸出本身,它將混合與谷歌測試輸出,從而很難閱讀。然而,有一個(gè)簡單的解決方案,這一問題。 由于大多數(shù)日志消息轉(zhuǎn)到 stderr,我們決定讓谷歌測試輸出到標(biāo)準(zhǔn)輸出。這種方式,可以方便地分隔兩個(gè)使用重定向。例如: ./my_test > googletest_output.txt 為什么應(yīng)該在全局變量喜歡測試夾具?有幾個(gè)好的理由:
如何測試而無需編寫 FRIEND_TEST () s 的私有類成員?您應(yīng)嘗試寫入可測試代碼,這意味著類應(yīng)從他們的公共接口輕松地進(jìn)行測試。要實(shí)現(xiàn)這一目標(biāo)的一種是平普爾成語: 你將所有的一類的私有成員移動到幫助器類,并公開的幫助器類的所有成員。 你有幾個(gè)其他選項(xiàng),不需要使用FRIEND_TEST:
class Foo { class Foo { class YourClass { 如何測試而無需編寫 FRIEND_TEST () s 的私有類的靜態(tài)成員?我們發(fā)現(xiàn)私有靜態(tài)方法雜波的頭文件。他們是實(shí)現(xiàn)細(xì)節(jié),理想情況下應(yīng)保持出。 h。所以常常我讓他們轉(zhuǎn)而無功能。 而不是: // foo.h 您可能應(yīng)該更好地編寫: // foo.h 我想要使用不同的參數(shù)運(yùn)行測試幾次。我需要寫幾個(gè)類似的副本嗎?號您可以使用一個(gè)稱為功能 [V1_6_AdvancedGuide# Value_Parameterized_Tests 的值參數(shù)測試] 讓您沒有定義它不止一次重復(fù)使用不同的參數(shù),您的測試。 如何測試文件,它定義 main ()?若要測試一個(gè)foo.cc文件,您需要編譯并鏈接到您的單元測試程序。然而,當(dāng)文件包含main ()函數(shù)的定義,它與你的單元測試的main ()將會發(fā)生沖突,并將導(dǎo)致生成錯(cuò)誤。 選擇合適的解決方案是將它分成三個(gè)文件:
然后,可以很容易測試foo.cc 。 如果您正在將測試添加到現(xiàn)有文件并不愿意看到這樣的侵入性變化,有黑客: 只是在單元測試中包含整個(gè)foo.cc文件。例如: // File foo_unittest.cc 但是,請記住這是黑客,只應(yīng)作為最后的手段。 ASSERT_DEATH() 中的語句參數(shù)可以是什么?ASSERT_DEATH _regex_ _statement_)(或任何死亡斷言宏) 可以使用_statement_在哪里有效。所以基本上_statement_可以是任何在當(dāng)前上下文中有意義的 c + + 語句。特別是,它可以引用全局和/或本地變量,并且可以是:
這里顯示了一些示例:// A death test can be a simple function call. googletest_unittest.cc包含更多的例子,如果你感興趣。 ASSERT_DEATH 使用正則表達(dá)式什么語法?在 POSIX 系統(tǒng)上,谷歌測試使用 POSIX 擴(kuò)展正則表達(dá)式語法 (http://en.wikipedia.org/wiki/Regular_expression#POSIX_Extended_Regular_Expressions)。在 Windows 上,它使用正則表達(dá)式語法的有限變體。有關(guān)更多詳細(xì)信息,請參見 [V1_6_AdvancedGuide# Regular_Expression_Syntax 正則表達(dá)式語法]。 我有一個(gè)夾具類美孚,但 TEST_F (美孚、 欄) 給了我錯(cuò)誤"對 Foo::Foo() 的調(diào)用不匹配功能"。為什么會這樣?谷歌測試需要能夠創(chuàng)建對象的測試夾具類中,因此它必須具有默認(rèn)構(gòu)造函數(shù)。通常,編譯器將定義一個(gè)給你。但是,有些情況下,你也要定義您自己:
ASSERT_DEATH 為什么抱怨以前的線程都已加入?隨著 Linux pthread 庫中,沒有轉(zhuǎn)回一旦你越線從單個(gè)線程對多個(gè)線程。您創(chuàng)建的線程,第一次管理器創(chuàng)建一個(gè)線程是此外,因此您可以獲得 3,不 2,線程。以后,當(dāng)您創(chuàng)建的線程時(shí)加入主線程的線程計(jì)數(shù)遞減 1,但管理器線程將永遠(yuǎn)不會被殺,所以你還有兩個(gè)線程,這意味著您不能安全地運(yùn)行死亡測試。 新 NPTL 線程庫不會患這個(gè)問題,因?yàn)樗粫?chuàng)建一個(gè)管理器線程。但是,如果你無法控制哪臺計(jì)算機(jī)運(yùn)行您的測試,你不應(yīng)該取決于此。 為什么谷歌測試是否需要整個(gè)測試用例,而不是要被命名為 FOODeathTest,使用 ASSERT_DEATH 時(shí)的各個(gè)測試的?谷歌測試并不交叉來自不同測試用例的測試。就是它第一,在一個(gè)測試用例中運(yùn)行所有測試,然后都運(yùn)行所有測試下一個(gè)測試用例,依此類推。谷歌測試這樣做是因?yàn)樗枰八牡谝淮螠y試運(yùn)行時(shí),設(shè)置了一個(gè)測試用例和 afterwords 拆了。分裂測試用例需要多個(gè)設(shè)置和撤展過程,這是效率低下,令語義不潔凈。 如果我們確定的順序基于測試的測試用例的名稱而不是名稱的測試,我們將會有以下的情況的問題: TEST_F(FooTest, AbcDeathTest) { ... } 由于FooTest.AbcDeathTest需要運(yùn)行BarTest.Xyz之前,我們不隔行掃描來自不同測試用例的測試,我們需要在BarTest案中運(yùn)行任何測試之前運(yùn)行生成器的情況的全部測試。要運(yùn)行BarTest.DefDeathTest FooTest.Uvw之前的規(guī)定發(fā)生矛盾. 但我不喜歡它包含死亡測試和非死亡測試時(shí)調(diào)用我整個(gè)測試用例 FOODeathTest。我該怎么辦?你不需要,但如果你愿意,你可能分裂測試用例,生成器和FooDeathTest,名字哪里弄清楚他們與相關(guān): class FooTest : public ::testing::Test { ... }; 編譯器抱怨"不敵運(yùn)算符 << '"何時(shí)使用斷言。是什么給了?如果您使用用戶定義類型FooType的說法,你必須確保有輸出 & 運(yùn)算符 << (輸出 & const FooType &)定義,我們可以打印的FooType值的函數(shù). 此外,如果在名稱空間中,聲明為FooType <<運(yùn)算符還需要在同一命名空間中定義。 我如何壓抑對 Windows 的內(nèi)存泄漏消息?由于靜態(tài)初始化的谷歌測試單身人士需要在堆上的分配,Visual c + + 內(nèi)存泄漏檢測儀將報(bào)告在程序運(yùn)行結(jié)束時(shí)的內(nèi)存泄漏問題。為避免這種最簡單的方法是使用_CrtMemCheckpoint和_CrtMemDumpAllObjectsSince ,不報(bào)告任何靜態(tài)調(diào)用初始化堆對象。有關(guān)更多詳細(xì)信息和附加堆檢查/調(diào)試?yán)蹋垍㈤?MSDN。 我工程與谷歌在 Visual Studio 中的測試,我收到的都是一堆鏈接器錯(cuò)誤 (或警告)。幫助!你可以得到以下鏈接器的一些錯(cuò)誤或警告如果您試圖鏈接您的測試項(xiàng)目與谷歌測試庫時(shí),您的項(xiàng)目不生成使用相同的編譯器設(shè)置。
谷歌測試項(xiàng)目 (gtest.vcproj) 已將運(yùn)行時(shí)庫選項(xiàng)設(shè)置為 /MT (使用多線程靜態(tài)庫,用于調(diào)試 /MTd)。如果您的項(xiàng)目使用別的東西,例如 /MD (使用 /MDd 用于調(diào)試多線程的 Dll),您需要更改以匹配您的項(xiàng)目中谷歌測試項(xiàng)目的設(shè)置。 更新此設(shè)置打開項(xiàng)目屬性在 Visual Studio IDE 中,然后選擇配置屬性的分支 |C/C + + |代碼生成,并更改"運(yùn)行時(shí)庫"的選項(xiàng)。您還可以嘗試使用 gtest md.vcproj 而不 gtest.vcproj。 在庫中,我把我的測試中,Google 測試并不運(yùn)行它們。發(fā)生了什么事情?你讀過谷歌測試底漆頁上警告嗎? 我希望與 Visual Studio 一起使用谷歌測試,但不知道從哪里開始。許多人都在您所在的位置和張貼之一他到我們的郵件列表中的解決方案。這里是他的鏈接: http://hassanjamilahmad.blogspot.com/2009/07/gtest-starters-help.html. 我看到了編譯一提 std::type_traits 嘗試在 Solaris 上使用谷歌測試時(shí)的錯(cuò)誤。谷歌測試使用 c + + 標(biāo)準(zhǔn)庫不支持 SunStudio 的部分。我們的用戶報(bào)告使用替代實(shí)現(xiàn)成功。嘗試運(yùn)行生成后運(yùn)行此命令: 導(dǎo)出抄送 = 抄送 CXX = 抄送 CXXFLAGS ='-庫 = stlport4' 我的代碼如何檢測其是否運(yùn)行在測試中?如果您編寫代碼,嗅是否它運(yùn)行在測試中,并且相應(yīng)地做不同的事情,滲入生產(chǎn)代碼僅測試邏輯和有沒有捷徑,確保僅測試的代碼路徑不誤生產(chǎn)中運(yùn)行。這種聰明也會導(dǎo)致Heisenbugs。因此,我們強(qiáng)烈建議對實(shí)踐,和谷歌測試并不提供一種方法做這件事。 In general, the recommended way to cause the code to behave differently under test is dependency injection. You can inject different functionality from the test and from the production code. Since your production code doesn't link in the for-test logic at all, there is no danger in accidentally running it. However, if you really, really, really have no choice, and if you follow the rule of ending your test program names with _test, you can use thehorrible hack of sniffing your executable name (argv[0] in main()) to know whether the code is under test. Google Test defines a macro that clashes with one defined by another library. How do I deal with that?In C++, macros don't obey namespaces. Therefore two libraries that both define a macro of the same name will clash if you #include both definitions. In case a Google Test macro clashes with another library, you can force Google Test to rename its macro to avoid the conflict. Specifically, if both Google Test and some other code define macro FOO, you can add -DGTEST_DONT_DEFINE_FOO=1 to the compiler flags to tell Google Test to change the macro's name from FOO to GTEST_FOO. For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write GTEST_TEST(SomeTest, DoesThis) { ... } instead of TEST(SomeTest, DoesThis) { ... } in order to define a test. Currently, the following TEST, FAIL, SUCCEED, and the basic comparison assertion macros can have alternative names. You can see the full list of covered macros here. More information can be found in the "Avoiding Macro Name Clashes" section of the README file. My question is not covered in your FAQ!If you cannot find the answer to your question in this FAQ, there are some other resources you can use:
Please note that creating an issue in the issue tracker is not a good way to get your answer, as it is monitored infrequently by a very small number of people. When asking a question, it's helpful to provide as much of the following information as possible (people cannot help you if there's not enough information in your question):
|