2011-03-10 95 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