日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数

發(fā)布時(shí)間:2024/4/11 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

使用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ù)的問題。

int?_tmain(int?argc,?_TCHAR*?argv[])
{
????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í)高于代碼中指定。

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)境變量全大寫,比如對(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)行所有案例
./foo_test --gtest_filter=* 使用通配符*,表示運(yùn)行所有案例
./foo_test --gtest_filter=FooTest.* 運(yùn)行所有“測(cè)試案例名稱(testcase_name)”為FooTest的案例
./foo_test --gtest_filter=*Null*:*Constructor* 運(yùn)行所有“測(cè)試案例名稱(testcase_name)”或“測(cè)試名稱(test_name)”包含Null或Constructor的案例。
./foo_test --gtest_filter=-*DeathTest.* 運(yùn)行所有非死亡測(cè)試案例。
./foo_test --gtest_filter=FooTest.*-FooTest.Bar 運(yùn)行所有“測(cè)試案例名稱(testcase_name)”為FooTest的案例,但是除了FooTest.Bar這個(gè)案例

--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ò)誤。
--gtest_repeat=-1 ???????? 無限次數(shù)執(zhí)行。。。。
--gtest_repeat=1000 --gtest_break_on_failure ??? 重復(fù)執(zhí)行1000次,并且在第一個(gè)錯(cuò)誤發(fā)生時(shí)立即停止。這個(gè)功能對(duì)調(diào)試非常有用。
--gtest_repeat=1000 --gtest_filter=FooBar ??? 重復(fù)執(zhí)行1000次測(cè)試案例名稱為FooBar的案例。

?

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。