如何使用gtest设置测试名称

时间:2017-08-23 11:22:19

标签: c++ googletest

如何使用C ++动态设置Google测试用例的名称?
例如,我有一个具有用户定义端口数的L2交换机,我想用google测试测试每一个。

class VLAN : public ::testing::Test {};

TEST(VLAN, dot1qPortIngressFiltering_Port1_Min) {
    snmp.set("Q-BRIDGE-MIB::dot1qPortIngressFiltering.1", Integer32(1));
    auto result = snmp.get("Q-BRIDGE-MIB::dot1qPortIngressFiltering.1");
    auto res = std::get<Integer32>(result);
    ASSERT_EQ(res, Integer32(1));
} 

当然,我只需更改一位数字dot1qPortIngressFiltering_Port1_Min, dot1qPortIngressFiltering_Port2_Min, dot1qPortIngressFiltering_Port3_Min ...即可手动复制粘贴此案例,但我甚至不知道可能的端口数。

我试图传递构造为字符串的测试名称,但看起来TEST()不接受字符串作为第二个参数。我知道我们可以使用test_info->name(), test_info->test_case_name());获取测试名称,但我们如何设置呢?

1 个答案:

答案 0 :(得分:0)

您可以使用googletest中的Parameterized Tests

要创建参数化测试,fixture类必须从TestWithParam派生。

class VLAN : public TestWithParam<PortCase> {};

参数类型为PortCase

struct PortCase {
  int portNumber;
  std::string portName;
  PortCase(int portNumber, std::string portName) : 
          portNumber(portNumber), portName(portName) {}
}

现在我们可以编写真正的测试(注意TEST_P):

TEST_P(VLAN, dot1qPortIngressFiltering_Port1_Min) {
  PortCase input = GetParam();
  snmp.set(input.portName, Integer32(input.portNumber));
  auto result = snmp.get(input.portName);
  auto res = std::get<Integer32>(result);
  ASSERT_EQ(res, Integer32(input.portNumber));
}  

PortCase ports[] = {
  PortCase("Q-BRIDGE-MIB::dot1qPortIngressFiltering.1", 1);
  PortCase("Q-BRIDGE-MIB::dot1qPortIngressFiltering.2", 2);
  PortCase("Q-BRIDGE-MIB::dot1qPortIngressFiltering.3", 3);
}

INSTANTIATE_TEST_CASE_P(PortTests, VLAN, ValuesIn(ports));

这应该解决问题,并且可能比通过端口更漂亮: - )