Rolf b: Unit-Tests

Beitrag lesen

Das API ist zumindest mal merkwürdig. Auf Grund der gegeben Methoden erinnert es am ehesten an eine Queue (FIFO-Liste) mit folgender Semantik:

  • Add(Item i) hängt vorn einen Eintrag an die Queue
  • Get() liefert das älteste Element, löscht es aber nicht
  • Remove() löscht das älteste Element, liest es aber nicht

Vielleicht ist das tatsächlich spezifizierte Verhalten anders, jedenfalls musst Du die exakte Spec kennen, sonst kannst Du keine Tests machen. Dass Du ohne Einblick ins Objekt die meisten Tests nicht isoliert auf einer Methode machen kannst, ist normal, deswegen brauchst Du Dir keinen Kopf zu machen.

Unter der Annahme, dass ich das gewünschte Verhalten des Interface richtig erraten habe, hier mal ein paar Tests, die ich schreiben würde:

// Teste ob Add(null) das gewünschte Ergebnis liefert
object testObject = GetNewTestObject();
testObject.Add(null);
// Muss entweder funktionieren oder eine Exception werfen - hängt von der Impl oder Spec ab
// Teste, ob ein Add in eine leere 'Queue' das geAddete-Element liefert
object testObject = GetNewTestObject();
Item i = new Item();
testObject.Add(i);
Assert.AreSame(i, Get());
// Teste, ob FIFO-Verhalten vorliegt
object testObject = GetNewTestObject();
Item i1 = new Item();
Item i2 = new Item();
testObject.Add(i1);
testObject.Add(i2);
Assert.AreSame(i1, testObject.Get());
testObject.Remove();
Assert.AreSame(i2, testObject.Get());
// Teste, ob ein Get ohne zwischenzeitliches Remove reproduzierbar das gleiche Item liefert
object testObject = GetNewTestObject();
Item i1 = new Item();
Item i2 = new Item();
testObject.Add(i1);
testObject.Add(i2);
Assert.AreSame(i1, Get());
Assert.AreSame(i1, Get());

An der Stelle siehst Du schon, dass auch Tests geplant werden müssen. Die Aufgabe, ein TestObjekt zu erzeugen mit N Elementen in einer definierten Reihenfolge, wiederholt sich. Also: Funktion schreiben, gemeinsamen Code auslagern. Das Folgende ist C# Syntax, das musst Du natürlich für deinen Fall anpassen.

function Item[] FillTestobjectWithItems(TestObject t, int n)
{
   Item[] testItems = new Item[n];
   for (int i=0; i<n; i++)
   {
      testItems[i] = new Item();
      // Ggf. Item irgendwie idenfizierbar identifzieren
      t.Add(testItems[i]);      
   }
   return testItems;
}

Mit dieser Funktion vereinfacht sich Testfall 3 zu:

// Teste, ob FIFO-Verhalten vorliegt
TestObject testObject = GetNewTestObject();
Item[] testItems = FillTestobjectWithItems(testObject, 5);

for (int i=0; i<testItems.Length; i++)
{
   Assert.AreSame(testItems[i], testObject.Get();
   testObject.Remove();
}

Und so weiter und so weiter. Viel Spaß :)

Rolf