2012-08-07 87 views
1

我想用GTest來測試我的代碼,但困擾我的事情之一是它總是被編譯進來。這會減慢我的發佈版本。 GTest測試看起來像這樣「Comment」out宏函數定義

TEST(CaseName, TestName) 
{ 
    ASSERT_EQ(3, 3); 
} 

我希望能夠通過簡單的定義將所有測試註釋掉。我可以在#ifdef的每個測試中包裝,但這真的很難看。我想不包含GTest頭文件,而是以一種擺脫測試的方式自己定義TEST。

我到目前爲止。

我有一個宏將其定義爲一個靜態函數,所以它應該被優化出來,但測試中的assert仍然被編譯(並且是未定義的)。這意味着我還必須定義每一個ASSERTEXPECT,這至少是很乏味的。

#define TEST(tcase, test) static void uselessFunction##tcase##_##test(void) 

可以棒的,但我更希望的東西更好。希望有一些宏魔術師可以幫助。

+0

你爲什麼重新發明輪子 - assert和NDEBUG #define有什麼問題? – 2012-08-07 01:56:07

+0

這就是我要去的,但GTest有一些很好的功能,比如自動運行,漂亮的打印(能夠看到實際值是殺手)。我使用'assert'和一個腳本來掃描我的源代碼以獲得特殊格式的測試名稱(所以我不必保留一個列表),但GTest更好。 – 2012-08-07 02:35:42

+0

聽起來很公平 - 我喜歡cppunit - 但我認爲它今天可能有點過時。儘管在現代機器上編譯時間應該是你最後的擔心。類的轉發可以幫助加快速度,但是現在我可以在不到一分鐘的時間內編譯100,000行代碼。 CPU時間是這個星球上最便宜的東西 – 2012-08-07 02:42:15

回答

3

而不是像這樣使用宏,它可能會更好地把所有的測試文件編譯到一個測試可執行文件,並把所有的生產文件放入一個由測試EXE鏈接的庫。

通過這種方式,您可以讓gtest針對調試版和發佈版構建運行,但只能在構建測試可執行文件時編譯測試代碼。

+0

我可以做到這一點,但我寧願在源代碼旁邊進行測試。確保編寫正確的測試更容易。這兩種情況之間的唯一區別是,您將它們放在單獨的文件中,而我將它們放在一起。否則我們都使用相同的流程。 – 2012-08-07 02:32:56

+0

這不是一回事。您可以按照我的建議從編譯* all *配置中排除測試,或者更重要的是,您可以將它們包含在所有配置中。禁用在Release中運行測試套件的能力不是我會選擇做的。有些錯誤只能通過運行發佈代碼來調用。 – Fraser 2012-08-07 02:45:34

+0

我可以在發行版中運行測試套件。我的測試定義與我的發佈定義不同。測試可以在任一個上運行。如果你認爲最後的構建不夠公平,但我很小心地確保測試是唯一需要改變的地方(我冒這個險)。 – 2012-08-07 02:56:30