使用Visual Studio测试框架进行C ++单元测试

时间:2011-10-03 17:14:28

标签: c++ vs-unit-testing-framework

我在为我实现的队列类设置示例测试时遇到了一些问题。

这是队列类:

Queue.h:

    typedef float QueueInfoType;
    QueueInfoType x;
    class Queue
    {
      public:
        Queue(){front = rear = count = 0;}

        bool isEmpty();

        bool isFull();

        void add(QueueInfoType x);

        float remove();

        int numItems();

        enum {MAXQUEUE = 80};

      private:
        QueueInfoType values[MAXQUEUE];
        int front, rear, count;
    };

Queue.cpp:

    bool Queue::isEmpty()
    {
      return front == rear;
    }

    bool Queue::isFull()
    {
      return count >= MAXQUEUE;
    }

    void Queue::add(QueueInfoType x)
    {
      values[rear = (rear + 1) % MAXQUEUE] = x;
      count = count + 1;
    }

    float Queue::remove()
    {
      count = count - 1;
      return x = values[front = (front + 1) % MAXQUEUE];
    }

    int Queue::numItems()
    {
      return count;
    }

测试方法:

    [TestMethod]
    void TestNumItems()
    {
        Queue q;
        for(int i = 0; i < 20; i++)
        {
            q.add(i);
        }
        int expected = 2;
        int actual = q.numItems();
        Assert::AreEqual(expected, actual,  "queue had: " + actual + " items");
    };

我显然遗漏了一些东西,当我调用add方法将一个项目添加到队列时,我对队列的计数从不递增,但是项目被添加到队列中。

我正在静态库中编译我的队列类,并在我的测试项目中添加对它的引用。

为什么我的队列计数永远不会改变的任何想法?

修改

我正在使用此类创建一个循环队列,该队列具有由MAXQUEUE定义的最大项目数。

以上是QueueInfoType的定义方式。

注意:

当我将静态库更改为可执行文件并将void main()添加到我的queue.cpp并编写代码来测试队列的函数时,它运行正常并且计数返回正常。当它被测试项目用作静态库时会发生什么吗?

3 个答案:

答案 0 :(得分:0)

我不确定,但是必须使用指针实现队列类,所以没有大小限制,你也可以在add函数中使用类似的东西:

void Queue::add(QueueInfoType x)
{
  count++;
  values[count] = x;
}

因此,实施更容易理解,而且关于你的错误......我找不到它,它可能有用......我会继续思考。

PD:抱歉我的英文

答案 1 :(得分:0)

我认为你的预期应该是“20”。

另外,remove正在返回一个“float”,但它应该是一个QueueInfoType。

我运行测试并且工作正常(除了测试20 vs 2)。我的考试实际是20分。

此外,删除中“x =”的分配似乎不正确。

答案 2 :(得分:0)

尝试将测试例程中的for循环更改为:

    for(int i = 0; i < 20; i++)
    {
        q.add(i + 100);
    }

如果您最终得到一个不同的数字,那么它是因为您不小心超出了阵列并损坏了堆栈。由于变量的定义方式,它们可能最终成为堆栈上的邻居。