CppUnitTestFramework并测试“向量下标超出范围”

时间:2017-04-03 18:19:06

标签: c++ unit-testing visual-c++ stdvector

我有一些我想测试的代码。如果传递了错误的参数,我可以访问超出其范围的向量。我想测试这个条件。是否可以使用CppUnitTestFramework

测试此代码
 #if _ITERATOR_DEBUG_LEVEL == 2
        if (size() <= _Pos)
            {   // report error
            _DEBUG_ERROR("vector subscript out of range");
            _SCL_SECURE_OUT_OF_RANGE;
            }

 #elif _ITERATOR_DEBUG_LEVEL == 1
        _SCL_SECURE_VALIDATE_RANGE(_Pos < size());
 #endif /* _ITERATOR_DEBUG_LEVEL */

1 个答案:

答案 0 :(得分:1)

如果你想测试某些东西,那就意味着你期望某种可预测的行为。使用vector :: operator []访问超出范围的项目会引爆未定义的行为。在Debug MS VS build的情况下,您可能会得到一个断言,但在Release版本中,任何事情都可能发生。所以测试operator []是没有意义的,实际上开发人员有责任确保传递的索引值是正确的。但是还有vector :: at()方法,如果传递的索引无效,则会抛出out_of_range异常,因此您可以像这样测试它:

TEST_METHOD(VectorOutOfRangeAccess_Test)
{
    auto out_of_range_thrown{false};
    try
    {
        ::std::vector< int > const values{0, 1, 2};
        values.at(3);
    }
    catch(::std::out_of_range const &)
    {
        out_of_range_thrown = true;
    }
    catch(...){}
    Assert::IsTrue(out_of_range_thrown);
}