1

J'utilise VS2005 VC++ pour C++ non géré. Je VSTS et essaie d'utiliser l'outil de couverture de code pour accomplir deux choses en ce qui concerne les tests unitaires:Je veux dire au compilateur VC++ de compiler tout le code. Peut-il être fait?

  1. Voyez combien de mon code référencé sous test est CHAISE
  2. Voyez combien de méthodes de mon code l'essai (le cas échéant) ne sont pas du tout appareil testé

Configuration de l'outil de couverture de code VSTS (voir le link text) et l'accomplissement de la tâche # 1 était simple. Cependant # 2 a été un défi surprenant pour moi. Voici mon code de test.

class CodeCoverageTarget 
{ 
public: 
    std::string ThisMethodRuns() { 
     return "Running"; 
    } 

    std::string ThisMethodDoesNotRun() { 
     return "Not Running"; 
    } 
}; 



#include <iostream> 
#include "CodeCoverageTarget.h" 
using namespace std; 
int main() 

{ 
    CodeCoverageTarget cct; 
    cout<<cct.ThisMethodRuns()<<endl; 
} 

Lorsque les deux méthodes sont définies dans la classe comme au-dessus du compilateur élimine automatiquement le ThisMethodDoesNotRun() du fichier obj. Si je déplace sa définition en dehors de la classe, elle est incluse dans le fichier obj et l'outil de couverture de code montre qu'il n'a pas été exercé du tout. Dans la plupart des cas, je veux que le compilateur fasse cette élimination pour moi, mais pour l'outil de couverture de code, il détruit une partie significative de la valeur (par exemple, trouver des méthodes non testées). J'ai essayé un certain nombre de choses pour dire au compilateur d'arrêter d'être intelligent pour moi et de tout compiler, mais je suis perplexe. Ce serait bien si l'outil de couverture de code compensait cela (je suppose en balayant la source et en l'associant à la sortie de l'éditeur de liens) mais je n'ai rien trouvé pour suggérer qu'il a un mode spécial à activer. Ai-je complètement manqué quelque chose de simple ici ou n'est-ce pas possible avec le compilateur VC++ + l'outil de couverture de code VSTS?

Merci à l'avance, KGB

+0

J'ai posé une question connexe mais plus générique ici: http://stackoverflow.com/questions/307478/automated-dead-code-detection-in-native-c-application-on-windows –

Répondre

0

Désactiver des fonctions inline. La façon la plus simple de le faire est de simplement compiler en mode Debug.

Modifier: après avoir vu votre clarification, je trouve que ma réponse est erronée. Peut-être que si vous déplaciez le corps de la fonction dans une autre section du fichier .h, en utilisant le mot-clé "inline"?

0

Désolé je devrais avoir clarifié que je construis le mode de débogage avec l'inline et toute l'optimisation outre de. En outre, le code est enlevé avant que l'inline ne se produise, car il n'est jamais référencé pour être considéré comme inline.

1

Vous pouvez essayer d'ajouter une ligne de code pour appeler la fonction uniquement si certaines conditions sont vraies et garantir que cette condition ne sera jamais vraie. Assurez-vous simplement que le compilateur ne peut pas comprendre cela. Par exemple,


int main(int argc, char **argv) 
{ 
    if(argv == NULL) // C runtime says this won't happen 
    someMethodWhichIsntReallyEverCalled(); 
} 
+0

Le problème I J'essaie de résoudre ici est la détection des fonctions/enthodes qui ont déjà été écrites et ont été totalement oubliées dans le test unitaire. Cela devrait fonctionner, mais si je me souviens de faire cela, je me souviendrai probablement de tester la fonction aussi. Merci! Kevin –

0

Une autre option consiste à basculer entre en ligne et les fonctions non inline en fonction de votre construction, l'utilisation des fichiers .inl, comme ceci:

dans le fichier foo.inl:

inline std::string Foo::ThisMethodDoesNotRun() 
{ 
    return "Not Running"; 
} 

à foo.h:

#if !COVERAGE_BUILD 
#include "foo.inl" 
#endif 

dans foo.cpp:

#if COVERAGE_BUILD 
#define inline 
#include "foo.inl" 
#endif 
+0

Merci Don, Nous avons beaucoup de code hérité alors essayer de rééquiper serait un problème. Kevin –

1

Une façon de vous assurer que vos fonctions ne sont pas supprimées est de les exporter. Vous pouvez le faire en ajoutant __declspec(dllexport) à vos déclarations de fonction.Il est préférable de l'intégrer dans une macro de préprocesseur C afin de pouvoir l'arrêter, car il est spécifique au compilateur et vous ne souhaitez peut-être pas que toutes vos générations exportent des symboles. Une autre façon d'exporter des fonctions est de créer un .DEF file.

Si le problème est inhérent, vous pouvez également avoir un succès avec __declspec(noinline).

Votre code est-il dans une bibliothèque statique qui est ensuite compilée dans un test EXE/DLL? L'éditeur de liens supprimera automatiquement les fichiers objets non référencés qui se trouvent dans des bibliothèques statiques. Exemple: si la bibliothèque statique contient a.obj et b.obj et que l'EXE/DLL que vous liez dans les symboles de références de b.obj mais pas de a.obj, le contenu de a.obj ne sera pas lié à l'exécutable ou à la DLL. Cependant, après avoir relu votre description, il ne semble pas que ce soit ce qui se passe ici.

Questions connexes