【问题标题】:Can I pass parameters to googletest test function我可以将参数传递给 googletest 测试函数吗
【发布时间】:2012-02-29 09:42:39
【问题描述】:

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

【问题讨论】:

标签: c++ googletest


【解决方案1】:

您可以执行以下操作:

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());
}

【讨论】:

  • Environment 后代的目的是什么?为什么不只是g_command_line_arg = argc == 2 ? argv[1] : ""
  • 只是限制g_command_line_arg的范围。由于它位于 my_test.h 中的未命名命名空间中,因此无法在该翻译单元之外访问它。
  • 为什么给我一个free(): invalid pointer &lt;a_number&gt;的错误?
  • 你不应该在InitGoogleTest之后初始化command_line_arg,这样就不会干扰gtest本身的参数吗?
  • 如果我想传递多个参数怎么办?
【解决方案2】:

您应该使用类型参数化测试。 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));

【讨论】:

  • 注意:INSTANTIATE_TEST_CASE_P 是per-test-case,而不是per-test。这意味着对于每个实例化,整个测试用例(它的所有测试函数)都将使用给定的参数执行,而不能灵活地以更精细的方式传递参数,即改为传递给特定的测试函数。
  • 另外,您的意思是值参数化测试。
  • 我赞成这条评论,因为它通常是正确的。但是,在某些情况下,测试依赖于可能因环境而异的某些外部资源。在你说“这就是模拟的用途”之前,你不能模拟一切。考虑测试实际使用蜂窝网络的手机功能。你必须打电话给某人...
【解决方案3】:

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

在我的例子中,我只是想要一个标志来显示调试信息,所以我使用了getenv()

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

【讨论】:

    猜你喜欢
    • 2014-02-15
    • 2011-02-20
    • 2011-01-10
    • 2015-04-28
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    相关资源
    最近更新 更多