在 Google 测试框架中的测试用例中访问 argc 和 argv 的方法是什么?

问题描述 投票:0回答:3

我正在使用 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
}
c++ unit-testing googletest
3个回答
13
投票

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

//---------------------------------------------
// 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()
传输到你拥有的任何测试函数时,它们就可以完成工作。


1
投票

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


0
投票

您可以使用内部API

::testing::internal::GetArgvs()
来获取输入argumentmnts。

class GTestMyArgsEnv : public ::testing::Environment {
 public:
  // It's safe to parse the argvs in SetUp
  void SetUp() override {
    for (const auto& s : ::testing::internal::GetArgvs()) {
      // Deal with s for your arguments parser
      static constexpr std::string_view kArgPrefix = "--my_foo=";
      if (std::string_view(s).substr(0, kArgPrefix.size()) == kArgPrefix) {
        my_foo_ = s.substr(kArgPrefix.size());
      }
    }
  }

  const auto &my_foo() const { return my_foo_; }

 private:
    std::string my_foo_;
};

// Use global var to let your TEST access the parser's result, 
// the env will be release after RUN_ALL_TESTS
static auto* env = new GTestMyArgsEnv();

// In main function, you should regiester env before RUN_ALL_TEST
GTEST_API_ int main(int argc, char** argv) {
  testing::InitGoogleTest(&argc, argv);
  testing::AddGlobalTestEnvironment(env);
  return RUN_ALL_TESTS();
}

TEST(Foo, Bar) {
  EXPECT_EQ(env->my_foo(), "baz");
}

当您运行测试用例时。结果将取决于参数。

© www.soinside.com 2019 - 2024. All rights reserved.