我可以将参数传递给谷歌测试功能吗

Can I pass parameters to googletest test function

本文关键字:测试 功能 谷歌 参数传递 我可以      更新时间:2023-10-16

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

您可以执行以下操作:

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

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

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

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

示例

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

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

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

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