2011-10-03 4 views
1

Je rencontre des problèmes lors de la configuration d'un exemple de test pour une classe de files d'attente que j'ai implémentée.Tests unitaires C++ avec cadre de test Visual Studio

Voici la classe de file d'attente:

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; 
    } 

Méthode d'essai:

[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"); 
    }; 

Je suis évidemment manque quelque chose, mon compte pour le la file d'attente n'est jamais incrémentée lorsque j'appelle la méthode add pour ajouter un élément à la file d'attente, mais les éléments sont bien ajoutés à la file d'attente.

Je compile ma classe de file d'attente dans une bibliothèque statique et j'y ajoute une référence dans mon projet de test.

Des idées pour lesquelles le nombre de ma file d'attente ne change jamais?

EDIT:

Je crée une file d'attente circulaire avec cette classe qui a un nombre maximal d'éléments définis par MAXQUEUE.

Ci-dessus, comment QueueInfoType est défini.

REMARQUE:

Lorsque je change la bibliothèque statique à un exécutable et ajouter void main() à mon queue.cpp et écrire du code pour tester les fonctions de la file d'attente, il fonctionne très bien et compte des rendements correctement. Y at-il quelque chose qui se passe quand il est utilisé comme bibliothèque statique par le projet de test?

+0

Pouvez-vous poster la sortie du test? Je suis un peu curieux de savoir quelle était la valeur de 'effective' quand elle a échoué. –

+0

'Failed TestNumItems QueueTest Assert.AreEqual a échoué. Attendu: <2>. Réel: <0>. La queue contenait: 0 items. »Pendant le débogage, la valeur de count ne change jamais, mais la valeur ou rear change. – NexAddo

+0

Comment 'QueueInfoType' est-il défini? –

Répondre

0

Je ne suis pas sûr, mais une classe de file doit être implémentés en utilisant des pointeurs, donc il n'y a pas une limite de taille, et vous pouvez utiliser quelque chose comme ça dans la fonction add aussi:

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

Donc la mise en œuvre est plus facile à comprendre, et à propos de votre erreur ... Je ne la trouve pas, ça peut marcher ... Je continuerai à réfléchir.

PD: désolé mon anglais

+0

En outre, il peut être utile de vérifier 'isFull' avant d'ajouter un élément et' isEmpty' avant d'en supprimer un. –

+0

Je suis désolé de ne pas vous suivre ici, comment votre implémentation utilise-t-elle les pointeurs plus que NexAddo? Parlez-vous de tampons alloués dynamiquement en utilisant le mot clé 'new' ou' malloc'? si c'est le cas, il n'y a absolument rien qui stipule que c'est une exigence. –

0

Je pense que votre attendu devrait être "20".

De plus, remove renvoie un "float" mais cela devrait probablement être un QueueInfoType.

J'ai exécuté le test et cela a bien fonctionné (autre que tester 20 vs 2). Le réel était de 20 pour mon test.

De même, l'affectation de "x =" dans remove ne semble pas correcte.

+0

Pour moi, il est toujours égal à zéro pour 'q.numItems()' – NexAddo

0

Essayez de changer la boucle dans la routine de test:

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

Si vous finissez par obtenir un numéro différent pour votre compteur, puis est parce que vous êtes allé accidentellement hors des limites sur votre tableau et endommagé la pile .En raison de la façon dont les variables ont été définies, elles peuvent aboutir à des voisins sur la pile.

+0

'MAXQUEUE' est défini dans le fichier d'en-tête:' enum {MAXQUEUE = 80}; ' –

+0

C'est mon affichage noob. Je n'ai jamais eu à utiliser un 'enum {}' avant. –

Questions connexes