Fitness für Akzeptanztest

„Akzeptanz wird über Wissen erworben und nicht verliehen.“

Justus Vogt

Bei großen Software Projekten aber auch bei den kleinen Programmen für die Töchter möchten die Kunden gerne eigene Akzeptanztests auf den fertiggestellten Systemen durchführen. Da auch bei den Testern das Interesse nach Automatisierung groß, aber die Programmierfähigkeiten gering sind, müssen entsprechende Werkzeuge her.

Ein auch für Laien beherrschbares System ist FitNesse, bei dem die Tester ihre Testfälle in Form von Wiki Tabellen editieren. Dabei steht üblicherweise jede Zeile in einer Tabelle für einen einzelnen Testdatensatz. 

Für das Ancestor Projekt benötigen meine Töchter einen Test, mit dem Personen in einer Gedcom Datei getestet werden können. 

Die hier dargestellte Wiki Seite enthält eine Tabelle für die entsprechenden Tests. Sie verwendet das Test System SLIM und eine Sammlung von Fixtures im Archiv genealogy-0.0.1.jar. Dazu aber später mehr.

In der ersten Zeile der Tabelle wird das verwendete Fixture für den Test, sowie der Name der verwendeten Gedcom Datei angegeben. In der zweiten Zeile werden die Namen der Eingangs- und Ausgangswerte für den Test angegeben. Bei der Testdurchführung werden dann mit Hilfe der Eingangswerte die berechneten Prüfwerte gegen die Ausgangswerte abgeglichen. In diesem Beispiel gibt es nur den Eingangswert name und die Ausgangswerte gender, father und mother. Die Namen der Ausgangswerte enden mit einem Fragezeichen. In allen weiteren Zeilen der Tabelle folgen dann die Werte der einzelnen Tests. 

 Die Tests werden mit dem Menüpunkt Test ausgeführt. Erfolgreiche Tests werden grün markiert und nicht erfolgreiche rot. In diesem nicht sehr didaktischen Beispiel laufen die Tests natürlich alle erfolgreich durch. 

Der Tester kann die Tabelle einfach ändern, um etwa bestehende Tests anzupassen oder neue Tests  hinzu zu fügen. Über den Menüpunkt EDIT gelangt man auf  die Bearbeitungsansicht, wie sie in vielen Wikis recht ähnlich implementiert ist.

<test page>
!define TEST_SYSTEM {slim} 
!path genealogy-0.0.1.jar

|de.schegge.genealogy.PersonFixture|base.ged|
|name|gender?|father?|mother?|
|Carsten /Rathkamp/|MALE|Johann /Brammerbusch/|Anna /Rathkamp/|
|Gesche /Helms/|FEMALE|Johann Friedrich /Hilbers/|Adelheid /Helms/|

Nach dem Ändern und Speichern der Seite können die Tests sofort vom Tester ausgeführt werden.

Damit die Tests funktionieren, müssen dem Tester entsprechende Fixtures zur Verfügung gestellt werden. Fixtures für SLIM sind einfache Java Klassen, mit Settern für die Eingangswerte und  Methoden für die Ausgangswerte.  Zusätzlich können diese Fixtures spezielle Methoden wie  execute und reset enthalten.

Bei jedem Testdurchlauf werden zuerst die vorhandenen Eingangswerte mit den Settern gesetzt, dann die execute Methode aufgerufen, die Ausgangswerte abgefragt und zum Schluss die reset Methode aufgerufen. 

Parameter die in der ersten Tabellenzeile stehen, werden an den Konstruktor des Fixtures übergeben und damit grundlegende Werte für alle Tests in der Tabelle festgelegt. Hier ist das der Name der zu verwendenen Gedcom Datei.

public class PersonFixture {
	private GedCom gedcom;
	private Optional<Person> person;
	private Optional<String> name;

	public PersonFixture(String archive) throws IOException {
		GedComReader reader = new GedComReader();
		gedcom = reader.read(new FileReader(archive));
		person = Optional.empty();
	}

	public void reset() {
		person = Optional.empty();
	}

	public void setName(String name) {
		this.name = Optional.ofNullable(name);
	}

	public void execute() {
		person = name.flatMap(gedcom::findPerson);
	}

	public String gender() {
		return person.map(Person::getSex).map(Objects::toString).orElse("");
	}

	public String father() {
		return person.map(Person::getFamily).map(Family::getHusband)
				.map(Person::getName).orElse("");
	}

	public String mother() {
		return person.map(Person::getFamily).map(Family::getWife)
				.map(Person::getName).orElse("");
	}
}

Hat ein Fixture nur einen einzelnen Ausgangswert, kann auf die execute Methode verzichtet werden. Dann wird der Test direkt in der Methode für den Ausgangswert durchgeführt. Enthält das Fixture keinen State, dann kann auf die reset Methode verzichtet werden.

Mit Hilfe von FitNesse können Tester ohne Programmierkenntnisse auf einfache Weise Akzeptanzests erstellen, ausführen und auswerten. Obwohl SLIM Fixtures als POJOs ohne den Einsatz von Interfaces oder Annotationen für Software Entwickler archaisch wirken, funktioniert das System jedoch ausgesprochen gut. Schöner wäre aber eine Test Engine für FitNesse, die mit JUnit 5 ParameterizedTests umgehen könnte.