Teil 3: Testen mit Faktor-IPS
Testfalltyp für Beitragsberechnung Hausrat
Für den Testfalltypen erweitern wir die Package-Struktur unterhalb des Sourcefolders "modell" im Projekt faktorips-tutorial-hausratmodell um das IPS-Package "test".
Mit dem Kontextmenü Neu ► Testfalltyp im Model Explorer legen wir einen neuen Testfalltypen an (alternativ können Testfalltypen auch über das Icon in der Toolbar angelegt werden):
Nachdem wir im folgenden Dialog den Namen des Testfalls BeitragsberechnungHausratTest definiert haben, öffnet sich der Editor für Testfalltypen (s. Abbildung 2). Auf der linken Seite sehen wir die (zunächst leere) Struktur des Testfalls, auf der rechten Seite jeweils die Details zu den Elementen der Struktur. Wir beginnen, die Struktur unseres Testfalls anzulegen. Testfalltypen werden in einer Baumstruktur erfasst. Zunächst werden wir also das Wurzelelement definieren. Dazu rufen wir mit Neu… den Wizard zum Anlegen von Testparametern auf. Zunächst müssen wir die Art des Testparameters bestimmen. Es gibt drei Arten von Testparametern (zunächst unabhängig davon, ob diese als Eingabeparameter oder erwartete Ergebnisse benutzt werden):
-
Vertragsteilklasse
-
Wert
-
Regel
Für unseren Testfalltyp, mit dem wir die Beitragsberechnung von Hausratverträgen testen wollen, wählen wir als Wurzelelement die Art Vertragsteiltyp:
Nun wählen wir als Datentyp unsere Vertragsteilklasse HausratVertrag. Der Name wird mit dem Namen des Datentypen vorbelegt, dies belassen wir für unser Beispiel auch so. Im Feld Typ können wir spezifizieren, welche Funktion der Parameter im Testfall hat:
-
Eingabe
Attribute der Vertragsteilklasse dienen ausschließlich als Eingabedaten für Testfälle -
Erwartetes Ergebnis
Attribute der Vertragsteilklasse dienen ausschließlich als erwartete Werte der Testfälle -
Eingabe und erwartetes Ergebnis
Attribute der Vertragsteilklasse können entweder Eingabeparameter oder erwarteter Wert sein
Für unser Beispiel wählen wir Eingabe und erwartetes Ergebnis als Parametertyp, da wir an den zu definierenden Hausratverträgen sowohl Eingabeparameter als auch das erwartete Ergebnis, in unserem Fall der berechnete Beitrag, definieren wollen:
Auf der nächsten Dialogseite des Wizards kann die Kardinalität der Parameter einschränkt werden (bei Wurzelparametern allerdings nicht weiter, es gibt immer genau einen). Zusätzlich kann spezifiziert werden, ob der Parameter im Test durch einen Produktbaustein konfiguriert werden muss. Wir setzen die Checkbox Benötigt Produktbaustein und bewirken damit, dass bei der Definition der Testfälle für jeden Hausratvertrag das zu verwendende Hausratprodukt spezifiziert werden muss:
Die Kardinalität und das Kennzeichen, ob eine Konfiguration durch einen Produktbaustein notwendig ist, kann natürlich auch noch nachträglich direkt im Testfalltyp-Editor geändert werden.
Nun gilt es zu spezifizieren, welche Attribute zu testen sind, und welche als Eingabeparameter dienen. Zunächst werden wir das Attribut nettobeitragZw als erwartetes Ergebnis der Testfälle anlegen. Hierzu wählen wir in der Strukturansicht (links) die Beziehung zur Vertragsteilklasse HausratVertrag aus und legen auf der rechten Seite mit Neu… ein neues Testattribut an, welches auf einer Vertragsklasse basiert:
Im folgenden Dialog können die Attribute der Vertragsteilklasse ausgewählt und in den Testfalltyp übernommen werden.
In unserem Fall erfassen wir die Parameter nettobeitragZw, versSumme, plz und zahlweise. Danach werden auf der Detail-Seite des Editors die Attribute und ihr Typ angezeigt. Das abgeleitete Attribut /nettobeitragZw wird automatisch mit dem Typ Erwartetes Ergebnis vorbelegt, die weiteren Attribute dienen uns als Eingabeparameter.
Jetzt erweitern wir die Struktur unseres Testfalltyps um alle weiteren notwendigen Elemente . Wir nehmen die Vertragsteilklassen HausratGrunddeckung und HausratZusatzdeckung in den Testfalltyp auf. Dazu markieren wir in der Struktur das Element HausratVertrag und erzeugen jeweils mit Neu… die Beziehungen HausratGrunddeckung und HausratZusatzdeckungen. Für HausratGrunddeckung wählen wir als Typ Eingabe, als Kardinalität 1..1 und setzen die Checkbox Benötigt Produktbaustein. Für die HausratZusatzdeckungen wählen wir als Type Eingabe, als Kardinalität 0..* und setzen ebenfalls die Checkbox Benötigt Produktbaustein. Zur Erinnerung: Die Auswahl der Checkbox bedeutet, dass die jeweilige Vertragsteilklasse im Testfall durch einen Produktbaustein konfiguriert werden muss. Wir werden dies später sehen, wenn wir einen Testfall anlegen.
Danach sollte der Testfalltyp-Editor so aussehen:
Damit haben wir definiert, dass mit unserem Testfalltyp eine Instanz eines Hausratvertrags, mit einer Grunddeckung und beliebig vielen Zusatzdeckungen getestet werden kann. Jede Vertragsteilklasse muss sich auf einen konkreten Produktbaustein beziehen.
Wenn wir den Testfalltypen speichern, wird im Source-Verzeichnis des Projekts faktorips-tutorial-hausratmodell im Package org.faktorips.tutorial.hausrat.model.test
eine zugehörige Java-Klasse generiert, die den Namen des Testfalltypen trägt, und in der wir die Testlogik implementieren. Wechseln wir auf den Package-Explorer und schauen uns zunächst die Struktur der generierten Klasse genauer an:
public class BeitragsberechnungHausratTest extends IpsTestCase2 {
//...
private HausratVertrag inputHausratVertrag;
private HausratVertrag erwartetHausratVertrag;
public void executeBusinessLogic() {
//...
}
public void executeAsserts(IpsTestResult result) {
// begin-user-code
// TODO : Hier muessen die durchzufuehrenden Pruefungen implementiert werden.
throw new RuntimeException(
"Keine Pruefungen vorhanden. Diese muessen in der Java-Klasse, die den Testfalltyp repraesentiert, implementiert werden.");
// end-user-code
}
}
-
Membervariablen
inputHausratVertrag
underwartetHausratVertrag
vom Typ HausratVertrag:
Da wir den Root-Parameter HausratVertrag als "Erwartetes Ergebnis und Eingabeparameter" festgelegt haben, sind zwei entsprechende Instanzvariablen angelegt worden.inputHausratVertrag
enthält die Eingabewerte des Testfalls, gemäß der Definition der Eingabewerte im Testfalltyp.erwartetHauratVertrag
enthält die im Testfall erwarteten Ergebnisse (gemäß der Definition im Testfalltyp). Zur Testfalllaufzeit haben wir so zwei Instanzen von HausratVertrag, die wir miteinander vergleichen können. -
leere Methode
executeBusinessLogic()
:
In dieser Methode wird die zu testende Geschäftslogik aufgerufen. Zum Beispiel durch Aufruf einer Methode auf den Eingabeobjekten (hierinputHausratVertrag
).Die Methode wird ausgeführt, bevor die MethodeexecuteAsserts(…)
aufgerufen wird. -
Testmethode
executeAsserts()
:
Hier wird der Vergleich von Ist- und Sollwerten implementiert. Zunächst ist hier eine Default-Implementierung generiert, die den Test fehlschlagen lässt, um eine Implementierung durch den Entwickler zu erzwingen.
Bevor wir die Klasse BeitragsberechnungHausratTest
abschließend implementieren, legen wir im nächsten Kapitel einen Testfall an, der auf unserem Testfalltyp basiert.