2013-10-03 117 views
3

我有一個必須測試的解析器。這個解析器有很多測試輸入文件。解析器的預期行爲通過比較Parser的輸出和相應的預生成文件來測試。在運行時創建測試(谷歌測試)

當前我在測試中處理YAML文件以獲取輸入文件,預期文件及其描述(如果失敗,將打印此描述)。

還應該在相同的輸入上測試解析器的參數。

所以,我需要以在測試下面的代碼:

TEST(General, GeneralTestCase) 
{ 
    test_parameters = yaml_conf.get_parameters("General", "GeneralTestCase"); 
    g_parser.parse(test_parameters); 

    ASSERT_TRUE(g_env.parsed_as_expected()) << g_env.get_description("General", "GeneralTestCase"); 
} 

TEST(Special, SpecialTestCase1) 
{ 
    test_parameters = yaml_conf.get_parameters("Special", "SpecialTestCase1"); 
    g_parser.parse(test_parameters); 

    ASSERT_TRUE(g_env.parsed_as_expected()) << g_env.get_description("Special", "SpecialTestCase1"); 
} 

TEST(Special, SpecialTestCase2) 
{ 
    test_parameters = yaml_conf.get_parameters("Special", "SpecialTestCase2"); 
    g_parser.parse(test_parameters); 

    ASSERT_TRUE(g_env.parsed_as_expected()) << g_env.get_description("Special", "SpecialTestCase2"); 
} 

這是很容易看到代碼的重複。所以我覺得有一種方法可以使這些測試自動化。

在此先感謝。

回答

9

使用value-parameterized tests

typedef std::pair<std::string, std::string> TestParam; 

class ParserTest : public testing::TestWithParam<TestParam> {}; 

TEST_P(ParserTest, ParsesAsExpected) { 
    test_parameters = yaml_conf.get_parameters(GetParam().first, 
               GetParam().second); 
    g_parser.parse(test_parameters); 
    ASSERT_TRUE(g_env.parsed_as_expected()); 
} 

INSTANTIATE_TEST_CASE_P(
    GeneralAndSpecial, 
    ParserTest, 
    testing::Values(
     TestParam("General", "GeneralTestCase") 
     TestParam("Special", "SpecialTestCase1") 
     TestParam("Special", "SpecialTestCase2"))); 

您可以從磁盤讀取的測試案例列表,並返回它作爲一個載體:

std::vector<TestParam> ReadTestCasesFromDisk() { ... } 

INSTANTIATE_TEST_CASE_P(
    GeneralAndSpecial, // Instantiation name can be chosen arbitrarily. 
    ParserTest, 
    testing::ValuesIn(ReadTestCasesFromDisk()));