2016-02-12 156 views
1

我正在尝试创建运行测试所需的字符串数组。我就是这么做的。在googletest框架中的for循环中运行EXPECT_THROWD

TEST(ParseTest, UnknownType) { 
    String test_strings[] = { 
     String("X 1024\n"), 
     String("AB 1024\n") 
    }; 

    int test_strings_size = sizeof(test_strings)/sizeof(test_strings[0]); 

    for (int idx = 0; idx < test_strings_size; idx++) { 
     Transaction transaction; 
     String transaction_type = test_strings[idx]; 
     EXPECT_THROW(transaction.parse(transaction_type), ParseError); 
    } 
} 

但是,当我在谷歌测试框架运行它,我得到以下错误:

[==========] Running 1 test from 1 test case. 
[----------] Global test environment set-up. 
[----------] 1 test from ParseTest 
[ RUN  ] ParseTest.UnknownRequestType 
tests/transaction.cpp:20: Failure 
Expected: transaction.parse(transaction_type) throws an exception of type ParseError. 
    Actual: it throws nothing. 
[ FAILED ] ParseTest.UnknownRequestType (0 ms) 
[----------] 1 test from ParseTest (0 ms total) 

[----------] Global test environment tear-down 
[==========] 1 test from 1 test case ran. (0 ms total) 
[ PASSED ] 0 tests. 
[ FAILED ] 1 test, listed below: 
[ FAILED ] ParseTest.UnknownRequestType 

1 FAILED TEST 

当这应该实际运行两个测试用例,它抱怨的只有一个。我错过了什么吗?

回答

2

下面是一些澄清:

你实际上是运行一个测试用例,请参阅下面的定义:

TEST(TestCase, TestName) 

所以在测试结果时,它说:“1测试1测试案例跑” ,'test'是指你的TestName字段(在你的情况下是UnknownType)和测试用例显然是指'测试用例'(ParseTest)。无论您在特定测试中设置了多少个“ASSERTions”或“期望”,都无关紧要。它最终将被报告为一项测试。

因此,如果您

TEST(TestCase1, Test1){ 
    ..... 
} 
TEST(TestCase1, Test2){ 
    .... 
} 

它将被报告为:1个测试用例2周的测试跑

因此,假设“X 1024”是会造成异常的一个,我怀疑“AB 1024”(没有例外)的结果是最终报告的结果。

1

我会写一个value parameterized test以获得更方便的测试结果。

实施例:

class ParseTest : public ::testing::TestWithParam<const String> {}; 

TEST_P(ParseTest, UnknownType) 
{ 
    Transaction transaction; 
    String transaction_type = GetParam(); 
    EXPECT_THROW(transaction.parse(transaction_type), ParseError); 
} 

INSTANTIATE_TEST_CASE_P(UnknownTypeInstance, 
         ParseTest, 
         ::testing::Values(String("X 1024\n"), String("AB 1024\n")));