Comment configurer les tests unitaires pour Visual Studio C ++


93

Je vais avoir du mal à trouver comment obtenir le cadre de tests mis en place et utilisable dans Visual Studio 2008 pour C++probablement avec la suite test intégré dans l' unité.

Tous les liens ou tutoriels seraient appréciés.


Google publie C ++ Test Framework qui est très similaire aux frameworks xUnit. http://code.google.com/p/googletest/
popopome

Quel framework avez-vous fini par utiliser?
Joakim Karlsson

en fait, je n'en ai toujours pas utilisé. J'ai décidé que ce que je travaillais sur les tests unitaires n'était pas l'utilisation la plus efficace du temps.
DShook

Réponses:


56

Cette page peut vous aider, elle passe en revue plusieurs frameworks de tests unitaires C ++:

  • CppUnit
  • Boost.Test
  • CppUnitLite
  • NanoCppUnit
  • Unité ++
  • CxxTest

Découvrez CPPUnitLite ou CPPUnitLite2 .

CPPUnitLite été créé par Michael Feathers, qui portait à l'origine JUnit de Java en C ++ en tant que CPPUnit (CPPUnit essaie d'imiter le modèle de développement de JUnit - mais C ++ manque des fonctionnalités de Java [par exemple, réflexion] pour le rendre facile à utiliser).

CPPUnitLite tente de créer un véritable framework de test de style C ++, pas un Java porté en C ++. (Je paraphrase le livre Working Effectively with Legacy Code de Feather ). CPPUnitLite2 semble être une autre réécriture, avec plus de fonctionnalités et de corrections de bogues.

Je suis également tombé sur UnitTest ++ qui comprend des éléments de CPPUnitLite2 et d'un autre cadre.

Microsoft a publié WinUnit .

Commander aussi Catch ou Doctest


2
Googletest est très similaire à boost :: test mais un peu plus facile à intégrer dans VS
Martin Beckett

3
Je suis surpris que Catch ne soit pas mentionné ici. Consultez également doctest - ma réimplémentation de Catch avec un grand accent sur la vitesse de compilation - consultez la FAQ pour voir ce qui est différent entre les deux
onqtam

1
@onqtam ne soyez pas trop surpris, cette question / réponse date de 2008! Vous avez ajouté des liens suggérés.
Aardvark

24

Il existe un moyen de tester le C ++ non managé à l'aide du framework de test intégré dans Visual Studio 2008 . Si vous créez un projet de test C ++, à l'aide de C ++ / CLI, vous pouvez ensuite effectuer des appels à une DLL non gérée. Vous devrez basculer la prise en charge du Common Language Runtime vers / clr à partir de / clr: safe si vous souhaitez tester du code qui a été écrit en C ++ non managé.

J'ai des détails étape par étape sur mon blog ici: http://msujaws.wordpress.com/2009/05/06/unit-testing-mfc-with-mstest/


1
Cela impose certaines restrictions à votre code C ++, j'ai au moins une base de code où essayer d'inclure ses en-têtes dans le code C ++ / CLI était plus problématique qu'il n'en valait la peine. Le grand avantage pour moi d'utiliser C ++ / CLI est que vous pouvez utiliser les tests paramétrés géniaux avec des attributs comme RowTest dans mbUnit / NUnit / xUnit.Net
Andy Dent

9

Voici l'approche que j'utilise pour tester le module de réécriture d'URL IIS chez Microsoft (il est basé sur la ligne de commande, mais devrait également fonctionner pour VS):

  1. Assurez-vous que vos fichiers d'en-tête sont consommables en déplaçant le code source vers les fichiers cpp et en utilisant la déclaration directe si nécessaire.
  2. Compilez votre code à tester en tant que bibliothèque (.lib)
  3. Créez votre projet UnitTest en C ++ avec le support CLR.
  4. Incluez vos fichiers d'en-tête.
  5. Incluez vos fichiers .lib.
  6. Ajouter une référence à Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
  7. Utilisez une très petite classe pour déclarer votre test unitaire et passez du code managé au code C ++ / natif comme celui-ci (peut avoir des fautes de frappe):

Voici un exemple:

// Example
#include "stdafx.h"
#include "mstest.h"

// Following code is native code.
#pragma unmanaged
void AddTwoNumbersTest() {
  // Arrange
  Adder yourNativeObject;
  int expected = 3;
  int actual;
  // Act
  actual = yourNativeObject.Add(1, 2);
  // Assert
  Assert::AreEqual(expected, actual, L"1 + 2 != 3");
}

// Following code is C++/CLI (Managed)
#pragma managed
using namespace Microsoft::VisualStudio::TestTools::UnitTesting;
[TestClass]
public ref class TestShim {
public:
  [TestMethod]
  void AddTwoNumbersTest() {
     // Just jump to C++ native code (above)
     ::AddTwoNumbersTest();
  }
};

Avec cette approche, les gens n'ont pas à apprendre trop de choses C ++ / CLI, tout le vrai test sera fait en C ++ natif et la classe TestShim sera utilisée pour `` publier '' le test sur MSTest.exe (ou le rendre visible ).

Pour ajouter de nouveaux tests, il suffit de déclarer une nouvelle méthode [TestMethod] void NewTest () {:: NewTest ();} et une nouvelle fonction native void NewTest (). Pas de macros, pas de trucs, sans détour.

Maintenant, le fichier heade est facultatif, mais il peut être utilisé pour exposer les méthodes de la classe Assert avec des signatures natives C ++ (par exemple wchar_t * au lieu de Stirng ^), vous pouvez donc le garder proche de C ++ et loin de C ++ / CLI :

Voici un exemple:

// Example
#pragma once
#pragma managed(push, on)
using namespace System;
class Assert {
public:
    static void AreEqual(int expected, int actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    static void AreEqual(int expected, int actual, PCWSTR pszMessage) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual, gcnew String(pszMe
ssage));
    }

    template<typename T>
    static void AreEqual(T expected, T actual) {
        Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual(expected, actual);
    }

    // Etcetera, other overloads...
}
#pragma managed(pop)

HTH


6

Personnellement, je préfère WinUnit car il ne m'oblige à rien écrire sauf pour mes tests (je construis un .dll comme test, pas un exe). Je viens de créer un projet, et je pointe WinUnit.exe vers mon répertoire de sortie de test et il exécute tout ce qu'il trouve. Vous pouvez télécharger le projet WinUnit ici . (MSDN vous oblige maintenant à télécharger l'intégralité du numéro, pas l'article. WinUnit est inclus dans.)


4

Le framework inclus avec VS9 est .NET, mais vous pouvez écrire des tests en C ++ / CLI, donc tant que vous êtes à l'aise pour apprendre certains ismes .NET, vous devriez être en mesure de tester la plupart des codes C ++.

boost.test et googletest semblent assez similaires, mais adaptés pour des utilisations légèrement différentes. Les deux ont un composant binaire, vous aurez donc besoin d'un projet supplémentaire dans votre solution pour compiler et exécuter les tests.

Le framework que nous utilisons est CxxTest , qui est beaucoup plus léger; c'est uniquement les en-têtes et utilise un script Perl (!) pour extraire les informations de la suite de tests de vos en-têtes (les suites héritent de CxxTest :: Base, tous les noms de vos méthodes de test commencent par "test"). Évidemment, cela nécessite que vous obteniez Perl d' une source ou d' une autre , ce qui ajoute une surcharge à la configuration de votre environnement de construction.


CxxTest peut utiliser python au lieu de perl
Martin Beckett

Vous devez également faire attention aux DLL requises par votre code - j'ai eu des problèmes avec NUnit et mbUnit lors du test du code C ++ / CLI, en essayant de charger les DLL.
Andy Dent

2

J'utilise UnitTest ++ .

Dans les années depuis que j'ai publié ce message, la source est passée de SourceForge à github. De plus, l' exemple de didacticiel est désormais plus indépendant - il n'entre pas du tout dans une configuration ou un projet mis en place.

Je doute que cela fonctionnera toujours pour Visual Studio 6 car les fichiers de projet sont maintenant créés via CMake. Si vous avez encore besoin du support de l'ancienne version, vous pouvez obtenir la dernière version disponible sous la branche SourceForge .


2

Les outils qui ont été mentionnés ici sont tous des outils de ligne de commande. Si vous recherchez une solution plus intégrée, jetez un œil à cfix studio , qui est un complément Visual Studio pour les tests unitaires C / C ++. Il est assez similaire à TestDriven.Net, mais pour C / C ++ (non géré) plutôt que .NET.


1

J'ai utilisé CppUnit avec VS2005 et Eclipse. Le wiki est très complet (surtout si vous êtes familier avec JUnit).


1

Je ne suis pas sûr à 100% de VS2008, mais je sais que le framework de test unitaire que Microsoft a livré dans VS2005 dans le cadre de leur Team Suite était uniquement pour .NET, pas C ++

J'ai aussi utilisé CppUnit et tout allait bien. À peu près identique à NUnit / JUnit / ainsi de suite.

Si vous avez utilisé boost, ils ont également une bibliothèque de tests unitaires

Les gars derrière boost ont de sérieux problèmes de codage, donc je dirais que leur cadre devrait être plutôt bon, mais ce n'est peut-être pas le plus convivial :-)


1

J'aime aussi le CxxTest pour les mêmes raisons. C'est un fichier d'en-tête uniquement, donc aucune liaison n'est requise. Vous n'êtes pas coincé avec Perl car il existe également un runner Python. Je vais bientôt passer en revue la bibliothèque Google. Le matériel Boost emporte trop d'autres bagages.


1

Le testeur d'unité pour Visual Studio 2008 est uniquement pour le code .NET pour autant que je sache.

J'ai utilisé CppUnit sur Visual Studio 2005 et je l'ai trouvé assez bon.

Autant que je me souvienne, la configuration était relativement indolore. Assurez-vous simplement que dans vos projets de test, l'éditeur de liens (Linker → Input → Additional Dependencies) inclut cppunitd.lib.

Ensuite, #include <cppunit/extensions/HelperMacros.h>dans votre en-tête.

Vous pouvez ensuite suivre les étapes de http://cppunit.sourceforge.net/doc/1.11.6/cppunit_cookbook.html pour faire fonctionner votre classe de test.


1

Je souffrais d'implémenter des tests unitaires pour une application C ++ non gérée dans un environnement Windows avec Visual Studio. J'ai donc réussi à surmonter et à rédiger un article comme guide étape par étape pour les tests unitaires d'applications C ++ non gérées. J'espère que cela peut vous aider.

Test unitaire pour C ++ non managé dans Visual Studio

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.