Voici l'approche que j'utilise pour tester le module IIS URL Rewrite de Microsoft (elle est basée sur la ligne de commande, mais devrait aussi fonctionner pour VS) :
- Assurez-vous que vos fichiers d'en-tête sont consommables en déplaçant le code source dans des fichiers cpp et en utilisant la déclaration forward si nécessaire.
- Compilez votre code pour le tester en tant que bibliothèque (.lib)
- Créez votre projet UnitTest en C++ avec le support CLR.
- Incluez vos fichiers d'en-tête.
- Incluez vos fichiers .lib.
- Ajouter une référence à Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
- Utilisez une très petite classe pour déclarer votre test unitaire et passez du code géré au code C++/Natif comme ceci (il peut y 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 sur le C++/CLI, tous les tests réels seront effectués en C++ natif et la classe TestShim sera utilisée pour "publier" le test à 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 d'astuces, tout simplement.
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^), ce qui permet de rester 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
0 votes
Google publie C++ Test Framework qui est très similaire aux cadres xUnit. http://code.google.com/p/googletest/
0 votes
Quel cadre avez-vous fini par utiliser ?
0 votes
En fait, je n'ai encore utilisé aucun d'entre eux. J'ai décidé que pour ce sur quoi je travaillais, les tests unitaires n'étaient pas l'utilisation la plus efficace du temps.