c++单元测试与Visual Studio测试框架

C++ unit testing with Visual Studio test framework

本文关键字:测试 框架 Studio Visual 单元测试 c++      更新时间:2023-10-16

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

下面是队列类:

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并编写代码来测试队列的功能时,它工作得很好并且计数返回正确。当它被测试项目用作静态库时,是否会发生一些事情?

我想你的期望应该是"20"。

此外,remove返回一个"float",但这应该是一个QueueInfoType。

我运行了测试,它工作得很好(除了测试20 vs 2)。我的测试实际是20。

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

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

所以实现更容易理解,关于你的错误…我找不到它,它可能有用……我将继续思考。

PD: sorry about my english

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

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

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