2010-12-08 15 views
2

Je suis vraiment nouveau pour les tests unitaires, et j'ai le programme vraiment de base suivante:C++ tests unitaires en utilisant Boost

#include "stdafx.h" 


// classes example 
#include <iostream> 
using namespace std; 

class CRectangle { 
    int x, y; 
    public: 
    void set_values (int,int); 
    int area() {return (x*y);} 
bool isEq(); 
}; 

void CRectangle::set_values (int a, int b) { 
    x = a; 
    y = b; 
} 

bool CRectangle::isEq() { 
    if(x==y) 
    { 
    return true; 
    } 
    else 
    { 
    return false; 
    } 


} 
int main() { 
    CRectangle rect; 
    rect.set_values (3,3); 
    cout << "area: " << rect.area(); 
    cout << " isEq: " << rect.isEq() << " \n"; 
    return 0; 
} 

Je veux savoir comment puis-je tester la méthode isEq? Je veux 100% de couverture de code de cette méthode et je veux utiliser le cadre de test Boost. Des idées? J'utilise VS 2009 SP1, que puis-je construire et exécuter? Je suis très confus avec les tests unitaires.

MISE À JOUR:

Merci Stuart, mais ce que Im faire est toujours pas donner un sens. Je sais avoir le code suivant avec les noms de fichiers suivants:

//FILENAME: test.cpp 
#include "stdafx.h" 
#define BOOST_TEST_MODULE isEq Test 
#include <boost/test/included/unit_test.hpp> 
#include "CRectangle.h" 

BOOST_AUTO_TEST_CASE(isEq_test) 
{ 
    CRectangle rect; 
    rect.set_values(5,5); 
    BOOST_CHECK_EQUAL(rect.isEq(), true); 
    rect.set_values(23,9); 
    BOOST_CHECK_EQUAL(rect.isEq(), false); 
} 

// FILENAME: CRectangle.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "CRectangle.h" 
//#include <boost/test/included/unit_test.hpp> 

// classes example 
#include <iostream> 
using namespace std; 


void CRectangle::set_values (int a, int b) { 
    x = a; 
    y = b; 
} 

bool CRectangle::isEq() { 
    if(x==y) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 


} 

int main() { 
CRectangle rect; 
rect.set_values (3,3); 
cout << "area: " << rect.area(); 
cout << " isEq: " << rect.isEq() << " \n"; 
return 0; 
} 

//FILENAME: CRectangle.h 
//void CRectangle::set_values (int a, int b); 
//bool CRectangle::isEq(); 

#ifndef CRECTANGLE_H 
#define CRECTANGLE_H 

class CRectangle { 
    int x, y; 
    public: 
    void set_values (int,int); 
    int area() {return (x*y);} 
    bool isEq(); 
}; 


#endif 

// FILENAME: stdafx.h : include file for standard system include files, 
// or project specific include files that are used frequently, but 
// are changed infrequently 
// 

#pragma once 

#include "targetver.h" 

#include <stdio.h> 
#include <tchar.h> 



// TODO: reference additional headers your program requires here 
#ifdef _UT 
#define ut_private public 
#define ut_protected public 
#else 
#define ut_private private 
#define ut_protected protected 
#endif 

Je veux vous rappeler que je suis en utilisant Visual Studio 2008 SP1 (Exécution de ce projet en tant qu'application console Win32). Chaque fois que je construis les fichiers suivants, il me donne des erreurs. Je ne sais pas non plus comment le Boost lib est censé me donner les résultats de mon test ??? Est-ce qu'une nouvelle fenêtre s'ouvrira ??? Que va-t-il se passer exactement?

Répondre

4

La façon la plus simple de le tester est de faire quelque chose comme ça (je ne cherche pas à écrire de grands cas de test, je vais laisser ça à vous):

#define BOOST_TEST_MODULE isEq Test 
#include <boost/test/included/unit_test.hpp> 

#include "CRectangle.h" 

BOOST_AUTO_TEST_CASE(isEq_test) 
{ 
    CRectangle rect; 
    rect.set_values(5,5); 
    BOOST_CHECK_EQUAL(rect.isEq(), true); 
    rect.set_values(23,9); 
    BOOST_CHECK_EQUAL(rect.isEq(), false); 
} 

Pas besoin de construire Boost. Testez si vous faites cela, vous suffit d'inclure l'en-tête et vous partez. J'espère que ça aidera un peu!

p.s. En aparté, vous pouvez choisir un schéma de nommage pour vos fonctions et de s'y tenir - ayant à la fois set_values et isEq semble un peu contradictoire, pour ce que ça vaut ...

+0

Merci pour votre réponse, mais je suis toujours confus, quel entête je suis destiné à inclure? Suis-je censé écrire le fichier d'en-tête moi-même. Je ne suis pas un programmeur C++ par métier, cependant je sais c relativement bien. – user531571

+0

Où puis-je mettre le code que vous avez écrit ci-dessus? Dois-je le mettre dans un autre fichier. Cpp? ou le même fichier que le code que j'ai écrit dans mon premier post (nom demonstration.cpp). Aussi, comment écrivez-vous mon fichier d'en-tête? – user531571

+0

Par "inclure l'en-tête", je voulais dire celui du code ci-dessus, c'est-à-dire "boost/test/included/unit_test.hpp".La façon dont j'ai structuré les choses était d'avoir une bibliothèque avec toutes les choses que je voulais tester, puis j'ai écrit le programme principal et un ensemble de programmes de tests unitaires qui étaient liés à la bibliothèque. Chaque programme de test unitaire ressemble un peu à ce qui précède, mais inclut le fichier d'en-tête de tout ce que vous essayez de tester, par exemple. '#include" CRectangle.h "'. Vous n'avez pas besoin d'une fonction 'main' dans vos programmes de test - Boost.Test gère tout automatiquement - vous avez juste besoin d'écrire le genre de chose montré ci-dessus. –

2

Pour continuer la réponse:

la classe et les fonctions dans le fichier source doivent être exportés, de sorte qu'ils peuvent être utilisés dans le fichier de test unitaire comme suit:

//CRectangle.h

#define DLLEXPORT __declspec(dllexport) 

class DLLEXPORT CRectangle 
{ 
... 
} 

// CRectangle.cpp 

void DLLEXPORT CRectangle::set_values (int a, int b) 
{ 
... 
} 

bool DLLEXPORT CRectangle::isEq() 
{ 
.. 
} 

sur la compilation du sourc CRectangle e.lib.

Enfin lier le programme Unit Test avec source.lib, inclure "CRectangle.h" et appeler les fonctions dans CRectangle.

Espérons que cela aide ..