13

我正在使用 Google Test 来测试我的 C++ 项目。但是,在某些情况下,需要访问 argc 和 argv 才能加载所需的数据。

main()方法中,在初始化的时候,将argc和argv传递给testing的构造函数。

testing::InitGoogleTest(&argc, argv);

我如何在稍后的测试中访问它们?

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

3 回答 3

12

我不知道谷歌的测试框架,所以可能有更好的方法来做到这一点,但这应该可以:

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

Globals 并不漂亮,但是当您拥有的只是一个测试框架,它不允许您将一些数据从main()您拥有的任何测试功能中传输出来时,它们就可以完成这项工作。

于 2011-03-10T15:48:27.293 回答
1

如果在 Windows 上使用 Visual Studio 运行,则在 __argc 和 __argv 中可用。

于 2011-03-11T13:23:56.463 回答
-3

您的测试可执行文件的命令行参数是针对测试框架的,而不是针对您的测试的。使用它们,您可以设置--gtest_output,--gtest_repeat--gtest_filter. 测试首先应该是可重现的,如果它取决于使用“正确”参数的人,则不是。

无论如何,你想要达到什么目的?


Post Scriptum(庆祝对这个答案的第 5 次反对):

我在这里试图提出的想法是成功运行测试所需的一切都应该包含在版本控制的源代码中。如果您需要“加载所需的数据”,那也应该是您的测试源中自包含的内容。如果配置是动态的(如@totowtwo 提到的 IP 地址),请编写一种方法来解决它。

命令行选项用于临时配置。调试级别,仅运行特定的测试子集,诸如由测试框架处理的内容,并且不应要求您的测试代码进行命令行解析。

测试的命令行选项通常在您的构建设置中配置,即版本控制之外。即使在您的环境之外,测试本身也应该始终可以作为黑盒运行,并且必须找出“正确”的命令行选项来运行它们是有害的。(假设您丢失了整个设置,并且不得不重新构建。即使您不记得“正确的”命令行选项,您也希望您的测试能够正常工作,对吗?)

于 2011-03-10T15:35:15.403 回答