• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
            搜索 
             對于  
            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è)列表的事情,我們喜歡谷歌測試。我們不要為我們宣稱他們是唯一谷歌測試-相反,他們使谷歌測試組合的選擇。我們希望此列表可以幫助您決定是否為您太。

            • 谷歌測試旨在作為便攜式: 它不需要異常或 RTTI ;圍繞各種 bug 在各種編譯器和環(huán)境 ; 它的工作原理等。因此,它適用于 Linux、 Windows、 Mac OS X 幾個(gè)嵌入式的操作系統(tǒng)。
            • 非致命的斷言 (EXPECT_ *) 已被證明是儲戶的大好時(shí)機(jī),因?yàn)樗鼈冊试S在單個(gè)編輯-編譯-測試周期中報(bào)告多個(gè)故障的測試。
            • 很容易寫生成信息性消息的斷言: 您只使用流語法追加任何附加信息,如ASSERT_EQ (5,F(xiàn)oo(i)) <<"where i ="<< i ;它不需要一套新的宏或特殊功能。
            • 谷歌測試自動檢測您的測試,并且不需要您枚舉它們?yōu)榱诉\(yùn)行它們。
            • 死亡測試是非常方便,確保您斷言在生產(chǎn)中的代碼由合適的條件觸發(fā)的。
            • SCOPED_TRACE可以幫助您理解斷言失敗的上下文時(shí)它來自內(nèi)部是子路徑或循環(huán)。
            • 您可以決定要使用的名稱模式運(yùn)行的測試。這樣可以節(jié)省的時(shí)間,當(dāng)您要快速地重復(fù)測試失敗。
            • 谷歌測試可以生成可以像哈德遜流行連續(xù)生成系統(tǒng)所分析的 XML 測試結(jié)果報(bào)告。
            • 簡單的東西很容易在谷歌測試中,而硬的事情都是可能: 此外,高級的功能 (如全球測試環(huán)境和測試參數(shù)的類型,谷歌測試支持?jǐn)U展框架--谷歌測試做不出的框中,如果用戶通過各種方式可能就一個(gè)用戶可以實(shí)現(xiàn)使用谷歌測試公共 API 的功能而無需更改 Google 測試本身。特別是,您可以:

            谷歌測試將您修復(fù)它們進(jìn)行編譯時(shí)收到警告?

            我們的努力減少谷歌測試生成編譯器警告。發(fā)布一個(gè)新版本之前, 我們測試以確保它不會生成 Windows、 Linux、 Mac OS 上使用它的 CMake 腳本在編譯時(shí)警告。

            不幸的是,這并不意味著你保證就看到?jīng)]有任何警告,谷歌測試您的環(huán)境中進(jìn)行編譯時(shí):

            • 您可能使用不同的編譯器為我們使用或同一編譯器的不同版本。我們可能不能測試所有的編譯器。
            • 您可以在不同平臺上像我們一樣編制。
            • 像我們一樣,可能您的項(xiàng)目使用不同的編譯器標(biāo)志。

            它并不總是可能使谷歌測試無預(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)庫使用下列:

            1. 任何以大寫字母,跟著_開頭的標(biāo)識符和
            2. 任何標(biāo)識符的容器兩個(gè)連續(xù)下劃線 (即__)任意位置在其名稱中。

            用戶代碼是禁止使用這樣的標(biāo)識符。

            現(xiàn)在讓我們看看這意味著測試TEST_F.

            目前測試 TestName TestCaseName) ,將生成一個(gè)名為TestCaseName_TestName_Test類。如果包含TestCaseNameTestName ,會發(fā)生什么_?

            1. 如果TestCaseName開頭_跟著以大寫字母 (比如_Foo),我們最終_Foo_TestName_Test,這是保留,因此無效。
            2. 如果TestCaseName _ (比如Foo_) 以結(jié)尾,我們得到Foo__TestName_Test,而是無效。
            3. 如果TestName開頭_ (比如_Bar),我們得到TestCaseName__Bar_Test,而是無效。
            4. 如果TestName _ (比如Bar_) 以結(jié)尾,我們得到TestCaseName_Bar__Test,而是無效。

            TestCaseNameTestName不能開始或結(jié)束_與如此清晰 (事實(shí)上, TestCaseName可以開始_ — — 只要_不跟著大寫字母。但是,變得更復(fù)雜。所以為了簡單起見,我們只是說它不能以開始_.).

            它可能是TestCaseNameTestName ,包含在中間_好的。但是,考慮這:

            TEST(Time, Flies_Like_An_Arrow) { ... }
            TEST
            (Time_Flies, Like_An_Arrow) { ... }

            現(xiàn)在,兩個(gè)測試s 都將生成相同的類 (Time_Files_Like_An_Arrow_Test)。這不是好的。

            所以為了簡單起見,我們只是要求用戶,以避免在TestCaseNameTestName _ 。規(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.slnmsvc\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)在,您有Win32x64平臺配置,可以選擇從標(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):

            • 在編譯時(shí),很多警告。
            • 谷歌測試本身并不是所有的測試都兼容 MinGW使檢查會產(chǎn)生一些錯(cuò)誤。

            我們亦在 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_testsgtest_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)目中使用谷歌測試。后來我們意識到這種方法的一些額外的好處:

            1. 在析構(gòu)函數(shù)中投擲是 c + + 中未定義的行為。不使用異常意味著谷歌測試斷言是安全的在析構(gòu)函數(shù)中使用。
            2. EXPECT_ *家庭的宏將甚至出現(xiàn)故障,會報(bào)告一次運(yùn)行試驗(yàn)中允許多個(gè)故障后繼續(xù)。這是一個(gè)受歡迎的功能、 作為 c + + 中編輯-編譯-測試周期通常是很長,能夠修復(fù)一次超過一件事是一種幸福。
            3. 如果使用異常實(shí)施斷言,測試虛假可能會忽略失敗如果它抓住用戶代碼:
            4. try { ... ASSERT_TRUE(...) ... }
              catch (...) { ... }

            上面的代碼會通過即使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 {};

            TEST_F
            (FooTest, DoesThis) { ... }

            typedef ::testing::Test FooTest;

            TEST_F
            (FooTest, DoesThat) { ... }

            然而,很多人認(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 + + 允許。特別是:

            • 轉(zhuǎn)輪式需要拆分成兩個(gè)部分的信息: 死亡的定義測試本身和轉(zhuǎn)輪如何運(yùn)行死亡測試和所期望的規(guī)范。將 c + + 程序?qū)懰劳鰷y試,雖然轉(zhuǎn)輪規(guī)范可能或不可能。用戶需要小心地保持兩個(gè)同步。ASSERT_DEATH 語句 expected_message)在一個(gè)地方,在一種語言,而無需樣板代碼中指定所需的所有信息。它是非常聲明性。
            • ASSERT_DEATH有一個(gè)類似語法和其他谷歌測試的斷言,錯(cuò)誤報(bào)告的語義,因此容易學(xué)。
            • ASSERT_DEATH可以混入其它斷言和其他邏輯,在你的意志。你并不限于一人死亡測試每個(gè)測試方法。例如,您可以編寫類似:
            •     if (FooCondition()) {
                    ASSERT_DEATH
              (Bar(), "blah");
                 
              } else {
                    ASSERT_EQ
              (5, Bar());
                 
              }

            如果您希望一個(gè)死亡測試每個(gè)測試方法,您可以編寫您的測試中那種風(fēng)格,但我們不想,強(qiáng)加給用戶。更少的人工限制越好。

            • ASSERT_DEATH可以引用當(dāng)前函數(shù)中的局部變量,您可以決定多少死亡測試要基于的運(yùn)行時(shí)信息。例如,
            •     const int count = GetCount();  // Only known at run time.
                 
              for (int i = 1; i <= count; i++) {
                    ASSERT_DEATH
              ({
                     
              double* buffer = new double[i];
                     
              ... initializes buffer ...
                     
              Foo(buffer, i)
                   
              }, "blah blah");
                 
              }

            基于轉(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
            class Foo {
             
            ...
             
            static const int kBar = 100;
            };

            您還需要在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.
            class BaseTest : public ::testing::Test {
             
            protected:
               
            ...
            };

            // Derives a fixture FooTest from BaseTest.
            class FooTest : public BaseTest {
             
            protected:
               
            virtual void SetUp() {
                 
            BaseTest::SetUp();  // Sets up the base fixture first.
                 
            ... additional set-up work ...
               
            }
               
            virtual void TearDown() {
                 
            ... clean-up work for FooTest ...
                 
            BaseTest::TearDown();  // Remember to tear down the base fixture
                                         
            // after cleaning up FooTest!
               
            }
               
            ... functions and variables for FooTest ...
            };

            // Tests that use the fixture FooTest.
            TEST_F
            (FooTest, Bar) { ... }
            TEST_F
            (FooTest, Baz) { ... }

            ... additional fixtures derived from BaseTest ...

            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()在以下情況中:

            • 如果撤展操作可能會引發(fā)異常,則必須使用TearDown()析構(gòu)函數(shù),相對于扔在析構(gòu)函數(shù)中會導(dǎo)致未定義的行為,通常會立刻殺死你的程序。請注意,編譯器中啟用異常時(shí),可能會引發(fā)許多標(biāo)準(zhǔn)庫 (STL) 像。因此如果你想寫工作有無異常的便攜式測試應(yīng)該更喜歡TearDown() 。
            • 谷歌測試團(tuán)隊(duì)正考慮制作平臺上拋出的異常在哪里的斷言宏啟用 (例如 Windows、 Mac OS、 Linux 客戶端),其中,將不再需要傳播到它的調(diào)用子例程從失敗的用戶。因此,您不應(yīng)該使用谷歌測試斷言在析構(gòu)函數(shù)中的,如果您的代碼可以在這樣的平臺上運(yùn)行。
            • 在構(gòu)造函數(shù)或析構(gòu)函數(shù)中,你不能在此對象上調(diào)用虛函數(shù)。(您可以調(diào)用一個(gè)方法聲明為虛擬的但它將靜態(tài)綁定)。因此,如果您需要調(diào)用將被派生類中的重寫的方法,您必須使用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) {
             
            return n > 0;
            }
            bool IsPositive(double x) {
             
            return x > 0;
            }

            如果你寫,你將得到編譯器錯(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>
            bool IsNegative(T x) {
             
            return x < 0;
            }

            您可以使用它在謂詞的斷言,像這樣:

            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 {};

            TEST_F
            (FooTest, Abc) { ... }
            TEST_F
            (FooTest, Def) { ... }

            class BarTest : public BaseTest {};

            TEST_F
            (BarTest, Abc) { ... }
            TEST_F
            (BarTest, Def) { ... }

            您可以只是typedef測試夾具:

            typedef BaseTest FooTest;

            TEST_F
            (FooTest, Abc) { ... }
            TEST_F
            (FooTest, Def) { ... }

            typedef BaseTest BarTest;

            TEST_F
            (BarTest, Abc) { ... }
            TEST_F
            (BarTest, Def) { ... }

            谷歌測試輸出,埋在一大堆的日志消息。我該怎么辦?

            谷歌測試輸出注定要簡明和人性化的報(bào)告。如果您的測試生成的文本輸出本身,它將混合與谷歌測試輸出,從而很難閱讀。然而,有一個(gè)簡單的解決方案,這一問題。

            由于大多數(shù)日志消息轉(zhuǎn)到 stderr,我們決定讓谷歌測試輸出到標(biāo)準(zhǔn)輸出。這種方式,可以方便地分隔兩個(gè)使用重定向。例如:

            ./my_test > googletest_output.txt

            為什么應(yīng)該在全局變量喜歡測試夾具?

            有幾個(gè)好的理由:

            1. 很可能你的測試需要更改其全局變量的狀態(tài)。這使得難以逃脫一個(gè)測試和其他污染,難以調(diào)試跟副作用。通過使用固定裝置,每次測試了一套新的變量的不同 (但具有相同的名稱)。因此,保持彼此獨(dú)立的測試。
            2. 全局變量污染全局命名空間。
            3. 可重用測試夾具通過子類,其中做不容易全局變量。這很有用,如果很多測試用例有一些共同點(diǎn)。

            如何測試而無需編寫 FRIEND_TEST () s 的私有類成員?

            您應(yīng)嘗試寫入可測試代碼,這意味著類應(yīng)從他們的公共接口輕松地進(jìn)行測試。要實(shí)現(xiàn)這一目標(biāo)的一種是平普爾成語: 你將所有的一類的私有成員移動到幫助器類,并公開的幫助器類的所有成員。

            你有幾個(gè)其他選項(xiàng),不需要使用FRIEND_TEST:

            • 寫入測試夾具類的成員為:
            • class Foo {
               
              friend class FooTest;
               
              ...
              };

              class FooTest : public ::testing::Test {
               
              protected:
               
              ...
               
              void Test1() {...} // This accesses private members of class Foo.
               
              void Test2() {...} // So does this one.
              };

              TEST_F
              (FooTest, Test1) {
               
              Test1();
              }

              TEST_F
              (FooTest, Test2) {
               
              Test2();
              }
            • 在夾具類中,寫的訪問器用于測試的類的私有成員,然后在您的測試中使用訪問器:
            • class Foo {
               
              friend class FooTest;
               
              ...
              };

              class FooTest : public ::testing::Test {
               
              protected:
               
              ...
                T1 get_private_member1
              (Foo* obj) {
                 
              return obj->private_member1_;
               
              }
              };

              TEST_F
              (FooTest, Test1) {
               
              ...
                get_private_member1
              (x)
               
              ...
              }
            • 如果將方法聲明為受保護(hù),您可以更改其僅僅用于測試的子類中的訪問級別:
            • class YourClass {
               
              ...
               
              protected: // protected access for testability.
               
              int DoSomethingReturningInt();
               
              ...
              };

              // in the your_class_test.cc file:
              class TestableYourClass : public YourClass {
               
              ...
               
              public: using YourClass::DoSomethingReturningInt; // changes access rights
               
              ...
              };

              TEST_F
              (YourClassTest, DoSomethingTest) {
               
              TestableYourClass obj;
                assertEquals
              (expected_value, obj.DoSomethingReturningInt());
              }

            如何測試而無需編寫 FRIEND_TEST () s 的私有類的靜態(tài)成員?

            我們發(fā)現(xiàn)私有靜態(tài)方法雜波的頭文件。他們是實(shí)現(xiàn)細(xì)節(jié),理想情況下應(yīng)保持出。 h。所以常常我讓他們轉(zhuǎn)而無功能。

            而不是:

            // foo.h
            class Foo {
             
            ...
             
            private:
             
            static bool Func(int n);
            };

            // foo.cc
            bool Foo::Func(int n) { ... }

            // foo_test.cc
            EXPECT_TRUE
            (Foo::Func(12345));

            您可能應(yīng)該更好地編寫:

            // foo.h
            class Foo {
             
            ...
            };

            // foo.cc
            namespace internal {
             
            bool Func(int n) { ... }
            }

            // foo_test.cc
            namespace internal {
             
            bool Func(int n);
            }

            EXPECT_TRUE
            (internal::Func(12345));

            我想要使用不同的參數(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è)文件:

            1. foo.h包含聲明,
            2. foo.cc包含main (),除了定義和
            3. foo_main.cc定義的main ()只包含.

            然后,可以很容易測試foo.cc 。

            如果您正在將測試添加到現(xiàn)有文件并不愿意看到這樣的侵入性變化,有黑客: 只是在單元測試中包含整個(gè)foo.cc文件。例如:

            // File foo_unittest.cc

            // The headers section
            ...

            // Renames main() in foo.cc to make room for the unit test main()
            #define main FooMain

            #include "a/b/foo.cc"

            // The tests start here.
            ...

            但是,請記住這是黑客,只應(yīng)作為最后的手段。

            ASSERT_DEATH() 中的語句參數(shù)可以是什么?

            ASSERT_DEATH _regex_ _statement_)(或任何死亡斷言宏) 可以使用_statement_在哪里有效。所以基本上_statement_可以是任何在當(dāng)前上下文中有意義的 c + + 語句。特別是,它可以引用全局和/或本地變量,并且可以是:

            • 一個(gè)簡單的函數(shù)調(diào)用 (通常情況下),
            • 一個(gè)復(fù)雜的表達(dá)式,或
            • 復(fù)合語句。

            這里顯示了一些示例:
            // A death test can be a simple function call.
            TEST
            (MyDeathTest, FunctionCall) {
              ASSERT_DEATH
            (Xyz(5), "Xyz failed");
            }

            // Or a complex expression that references variables and functions.
            TEST
            (MyDeathTest, ComplexExpression) {
             
            const bool c = Condition();
              ASSERT_DEATH
            ((c ? Func1(0) : object2.Method("test")),
                           
            "(Func1|Method) failed");
            }

            // Death assertions can be used any where in a function. In
            // particular, they can be inside a loop.
            TEST
            (MyDeathTest, InsideLoop) {
             
            // Verifies that Foo(0), Foo(1), ..., and Foo(4) all die.
             
            for (int i = 0; i < 5; i++) {
                EXPECT_DEATH_M
            (Foo(i), "Foo has \\d+ errors",
                               
            ::testing::Message() << "where i is " << i);
             
            }
            }

            // A death assertion can contain a compound statement.
            TEST
            (MyDeathTest, CompoundStatement) {
             
            // Verifies that at lease one of Bar(0), Bar(1), ..., and
             
            // Bar(4) dies.
              ASSERT_DEATH
            ({
               
            for (int i = 0; i < 5; i++) {
                 
            Bar(i);
               
            }
             
            },
             
            "Bar has \\d+ errors");}

            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è)給你。但是,有些情況下,你也要定義您自己:

            • 如果顯式聲明類美孚的非默認(rèn)構(gòu)造函數(shù),然后您需要定義默認(rèn)構(gòu)造函數(shù),即使是不為空。
            • 如果美孚具有 const 非靜態(tài)數(shù)據(jù)成員,則您必須定義默認(rèn)構(gòu)造函數(shù),以初始化 const 成員的構(gòu)造函數(shù)初始值設(shè)定項(xiàng)列表中。(早期版本的gcc不會強(qiáng)制您對 const 成員進(jìn)行初始化。它是一個(gè)gcc 4中已修復(fù)的 bug.)

            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) { ... }
            TEST_F
            (FooTest, Uvw) { ... }

            TEST_F
            (BarTest, DefDeathTest) { ... }
            TEST_F
            (BarTest, Xyz) { ... }

            由于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 { ... };

            TEST_F
            (FooTest, Abc) { ... }
            TEST_F
            (FooTest, Def) { ... }

            typedef FooTest FooDeathTest;

            TEST_F
            (FooDeathTest, Uvw) { ... EXPECT_DEATH(...) ... }
            TEST_F
            (FooDeathTest, Xyz) { ... ASSERT_DEATH(...) ... }

            編譯器抱怨"不敵運(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è)置。

            • LNK2005: 符號已經(jīng)定義的對象
            • LNK4217: 本地定義符號導(dǎo)入功能 '功能' ' 符號
            • LNK4049: 本地定義符號 '符號' 導(dǎo)入

            谷歌測試項(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 reallyreallyreally 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 TESTFAILSUCCEED, 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:

            1. read other wiki pages,
            2. search the mailing list archive,
            3. ask it on googletestframework@googlegroups.com and someone will answer it (to prevent spam, we require you to join the discussion groupbefore you can post.).

            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):

            • the version (or the revision number if you check out from SVN directly) of Google Test you use (Google Test is under active development, so it's possible that your problem has been solved in a later version),
            • your operating system,
            • the name and version of your compiler,
            • the complete command line flags you give to your compiler,
            • the complete compiler error messages (if the question is about compilation),
            • the actual code (ideally, a minimal but complete program) that has the problem you encounter.
            久久国产成人午夜aⅴ影院| 深夜久久AAAAA级毛片免费看 | 久久人人爽人人爽人人av东京热| 久久AⅤ人妻少妇嫩草影院| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 久久影院综合精品| 久久精品国产亚洲5555| 亚洲香蕉网久久综合影视 | 国产欧美久久久精品影院| 国产日韩久久免费影院| 狠狠色综合久久久久尤物| 午夜不卡久久精品无码免费| 国产精品一久久香蕉国产线看| 97超级碰碰碰碰久久久久| 久久婷婷国产剧情内射白浆| 久久久精品一区二区三区| 久久久久久精品久久久久| 51久久夜色精品国产| 亚洲精品高清国产一线久久| 久久免费视频一区| 日本一区精品久久久久影院| 亚洲AV成人无码久久精品老人 | 日韩美女18网站久久精品| 91精品国产9l久久久久| 免费无码国产欧美久久18| 久久久久亚洲AV成人网人人软件| …久久精品99久久香蕉国产| 久久AV高潮AV无码AV| 亚洲天堂久久久| 亚洲欧美日韩精品久久亚洲区 | 国产精品一区二区久久精品| 色偷偷久久一区二区三区| 久久综合久久伊人| 久久久久一级精品亚洲国产成人综合AV区| 久久青青草原亚洲av无码app| 亚洲中文字幕无码久久综合网| 思思久久精品在热线热| 久久久久久亚洲精品影院| 久久久久精品国产亚洲AV无码| 久久久国产打桩机| 亚洲AV无码久久精品狠狠爱浪潮|