2016-02-24 3 views
5

J'utilise VS 2015 Enterprise et j'ai effectué un test unitaire générique pour analyser la couverture de code. Je regarde la liste des blocs couverts par fonction, et ils semblent généralement corrects. Cependant, lorsque je clique avec le bouton droit sur une méthode -> "Aller au code source", sur certaines fonctions il va à l'endroit correct dans le code source (le fichier .cpp pertinent), mais sur d'autres essaye d'ouvrir le fichier d'en-tête le numéro de ligne source est correct, mais le code est dans le fichier .cpp - pas le fichier .h). Cela affecte la mise en évidence du code source - les fonctions que VS pense être en .h ne sont pas mises en évidence dans le fichier .cpp. Je ne peux pas déterminer de différence dans les fonctions (même visibilité, même en-tête et fichiers sources), sauf peut-être sur quel thread ils sont appelés. Une idée de pourquoi VS pense que du code est en .h plutôt que .cpp?Couverture de code de Visual Studio 2015 Mauvais fichier

+0

[mcve] aiderait. Utilisez-vous des fonctions modélisées? – AndyG

+0

Je suis d'accord. Aucune fonction de modèle. – Jeff

+0

Le projet x64 ou x86? Je rappelle qu'il y a des problèmes avec x64. – AndyG

Répondre

0

Apparemment, même si VS 2015 prend en charge la fonctionnalité C++ 11 non-static data member initializers (compile correctement), l'outil de couverture s'interrompt sur cette fonctionnalité. Voici le MCVE. J'utilise VS 14.0.24720.00 Update 1. Pour reproduire, compilez ce programme puis obtenez une couverture de code en l'exécutant en utilisant un Generic Test. Si x est initialisé, l'outil de couverture recherche le code du constructeur dans le fichier .h. Si vous supprimez = 0, il identifie correctement la définition du constructeur comme dans le fichier .cpp. Dans mon code de produit, ce n'était pas le constructeur, mais des fonctions apparemment aléatoires que l'outil de couverture pensait avoir été définies dans le fichier .h. Le correctif, dans mon cas, consistait simplement à déplacer l'initialisation des membres de données vers la liste d'initialisation du constructeur.

//.h 
class Test 
{ 
public: 
    Test(); 
    ~Test(); 

    void Func1(); 

    void Func2(); 

    void Func3(); 

    int x = 0; 
}; 

.

// .cpp 
#include "Test.h" 

#include <iostream> 

Test::Test() 
{ 
    std::cout << "in Test()" << std::endl; 
} 

Test::~Test() 
{ 
} 

void Test::Func1() 
{ 
    std::cout << "in Func1" << std::endl; 

    Func2(); 

    Func3(); 
} 

void Test::Func2() 
{ 
    std::cout << "in Func2" << std::endl; 
} 

void Test::Func3() 
{ 
    std::cout << "in Func3" << std::endl; 
}