Komplexe Systeme wie ERPNext bringen einigen Testaufwand mit sich. Ein effizienter und zuverlässiger Testablauf ist deswegen enorm wichtig. Bei der K&K Software AG nutzen wir dafür sogenannte Unittests. Lesen Sie hier, was sich hinter dem Begriff verbirgt und welche Vorteile Unittests mitbringen.
Was ist ein Unittest?
Das Testen unserer Produkte ist nicht immer einfach. ERPNext ist ein komplexes System mit vielen eng ineinandergreifenden Funktionen. Außerdem arbeiten wir bei K&K Software an unseren Systemen iterativ und inkrementell nach dem Scrum-Prinzip. Das heißt, dass sich unsere Systeme in einem ständigen Wandel befinden: Zum einen entwickelt sich das ERPNext-Framework kontinuierlich weiter. Außerdem fügen wir immer wieder neue Teile zu den von uns gepflegten und entwickelten ERP-Systemen hinzu.
Während dieser konsistente Ausbau eine große Stärke von ERPNext und unserer agilen Arbeitsweise ist, weil man so stets flexibel bleibt und das System organisch mit den Anforderungen der Kunden wachsen kann, bringt es auch einen höheren Bedarf an Software-Tests mit. Wir möchten unseren Kunden schließlich immer ein voll funktionales System mit hoher Codequalität ausliefern.
Um den Testablauf effizienter zu gestalten, haben wir vor einiger Zeit damit angefangen, sogenannte Unittests (auch bekannt als Modultests oder Komponententests) einzuführen. Für das Setup des Tests brauchen wir initial etwas Zeit, weil er individuell für jeden Anwendungsfall erstellt werden muss. Er spart aber, wenn er erst einmal funktioniert, sehr viel Aufwand bei der Qualitätssicherung und sorgt für einen hochwertigeren Code.
Testautomatisierung mit Unittests schnell erklärt
Unittests sind kleine Programmfunktionen, die wir spezifisch und individuell für die Anwendungsfälle unserer Kunden entwickeln. Ausgehend von einem festgelegten Startzustand führt die Funktion eine Kette festgelegter Funktionen aus. Anschließend prüft sie, ob ein erwartetes Ergebnis herauskommt. Wurde der erwartete Endzustand nicht erreicht, dann bedeutet das, dass etwas nicht so läuft, wie wir es erwarten. Auf diese Art kann man gerade in komplexen Systemen wie ERPNext schnell überprüfen, ob alle Zahnräder richtig ineinandergreifen.
Damit man sich sicher sein kann, dass diese Fehler im System begründet sind, muss die Testumgebung sauber sein. Das heißt, dass Untittests zwei besondere Anforderungen an die Entwickler stellen: Zum einen müssen wir eine saubere Testumgebung sicherstellen, zum anderen den Test so entwickeln, dass er aussagekräftige Ergebnisse produziert.
Deswegen dauert es immer ein wenig, bis wir einen Unittest geschrieben haben. Die Vorteile liegen aber auf der Hand: Haben wir den Test geschrieben, kann er nach jedem relevanten Update automatisch ausgeführt werden, ohne neu geschrieben werden zu müssen. Das spart unserer Qualitätssicherung enorm viel Zeit, weil man nicht bei jedem Update oder neuem Feature alles manuell testen muss, zum anderen garantiert der Test auch, dass die Funktionalität bestimmter Systeme regelmäßig überprüft wird.
Was testen wir mit einem Unittest?
Unttests können wegen ihres Designs nur bestimmte Aspekte eines ERP-Systems prüfen. Es geht nicht darum, ob es im Ganzen läuft. Dieser Prozess lässt sich schwer automatisieren. Stattdessen testen wir bei Unittests den unsichtbaren Unterbau des Systems. Unsere Qualitätssicherung stellt hier fest, ob bestimmte Komponenten (wie zum Beispiel die Berechnung von Steuern auf einen Artikel) richtig von ERPNext durchgeführt werden.
Im oberen Test wurde ein Fehler entdeckt. Unten ein erfolgreicher Test.
Wir können bei Unittests aber lediglich Berechnungen anstellen, die komplett in unserem ERPNext-System laufen. Müssten dazu, zum Beispiel über eine API, Daten von außerhalb hinzugezogen werden, wäre ein Unittest nicht möglich. Schließlich ist jedes andere System für uns eine Black Box, die uns lediglich Daten übergibt, wir haben also keinen Zugriff auf deren Fundament.
Um für die Testautomatisierung mit einem Unittest in Frage zu kommen, müssen die getesteten Komponenten also zwei Anforderungen erfüllen: Zum einen müssen sie so aufgebaut sein, dass wir am Ende klar erkennen können, ob die Komponente richtig oder falsch abgelaufen ist – zum Beispiel, wenn ein erwarteter Zahlenwert abweicht. Zum zweiten müssen alle Informationen und Berechnungen auf dem Testsystem laufen.
Von Intervallgrenzen und Extremfällen
Unittests können nur einen bestimmten Endzustand auslesen und überprüfen. Deshalb müssen wir uns schon im Vorfeld genau überlegen, wie man einen solchen Test modellieren kann, um ein möglichst aussagekräftiges Ergebnis zu erhalten. Wir nutzen dazu vor allem zwei Varianten, nämlich das Auslesen von Intervallgrenzen und die ‚Funktionsgarantie‘, die sich Extremfälle anschaut.
Manchmal hat man im System Komponenten, die erst ab einem bestimmten Punkt auslösen. Zum Beispiel kann ERPNext automatisch eine Warnung abgeben, wenn ein bestimmter Artikel unter eine festgelegte Stückzahl fällt, oder ein Mitarbeiter kann seine Urlaubstage aufbrauchen. Hier muss man nicht jeden einzelnen Wert überprüfen, sondern nur schauen, ob diese bestimmte Komponente einen anderen Wert ausgibt, wenn diese Grenze unterschritten und überschritten wird. Daraus lässt sich dann logisch schließen, dass alle anderen Werte in diesem Intervall auch funktionieren müssen.
Möchte man eine Funktion auf ihre zuverlässige Funktionalität prüfen, ist es sinnvoll, als Testwerte nicht die Grenze eines bestimmten Intervalls, sondern einen Extremwert zu nutzen. Die Logik dahinter ist, dass eine Funktion, die unter Extrembedingungen funktioniert, auch im Normalbetrieb problemlos laufen wird.
Zu Beginn werden User und Artikel automatisch erstellt.
Am Ende wird alles wieder rückabgewickelt.
Wie erstellen wir einen Unittest?
Schritt 1: Wir setzen ein Testsystem auf. Damit ein Test ohne Interferenzen laufen kann, erstellen wir zunächst ein sauberes Testsystem, also ein neues ERPNext-System. Auf dieser weißen Leinwand können wir genau die Funktionen, die wir testen wollen, durchführen. Im Anschluss an den Unittest setzen wir das ERP-System auf den Ausgangspunkt zurück, damit der nächste Test auch wieder auf einem sauberen System laufen kann.
Schritt 2: Wir legen die Funktion an. Zunächst einmal füttern wir das ERP-System mit allen nötigen Variablen, wie es in der Alltagspraxis der Fall wäre. Das heißt, die Funktion legt (je nach Test) Benutzer, Vorlagen, Artikel usw. an und trägt die für den Test relevanten Eigenschaften (z.B. Artikelgruppen) ein. Anschließend führt es die zu testende Komponente im System aus.
Schritt 3: Wir lesen die Ergebnisse aus. Im Sinne der Testautomatisierung erfolgt das Auslesen und Bewerten der Ergebnisse dann ebenfalls automatisch. Zunächst legen wir schon in der Funktion ein erwartetes Ergebnis an. Das ist zum Beispiel ein bestimmter Artikelpreis, nachdem eine Steuer hinzugefügt wurde. Dann prüft der Test automatisch, ob das erwartete Ergebnis auch so im System steht. Das macht er mit schlichten assertTrue()-Funktionen. Das ist ein Stück Code, der automatisch eine von uns festgelegte Aussage (z.B. „Zahl X taucht an Stelle Y auf“) überprüft. Wenn das nicht der Fall ist, dann meldet uns der Test, dass etwas nicht stimmt.
Grundsätzlich sind Unittests auch erweiterbar. Man kann zum Beispiel mehrere Endzustände (also meherere assertTrue()-Funktionen) mit einem Unittest überprüfen. Es ist auch möglich, die Anzahl der zu überprüfenden Kompontenten innerhalb des gleichen ERP-Systems zu erhöhen und die Tests so erweitern. Da ein Unittest aber nur anzeigen kann, ob eine Funktion richtig durchgeführt wurde, aber nicht, wo im Zweifelsfall genau der Fehler liegt, ist es sinnvoll, seine Tests so exakt und fokussiert wie möglich zu gestalten.
Nochmal in aller Kürze
- Unittests sind automatisierte Tests, die vor allem bei sich oft verändernden Programmen testen, ob alle Komponenten noch richtig ineinander greifen.
- Dafür wird ein sauberes System aufgesetzt, und eine bestimmte Funktion wird durchgeführt. Entspricht das Ergebnis den Erwartungen, gilt der Test als bestanden.
- Unittests überprüfen den Unterbau eines Systems; sie sind so in der Lage, sofort zu erkennen, wenn bei einem Umbau versehentlich ein anderes Subsystem verändert wurde.
- Nur der Unterbau des jeweiligen Systems kann getestet werden; ist eine Komponente von Daten von Außerhalb (z.B. via APIs) abhängig, kann sie nicht durch Unittests überprüft werden.
- Unittests müssen zunächst von uns erstellt werden, was u.U. Zeit braucht; dafür sparen wir bei jedem Update wertvolle Testzeit und garantieren eine hohe Code-Qualität.
Wenn Sie weitere Fragen haben, oder denken, dass wir in unserem Artikel etwas übersehen haben, dann melden Sie sich doch einfach bei uns. Weitere Informationen über unseren Betrieb, sowie Kontaktdaten finden Sie unten auf dieser Seite oder unter: https://erp-beratung.team/kontakt/.
Wenn Sie ERPNext in einer zwangloseren Umgebung ausprobieren möchten, dann nutzen Sie eines unterer Demosysteme: demo-magic.erp-beratung.team/.
Team K&K Software AG
Wir bei K&K arbeiten in einem interdisziplinären Team zusammen. Das ist wunderbar, da so viele unterschiedliche Denkansätze ins Unternehmen kommen. Unsere Erfahrungsberichte, Branchennews, Anleitungen und Sonstiges stellen wir regelmäßig in diesem Blog online.