2009-07-23 4 views
0

Ich habe ein persistentes Objekt mit 7 relevanten Feldern.Wie würden Sie etwas testen, das komplexe Objekte filtert

Die Felder können die Anzahl der Werte halten hier aufgelistet:

Field # of Possible Values 
1  5 
2  20 
3  2 
4  2 
5  19 
6  2 
7  8 

, die ein Potential für 121.600 einzigartige Objekte ist.

Bei dem getesteten Code handelt es sich um eine Anzahl von Filtern, die basierend auf den Werten ihrer Felder eine bestimmte Anzahl dieser Objekte abruft und sie dann zur Verwendung durch ein anderes System in eine Bin ablegt. Die Ablage ist trivial, getestet und funktioniert einwandfrei ... es ist nur so, dass die Filterung nicht funktioniert. Es scheint viele Randfälle zu geben, die nicht abgedeckt werden und viele Objekte werden in einen Behälter gestellt, wenn sie überhaupt nicht ausgewählt werden sollten oder umgekehrt.

Alles in allem gibt es 9 Filter, die in einer Kette von Verantwortung arbeiten, wobei jeder Filter Objekte in einen Behälter legt, bis der Behälter voll ist, an welchem ​​Punkt die Kette austritt. Der letzte Filter in der Kette ist einfach ein "Filter", der eine E-Mail an einen Administrator sendet, der feststellt, dass die Objekte knapp sind (dh, wenn die Kette diesen Filter erreicht hat, dann ist die Bin nicht voll und muss etwas tun angeschaut werden).

Also mein Problem ist das: Wie teste ich diese Filter? Ich ein jeden einzelnen Objekttyp erstellen könnte eine Reihe von für Anweisungen mit:

public void FixtureSetup() 
{ 
    for(each possible value for field 1) 
    { 
     for(each possible value for field 2) 
     { 
      // ... continue with 5 more for statements 

      // Create Object with each value 
     } 
    } 
} 

Aber versuchen, manuell herauszufinden, was sollte aus den resultierenden Sammelobjekten richtig gefiltert werden (auch die Sammlung von gefilterten Objekten) wäre furchtbar schwierig (und wenn möglich, hätte ich es leicht gemacht, als ich zuerst die Filter schrieb).

Ich bin mir bewusst, dass die Anforderungen an Schuld, weil sie etwas sagen wie:

filter 1 gets 
    - field 1: values 1/2/3 
    - field 2: values 2/3/4 
    - etc. 

aber die Ergebnisse zeigen so viele Grenzfälle, dass jedes Mal, wenn ich es ändern, dass die speziellen Fall zu schließen, etwas sonst bricht (und ich habe keine Regressionstests, um sicherzustellen, dass dies nicht der Fall ist) und es ist schwierig herauszufinden, wo in der Kette das jeweilige Problem aufgetreten ist.

bearbeiten> Ich versuche, die Filter einzeln zu testen, jedoch gelten folgende Voraussetzungen:

Filter 1 Greifer 500 der 121.600 möglichen Objekte (nach den Kriterien des Filters). Ich finde das, sage 100 (vollständige Schätzung) der Objekte, die ergriffen werden, sollte nicht - und aus unterschiedlichen Gründen. Um das zu wissen, müsste ich jeden mit den Benutzern des anderen Systems durchgehen, um zu wissen, ob die Ergebnismenge jedes Filters korrekt ist. Das Gegenteil davon bleibt mir auch in Erinnerung ... was ist mit all dem Gegenstand, der hätte gegriffen werden sollen, aber nicht waren.

Ich fange an zu denken, dass dies ein Problem bei der Anforderungserfassung und nicht beim Testen sein könnte.

Antwort

6

Es klingt, als ob Sie keine klare Spezifikation haben.Wenn Sie keine klare Spezifikation haben, wie können Sie dann wissen, ob der Code gemäß Spezifikation funktioniert?

Machen Sie einen Schritt zurück. Beginnen Sie mit einem einem Satz spec schreiben:

Die FrobFilter Komponente nimmt eine Folge von Frobs und Orte jeder in der richtigen FrobBin bis ein Behälter voll ist.

OK, jetzt haben Sie eine Spezifikation. Es ist noch keine testbare oder implementierbare Spezifikation. Warum nicht? Zwei Gründe.

Grund 1: Die Konsequenz, dass kein FrobBin vor Ablauf der Frob-Sequenz aufgefüllt wurde, wurde nicht festgelegt.

Grund Zwei: "Korrekt" ist nicht angegeben.

Jetzt schreiben Sie eine Ein-Satz-Spezifikation, die jede Sorge anspricht.

Wenn die Sequenz endet, bevor ein Fach voll ist, wird der Administrator benachrichtigt.

Der richtige Behälter für einen Frob, so dass Blargh Gnusto ist, ist immer der FrotzBin.

OK, jetzt haben Sie zwei weitere Probleme. Wie wird der Administrator benachrichtigt? Und was passiert, wenn der Frob Blargh kein Gnusto ist?

Einfach weiter brechen, ein Satz nach dem anderen, bis Sie eine vollständige und genaue Spezifikation haben. Dann werden Sie finden, dass Ihre Spezifikation, das Programm, das implementiert, und die Testfälle sehen alle bemerkenswert ähnlich zueinander. Und das ist eine wunderbare Situation.

+0

Nur um Sie zu aktualisieren Eric: Ich tat dies tatsächlich und war in der Lage, das Problem und seine Lösung besser zu definieren. Vielen Dank. –

2

Es hört sich so an, als müssten Sie jeden dieser Filter einzeln testen, mit einem Mock-Filter "darunter", an den jeder angekettet werden soll.

Hoffentlich ist jeder der Filter einfach und kann einfach getestet werden.

Ich hätte dann ein paar Integrationstests für die ganze Sache, wenn es alles verdrahtet ist.

+0

Die Filter sind einfach, aber von Tag zu Tag werden sie komplexer, bis zu dem Punkt, an dem das Management dieser Komplexität mich umbringt. –

+1

Umso mehr Grund, die Filter einzeln zu testen, könnte man streiten. Viel Glück! :) –

Verwandte Themen