Ich habe noch nie Einheitentests aus verschiedenen Gründen geschrieben. Ich habe jetzt die Möglichkeit, Tests bequem zu schreiben, weil ich eine kleine App von Grund auf neu erstellen muss.Wie würden Sie in dieser Situation Unit Tests anwenden?
Allerdings bin ich ein wenig verwirrt. Die Anwendung soll einen Drucker mit einem Chipkartenleser verwenden, um Daten auf einer Chipkarte zu programmieren. Hier ist die Reihenfolge der Aktionen: Gerätekontext erstellen, Druckermodus einstellen, ein Dokument initialisieren, eine Karte in den Drucker einführen, mit einem Kartenleser verbinden, etwas auf die Karte schreiben, Karte herausziehen, Dokument beenden, entsorgen Gerätekontext.
Okay, Komponententests sollen eine Funktion für jeden Test testen, und jeder Test soll unabhängig vom Ergebnis anderer Tests laufen. Aber sehen wir mal - ich kann das Schreiben auf Smartcard nicht testen, wenn ich es nicht richtig im Drucker positioniert habe und wenn ich es nicht angeschlossen habe. Und ich kann das nicht per Software nachahmen - ich kann nur testen, ob das Schreiben wirklich passiert ist, wenn die echte Karte richtig positioniert und verbunden ist. Und wenn die Verbindung zur Karte fehlschlägt, gibt es keine Möglichkeit, das Schreiben auf die Karte zu testen - so ist das Testunabhängigkeitsprinzip gebrochen.
Bisher kam ich mit einem Test wie folgt auf (es gibt auch andere Test, der ‚richtigen‘ sind und andere Dinge testen zu)
[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");
}
Der Test funktioniert, aber die Prinzipien gebrochen werden - es testet mehrere Funktionen, und viele von ihnen. Und jede folgende Funktion hängt vom Ergebnis des vorherigen ab. Nun kommen wir zu der Frage: Wie sollte ich unter diesen Umständen auf Unit-Tests zugehen?
Jede Chance auf Zugriff auf die C# -Wrapper? Wir machen das gleiche, greifen jedoch auf VB6- und C++ - Code zurück. Würde es lieben, alles in einer besseren IDE und einem besseren Framework zu tun. – fuzz