2011-10-03 268 views
1

我有一些問題爲我實現的隊列類設置了一個樣本測試。使用Visual Studio測試框架進行C++單元測試

這裏是隊列類:

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並編寫代碼來測試隊列的功能,它工作得很好,並正確計算收益。當測試項目將其用作靜態庫時,是否發生了一些情況?

+0

你可以發佈測試的輸出嗎?我有點好奇,「實際」的價值是什麼時候失敗了。 –

+0

'失敗的TestNumItems QueueTest Assert.AreEqual失敗。預計:<2>。實際:<0>。隊列有:0個項目。「調試時,計數值永遠不會改變,但值或後面確實會改變。 – NexAddo

+0

如何定義QueueInfoType? –

回答

0

我不知道這一點,但一個隊列類必須使用指針來實現,所以沒有大小限制,可以在添加功能使用類似的東西太多:

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

因此,實現更容易理解,並且關於您的錯誤...我找不到它,它可能工作...我會繼續思考。

PD:對不起我的英語

+0

另外,在刪除一個元素和「isEmpty」之前,可能需要檢查'isFull'。 –

+0

對不起,我不太關注你,你怎麼使用比NexAddo更多的指針?你是在用'new'關鍵字還是'malloc'來談論動態分配的緩衝區?如果是的話,那絕對沒有什麼說明這是一項要求。 –

0

我認爲你的預期應該是「20」。

此外,刪除正在返回一個「浮動」,但應該可能是一個QueueInfoType。

我跑了測試,它工作正常(除了測試20 vs 2)。我的測試實際是20。

此外,刪除中的「x =」的分配看起來不正確。

+0

對我來說,它仍然顯示爲'q.numItems()' – NexAddo

0

嘗試改變for循環測試例程:

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

如果你最終得到不同數量的爲您計數,那麼它的,因爲你不小心出去陣列上界,破壞了堆。由於變量是如何定義的,它們可能會在堆棧中結束鄰居。

+0

'MAXQUEUE'在頭文件中定義爲'enum {MAXQUEUE = 80};' –

+0

這是我的菜單顯示。我從來沒有必須使用'enum {}''。 –

相關問題