2010-05-07 10 views
2

J'ai le code C++/CLI et j'utilise la couverture de Code Suite Team Suite de Visual Studio 2008.Couverture partielle d'une instruction de retour en C++/CLI

L'en-tête de code:

// Library.h 

#pragma once 

#include <string> 

using namespace System; 

namespace Library 
{ 
    public ref class MyClass 
    { 
    public: 
    static void MyFoo(); 
    static std::string Foo(); 
    }; 
} 

La mise en œuvre du code:

#include "Library.h" 

using namespace Library; 
using namespace System; 

void MyClass::MyFoo() 
{ 
Foo(); 
} 

std::string MyClass::Foo() 
{ 
return std::string(); 
} 

J'ai un C# test unitaire, qui appelle MyClass.MyFoo():

[TestMethod] 
public void TestMethod1() 
{ 
    Library.MyClass.MyFoo(); 
} 

Pour une raison quelconque, je ne pas obtenir une couverture de code complet pour MyClass. La méthode Foo() a 3 blocs non couverts et 5 blocs couverts. Les crochets de fermeture (}) sont marqués en orange - partiellement recouverts. Je ne sais pas pourquoi il est partiellement couvert au lieu d'être entièrement couvert, et c'est ma question.

MyClass Code Coverage Print Screen http://img217.imageshack.us/img217/7664/myclasscoverage.png

MISE À JOUR

Un autre exemple:

tête:

// Library.h 

#pragma once 

using namespace System; 

namespace Library 
{ 
    struct MyStruct 
    { 
     int _number; 
    }; 

    public ref class MyClass 
    { 
    public: 
     static void MyFoo(); 
     static MyStruct* Foo(); 
    }; 
} 

Mise en œuvre:

#include "Library.h" 

using namespace Library; 
using namespace System; 

void MyClass::MyFoo() 
{ 
    delete Foo(); 
} 

MyStruct* MyClass::Foo() 
{ 
    return new MyStruct(); 
} 

Je reçois toujours la même couverture manquante dans l'instruction return de Foo.

Répondre

2

Vous ne couvrez pas le cas où la fonction sort par exception au lieu de normalement. Bien sûr, si vous ne pouvez même pas construire un std::string de longueur nulle alors votre programme est probablement allé trop loin pour la récupération, mais déterminer que cela dépasse la portée de l'analyse de couverture de code. EDIT: Afin d'améliorer la couverture, vous pouvez simuler un operator new global qui échoue basé sur un drapeau global (ou plus flexible, échoue sur la Nième allocation) que vous pouvez définir dans votre cas de test.

par exemple.

int allocation_failure = 0; 
void* operator new(size_t requestedbytes) 
{ 
    if (allocation_failure) { 
     if (!--allocation_failure) { 
      throw std::bad_alloc(); 
     } 
    } 
    void* retval = malloc(requestedBytes); 
    if (!retval) { 
     throw std::bad_alloc(); 
    } 
    return retval; 
} 

void operator delete(void* p) 
{ 
    if (p) free(p); 
} 

Ou vous pourriez ne pas conditionnellement les allocations d'une certaine taille, ou l'allocation Nième d'une taille particulière, etc., d'exercer tous les chemins possibles à travers votre code.

+0

Regardez le deuxième exemple que j'ai donné. Il n'utilise pas std :: string. – brickner

+2

Toute utilisation de 'new' peut échouer en lançant une exception. Votre scénario de test ne couvre pas le chemin exceptionnel. –

+0

J'étais douteuse, mais vous aviez raison. J'ai réussi à créer un code similaire à mon 2ème exemple et à le couvrir complètement en le faisant lancer une exception. Je ne pouvais pas complètement couvrir quelque chose qui renvoie std :: string, mais il semble que j'ai du mal à faire des exceptions dans tous les endroits possibles. Merci beaucoup! – brickner

1

[La divulgation complète: Je suis sur l'équipe qui aide à créer les outils de couverture de code VS]

Essayez la collecte couverture de code contre une accumulation de libération au lieu d'une version de débogage.

Le compilateur peut émettre IL qui est réellement inaccessible après que certaines optimisations/transformations ont été appliquées. Le moyen le plus simple de voir si c'est le cas est de regarder l'IL avec ildasm ou Reflector. Voir here pour un exemple.

+0

Juste par curiosité (puisque vous êtes ici :-P), savez-vous (ou pouvez-vous dire) si Microsoft à tout moment a l'intention de soutenir les tests et l'analyse de la couverture pour le C++ natif? Nous, les développeurs C++, nous nous sentons souvent laissés pour compte, avec toutes les nouvelles fonctionnalités de Visual Studio géniales .NET (bien que, de toute évidence, le profileur de code natif soit plutôt sympa). –

+0

Nous avons reçu beaucoup de commentaires sur la nécessité de mieux prendre en charge le code natif avec nos outils. Je ne peux pas parler de l'avenir du test natif (c'est une équipe différente), mais la couverture de code a fonctionné pour le code natif depuis VS2005 (comme le profileur). L'expérience n'est pas aussi polie qu'elle l'est pour la gestion, mais la fonctionnalité est là. Voir http://blogs.msdn.com/ms_joc/archive/2005/10/04/477166.aspx pour plus d'informations. –

+0

@Chris: Merci beaucoup pour le lien; Je n'avais aucune idée que c'était une fonctionnalité disponible. À partir de l'interface utilisateur graphique de Visual Studio, vous ne devineriez jamais que la couverture de code natif était prise en charge. Le manque de support de mise en évidence intégré est décevant, mais les mesures de couverture + sortie au format XML = un énorme plus. Impressionnant. –