2011-03-10 90 views
7

我正在使用Google測試來測試我的C++項目。但是,有些情況下需要訪問argc和argv才能加載所需的數據。在Google測試框架中,如何訪問測試用例中的argc和argv?

main()方法中,初始化時,argc和argv被傳遞給測試的構造函數。

testing::InitGoogleTest(&argc, argv); 

我以後如何在測試中訪問它們?

TEST(SomeClass, myTest) 
{ 
    // Here I would need to have access to argc and argv 
} 
+0

可能重複的[如何將參數傳遞給gtest](http://stackoverflow.com/questions/4818785/how-to-pass-parameters-to-the-gtest) – 2011-03-10 15:52:07

+1

這並沒有回答,但答案張貼在下面,所以請不要關閉。 – Nils 2011-03-10 15:53:42

+0

你是什麼意思「它沒有回答」?答案就在那裏:「使用您最喜歡的命令行解析技術,將結果存儲在某個全局變量中,並在測試期間引用它。」此外,這與這是否應該關閉無關。這是一個重複的問題。一旦關閉,答案可以合併。 – 2011-03-10 16:01:21

回答

7

我不知道谷歌的測試框架,所以有可能是一個更好的方式來做到這一點,但是這應該這樣做:

//--------------------------------------------- 
// some_header.h 
extern int my_argc; 
extern char** my_argv; 
// eof 
//--------------------------------------------- 

//--------------------------------------------- 
// main.cpp 
int my_argc; 
char** my_argv; 

int main(int argc, char** argv) 
{  
    ::testing::InitGoogleTest(&argc, argv); 
    my_argc = argc; 
    my_argv = argv; 
    return RUN_ALL_TESTS(); 
} 
// eof 
//--------------------------------------------- 

//--------------------------------------------- 
// test.cpp 
#include "some_header.h" 

TEST(SomeClass, myTest) 
{ 
    // Here you can access my_argc and my_argv 
} 
// eof 
//--------------------------------------------- 

全局不漂亮,但是當你已經是一個測試框架,它不會允許你將main()中的一些數據轉換爲你擁有的任何測試功能,他們可以完成這項工作。

+0

我可以請求您將main()更改爲'{:: testing :: InitGoogleTest(&argc,argv); my_argc = argc; my_argv = argv;返回RUN_ALL_TESTS(); ''?如果你已經通過了-gtest參數,那麼谷歌測試會從argv中移除它們並減少argc。這在InitGoogleTest中發生。如果在此之前分配,argc可以計算argv中非NULL字符串的數量。 – totowtwo 2012-06-15 17:32:22

+0

@totowtow:我對谷歌測試一無所知。你爲什麼不給自己添加這樣的答案?在這裏平息我,你會得到我的讚賞。 – sbi 2012-06-15 19:20:34

+0

那麼你的問題已經被老問題接受了,所以我剛剛提交了一個編輯 – totowtwo 2012-06-15 20:30:03

1

的命令行參數測試可執行文件是爲測試框架,而不是爲你的測試。與他們一起,你設置的東西像--gtest_output,--gtest_repeat--gtest_filter。測試首先應該是可重現的,如果這取決於使用「正確」參數的人,則不是這樣。

無論如何,你想達到什麼目的?

+0

簡單地使用argc和argv可以使用TEST(..){} – Nils 2011-03-10 15:37:16

+0

@Nils:我試圖指出的是,在測試驅動程序中使用命令行選項是一個**啞巴的想法,基本上是擊敗測試驅動程序的目的。 – DevSolar 2011-03-10 18:18:41

+3

@DevSolar這是一個可怕的,缺乏想象力的意見。您還需要指定一個IP地址才能運行網絡測試? argv擊敗硬編碼或自定義配置文件。 – totowtwo 2012-06-01 19:16:55

1

如果在使用Visual Studio的Windows上運行,那些在__argc和__argv中可用。

+2

不幸的是我在Linux上.. – Nils 2011-03-11 16:55:13

+1

確實不幸:) – 2011-03-11 17:45:42