我可以将参数传递给googletest测试功能吗?

时间:2012-02-29 09:42:40

标签: c++ googletest

构建我的测试文件xxxxtest后,使用gtest可以在运行测试时传递一个参数,例如: ./xxxxtest 100。我想使用参数控制我的测试功能,但我不知道如何在我的测试中使用para,你能在测试中向我展示一个样本吗?

3 个答案:

答案 0 :(得分:5)

您可以执行以下操作:

main.cc

#include <string>
#include "gtest/gtest.h"
#include "my_test.h"

int main(int argc, char **argv) {
  std::string command_line_arg(argc == 2 ? argv[1] : "");
  testing::InitGoogleTest(&argc, argv);
  testing::AddGlobalTestEnvironment(new MyTestEnvironment(command_line_arg));
  return RUN_ALL_TESTS();
}


my_test.h

#include <string>
#include "gtest/gtest.h"

namespace {
std::string g_command_line_arg;
}

class MyTestEnvironment : public testing::Environment {
 public:
  explicit MyTestEnvironment(const std::string &command_line_arg) {
    g_command_line_arg = command_line_arg;
  }
};

TEST(MyTest, command_line_arg_test) {
  ASSERT_FALSE(g_command_line_arg.empty());
}

答案 1 :(得分:3)

您应该使用类型参数化测试。 https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#type-parameterized-tests

  

类型参数化测试与类型化测试类似,不同之处在于它们并不要求您提前知道类型列表。相反,您可以先定义测试逻辑,然后再使用不同的类型列表对其进行实例化。您甚至可以在同一个程序中多次实例化它。

     

如果您正在设计接口或概念,则可以定义一组类型参数化测试,以验证接口/概念的任何有效实现应具有的属性。然后,每个实现的作者可以用他的类型实例化测试套件,以验证它是否符合要求,而不必重复编写类似的测试。

实施例

class FooTest: public ::testing::TestWithParam < int >{....};
    TEST_P(FooTest, DoesBar){
        ASSERT_TRUE(foo.DoesBar(GetParam());
    }

INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));

答案 2 :(得分:0)

如果您不想创建自己的main()函数。您还可以考虑通过环境变量传递信息。

就我而言,我只是想要一个标记来显示或不显示调试信息,所以我使用了getenv()

另一种选择是将任何需要的信息放在文本文件中,然后从测试中读取。