• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
            搜索 
             對于  
            V1_6_FAQ  
            提示和常見問題關于谷歌 c + + 測試框架
            zhanyong...@gmail.com更新的2011 年 4 月 18 日

            如果你找不到在這里,你的問題的答案,你讀過底漆AdvancedGuide,則將其發送到 googletestframework@googlegroups.com。

            為什么應該的我最喜歡的 c + + 測試框架而不是使用 Google 測試?

            首先,讓我們說清楚我們不想要進入的 c + + 的測試框架是最佳的辯論。存在許多精細框架編寫 c + + 的測試中,和我們有巨大的開發人員和用戶他們尊重。我們認為不存在 (或者將) 最好的單一框架-您必須選擇合適的工具為您正在處理的特定任務。

            因為我們找不到正確的功能和便利條件組合在一個現有的框架,以滿足我們的需要,我們創建了谷歌測試。以下是一個列表的事情,我們喜歡谷歌測試。我們不要為我們宣稱他們是唯一谷歌測試-相反,他們使谷歌測試組合的選擇。我們希望此列表可以幫助您決定是否為您太。

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

            谷歌測試將您修復它們進行編譯時收到警告?

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

            不幸的是,這并不意味著你保證就看到沒有任何警告,谷歌測試您的環境中進行編譯時:

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

            它并不總是可能使谷歌測試無預警的每個人。或者,它可能不可取如果很少啟用警告并修復侵犯行為會使代碼更復雜。

            如果谷歌測試進行編譯時,您會看到警告,我們建議您在使用-isystem標志 (假設你使用 GCC) 來標記為系統標題谷歌測試頭。這會取消警告從谷歌測試郵件頭。

            為什么應該不測試用例名稱和測試名稱包含下劃線?

            下劃線 (_) 是特殊的情況下,c + + 儲備由編譯器和標準庫使用下列:

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

            用戶代碼是禁止使用這樣的標識符。

            現在讓我們看看這意味著測試TEST_F.

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

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

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

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

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

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

            所以為了簡單起見,我們只是要求用戶,以避免在TestCaseNameTestName _ 。規則是不必要的更多限制,但它既簡單又容易記住。它還使谷歌測試以防其執行需要在將來會改變一些發展的空間。

            如果您違反此規則,有可能不會馬上的后果,但您的測試可能 (只是 5 月) 與新的編譯器 (或新版本的編譯器使用的) 或新版本的谷歌測試中斷。因此最好遵循的規則。

            它為什么不推薦將安裝谷歌測試預編譯的副本 (例如,為 /usr/local)?

            在最初的時候,我們說過你也可以安裝已編譯的谷歌測試庫使用使安裝*nix 系統。然后每個用戶的計算機中,可以編寫測試,無需重新編譯谷歌測試。

            這看起來像是一個好主意,但它有了茶: 每個用戶需要編譯使用同一編譯器標志用于編譯安裝的谷歌測試庫 ; 他測試否則他可能遇到未定義的行為 (即測試可以奇怪的行為和甚至可能會崩潰,沒有明顯的原因)。

            為什么會這樣?因為 c + + 都有這種東西叫做一個定義規則: 如果兩個 c + + 源文件包含不同定義的同一類/功能/變量,并且您將它們鏈接在一起,你違反規則。鏈接器可能或不可能捕獲錯誤 (在許多情況下它不需要由 c + + 標準趕上違反)。如果不是,你會得到奇怪的運行時行為,是意外,很難調試。

            如果您編譯谷歌測試和測試代碼使用不同的編譯器標志,他們可能會看到不同的定義的同一類/功能/變量 (如, # if谷歌測試中使用)。因此,頭腦清楚,我們建議以避免安裝預編譯的谷歌測試庫。相反,每個項目應編譯谷歌測試本身,這樣它可以肯定的是同一標志用于谷歌測試和測試。

            我如何生成 64 位二進制文件在 Windows 上 (使用 Visual Studio 2008)?

            (由特雷弗 · 羅賓遜回答)

            加載提供的 Visual Studio 解決方案文件,或msvc\gtest md.slnmsvc\gtest.sln經過遷移向導遷移到 Visual Studio 2008 的解決方案和項目文件。生成菜單中選擇配置管理器 … … 。活動解決方案平臺下拉列表中選擇> < 新 … … 。從新的平臺下拉列表中選擇x 64 ,將從此處復制設置設置保留為Win32創建新的項目平臺選中此選項,然后單擊確定現在,您有Win32x64平臺配置,可以選擇從標準工具欄上,使您可以構建 32 位或 64 位的二進制文件 (或兩者在一次使用批量生成) 之間切換。

            為了防止覆蓋另一個生成輸出文件,您需要更改所有項目之間的中間目錄設置為新創建的平臺配置。為此,多選操作 (如使用按住 shift 鍵單擊) 的所有項目 (但不是解決辦法)解決方案資源管理器中。用鼠標右鍵單擊其中之一,并選擇屬性在左窗格中,選擇配置屬性,并從配置下拉列表中,選擇所有配置請確保選定的平臺是x 64中間目錄設置,更改從$(PlatformName)\$(ConfigurationName)$(OutDir)\$(ProjectName)的值。單擊確定,然后生成解決方案。生成完成時,64 位二進制文件將在msvc\x64\Debug目錄中。

            可以在 MinGW 上使用谷歌測試嗎?

            我們沒有測試此自己,但每個亞伯拉罕森報告說他是能夠編譯和安裝谷歌測試成功地使用這個軟件從 MinGW 時。您需要將其與配置:

            配置路徑/TO/CC ="海灣合作委員會 mno-這個軟件"CXX ="g + +-mno-這個軟件"

            您應該能夠取代-mno-這個軟件選項以直接鏈接到真正的 MinGW 二進制文件,但我們還沒試過。

            注意事項:

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

            我們亦在 Linux 上包含站點上使用這些說明成功交叉編譯的谷歌測試 MinGW 二進制文件的報告。

            請如果您有興趣提高對 MinGW 的支持,聯系googletestframework@googlegroups.com 。

            為什么谷歌測試支持 EXPECT_EQ ptr NULL) 和 ASSERT_EQ ptr NULL) 但不是 EXPECT_NE ptr NULL) 和 ASSERT_NE ptr NULL)?

            由于 c + + 的一些特性,它需要一些非普通模板元編程技巧,支持使用NULL作為參數的EXPECT_XX()ASSERT_XX()宏。因此我們只能做到哪里最需要 (否則我們讓谷歌測試執行難維持與比必要多出錯)。

            EXPECT_EQ()宏需要作為其第一個參數的預期值和實際值作為第二個。這是合理的有人想要寫EXPECT_EQ NULL some_expression),并確實要求這樣做幾次。因此我們執行它。

            EXPECT_NE ptr NULL)需要并不是幾乎一樣強壯。當斷言失敗時,您已經知道該ptr必須為,因此它不會添加任何信息,在此情況下打印 ptr。這意味著, EXPECT_TRUE(ptr!NULL)同樣適用。

            如果我們支持EXPECT_NE ptr NULL),我們將不得不支持EXPECT_NE (ptr,NULL)以及一致性,作為與EXPECT_EQ,不同的是我們還沒有一項公約EXPECT_NE的兩個參數的順序。這意味著使用模板元編程技巧在執行兩次,使其更難以理解和維護。我們相信效益并不證明成本。

            最后,隨著谷歌模仿圖書館的增長,我們鼓勵人們更經常在測試中使用統一的EXPECT_THAT (值) 和語法。研究方法的一個顯著的優勢是匹配可以輕松地結合形式新匹配,而是EXPECT_NE等,宏不能輕松地組合。因此,我們希望更多投資比匹配,在EXPECT_XX()宏。

            谷歌測試支持并行運行測試嗎?

            測試賽跑者往往緊耦合與生成/測試環境,和谷歌測試不會嘗試解決問題以并行方式運行測試。相反,我們試圖使谷歌測試與試驗賽跑者很好地工作。例如,谷歌測試 XML 報表包含對每個測試,花費的時間,其gtest_list_testsgtest_filter的標志可用于拆分到多個進程執行的測試方法。這些功能可以幫助并行運行的測試的測試運行。

            為什么不要谷歌測試運行不同的線程中的測試速度的東西?

            很難寫線程安全的代碼。大多數測試線程安全,不會寫入,因此可能無法正常工作在多線程環境中。

            如果你想一想,它已經難使您的代碼時你知道其他線程做什么工作。它是艱難得多,有時甚至是不可能的以使您的代碼時,你不知道的其他線程正在做工作 (記住可以添加、 刪除或修改之后寫入您的測試試驗方法)。如果您要運行的測試的同時,你會在不同的進程中更好地運行它們。

            為什么谷歌測試斷言不執行使用異常?

            我們的原始動機是為了能夠禁用例外的項目中使用谷歌測試。后來我們意識到這種方法的一些額外的好處:

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

            上面的代碼會通過即使ASSERT_TRUE拋出。雖然有人寫此測試中的機會不大,很可能會遇到這種模式,當你寫下測試的代碼的調用的回調的斷言。

            不使用異常的缺點在于ASSERT_ * (實施使用返回) 將只中止當前函數,不當前測試.

            為什么我們兩個不同的宏用測試與無固定裝置?

            不幸的是,c + + 的宏觀系統不允許我們為這兩種情況使用相同的宏。一種可能性是以提供測試夾具、 只有一個宏,要求用戶有時定義為空的夾具:

            class FooTest : public ::testing::Test {};

            TEST_F
            (FooTest, DoesThis) { ... }

            typedef ::testing::Test FooTest;

            TEST_F
            (FooTest, DoesThat) { ... }

            然而,很多人認為這是一條線太多。:-)我們的目標是使它真的很容易寫測試,所以我們試圖使瑣碎創建簡單的測試。這意味著需要為此類測試使用一個單獨的宏。

            我們認為這兩種方法是理想的但其中一方是合理的。最后,它可能并不重要太多。

            我們為什么不利用結構作為測試夾具?

            我們要表示被動的數據時,才使用結構。這種結構和類之間的區別是良好記錄的代碼作者的意圖。由于測試夾具如SetUp()TearDown()的邏輯,它們更好地定義為類。

            死亡測試試驗轉輪和使用斷言作為實施為什么呢?

            我們的目標是使死亡測試,方便用戶可能是 c + + 允許。特別是:

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

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

            • ASSERT_DEATH可以引用當前函數中的局部變量,您可以決定多少死亡測試要基于的運行時信息。例如,
            •     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");
                 
              }

            基于轉輪的方法往往是更為靜態和不夠靈活,或需要更多的用戶作出努力,得到這種靈活性。

            ASSERT_DEATH另一個有意思的一點是它調用fork()創建一個子進程運行死亡測試。這減輕快速、 fork()使用寫入時復制頁面,并會導致幾乎為零的開銷,并從用戶提供語句直接跳過所有全局和本地初始化和給定的語句導致任何代碼啟動的子進程。如果您啟動子進程從零開始,它可以秒只加載的一切并開始運行如果測試動態鏈接到許多圖書館。

            我的死亡測試修改某些狀態,但死亡測試完成后,更改好像是迷路了。為什么會這樣?

            執行死刑測試 (EXPECT_DEATH等) 在子流程世倜預期的崩潰不會殺死測試程序 (即父進程)。因此,他們承擔任何內存中副作用是流星雨在它們各自的子流程,但不是在父進程。你可以把它們看作運行的平行宇宙,更多或更少。

            編譯器抱怨"未定義的引用"到一些靜態的 const 成員變量,但我確實在類體中定義它們。怎么了?

            如果您的類有一個靜態數據成員:

            // foo.h
            class Foo {
             
            ...
             
            static const int kBar = 100;
            };

            您還需要在foo.cc中定義它以外的類的主體:

            const int Foo::kBar;  // No initializer here.

            否則為你的代碼是無效的 c + +,并以出乎意料的方式可能會中斷。特別是,在谷歌測試比較斷言 (EXPECT_EQ等) 中使用它將生成一個"未定義的引用"鏈接器錯誤。

            我必須具有幾個實現的接口。可以一次寫入一組測試和所有實現都重復他們嗎?

            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.

            完整的示例,使用派生的試驗裝置,請參見sample5.

            我的編譯器抱怨"無效值不忽視,應該是"。這是什么意思?

            你可能不返回void函數中用ASSERT_*() 。ASSERT_*()可以只用void函數中。

            我的死亡測試掛起 (或賽格故障)。如何解決呢?

            在谷歌測試中,死亡測試運行在一個子進程中,他們的工作的方式是微妙。寫你確實需要了解他們是如何死亡的測試。請確保您已經閱讀這。

            特別是,死亡測試不喜歡父進程中有多個線程。所以您可以嘗試的第一件事是消除創建線程以外的EXPECT_DEATH().

            有時這是不可能,您必須使用一些圖書館可能會創建線程之前甚至達到main () 。在這種情況下,您可以嘗試通過移動盡可能多的活動在EXPECT_DEATH()內盡可能減少沖突的可能性 (極端情況下,您希望移動內部的一切),或離開它盡可能多的東西。另外,可以將死亡測試樣式設置為"線程",而是更安全,但速度較慢,請嘗試并查看是否它會幫助。

            如果你去使用線程安全死亡測試,請記住它們會重新運行測試程序從子進程中開始。因此請確保您的程序可以運行肩并肩與本身是確定性。

            最后,要歸結為好的并發編程。你要確保這是沒有爭用條件或死鎖在你的程序中。沒有銀彈-對不起 !

            應該使用構造函數/析構函數測試夾具或設置上/淚下功能嗎?

            要記住的第一件事是谷歌測試不會重用相同的測試夾具對象在多個測試。每個TEST_F,谷歌測試將創建新測試夾具對象,立即調用SetUp(),運行測試,調用TearDown(),然后立即刪除測試夾具的對象。因此,有不需要編寫SetUp()TearDown()函數如果構造函數或析構函數已經完成的工作。

            您仍可能需要使用SetUp()/TearDown()在以下情況中:

            • 如果撤展操作可能會引發異常,則必須使用TearDown()析構函數,相對于扔在析構函數中會導致未定義的行為,通常會立刻殺死你的程序。請注意,編譯器中啟用異常時,可能會引發許多標準庫 (STL) 像。因此如果你想寫工作有無異常的便攜式測試應該更喜歡TearDown() 。
            • 谷歌測試團隊正考慮制作平臺上拋出的異常在哪里的斷言宏啟用 (例如 Windows、 Mac OS、 Linux 客戶端),其中,將不再需要傳播到它的調用子例程從失敗的用戶。因此,您不應該使用谷歌測試斷言在析構函數中的,如果您的代碼可以在這樣的平臺上運行。
            • 在構造函數或析構函數中,你不能在此對象上調用虛函數。(您可以調用一個方法聲明為虛擬的但它將靜態綁定)。因此,如果您需要調用將被派生類中的重寫的方法,您必須使用SetUp()/TearDown().

            編譯器抱怨"沒有匹配的調用的函數"何時使用 ASSERT_PREDn。如何解決呢?

            如果您使用ASSERT_PRED *EXPECT_PRED *中的謂詞函數重載或模板,編譯器將有麻煩弄哪一個重載的版本,它應該使用。ASSERT_PRED_FORMAT *EXPECT_PRED_FORMAT *沒有這個問題。

            如果您看到此錯誤,您可能要切換到(ASSERT|期待) _PRED_FORMAT *,它也會給你更好的失敗消息。如果,不過,這不是一個選項,您可以通過明確告訴編譯器來挑哪個版本來解決問題。

            例如,假設您有

            bool IsPositive(int n) {
             
            return n > 0;
            }
            bool IsPositive(double x) {
             
            return x > 0;
            }

            如果你寫,你將得到編譯器錯誤。

            EXPECT_PRED1(IsPositive, 5);

            不過,這會工作:

            EXPECT_PRED1(*static_cast<bool (*)(int)>*(IsPositive), 5);

            Static_cast運算符尖括號里面的東西是int函數指針的類型- IsPositive().)

            另一個例子是,當你有一個模板函數

            template <typename T>
            bool IsNegative(T x) {
             
            return x < 0;
            }

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

            ASSERT_PRED1(IsNegative*<int>*, -5);

            東西都更有趣,如果您的模板有多個參數。不會編譯:

            ASSERT_PRED2(*GreaterThan<int, int>*, 5, 0);

            作為 c + + 預處理器認為你給ASSERT_PRED2 4 參數,這是一個超過預期。解決方法是將謂詞函數的包裝中括號:

            ASSERT_PRED2(*(GreaterThan<int, int>)*, 5, 0);

            我的編譯器抱怨"忽略返回值"當我打電話 RUN_ALL_TESTS()。為什么會這樣?

            有些人所忽略的返回值RUN_ALL_TESTS()也就是說,而不是

            return RUN_ALL_TESTS();

            他們寫道

            RUN_ALL_TESTS();

            這是錯誤和危險的。測試轉輪需要看到RUN_ALL_TESTS()的返回值,以確定是否測試通過。如果您的main ()函數將忽略它,您的測試將被視為成功即使有谷歌測試斷言失敗。很差。

            為了幫助用戶避免這種危險的 bug, RUN_ALL_TESTS()的執行導致 gcc 提高此警告,當返回值將被忽略。如果您看到此警告,此修復程序很簡單: 只需確保其值用作main ()的返回值.

            我的編譯器抱怨構造函數 (或析構函數) 不能返回值。這是怎么回事?

            由于 c + +,為了支持流媒體消息ASSERT_ *,如語法的一個特色,

            ASSERT_EQ(1, Foo()) << "blah blah" << foo;

            我們不得不放棄使用ASSERT *失敗 * (但不是期望 * ADD_FAILURE *) 中構造函數和析構函數。解決方法是將構造函數/析構函數的內容移至私人無效成員函數,或如果切換到EXPECT_*() 。本節中的用戶指南解釋了它。

            不是我的設置功能。為什么會這樣?

            C + + 是區分大小寫。它應拼寫為SetUp()你拼寫它作為Setup()?

            同樣地,有時拼寫為SetupTestCase() SetUpTestCase()的人,不知道為什么它永遠不會被稱為。

            我如何做直接在 Emacs 失敗的行跳?

            谷歌測試失敗的郵件格式是 Emacs 和許多其他 Ide,像 acme 和 XCode 理解。如果在編譯緩沖區中 Emacs 谷歌測試郵件,則可點擊。你現在可以打上一條消息要跳轉到對應的源代碼,輸入或使用C x ' 要跳轉到下一次的失敗。

            我有幾個測試用例,共享相同的測試夾具邏輯,有一個新的測試夾具類定義為每個嗎?這看起來非常繁瑣。

            你不必。而不是

            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) { ... }

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

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

            由于大多數日志消息轉到 stderr,我們決定讓谷歌測試輸出到標準輸出。這種方式,可以方便地分隔兩個使用重定向。例如:

            ./my_test > googletest_output.txt

            為什么應該在全局變量喜歡測試夾具?

            有幾個好的理由:

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

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

            您應嘗試寫入可測試代碼,這意味著類應從他們的公共接口輕松地進行測試。要實現這一目標的一種是平普爾成語: 你將所有的一類的私有成員移動到幫助器類,并公開的幫助器類的所有成員。

            你有幾個其他選項,不需要使用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)
               
              ...
              }
            • 如果將方法聲明為受保護,您可以更改其僅僅用于測試的子類中的訪問級別:
            • 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 的私有類的靜態成員?

            我們發現私有靜態方法雜波的頭文件。他們是實現細節,理想情況下應保持出。 h。所以常常我讓他們轉而無功能。

            而不是:

            // 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));

            您可能應該更好地編寫:

            // 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));

            我想要使用不同的參數運行測試幾次。我需要寫幾個類似的副本嗎?

            您可以使用一個稱為功能 [V1_6_AdvancedGuide# Value_Parameterized_Tests 的值參數測試] 讓您沒有定義它不止一次重復使用不同的參數,您的測試。

            如何測試文件,它定義 main ()?

            若要測試一個foo.cc文件,您需要編譯并鏈接到您的單元測試程序。然而,當文件包含main ()函數的定義,它與你的單元測試的main ()將會發生沖突,并將導致生成錯誤。

            選擇合適的解決方案是將它分成三個文件:

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

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

            如果您正在將測試添加到現有文件并不愿意看到這樣的侵入性變化,有黑客: 只是在單元測試中包含整個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.
            ...

            但是,請記住這是黑客,只應作為最后的手段。

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

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

            • 一個簡單的函數調用 (通常情況下),
            • 一個復雜的表達式,或
            • 復合語句。

            這里顯示了一些示例:
            // 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 使用正則表達式什么語法?

            在 POSIX 系統上,谷歌測試使用 POSIX 擴展正則表達式語法 (http://en.wikipedia.org/wiki/Regular_expression#POSIX_Extended_Regular_Expressions)。在 Windows 上,它使用正則表達式語法的有限變體。有關更多詳細信息,請參見 [V1_6_AdvancedGuide# Regular_Expression_Syntax 正則表達式語法]。

            我有一個夾具類美孚,但 TEST_F (美孚、 欄) 給了我錯誤"對 Foo::Foo() 的調用不匹配功能"。為什么會這樣?

            谷歌測試需要能夠創建對象的測試夾具類中,因此它必須具有默認構造函數。通常,編譯器將定義一個給你。但是,有些情況下,你也要定義您自己:

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

            ASSERT_DEATH 為什么抱怨以前的線程都已加入?

            隨著 Linux pthread 庫中,沒有轉回一旦你越線從單個線程對多個線程。您創建的線程,第一次管理器創建一個線程是此外,因此您可以獲得 3,不 2,線程。以后,當您創建的線程時加入主線程的線程計數遞減 1,但管理器線程將永遠不會被殺,所以你還有兩個線程,這意味著您不能安全地運行死亡測試。

            新 NPTL 線程庫不會患這個問題,因為它不會創建一個管理器線程。但是,如果你無法控制哪臺計算機運行您的測試,你不應該取決于此。

            為什么谷歌測試是否需要整個測試用例,而不是要被命名為 FOODeathTest,使用 ASSERT_DEATH 時的各個測試的?

            谷歌測試并不交叉來自不同測試用例的測試。就是它第一,在一個測試用例中運行所有測試,然后都運行所有測試下一個測試用例,依此類推。谷歌測試這樣做是因為它需要之前它的第一次測試運行時,設置了一個測試用例和 afterwords 拆了。分裂測試用例需要多個設置和撤展過程,這是效率低下,令語義不潔凈。

            如果我們確定的順序基于測試的測試用例的名稱而不是名稱的測試,我們將會有以下的情況的問題:

            TEST_F(FooTest, AbcDeathTest) { ... }
            TEST_F
            (FooTest, Uvw) { ... }

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

            由于FooTest.AbcDeathTest需要運行BarTest.Xyz之前,我們不隔行掃描來自不同測試用例的測試,我們需要在BarTest案中運行任何測試之前運行生成器的情況的全部測試。要運行BarTest.DefDeathTest FooTest.Uvw之前的規定發生矛盾.

            但我不喜歡它包含死亡測試和非死亡測試時調用我整個測試用例 FOODeathTest。我該怎么辦?

            你不需要,但如果你愿意,你可能分裂測試用例,生成器FooDeathTest,名字哪里弄清楚他們與相關:

            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(...) ... }

            編譯器抱怨"不敵運算符 << '"何時使用斷言。是什么給了?

            如果您使用用戶定義類型FooType的說法,你必須確保有輸出 & 運算符 << (輸出 & const FooType &)定義,我們可以打印的FooType值的函數.

            此外,如果在名稱空間中,聲明為FooType <<運算符還需要在同一命名空間中定義。

            我如何壓抑對 Windows 的內存泄漏消息?

            由于靜態初始化的谷歌測試單身人士需要在堆上的分配,Visual c + + 內存泄漏檢測儀將報告在程序運行結束時的內存泄漏問題。為避免這種最簡單的方法是使用_CrtMemCheckpoint_CrtMemDumpAllObjectsSince ,不報告任何靜態調用初始化堆對象。有關更多詳細信息和附加堆檢查/調試例程,請參閱 MSDN。

            我工程與谷歌在 Visual Studio 中的測試,我收到的都是一堆鏈接器錯誤 (或警告)。幫助!

            你可以得到以下鏈接器的一些錯誤或警告如果您試圖鏈接您的測試項目與谷歌測試庫時,您的項目不生成使用相同的編譯器設置。

            • LNK2005: 符號已經定義的對象
            • LNK4217: 本地定義符號導入功能 '功能' ' 符號
            • LNK4049: 本地定義符號 '符號' 導入

            谷歌測試項目 (gtest.vcproj) 已將運行時庫選項設置為 /MT (使用多線程靜態庫,用于調試 /MTd)。如果您的項目使用別的東西,例如 /MD (使用 /MDd 用于調試多線程的 Dll),您需要更改以匹配您的項目中谷歌測試項目的設置。

            更新此設置打開項目屬性在 Visual Studio IDE 中,然后選擇配置屬性的分支 |C/C + + |代碼生成,并更改"運行時庫"的選項。您還可以嘗試使用 gtest md.vcproj 而不 gtest.vcproj。

            在庫中,我把我的測試中,Google 測試并不運行它們。發生了什么事情?

            你讀過谷歌測試底漆頁上警告嗎?

            我希望與 Visual Studio 一起使用谷歌測試,但不知道從哪里開始。

            許多人都在您所在的位置和張貼之一他到我們的郵件列表中的解決方案。這里是他的鏈接: http://hassanjamilahmad.blogspot.com/2009/07/gtest-starters-help.html.

            我看到了編譯一提 std::type_traits 嘗試在 Solaris 上使用谷歌測試時的錯誤。

            谷歌測試使用 c + + 標準庫不支持 SunStudio 的部分。我們的用戶報告使用替代實現成功。嘗試運行生成后運行此命令:

            導出抄送 = 抄送 CXX = 抄送 CXXFLAGS ='-庫 = stlport4'

            我的代碼如何檢測其是否運行在測試中?

            如果您編寫代碼,嗅是否它運行在測試中,并且相應地做不同的事情,滲入生產代碼僅測試邏輯和有沒有捷徑,確保僅測試的代碼路徑不誤生產中運行。這種聰明也會導致Heisenbugs因此,我們強烈建議對實踐,和谷歌測試并不提供一種方法做這件事。

            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.
            热99RE久久精品这里都是精品免费 | 久久一日本道色综合久久| 激情久久久久久久久久| 久久亚洲国产成人精品性色| 国产精品久久久香蕉| 国产精品成人无码久久久久久| 国产色综合久久无码有码| 少妇久久久久久被弄到高潮| 国产精品欧美亚洲韩国日本久久 | 一本一本久久aa综合精品| 中文成人无码精品久久久不卡| 日韩精品无码久久一区二区三 | 久久久久亚洲精品天堂久久久久久 | 国内精品久久久久久麻豆| 99久久国产亚洲高清观看2024| 久久96国产精品久久久| 亚洲狠狠综合久久| 久久www免费人成精品香蕉| 久久久久亚洲AV无码专区网站| 亚洲国产日韩欧美久久| 亚洲精品视频久久久| 精品久久久久久久久免费影院| 99精品久久精品一区二区| 午夜精品久久久久久久| 99国产精品久久久久久久成人热| 精品久久久久久亚洲精品| 韩国无遮挡三级久久| 久久久精品国产Sm最大网站| 亚洲精品综合久久| 久久婷婷五月综合97色一本一本 | 久久精品女人天堂AV麻| 2021国产精品午夜久久| 久久久精品2019免费观看| 狠色狠色狠狠色综合久久| 国产亚洲色婷婷久久99精品91| 亚洲人成电影网站久久| 国产精品无码久久综合| 久久香蕉国产线看观看猫咪?v| 欧美va久久久噜噜噜久久| 精品综合久久久久久88小说| 无码国产69精品久久久久网站|