如何使用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());
获取测试名称,但我们如何设置呢?
答案 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));
这应该解决问题,并且可能比通过端口更漂亮: - )