"vector subscript out of range" 的 CppUnitTestFramework 和测试
CppUnitTestFramework and test for "vector subscript out of range"
我有一些代码想要测试。如果传递了错误的参数,我可以访问超出其范围的向量。我想测试这种情况。是否可以使用 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 */
如果您想测试某些东西,那么这意味着您期望某种可预测的行为。使用 vector::operator[] 访问超出范围的项目会引发未定义的行为。在 Debug MS VS build 的情况下,您可能会得到一个断言,但在 Release build 中,任何事情都可能发生。所以测试 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);
}
我有一些代码想要测试。如果传递了错误的参数,我可以访问超出其范围的向量。我想测试这种情况。是否可以使用 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 */
如果您想测试某些东西,那么这意味着您期望某种可预测的行为。使用 vector::operator[] 访问超出范围的项目会引发未定义的行为。在 Debug MS VS build 的情况下,您可能会得到一个断言,但在 Release build 中,任何事情都可能发生。所以测试 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);
}