Je n'ai jamais écrit de tests unitaires auparavant, pour diverses raisons. J'ai maintenant la chance d'écrire des tests, confortablement, parce que j'ai une petite application à faire de toutes pièces.Comment appliqueriez-vous les tests unitaires dans cette situation?
Cependant, je suis un peu perplexe. L'application est supposée utiliser une imprimante avec un lecteur de carte à puce pour programmer des données sur une carte à puce. Voici donc la séquence des actions: créer le contexte de l'appareil, définir le mode de l'imprimante, initialiser un document, insérer une carte dans l'imprimante, se connecter à la carte avec un lecteur, écrire quelque chose sur la carte, sortir la carte, contexte de l'appareil. Bon, les tests unitaires sont censés tester une fonction pour chaque test, et chaque test est supposé fonctionner indépendamment du résultat d'autres tests. Mais voyons - je ne peux pas tester l'écriture sur une carte à puce si je ne l'ai pas positionnée correctement dans l'imprimante et si je ne me suis pas connectée à celle-ci. Et je ne peux pas me moquer de cela par un logiciel - je ne peux que tester si l'écriture s'est effectivement produite si la vraie carte est correctement positionnée et connectée. Et si la connexion à la carte échoue, il n'y a aucun moyen de tester l'écriture sur la carte - le principe d'indépendance du test est donc rompu.
Jusqu'à présent, je suis venu avec un test comme celui-ci (il y a aussi d'autres tests qui sont « bon » et tester d'autres choses)
[Test]
public void _WriteToSmartCard()
{
//start print job
printer = new DataCardPrinter();
reader = new SCMSmartCardReader();
di = DataCardPrinter.InitializeDI();
printer.CreateHDC();
Assert.AreNotEqual(printer.Hdc, 0, "Creating HDC Failed");
Assert.Greater(di.cbSize, 0);
int res = ICE_API.SetInteractiveMode(printer.Hdc, true);
Assert.Greater(res, 0, "Interactive Mode Failed");
res = ICE_API.StartDoc(printer.Hdc, ref di);
Assert.Greater(res, 0, "Start Document Failed");
res = ICE_API.StartPage(printer.Hdc);
Assert.Greater(res, 0, "Start Page Failed");
res = ICE_API.RotateCardSide(printer.Hdc, 1);
Assert.Greater(res, 0, "RotateCardSide Failed");
res = ICE_API.FeedCard(printer.Hdc, ICE_API.ICE_SMARTCARD_FRONT + ICE_API.ICE_GRAPHICS_FRONT);
Assert.Greater(res, 0, "FeedCard Failed");
bool bRes = reader.EstablishContext();
Assert.True(bRes, "EstablishContext Failed");
bRes = reader.ConnectToCard();
Assert.True(bRes, "Connect Failed");
bRes = reader.WriteToCard("123456");
Assert.True(bRes, "Write To Card Failed");
string read = reader.ReadFromCard();
Assert.AreEqual("123456", read, "Read From Card Failed");
bRes = reader.DisconnectFromCard();
Assert.True(bRes, "Disconnect Failde");
res = ICE_API.SmartCardContinue(printer.Hdc, ICE_API.ICE_SMART_CARD_GOOD);
Assert.Greater(res, 0, "SmartCardContinue Failed");
res = ICE_API.EndPage(printer.Hdc);
Assert.Greater(res, 0, "End Page Failed");
res = ICE_API.EndDoc(printer.Hdc);
Assert.Greater(res, 0, "End Document Failed");
}
Le test fonctionne, mais les principes sont brisés - il teste plusieurs fonctions, et beaucoup d'entre elles. Et chaque fonction suivante dépend du résultat de la précédente. Maintenant, nous arrivons à la question: Comment dois-je aborder les tests unitaires dans ces circonstances?
Une chance d'accéder à l'emballage C#? Nous faisons la même chose mais en recourant au code VB6 et C++. J'adorerais pouvoir tout faire dans un meilleur IDE et cadre. – fuzz