推动测试案例混合结果

时间:2010-09-28 18:59:09

标签: c++ unit-testing

我目前正在练习测试驱动开发的编程风格,并试图记住我学到的一些有用的习语和异常安全规则。我已经使用了第一学期的旧编程任务来简单地解决问题,使用不应该用来感受它们的东西,了解它们各自的优点和缺点。你知道,练习。

我一直使用Boost_Unit_Test框架进行编码,到目前为止它一直很好(只有我尝试过的测试框架)。除此测试外:

BOOST_AUTO_TEST_CASE(CopyConstructor)
{
    Field *field = Field::EmptyField();
    PushValsToField(&field, 5);
    Field *field2 = new Field(*field);

    BOOST_REQUIRE_EQUAL(field->Size(), field2->Size());
    BOOST_REQUIRE_EQUAL((*field)[0], (*field2)[0]);
    BOOST_REQUIRE_EQUAL((*field)[1], (*field2)[1]);
    BOOST_REQUIRE_EQUAL((*field)[2], (*field2)[2]);
    BOOST_REQUIRE_EQUAL((*field)[3], (*field2)[3]);
    BOOST_REQUIRE_EQUAL((*field)[4], (*field2)[4]);
    // Error with BOOST_EQUAL_REQUIRE_COLLECTIONS
    BOOST_REQUIRE_EQUAL_COLLECTIONS(&(*field)[0], &(*field)[5],
                                    &(*field2)[0], &(*field)[5]);
    delete field;
    delete field2;
}

我不知道为什么,但是最后的比较([5])集合测试失败了。但是,其他测试通过。为什么最后一次测试失败了?

此外,任何风格指南或指针都会受到高度赞赏,但不在问题的范围内。

错误:

fatal error in "CopyConstructor": 

critical check { &(*field)[0], &(*field)[5] } == { &(*field2)[0], &(*field)[5] } failed. 

Collections size mismatch: 5 != 1073731817

实用信息和代码段

void PushValsToField(Field **field, int numPushes)
{
    for (int i(1); i <= numPushes; ++i)
        (*field)->Push_Back(i*10);
}

构造

Field *Field::EmptyField()
{
    return new Field();
}

Field::Field()
    : v_(new ElemType[10000]), vused_(0), vsize_(10000)
{}

Field::Field(const Field& other)
    : v_(h::NewCopy(other.v_, 
                    other.vsize_, 
                    other.vsize_)), 
      vused_(other.vused_), 
      vsize_(other.vsize_)
{}    

// Also available as a const& version
int& Field::operator[](int index) throw(const char *)
{
    if (index < 0 || index > vused_)
        throw "Index out of bounds.";
    else
        return v_[index];
}

复制功能

template <class T>
T *NewCopy( const T* src,
            size_t srcSize,
            size_t destSize)
{
    assert( destSize >= srcSize );

    T *dest = new T[destSize];
    try
    {
        std::copy(src, (src + srcSize), dest);
    }
    catch(...)
    {
        delete[] dest;
        throw;
    }

    return dest;
}

2 个答案:

答案 0 :(得分:2)

如果你的尺码是5,那么你的有效指数是不是0-4? 5将超出范围。我认为您的operator[]边界检查中有错误:

if (index < 0 || index > vused_)

......应该......

if (index < 0 || index >= vused_)

答案 1 :(得分:2)

BOOST_REQUIRE_EQUAL((*field)[0], (*field2)[0]); // one
BOOST_REQUIRE_EQUAL((*field)[1], (*field2)[1]); // two
BOOST_REQUIRE_EQUAL((*field)[2], (*field2)[2]); // three
BOOST_REQUIRE_EQUAL((*field)[3], (*field2)[3]); // four
BOOST_REQUIRE_EQUAL((*field)[4], (*field2)[4]); // five
BOOST_REQUIRE_EQUAL((*field)[5], (*field2)[5]); // wait, six?

计算您正在检查的元素数量,从零到五......它给你六个。但是你的收藏应该有五个元素。