2009-01-27 7 views
8

Je pense que le concept de Python's doctests est brillant, et en tant que programmeur C++ dans un magasin en temps réel, je suis assez jaloux. Nous n'avons fondamentalement aucune capacité d'essai unitaire, ce qui constitue un obstacle important. J'ai vu C++ Unit, etc, mais y at-il quelque chose qui puisse extraire des cas de test de commentaires comme les doctests de Python plutôt que de les mettre directement dans le code?C++ équivalent aux doctests de Python?

Répondre

2

Je viens de jeter un oeil à doctest, c'est en effet génial. Ainsi est la facilité d'utilisation du langage Python.

Pour C++ cependant, vous ne trouverez probablement pas un tel outil.

Si l'un des tests échoue, vous pouvez vouloir déboguer ce qui se passe. Ce ne serait pas si simple que la source du cas de test ait été générée à partir de commentaires. Au lieu de cela, dans les frameworks de tests unitaires existants pour C++, vous avez la source des tests avec une syntaxe spéciale, qui est compilée et facile à déboguer. En outre, la génération de la source à partir des commentaires constituerait une autre étape supplémentaire de (pré) compilation, ce qui ne ferait que rendre la vie plus difficile.

Vous devriez accepter que le codage en C++ n'est pas un travail rapide comme c'est le cas en Python, donc le test unitaire est également un peu plus difficile. D'autre part vous avez plus d'outils, vous pouvez mettre des assertions statiques pour les relations de type, par exemple, ce qui est impossible en Python. Donc brièvement je pense que l'analogue du doctest Python pour C++ aurait tellement d'inconvénients par rapport aux outils existants, que personne n'a commencé à l'implémenter.

Si vous croyez vraiment qu'il peut être meilleur que les outils existants, veuillez fournir quelques exemples. Je crois à peine qu'il existe des cas de la vie réelle où il peut être plus utilisable.

+1

"Vous devriez accepter que le codage en C++ ne soit pas aussi rapide qu'en Python" cette attitude est exactement la raison pour laquelle l'utilisation de C++ fait encore mal. – Slava

0

Je pensais quelque chose dans le sens de générer des fichiers CxxTest à partir de commentaires. Je n'ai pas utilisé ce cadre, mais cela semble prometteur. De leur manual, un fichier de test unitaire ressemble à quelque chose comme ceci:

// MyTestSuite.h 
#include <cxxtest/TestSuite.h> 

class MyTestSuite : public CxxTest::TestSuite 
{ 
public: 
    void testAddition(void) 
    { 
     TS_ASSERT(1 + 1 > 1); 
     TS_ASSERT_EQUALS(1 + 1, 2); 
    } 
}; 

Ma proposition serait un analyseur qui extrait le contenu de ces fonctions Testx des commentaires, plutôt que d'avoir à écrire tout ça. Par exemple (et je fais juste la syntaxe de commentaire ici, il peut y avoir un moyen plus propre pour l'écrire):

// MyRegularCode.cpp 

/// Description of the function here 
/// Then test case below that gets extracted 
/// and turned into CxxTest .h files 
/**testAddition 
MyClass mc; 
mc.MyFunction(); 
TS_ASSERT(mc.m_value > 1); 
TS_ASSERT_EQUALS(mc.m_value, 3); 
**/ 
void MyClass::MyFunction() 
{ 
    m_value = 3; 
}; 

Je ne sais pas comment obtiendraient mis en œuvre les aspects les plus puissants de CxxTest, tels en tant que création d'appareils, mais quelque chose comme cela pourrait fournir l'ensemble des docstrings et doctests python dans le monde C++.

0

Je suis au courant de vieux trucs avec mettre les choses dans les commentaires de code réel (IIRC, cela fait partie de pratique de la programmation). Cependant, il peut être plus facile de simplement mettre les tests unitaires dans les blocs #ifdef. Vous pouvez généralement exécuter le préprocesseur par lui-même pour ce genre de chose.

Ensuite, je suis conscient de one project qui utilise Perl comme un préprocesseur super-duper.

0

La structure de test fournie avec Fost gère quelque chose de très similaire. Les tests ne seraient pas incorporés dans la documentation, mais ils pourraient être placés à côté du code qu'ils testent. Dans la structure, les tests sont très similaires au code cxxtest.

#include "myclass.hpp" 
#include <fost/test> 

FSL_TEST_SUITE(myclass); 

/* 
    Your documentation 
*/ 
FSL_TEST_FUNCTION(constructors) { 
    fostlib::test::default_constructable<myclass>(); 
} 
myclass::myclass() { 
} 

FSL_TEST_FUNCTION(some_method) { 
    myclass instance; 
    FSL_CHECK_NOTHROW(instance.some_method(0)); 
    FSL_CHECK_EQ(instance.some_method(2), 2); 
    FSL_CHECK_NEQ(instance.some_method(-2), 0); 
} 
int myclass::some_method(int arg) { 
    // implementation 
} 

Tout ce lot avec les se compile des tests embarqués (vous pouvez les supprimer de la construction via un #define - non mis en œuvre, mais facile à faire). Les tests sont ensuite exécutés via un programme séparé qui charge le .DLL ou .so qui a été construit, trouve les tests et les exécute. Nous ne l'avons pas essayé, mais il devrait fonctionner avec les bibliothèques statiques et charger et exécuter dynamiquement les tests trouvés dans les fichiers .EXE sous Windows, mais je suis moins sûr que cela puisse être fait comme ça sur Linux ou Mac.

3

Vous pourriez trouver cela utile. J'ai commencé à développer cela après avoir besoin de cela dans mon propre code.

http://github.com/panyam/DocTestPlusPlus

Il est un script python qui passe par vos commentaires et extraits des tests et génère des fichiers de test.

Encore en développement et test. Appréciez tous les commentaires.

acclamations Sri

4

Je viens de publier doctest - Le plus léger caractéristique riche unique framework de test d'en-tête C.

Ce n'est pas pour écrire des tests dans les commentaires - mais pour écrire des tests directement dans le code de production. Il ne correspond pas parfaitement à vos besoins mais c'est toujours la meilleure option en C++ sans étapes de pré-traitement