玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
一、前言
使用gtest編寫的測(cè)試案例通常本身就是一個(gè)可執(zhí)行文件,因此運(yùn)行起來非常方便。同時(shí),gtest也為我們提供了一系列的運(yùn)行參數(shù)(環(huán)境變量、命令行參數(shù)或代碼里指定),使得我們可以對(duì)案例的執(zhí)行進(jìn)行一些有效的控制。
二、基本介紹
前面提到,對(duì)于運(yùn)行參數(shù),gtest提供了三種設(shè)置的途徑:
1. 系統(tǒng)環(huán)境變量
2. 命令行參數(shù)
3. 代碼中指定FLAG
因?yàn)樘峁┝巳N途徑,就會(huì)有優(yōu)先級(jí)的問題, 有一個(gè)原則是,最后設(shè)置的那個(gè)會(huì)生效。不過總結(jié)一下,通常情況下,比較理想的優(yōu)先級(jí)為:
命令行參數(shù) > 代碼中指定FLAG > 系統(tǒng)環(huán)境變量
為什么我們編寫的測(cè)試案例能夠處理這些命令行參數(shù)呢?是因?yàn)槲覀冊(cè)趍ain函數(shù)中,將命令行參數(shù)交給了gtest,由gtest來搞定命令行參數(shù)的問題。
{
????testing::InitGoogleTest(&argc,?argv);
????return?RUN_ALL_TESTS();
}
?
這樣,我們就擁有了接收和響應(yīng)gtest命令行參數(shù)的能力。如果需要在代碼中指定FLAG,可以使用testing::GTEST_FLAG這個(gè)宏來設(shè)置。比如相對(duì)于命令行參數(shù)--gtest_output,可以使用testing::GTEST_FLAG(output) = "xml:";來設(shè)置。注意到了,不需要加--gtest前綴了。同時(shí),推薦將這句放置InitGoogleTest之前,這樣就可以使得對(duì)于同樣的參數(shù),命令行參數(shù)優(yōu)先級(jí)高于代碼中指定。
{
????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)境變量全大寫,比如對(duì)于--gtest_output,響應(yīng)的系統(tǒng)環(huán)境變量為:GTEST_OUTPUT
2.? 有一個(gè)命令行參數(shù)例外,那就是--gtest_list_tests,它是不接受系統(tǒng)環(huán)境變量的。(只是用來羅列測(cè)試案例名稱)
三、參數(shù)列表
了解了上面的內(nèi)容,我這里就直接將所有命令行參數(shù)總結(jié)和羅列一下。如果想要獲得詳細(xì)的命令行說明,直接運(yùn)行你的案例,輸入命令行參數(shù):/? 或 --help 或 -help
1. 測(cè)試案例集合
| 命令行參數(shù) | 說明 |
| --gtest_list_tests | 使用這個(gè)參數(shù)時(shí),將不會(huì)執(zhí)行里面的測(cè)試案例,而是輸出一個(gè)案例的列表。 |
| --gtest_filter | 對(duì)執(zhí)行的測(cè)試案例進(jìn)行過濾,支持通配符 ???? 單個(gè)字符 *??? 任意字符 - ?? 排除,如,-a 表示除了a :??? 取或,如,a:b 表示a或b 比如下面的例子: ./foo_test 沒有指定過濾條件,運(yùn)行所有案例 |
| --gtest_also_run_disabled_tests | 執(zhí)行案例時(shí),同時(shí)也執(zhí)行被置為無效的測(cè)試案例。關(guān)于設(shè)置測(cè)試案例無效的方法為: 在測(cè)試案例名稱或測(cè)試名稱中添加DISABLED前綴,比如: //?Tests?that?Foo?does?Abc.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)錯(cuò)誤。 |
?
2. 測(cè)試案例輸出
| 命令行參數(shù) | 說明 |
| --gtest_color=(yes|no|auto) | 輸出命令行時(shí)是否使用一些五顏六色的顏色。默認(rèn)是auto。 |
| --gtest_print_time | 輸出命令行時(shí)是否打印每個(gè)測(cè)試案例的執(zhí)行時(shí)間。默認(rèn)是不打印的。 |
| --gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH] | 將測(cè)試結(jié)果輸出到一個(gè)xml中。 1.--gtest_output=xml: ?? 不指定輸出路徑時(shí),默認(rèn)為案例當(dāng)前路徑。 2.--gtest_output=xml:d:\ 指定輸出到某個(gè)目錄? 3.--gtest_output=xml:d:\foo.xml 指定輸出到d:\foo.xml 如果不是指定了特定的文件路徑,gtest每次輸出的報(bào)告不會(huì)覆蓋,而會(huì)以數(shù)字后綴的方式創(chuàng)建。xml的輸出內(nèi)容后面介紹吧。? |
?
3. 對(duì)案例的異常處理
| 命令行參數(shù) | 說明 |
| --gtest_break_on_failure | 調(diào)試模式下,當(dāng)案例失敗時(shí)停止,方便調(diào)試 |
| --gtest_throw_on_failure | 當(dāng)案例失敗時(shí)以C++異常的方式拋出 |
| --gtest_catch_exceptions | 是否捕捉異常。gtest默認(rèn)是不捕捉異常的,因此假如你的測(cè)試案例拋了一個(gè)異常,很可能會(huì)彈出一個(gè)對(duì)話框,這非常的不友好,同時(shí)也阻礙了測(cè)試案例的運(yùn)行。如果想不彈這個(gè)框,可以通過設(shè)置這個(gè)參數(shù)來實(shí)現(xiàn)。如將--gtest_catch_exceptions設(shè)置為一個(gè)非零的數(shù)。 注意:這個(gè)參數(shù)只在Windows下有效。 |
四、XML報(bào)告輸出格式
<?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>
從報(bào)告里可以看出,我們之前在TEST等宏中定義的測(cè)試案例名稱(testcase_name)在xml測(cè)試報(bào)告中其實(shí)是一個(gè)testsuite name,而宏中的測(cè)試名稱(test_name)在xml測(cè)試報(bào)告中是一個(gè)testcase name,概念上似乎有點(diǎn)混淆,就看你怎么看吧。
當(dāng)檢查點(diǎn)通過時(shí),不會(huì)輸出任何檢查點(diǎn)的信息。當(dāng)檢查點(diǎn)失敗時(shí),會(huì)有詳細(xì)的失敗信息輸出來failure節(jié)點(diǎn)。
在我使用過程中發(fā)現(xiàn)一個(gè)問題,當(dāng)我同時(shí)設(shè)置了--gtest_filter參數(shù)時(shí),輸出的xml報(bào)告中還是會(huì)包含所有測(cè)試案例的信息,只不過那些不被執(zhí)行的測(cè)試案例的status值為“notrun”。而我之前認(rèn)為的輸出的xml報(bào)告應(yīng)該只包含我需要運(yùn)行的測(cè)試案例的信息。不知是否可提供一個(gè)只輸出需要執(zhí)行的測(cè)試案例的xml報(bào)告。因?yàn)楫?dāng)我需要在1000個(gè)案例中執(zhí)行其中1個(gè)案例時(shí),在報(bào)告中很難找到我運(yùn)行的那個(gè)案例,雖然可以查找,但還是很麻煩。
五、總結(jié)
本篇主要介紹了gtest案例執(zhí)行時(shí)提供的一些參數(shù)的使用方法,這些參數(shù)都非常有用。在實(shí)際編寫gtest測(cè)試案例時(shí)肯定會(huì)需要用到的時(shí)候。至少我現(xiàn)在比較常用的就是:
1. --gtest_filter
2. --gtest_output=xml[:DIRECTORY_PATH\|:FILE_PATH]
3. --gtest_catch_exceptions
最后再總結(jié)一下我使用過程中遇到的幾個(gè)問題:
1. 同時(shí)使用--gtest_filter和--gtest_output=xml:時(shí),在xml測(cè)試報(bào)告中能否只包含過濾后的測(cè)試案例的信息。
2. 有時(shí),我在代碼中設(shè)置 testing::GTEST_FLAG(catch_exceptions) = 1和我在命令行中使用--gtest_catch_exceptions結(jié)果稍有不同,在代碼中設(shè)置FLAG方式有時(shí)候捕捉不了某些異常,但是通過命令行參數(shù)的方式一般都不會(huì)有問題。這是我曾經(jīng)遇到過的一個(gè)問題,最后我的處理辦法是既在代碼中設(shè)置FLAG,又在命令行參數(shù)中傳入--gtest_catch_exceptions。不知道是gtest在catch_exceptions方面不夠穩(wěn)定,還是我自己測(cè)試案例的問題。
總結(jié)
以上是生活随笔為你收集整理的玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩转Google开源C++单元测试框架G
- 下一篇: 玩转Google开源C++单元测试框架G