目錄
一、前言
二、基本介紹
三、參數(shù)列表
四、XML報告輸出格式
五、總結(jié)
一、前言
使用gtest編寫的測試案例通常本身就是一個可執(zhí)行文件,因此運(yùn)行起來非常方便。同時,gtest也為我們提供了一系列的運(yùn)行參數(shù)(環(huán)境變量、命令行參數(shù)或代碼里指定),使得我們可以對案例的執(zhí)行進(jìn)行一些有效的控制。
二、基本介紹
前面提到,對于運(yùn)行參數(shù),gtest提供了三種設(shè)置的途徑:
- 1. 系統(tǒng)環(huán)境變量
- 2. 命令行參數(shù)
- 3. 代碼中指定FLAG
因?yàn)樘峁┝巳N途徑,就會有優(yōu)先級的問題, 有一個原則是,最后設(shè)置的那個會生效。不過總結(jié)一下,通常情況下,比較理想的優(yōu)先級為:
命令行參數(shù) > 代碼中指定FLAG > 系統(tǒng)環(huán)境變量
為什么我們編寫的測試案例能夠處理這些命令行參數(shù)呢?是因?yàn)槲覀冊趍ain函數(shù)中,將命令行參數(shù)交給了gtest,由gtest來搞定命令行參數(shù)的問題。
int?_tmain(int?argc,?_TCHAR*?argv[])
{
????testing::InitGoogleTest(&argc,?argv);
????return?RUN_ALL_TESTS();
}
這樣,我們就擁有了接收和響應(yīng)gtest命令行參數(shù)的能力。如果需要在代碼中指定FLAG,可以使用testing::GTEST_FLAG這個宏來設(shè)置。比如相對于命令行參數(shù)--gtest_output,可以使用testing::GTEST_FLAG(output) = "xml:";來設(shè)置。注意到了,不需要加--gtest前綴了。同時,推薦將這句放置InitGoogleTest之前,這樣就可以使得對于同樣的參數(shù),命令行參數(shù)優(yōu)先級高于代碼中指定。
int?_tmain(int?argc,?_TCHAR*?argv[])
{
????testing::GTEST_FLAG(output)?=?"xml:";
????testing::InitGoogleTest(&argc,?argv);
????return?RUN_ALL_TESTS();
}
最后再來說下第一種設(shè)置方式-系統(tǒng)環(huán)境變量。如果需要gtest的設(shè)置系統(tǒng)環(huán)境變量,必須注意的是:
1. 系統(tǒng)環(huán)境變量全大寫,比如對于--gtest_output,響應(yīng)的系統(tǒng)環(huán)境變量為:GTEST_OUTPUT
2.? 有一個命令行參數(shù)例外,那就是--gtest_list_tests,它是不接受系統(tǒng)環(huán)境變量的。(只是用來羅列測試案例名稱)
三、參數(shù)列表
了解了上面的內(nèi)容,我這里就直接將所有命令行參數(shù)總結(jié)和羅列一下。如果想要獲得詳細(xì)的命令行說明,直接運(yùn)行你的案例,輸入命令行參數(shù):/? 或 --help 或 -help
1. 測試案例集合
命令行參數(shù) | 說明 |
--gtest_list_tests | 使用這個參數(shù)時,將不會執(zhí)行里面的測試案例,而是輸出一個案例的列表。 |
--gtest_filter | 對執(zhí)行的測試案例進(jìn)行過濾,支持通配符 ???? 單個字符 *??? 任意字符 - ?? 排除,如,-a 表示除了a :??? 取或,如,a:b 表示a或b 比如下面的例子: ./foo_test 沒有指定過濾條件,運(yùn)行所有案例 |
--gtest_also_run_disabled_tests | 執(zhí)行案例時,同時也執(zhí)行被置為無效的測試案例。關(guān)于設(shè)置測試案例無效的方法為: 在測試案例名稱或測試名稱中添加DISABLED前綴,比如: TEST(FooTest,?DISABLED_DoesAbc)?{??} class?DISABLED_BarTest?:?public?testing::Test?{??}; //?Tests?that?Bar?does?Xyz. TEST_F(DISABLED_BarTest,?DoesXyz)?{??} |
--gtest_repeat=[COUNT] | 設(shè)置案例重復(fù)運(yùn)行次數(shù),非常棒的功能!比如: --gtest_repeat=1000 ?? ? 重復(fù)執(zhí)行1000次,即使中途出現(xiàn)錯誤。 |
2. 測試案例輸出
命令行參數(shù) | 說明 |
--gtest_color=(yes|no|auto) | 輸出命令行時是否使用一些五顏六色的顏色。默認(rèn)是auto。 |
--gtest_print_time | 輸出命令行時是否打印每個測試案例的執(zhí)行時間。默認(rèn)是不打印的。 |
--gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH] | 將測試結(jié)果輸出到一個xml中。 1.--gtest_output=xml: ?? 不指定輸出路徑時,默認(rèn)為案例當(dāng)前路徑。 2.--gtest_output=xml:d:\ 指定輸出到某個目錄 3.--gtest_output=xml:d:\foo.xml 指定輸出到d:\foo.xml 如果不是指定了特定的文件路徑,gtest每次輸出的報告不會覆蓋,而會以數(shù)字后綴的方式創(chuàng)建。xml的輸出內(nèi)容后面介紹吧。 |
3. 對案例的異常處理
命令行參數(shù) | 說明 |
--gtest_break_on_failure | 調(diào)試模式下,當(dāng)案例失敗時停止,方便調(diào)試 |
--gtest_throw_on_failure | 當(dāng)案例失敗時以C++異常的方式拋出 |
--gtest_catch_exceptions | 是否捕捉異常。gtest默認(rèn)是不捕捉異常的,因此假如你的測試案例拋了一個異常,很可能會彈出一個對話框,這非常的不友好,同時也阻礙了測試案例的運(yùn)行。如果想不彈這個框,可以通過設(shè)置這個參數(shù)來實(shí)現(xiàn)。如將--gtest_catch_exceptions設(shè)置為一個非零的數(shù)。 注意:這個參數(shù)只在Windows下有效。 |
四、XML報告輸出格式
<?xml?version="1.0"?encoding="UTF-8"?>
<testsuites?tests="3"?failures="1"?errors="0"?time="35"?name="AllTests">
??<testsuite?name="MathTest"?tests="2"?failures="1"*?errors="0"?time="15">
????<testcase?name="Addition"?status="run"?time="7"?classname="">
??????<failure?message="Value?of:?add(1,?1) ?Actual:?3 Expected:?2"?type=""/>
??????<failure?message="Value?of:?add(1,?-1) ?Actual:?1 Expected:?0"?type=""/>
????</testcase>
????<testcase?name="Subtraction"?status="run"?time="5"?classname="">
????</testcase>
??</testsuite>
??<testsuite?name="LogicTest"?tests="1"?failures="0"?errors="0"?time="5">
????<testcase?name="NonContradiction"?status="run"?time="5"?classname="">
????</testcase>
??</testsuite>
</testsuites>
從報告里可以看出,我們之前在TEST等宏中定義的測試案例名稱(testcase_name)在xml測試報告中其實(shí)是一個testsuite name,而宏中的測試名稱(test_name)在xml測試報告中是一個testcase name,概念上似乎有點(diǎn)混淆,就看你怎么看吧。
當(dāng)檢查點(diǎn)通過時,不會輸出任何檢查點(diǎn)的信息。當(dāng)檢查點(diǎn)失敗時,會有詳細(xì)的失敗信息輸出來failure節(jié)點(diǎn)。
在我使用過程中發(fā)現(xiàn)一個問題,當(dāng)我同時設(shè)置了--gtest_filter參數(shù)時,輸出的xml報告中還是會包含所有測試案例的信息,只不過那些不被執(zhí)行的測試案例的status值為“notrun”。而我之前認(rèn)為的輸出的xml報告應(yīng)該只包含我需要運(yùn)行的測試案例的信息。不知是否可提供一個只輸出需要執(zhí)行的測試案例的xml報告。因?yàn)楫?dāng)我需要在1000個案例中執(zhí)行其中1個案例時,在報告中很難找到我運(yùn)行的那個案例,雖然可以查找,但還是很麻煩。
五、總結(jié)
本篇主要介紹了gtest案例執(zhí)行時提供的一些參數(shù)的使用方法,這些參數(shù)都非常有用。在實(shí)際編寫gtest測試案例時肯定會需要用到的時候。至少我現(xiàn)在比較常用的運(yùn)行參數(shù)就是:
1. --gtest_filter
2. --gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]
3. --gtest_catch_exceptions
最后再總結(jié)一下我使用過程中遇到的幾個問題:
1. 同時使用--gtest_filter和--gtest_output=xml:時,在xml測試報告中能否只包含過濾后的測試案例的信息。
2. 有時,我在代碼中設(shè)置 testing::GTEST_FLAG(catch_exceptions) = 1和我在命令行中使用--gtest_catch_exceptions結(jié)果稍有不同,在代碼中設(shè)置FLAG方式有時候捕捉不了某些異常,但是通過命令行參數(shù)的方式一般都不會有問題。這是我曾經(jīng)遇到過的一個問題,最后我的處理辦法是既在代碼中設(shè)置FLAG,又在命令行參數(shù)中傳入--gtest_catch_exceptions。不知道是gtest在catch_exceptions方面不夠穩(wěn)定,還是我自己測試案例的問題。
系列鏈接:
1.玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之一 - 初識gtest
2.玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之二 - 斷言
3.玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之三 - 事件機(jī)制
4.玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之四 - 參數(shù)化
5.玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之五 - 死亡測試
6.玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之六 - 運(yùn)行參數(shù)
7.玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之七 - 深入解析gtest文章來源:http://www.zghlxwxcb.cn/news/detail-721877.html
8.玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之八 - 打造自己的單元測試框架文章來源地址http://www.zghlxwxcb.cn/news/detail-721877.html
到了這里,關(guān)于玩轉(zhuǎn)Google開源C++單元測試框架Google Test系列(gtest)之六 - 運(yùn)行參數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!