簡介:為什么是 googletest筐乳?
googletest
可以幫助我們更好地編寫 C++ 測試用例鬼廓。
googletest 是一個由 Google 的測試技術(shù)團隊開發(fā)的測試框架队腐,它考慮到了谷歌的特定需求和限制坐儿。無論你使用的是 Linux、Windows 還是 Mac贝乎,只要你編寫 C++ 代碼情连,googletest 都可以幫到你。它支持任何類型的測試览效,不只是單元測試却舀。
那么,什么是好的測試锤灿,以及 googletest 是如何做到這些的呢挽拔?我們相信:
測試應(yīng)該是 獨立的 且 可重復(fù)的。調(diào)試由于其它測試而成功或失敗的測試是令人痛苦的但校,googletest 通過在不同的對象上運行每個測試用例來隔離測試螃诅。當(dāng)測試失敗時,googletest 允許你單獨運行它,以便快速調(diào)試术裸。
測試應(yīng)該得到良好的組織倘是,并反映測試代碼的結(jié)構(gòu)。googletest 將相關(guān)的測試分組為測試套件袭艺,它們可以共享數(shù)據(jù)和子例程搀崭。這種常見的模式很容易接受,并且使測試很容易維護匹表。這樣的一致性在人們切換項目并開始工作在一個新的代碼庫上時尤其有用门坷。
測試應(yīng)該是 可移植的 且 可復(fù)用的。Google 具有大量的平臺無關(guān)的代碼袍镀,它的測試也應(yīng)該是平臺無關(guān)的。googletest 適用于不同的操作系統(tǒng)冻晤,不同的編譯器苇羡,有異常或沒有異常鼻弧,所以 googletest 測試可以使用多種配置设江。
當(dāng)測試失敗時,它們應(yīng)該提供盡可能多的關(guān)于故障的 信息攘轩。googletest 不會在第一個測試失敗時停止叉存。相反,它僅停止當(dāng)前的測試并繼續(xù)運行下一個度帮。你還可以設(shè)置測試報告非致命故障歼捏,在此之后,當(dāng)前測試將繼續(xù)運行笨篷。這樣瞳秽,你可以在一個運行-編輯-編譯周期中探測并解決多個 bug。
測試框架應(yīng)該將測試編寫者從家務(wù)活中解放出來率翅,并讓他們將精力集中在測試 內(nèi)容 上练俐。googletest 自動追蹤所有定義的測試,且無需用戶以運行它們的順序迭代它們冕臭。
測試要 快腺晾。通過 googletest,你可以跨測試用例復(fù)用共享資源辜贵,且只支付一次 set-up/tear-down 的開銷悯蝉,不使測試相互依賴。
由于 googletest 是基于流行的 xUnit 框架的念颈,如果你以前用過 JUnit 或 PYUnit泉粉,你會覺得很自在。如果沒有,你需要大約 10 分鐘來學(xué)習(xí)基礎(chǔ)知識并開始使用嗡靡。因此讓我們開始吧跺撼。
術(shù)語說明
注意:由于術(shù)語 測試,測試用例 和 測試套件 的定義不同讨彼,可能會出現(xiàn)一些概念上的混淆歉井,因此要注意不要誤解這些術(shù)語。
從歷史上看哈误,googletest 剛開始使用術(shù)語 測試用例 來分組相關(guān)的測試哩至,然而當(dāng)前的出版物包括國際軟件測試資格委員會(ISTQB)及大量關(guān)于軟件質(zhì)量的教材使用術(shù)語 測試套件 來表示這一含義。
與 googletest 中使用的術(shù)語 測試 相對應(yīng)的是 ISTQB 等的術(shù)語 測試用例蜜自。
術(shù)語 測試 通常具有足夠廣泛的含義菩貌,包括 ISTQB 對 測試用例 的定義,所以這里沒有太多問題重荠。但 Google Test 中使用的術(shù)語 測試用例 具有矛盾的含義箭阶,因此令人困惑。
googletest 最近開始用 測試套件 替換術(shù)語 測試用例戈鲁。首選的 API 是 TestSuite仇参。舊的 TestCase API 正慢慢地被棄用和重構(gòu)。
因此請注意術(shù)語的不同定義:
含義 | googletest 術(shù)語 | ISTQB 術(shù)語 |
---|---|---|
以特定輸入值執(zhí)行一個特定的程序路徑并驗證結(jié)果 | TEST() | Test Case |
基本概念
使用 googletest 時婆殿,從編寫 斷言 開始诈乒,這些語句檢查條件是否為真。一個斷言的結(jié)果可以是 成功婆芦,非致命失敗怕磨,或者致命失敗。如果發(fā)生了致命失敗寞缝,它終止當(dāng)前函數(shù)癌压;否則程序繼續(xù)正常運行。
測試 使用斷言驗證被測代碼的行為荆陆。如果一個測試崩潰或有一個失敗的斷言滩届,則它 失敗;否則它 成功被啼。
測試套件 包含一個或多個測試帜消。你應(yīng)該將測試分組到反映被測代碼結(jié)構(gòu)的測試套件中。當(dāng)一個測試套件中的多個測試需要共享相同的對象和子例程時浓体,你可以把它們放進一個 測試夾具 類中泡挺。
一個 測試程序 可以包含多個測試套件。
我們將解釋如何編寫測試程序命浴,從單個斷言級別開始娄猫,直到測試和測試套件贱除。
斷言
googletest 斷言是像函數(shù)調(diào)用一樣的宏。你通過制造關(guān)于類或函數(shù)的行為的斷言來測試它媳溺。當(dāng)一個斷言失敗時月幌,googletest 打印斷言的源文件和行號的位置,以及一條失敗消息悬蔽。你也可以提供定制的失敗消息扯躺,它們將被加在 googletest 的消息的后面。
斷言成對的出現(xiàn)蝎困,它們測試相同的事情但對當(dāng)前函數(shù)具有不同的影響录语。ASSERT_*
版本在它們失敗時生成致命失敗,并終止當(dāng)前函數(shù)禾乘。EXPECT_*
版本生成非致命失敗澎埠,它們不終止當(dāng)前函數(shù)。通常 EXPECT_*
是首選盖袭,它們允許在一個測試中報告更多失敗失暂。然而,如果斷言的問題失敗時繼續(xù)執(zhí)行沒有意義鳄虱,則你應(yīng)該使用 ASSERT_*
。
由于失敗的 ASSERT_*
立即從當(dāng)前函數(shù)返回凭峡,則可能跳過之后的清理代碼拙已,它可能導(dǎo)致空間泄露。依賴于泄露的屬性摧冀,它可能值得或不值得解決 - 因此倍踪,如果在斷言錯誤之外還出現(xiàn)堆檢查器錯誤,請記住這一點索昂。
為了提供定制的失敗消息建车,簡單的使用 <<
操作符,或一串這種操作符椒惨,把它送進宏缤至。一個例子如下:
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;
}
任何可以被送給 ostream
的東西都可以被送進斷言的宏 - 特別是,C 字符串和 string
對象康谆。如果寬字符串(wchar_t*
领斥, Windows 上 UNICODE
模式的 TCHAR*
,或 std::wstring
)被送進斷言沃暗,它將在打印時被轉(zhuǎn)換為 UTF-8月洛。
基本斷言
這些斷言執(zhí)行基本的 true/false 條件測試。
致命斷言 | 非致命斷言 | 驗證 |
---|---|---|
ASSERT_TRUE(condition); |
EXPECT_TRUE(condition); |
condition 是 true |
ASSERT_FALSE(condition); |
EXPECT_FALSE(condition); |
condition 是 false |
記住孽锥,當(dāng)它們失敗時嚼黔,ASSERT_*
產(chǎn)生一個致命錯誤细层,并從當(dāng)前函數(shù)退出,EXPECT_*
則產(chǎn)生一個非致命錯誤唬涧,并允許函數(shù)繼續(xù)運行疫赎。任何一種情況下,斷言失敗意味著包含它的測試失敗爵卒。
可用性:Linux虚缎,Windows,Mac钓株。
二元比較
這個部分描述比較兩個值的斷言实牡。
致命斷言 | 非致命斷言 | 驗證 |
---|---|---|
ASSERT_EQ(val1, val2); |
EXPECT_EQ(val1, val2); |
val1 == val2 |
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 |
值參數(shù)必須是斷言的比較操作符可比較的,否則將報出編譯錯誤轴合。我們常要求參數(shù)支持 <<
操作符创坞,以便于把它們送進 ostream
,但這不再是必須的受葛。如果支持 <<
题涨,則在斷言失敗時它將被調(diào)用來打印參數(shù);否則 googletest 將嘗試以它能找到的最好的方式打印它們总滩。更多細(xì)節(jié)及如何定制參數(shù)的打印的信息纲堵,請參考文檔。
這些斷言可以使用用戶定義的類型闰渔,但只有你定義了對應(yīng)的比較操作符(比如 ==席函,<,等等)冈涧。由于這是 Google C++ Style Guide 禁止的茂附,你可以使用 ASSERT_TRUE()
或 EXPECT_TRUE()
斷言兩個用戶定義類型的對象的相等性。
然而督弓,當(dāng)可能時营曼,ASSERT_EQ(actual, expected)
好于 ASSERT_TRUE(actual == expected)
,因為它在失敗時告訴你 actual
和 expected
的值愚隧。
參數(shù)總是精確地計算一次蒂阱。因此,參數(shù)有副作用也沒關(guān)系奸攻。然而正如任何普通的 C/C++ 函數(shù)那樣蒜危,參數(shù)的求值順序是未定義的(比如編譯器有選擇任何順序的自由),你的代碼不應(yīng)該依賴任何特定的參數(shù)求值順序睹耐。
ASSERT_EQ()
對指針執(zhí)行相等性操作辐赞。如果使用兩個 C 字符串,它測試它們是否位于相同的內(nèi)存位置硝训,而不是它們是否具有相同的值响委。因此新思,如果你想比較 C 字符串的值(比如 const char*
),使用 ASSERT_STREQ()
赘风,它將在后面描述夹囚。特別地,要斷言 C 字符串是 NULL
邀窃,則使用 ASSERT_STREQ(c_string, NULL)
荸哟,如果支持 c++11 則考慮使用 ASSERT_EQ(c_string, nullptr)
。要比較兩個 string
對象瞬捕,你應(yīng)該使用 ASSERT_EQ
鞍历。
當(dāng)執(zhí)行指針比較時使用 *_EQ(ptr, nullptr)
和 *_NE(ptr, nullptr)
而不是 *_EQ(ptr, NULL)
和 *_NE(ptr, NULL)
。這是因為 nullptr
是類型安全的而 NULL
不是肪虎。參考 FAQ 獲得更多信息劣砍。
如果你在使用浮點數(shù),你可能想要使用這些宏的浮點變體以避免四舍五入導(dǎo)致的問題扇救。參考 高級 googletest 主題 了解更多信息刑枝。
這一節(jié)的宏可以同時用于窄的和寬的字符串對象(string
和 wstring
)。
可用性:Linux迅腔,Windows装畅,Mac。
歷史注釋:在 2016 年 2 月之前 *_EQ
習(xí)慣上稱其為 ASSERT_EQ(expected, actual)
沧烈。洁灵,因此大量已有的代碼使用這一順序。現(xiàn)在 *_EQ
用同樣的方法處理兩個參數(shù)掺出。
字符串比較
這一組斷言比較兩個 C 字符串。如果你想比較兩個 string
對象苫费,則使用 EXPECT_EQ
汤锨,EXPECT_NE
,等等百框。
致命斷言 | 非致命斷言 | 驗證 |
---|---|---|
ASSERT_STREQ(str1, str2); |
EXPECT_STREQ(str1, str2); |
兩個 C 字符串具有相同的內(nèi)容 |
ASSERT_STRNE(str1, str2); |
EXPECT_STRNE(str1, str2); |
兩個 C 字符串具有不同的內(nèi)容 |
ASSERT_STRCASEEQ(str1, str2); |
EXPECT_STRCASEEQ(str1, str2); |
兩個 C 字符串具有相同的內(nèi)容闲礼,忽略大小寫 |
ASSERT_STRCASENE(str1, str2); |
EXPECT_STRCASENE(str1, str2); |
兩個 C 字符串具有不同的內(nèi)容,忽略大小寫 |
注意斷言名字中的 "CASE" 意味著忽略大小寫铐维。NULL
指針和空字符串被認(rèn)為是不同的柬泽。
*STREQ*
和 *STRNE*
也接受寬 C 字符串(wchar_t*
)。如果比較兩個寬字符串失敗嫁蛇,則它們的值將以 UTF-8 窄字符串的形式打印锨并。
可用性:Linux,Windows睬棚,Mac第煮。
另請參閱:更多字符串比較技巧(子字符串解幼,前綴,后綴包警,和正則表達式匹配撵摆,比如),請參考高級 googletest 指南的這個部分害晦。
簡單的測試
要創(chuàng)建一個測試:
- 使用
TEST()
宏定義并命名一個測試函數(shù)特铝。這些是普通的沒有返回值的 C++ 函數(shù)。 - 在這個函數(shù)中壹瘟,可以包含任何你想包含的有效的 C++ 語句鲫剿,使用各種 googletest 斷言檢查值。
- 測試的結(jié)果由斷言決定俐筋;如果測試中的任何斷言失敗了(致命的或非致命的)牵素,或者如果測試崩潰了,則整個測試失敗澄者。否則笆呆,測試成功。
TEST(TestSuiteName, TestName) {
... test body ...
}
TEST()
的參數(shù)從一般到具體粱挡。第一個參數(shù)是測試套件的名字赠幕,第二個參數(shù)是測試用例中測試的名字。這兩個名字都必須是有效的 C++ 標(biāo)識符询筏,且它們都不應(yīng)該包含下劃線(_
)榕堰。測試的 完整名字
由包含它的測試套件和它自己的獨立名字組成。不同的測試套件中的測試可以具有相同的獨立名字嫌套。
比如逆屡,讓我們看一個簡單的整數(shù)函數(shù):
int Factorial(int n); // Returns the factorial of n
這個函數(shù)的測試套件看起來可能像下面這樣:
// Tests factorial of 0.
TEST(FactorialTest, HandlesZeroInput) {
EXPECT_EQ(Factorial(0), 1);
}
// Tests factorial of positive numbers.
TEST(FactorialTest, HandlesPositiveInput) {
EXPECT_EQ(Factorial(1), 1);
EXPECT_EQ(Factorial(2), 2);
EXPECT_EQ(Factorial(3), 6);
EXPECT_EQ(Factorial(8), 40320);
}
googletest 根據(jù)測試套件來分組結(jié)果,因此邏輯上相關(guān)的測試應(yīng)該放進相同的測試套件里踱讨;換句話說魏蔗,它們的 TEST()
的第一個參數(shù)應(yīng)該是相同的。在上面的例子中痹筛,我們有兩個測試莺治,HandlesZeroInput
和 HandlesPositiveInput
,它們屬于相同的測試套件 FactorialTest
帚稠。
當(dāng)命名你的測試套件和測試時谣旁,你應(yīng)該遵循如命名函數(shù)和類相同的規(guī)則。
可用性:Linux滋早,Windows榄审,Mac。
測試夾具:多個測試使用相同的數(shù)據(jù)配置
如果你發(fā)現(xiàn)你寫了兩個或更多測試操作類似的數(shù)據(jù)馆衔,你可以使用一個 測試夾具瘟判。它允許你為多個不同的測試復(fù)用相同的對象配置怨绣。
要創(chuàng)建一個測試夾具:
- 創(chuàng)建一個繼承自
::testing::Test
的類。由于我們想要從子類訪問夾具的成員拷获,因此從protected:
開始創(chuàng)建類體篮撑。 - 在類內(nèi)部,生命任何你打算使用的對象匆瓜。
- 如果有需要赢笨,編寫一個默認(rèn)的構(gòu)造函數(shù)或
SetUp()
函數(shù)為每個測試準(zhǔn)備對象。一個常見的錯誤是把SetUp()
拼成了Setup()
驮吱,其中有一個u
- 使用 C++11 中的override
確保你正確地拼寫了它茧妒。 - 如果有需要,編寫一個析構(gòu)函數(shù)或
TearDown()
函數(shù)釋放你在SetUp()
中分配的所有資源左冬。要學(xué)習(xí)何時你應(yīng)該使用構(gòu)造函數(shù)/析構(gòu)函數(shù)以及何時你應(yīng)該使用SetUp()
/TearDown()
桐筏,請閱讀 FAQ。
當(dāng)使用測試夾具時拇砰,使用 TEST_F()
而不是 TEST()
梅忌,它允許你訪問測試夾具中的對象和子例程:
TEST_F(TestFixtureName, TestName) {
... test body ...
}
像 TEST()
一樣,第一個參數(shù)是測試套件的名字除破,但對于 TEST_F()
牧氮,這必須是測試夾具類的名字。你可能已經(jīng)猜到:_F
指 fixture瑰枫。
不幸的是踱葛,C++ 宏系統(tǒng)不允許我們創(chuàng)建單個能處理這兩種類型的測試的宏。使用錯誤的宏將導(dǎo)致編譯器錯誤光坝。
而且尸诽,你必須在使用 TEST_F()
之前先定義一個測試夾具類,否則你將得到一個編譯器錯誤 "virtual outside class declaration"盯另。
對于通過 TEST_F()
定義的每個測試逊谋,googletest 將在運行時創(chuàng)建一個 全新的 測試夾具,立即通過 SetUp()
初始化它土铺,運行測試,通過調(diào)用 TearDown()
清理資源板鬓,然后刪除測試夾具悲敷。注意相同測試套件中的不同測試夾具具有不同的測試夾具類,且 googletest 總是在創(chuàng)建下一個之前刪除測試夾具俭令。googletest 不 為多個測試復(fù)用相同的測試夾具后德。一個測試對夾具的任何修改不影響其它的測試。
舉個例子抄腔,讓我們?yōu)槊麨?Queue
的 FIFO 隊列類編寫測試瓢湃,它具有如下的接口:
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;
...
};
首先理张,定義一個夾具類。按照慣例绵患,當(dāng)被測試的類是 Foo
時你應(yīng)該把它命名為 FooTest
雾叭。
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()
落蝙,因為在每個測試之后织狐,我們無需清理資源,這些已經(jīng)由析構(gòu)函數(shù)完成了筏勒。
現(xiàn)在我們將編寫使用 TEST_F()
和這個夾具的測試移迫。
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;
}
上例同時使用了 ASSERT_*
和 EXPECT_*
斷言。經(jīng)驗法則是當(dāng)你想要斷言失敗時測試?yán)^續(xù)執(zhí)行揭露更多錯誤時使用 EXPECT_*
管行,當(dāng)失敗之后繼續(xù)執(zhí)行沒有意義時使用 ASSERT_*
厨埋。比如,Dequeue
測試中的第二個斷言是 ASSERT_NE(nullptr, n)
捐顷,由于我們后面需要解引用指針 n
荡陷,當(dāng) n
為 NULL
時這將導(dǎo)致段錯誤。
當(dāng)運行這些測試時套菜,將發(fā)生如下的事情:
- googletest 構(gòu)造一個
QueueTest
對象(讓我們稱它為t1
)亲善。 -
t1.SetUp()
初始化t1
。 - 在
t1
上運行第一個測試(IsEmptyInitially
)逗柴。 - 測試結(jié)束之后
t1.TearDown()
清理資源蛹头。 -
t1
被銷毀。 - 上面的步驟在另一個
QueueTest
對象上重復(fù)戏溺,這次運行DequeueWorks
測試渣蜗。
可用性:Linux,Windows旷祸,Mac耕拷。
調(diào)用測試
TEST()
和 TEST_F()
隱式地把它們的測試注冊給 googletest。因此托享,不像許多其它的 C++ 測試框架骚烧,因此你無需以運行的順序把你定義的測試重新列出。
定義你的測試之后闰围,你可以通過 RUN_ALL_TESTS()
運行它們赃绊,如果所有的測試都成功了它將返回 0
,否則返回 1
羡榴。注意 RUN_ALL_TESTS()
運行你的鏈接單元中的 所有測試 -- 它們可以來自于不同的測試套件碧查,甚至是不同的源文件。
當(dāng)被調(diào)用時,RUN_ALL_TESTS()
宏:
- 保存所有的 googletest 標(biāo)記的狀態(tài)
- 為第一個測試創(chuàng)建一個測試夾具對象忠售。
- 通過
SetUp()
初始化它传惠。 - 在測試夾具對象上運行測試。
- 通過
TearDown()
清理測試夾具稻扬。 - 刪除夾具卦方。
- 恢復(fù)所有的 googletest 標(biāo)記的狀態(tài)
- 為下一個測試重復(fù)上述步驟,知道所有測試都已經(jīng)運行完腐螟。
如果發(fā)生了致命失敗則后續(xù)的步驟將被跳過愿汰。
重要:你一定不能忽略
RUN_ALL_TESTS()
的返回值,否則你將得到一個編譯錯誤乐纸。這種設(shè)計的原理是自動化測試服務(wù)是基于測試的退出碼來決定它是否通過的衬廷,而不是它的 stdout/stderr 輸出,因此你的main()
函數(shù)必須返回RUN_ALL_TESTS()
的值汽绢。而且吗跋,你應(yīng)該只調(diào)用
RUN_ALL_TESTS()
一次。多次調(diào)用它將與 googletest 的一些高級功能沖突(比如線程安全的 death tests)且這是不支持的宁昭。
可用性:Linux跌宛,Windows,Mac积仗。
編寫 main() 函數(shù)
編寫你自己的 main()
函數(shù)疆拘,它應(yīng)該返回 RUN_ALL_TESTS()
的值。
你可以從下面的示例代碼開始:
#include "this/package/foo.h"
#include "gtest/gtest.h"
namespace {
// The fixture for testing class Foo.
class FooTest : public ::testing::Test {
protected:
// You can remove any or all of the following functions if its body
// is empty.
FooTest() {
// You can do set-up work for each test here.
}
~FooTest() override {
// You can do clean-up work that doesn't throw exceptions here.
}
// If the constructor and destructor are not enough for setting up
// and cleaning up each test, you can define the following methods:
void SetUp() override {
// Code here will be called immediately after the constructor (right
// before each test).
}
void TearDown() override {
// Code here will be called immediately after each test (right
// before the destructor).
}
// Objects declared here can be used by all tests in the test suite for Foo.
};
// Tests that the Foo::Bar() method does Abc.
TEST_F(FooTest, MethodBarDoesAbc) {
const std::string input_filepath = "this/package/testdata/myinputfile.dat";
const std::string output_filepath = "this/package/testdata/myoutputfile.dat";
Foo f;
EXPECT_EQ(f.Bar(input_filepath, output_filepath), 0);
}
// Tests that Foo does Xyz.
TEST_F(FooTest, DoesXyz) {
// Exercises the Xyz feature of Foo.
}
} // namespace
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
::testing::InitGoogleTest()
函數(shù)解析 googletest 標(biāo)記的命令行參數(shù)寂曹,并移除所有已識別的標(biāo)記哎迄。這允許用戶通過不同的標(biāo)記控制測試程序的行為,我們將在 AdvancedGuide 描述相關(guān)的內(nèi)容隆圆。你必須在調(diào)用 RUN_ALL_TESTS()
之前調(diào)用這個函數(shù)漱挚,否則標(biāo)記將無法得到適當(dāng)?shù)某跏蓟?/p>
在 Windows 上,InitGoogleTest()
也可以用寬字符串渺氧,因此它也可以被用于以 UNICODE
模式編譯的程序旨涝。
但是正如你可能認(rèn)為的那樣,編寫所有這些 main()
函數(shù)太麻煩了侣背?我們完全同意你的看法白华,那就是 Google Test 為什么提供一個基本的 main()
函數(shù)實現(xiàn)的原因。如果它能滿足你的需要贩耐,則把你的測試與 gtest_main 庫鏈接在一起就好衬鱼,然后你可以走了。
注意:ParseGUnitFlags()
被 InitGoogleTest()
廢棄了憔杨。
已知限制
- Google Test 被設(shè)計為線程安全的。
pthreads
庫可用的系統(tǒng)上的實現(xiàn)是線程安全的蒜胖。當(dāng)前在其它系統(tǒng)(比如 Windows)上在兩個線程中并發(fā)地使用 Google Test 斷言是不安全的消别。在大多數(shù)測試中這通常不是問題抛蚤,斷言在主線程中完成。如果你想提供幫助寻狂,你可以志愿在gtest-port.h
中為你的平臺實現(xiàn)需要的同步原語岁经。