C++ 我可以将参数传递给googletest函数吗

C++ 我可以将参数传递给googletest函数吗,c++,googletest,C++,Googletest,在构建测试文件xxxxtest后,使用gtest可以在运行测试时传递一个参数,例如/xxxxtest 100。我想使用参数控制测试函数,但我不知道如何在测试中使用段落,能否在测试中显示一个示例?您可以执行以下操作: main.cc #包括 #包括“gtest/gtest.h” #包括“my_test.h” int main(int argc,字符**argv){ std::string命令行参数(argc==2?argv[1]:“”); 测试:InitGoogleTest(&argc,argv)

在构建测试文件xxxxtest后,使用gtest可以在运行测试时传递一个参数,例如
/xxxxtest 100
。我想使用参数控制测试函数,但我不知道如何在测试中使用段落,能否在测试中显示一个示例?

您可以执行以下操作:

main.cc
#包括
#包括“gtest/gtest.h”
#包括“my_test.h”
int main(int argc,字符**argv){
std::string命令行参数(argc==2?argv[1]:“”);
测试:InitGoogleTest(&argc,argv);
测试::AddGlobalTestEnvironment(新的MyTestEnvironment(命令行参数));
返回运行所有测试();
}

我的测试
#包括
#包括“gtest/gtest.h”
名称空间{
std::string g_command_line_arg;
}
类MyTestenEnvironment:公共测试::环境{
公众:
显式MyTestenEnvironment(const std::string和命令行参数){
g_command_line_arg=command_line_arg;
}
};
测试(MyTest,命令行参数测试){
ASSERT_FALSE(g_命令行_arg.empty());
}

您应该使用类型参数化测试。

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

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

范例

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));
class-FooTest:public::testing::TestWithParam{..};
测试P(最脚,DoesBar){
ASSERT_TRUE(foo.DoesBar(GetParam());
}
实例化_TEST_CASE_P(OneToTenRange,FooTest,::testing::Range(1,10));

< /代码> 如果您不想创建自己的代码>主()/<代码>函数,还可以考虑通过环境变量传递信息。

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


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

环境子代的用途是什么?为什么不只是
g_命令行_arg=argc==2?argv[1]:“”
?这只是为了限制
g_command_line_arg
的范围。因为它位于my_test.h中的未命名命名空间中,所以在该翻译单元之外无法访问。为什么它会给我一个
free()的错误:无效指针
?您不应该在
初始化GoogleTest
之后初始化
命令行参数
,这样您就不会干扰gtest本身的参数吗?如果我想传递多个参数呢?可能重复注意:实例化测试用例P是每个测试用例,而不是每个测试。这意味着对于每个I安装整个测试用例(它的所有测试功能)将使用给定的参数执行,没有灵活性以更大的粒度传递参数,例如,传递给特定的测试函数。此外,您指的是值参数化测试。我对该注释投了赞成票,因为它通常是正确的。但是,在某些情况下,测试依赖于某些外部资源,这些外部资源在不同的en之间可能有所不同环境。在你说“这就是模拟的目的”之前,你不能模拟一切。考虑一下测试一个实际使用手机网络的手机功能。你必须给某人打电话。。。
#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());
}
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));