2017-08-23 18 views
0

C++を使用してGoogleテストケースの名前を動的に設定するにはどうすればよいですか?
たとえば、ユーザーが定義したポート数のL2スイッチがあり、Googleテストですべてのポートをテストしたいとします。もちろんgtestを使用してテスト名を設定する方法

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

は、私は手動で簡単に1桁を変更することで、このケースをコピー&ペーストできます。dot1qPortIngressFiltering_Port1_Min, dot1qPortIngressFiltering_Port2_Min, dot1qPortIngressFiltering_Port3_Min ...が、私もポートの可能な数を知りません。

私は文字列として構築されたテスト名を渡そうとしましたが、TEST()は文字列を2番目のパラメータとして受け付けていないようです。 test_info->name(), test_info->test_case_name());でテスト名を得ることができますが、どうすれば設定できますか?

+0

ポート数はどのようにして得られますか? – AndyG

+0

@AndyGユーザー定義です。アプリケーションは.iniファイルを読み込み、この情報を取得します。 – Alexandr

+0

さて、おそらく私たちはGoogleのテストマクロを使って何もすることはできません。コンパイル時にコード生成が行われ、実行時までポート数がわからないことがあります。したがって、ポートごとに個別のテストを書くことはできませんが、ポートをループできる単一のテストを書くことはできません。.iniファイルを読み込んで別のプログラムを作成し、コンパイルして後で実行します。 – AndyG

答えて

0

googletestのParameterized Testsを使用できます。

パラメータ化されたテストを作成するには、フィクスチャクラスを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)); 

をポートを介してループしているよりももっと綺麗です。