2011-10-03 4 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이 정의 된 방법입니다.

참고 : 나는 실행에 정적 라이브러리를 변경하고 제 queue.cpp에 void main()을 추가하고 큐의 기능을 테스트하는 코드를 작성할 때, 잘 작동하고 적절하게 수익을 계산

. 테스트 프로젝트가 정적 라이브러리로 사용될 때 어떤 일이 발생합니까?

+0

테스트 결과를 게시 할 수 있습니까? 나는'실제'의 가치가 실패했을 때의 가치에 대해 좀 궁금해합니다. –

+0

'Failed TestNumItems QueueTest Assert.AreEqual failed. 예상 : <2>. 실제 : <0>. queue has : 0 items' 디버깅하는 동안 count 값은 변경되지 않지만 값이나 후방 값은 변경됩니다. – NexAddo

+0

'QueueInfoType'은 어떻게 정의되어 있습니까? –

답변

0

나는 그 모르겠지만, 큐 클래스는 포인터를 사용하여 구현해야합니다, 그래서 거기에 크기 제한은 없으며, 당신도 추가 기능에서 그런 일을 사용할 수 있습니다

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

구현이 이해하기 쉽고 실수에 대해서 ... 찾지 못하면 효과가 있습니다 ... 계속 생각하겠습니다.

PD : 미안 내 영어

+0

또한 요소를 추가하기 전에'isFull'을 검사하고 요소를 제거하기 전에'isEmpty'를 검사 할 가치가 있습니다. –

+0

미안하지만 여기에 따라 오지 않아서, NexAddo 이상의 포인터를 사용하여 구현하는 방법은 무엇입니까? 'new' 키워드 또는'malloc'을 사용하여 동적으로 할당 된 버퍼에 대해 이야기하고 있습니까? 그렇다면 절대적으로 요구 사항이라는 것은 아무것도 없습니다. –

0

내가 생각하는 당신의 "20"이어야합니다 기대했다.

또한 remove는 "float"을 반환하지만 이는 아마도 QueueInfoType이어야합니다.

나는 테스트를 실시했는데 괜찮 았는데 (20 대 2를 테스트하는 것 이외에는). 실제는 20 점이었습니다.

또한 제거시 "x ="할당이 올바르게 보이지 않습니다.

+0

제게'q.numItems() '에 대해서 여전히 0으로 보여줍니다. – NexAddo

0

봅니다 변화에 테스트 루틴 for 루프 :

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

당신은 당신이 실수로 배열 범위를 벗어 가서 스택 손상 때문에 다음의를, 당신의 카운트 다른 번호를 그만 둘 경우 .변수가 정의 된 방법 때문에 스택에서 이웃을 끝낼 수 있습니다.

+0

헤더 파일에'MAXQUEUE'가 정의되어 있습니다 :'enum {MAXQUEUE = 80};' –

+0

그건 제 녀석이 보여주는 것입니다. 전에는'enum {} '을 사용하지 않았습니다. –

관련 문제