Es herrscht Krieg in der Galaxis und du hast als Entwickler der Imperialen Armee die Verantwortung für eine Datenbankapplikation übernommen. Die Dinge beginnen aus dem Ruder zu laufen, als ein mächtiger Sith-Lord eine Last-Minute Änderung einfordert…
Einführung in die Thematik automatisierter Selbst-Tests anhand eines konkreten Demo-Projekts im Star-Wars Universum mit Hilfe des Open-Source Frameworks utPLSQL v3.
Unter anderem wird auf die folgenden Fragen und Themen eingegangen:
- Was sind automatisierte Selbst-Tests und wozu sind sie gut?
- Warum sollte ich Zeit und Energie in die Entwicklung automatisierter Selbst-Tests für meine Datenbank investieren?
- Was gewinne ich dadurch und wie profitiert mein Projekt/Produkt?
- Demonstration von Techniken und Strategien zur Einführung von Selbst-Testing in bestehende (Legacy-)Projekte
- Beispiele, wie aussagekräftige, sinnvolle Tests aussehen können und welche Fallstricke man vermeiden sollte
- Einfaches Beispiel zur Entwicklung neuer Funktionen mittels Test-Driven-Development (TDD)
- Anregungen zum “Mindset” für Selbst-Tests
- Präsentation von Features, mit denen utPLSQL bei der Entwicklung zuverlässiger und automatisierbarer Tests helfen kann
1. Testing mit
Aber das hat gestern noch funktioniert
Samuel Nitsche
@Der_Pesse
derpesse@gmail.com
http://cleandatabase.wordpress.com
Senior Software Entwickler
bei Smart Enterprise Solutions, Pforzheim
Maintainer utPLSQL, Oracle ACE
Live-Code Beispiele:
https://github.com/pesse/sith-demo-db/tree/
apexconn19/presentation_stages
5. V_GROUPS
GROUP_NAME
1st Squad of 1st Platoon of
2nd Company of 5th Battalion
of 1st Brigade of 1st Division
Ehrung einer Soldaten-
Gruppe
Revan’s Ghosts
??
?
LEADER_NAME
LEADER_RANK_LABEL
17. Assault
Group 1
Division
1
Brigade 1
Division
2
Brigade 1
Batallion
1
Batallion
2
Company
1
Platoon
1
Company
2
Platoon
1
Platoon
2
Brigade 2
Division
3
Brigade 1
1st Platoon of 2nd Company of 2nd Batallion of 1st
Brigade of 2nd Division of 1st Assault Group
18. Position innerhalb übergeordneter Gruppe: 1
Label Gruppentyp: Platoon
Ehrenname: Revan‘s Ghosts
Result = Revan‘s Ghosts
Position innerhalb übergeordneter Gruppe: 1
Label Gruppentyp: Platoon
Ehrenname: NULL
Result = 1st Platoon
GET_GROUP_NAME
Automatisierte Tests sind “change detectors”, die uns bei Änderung bestehender Funktionalität warnen (unabhängig davon, ob diese Änderung gewollt ist oder - wie in unserem Beispiel - ungewollt)
Sie sind transportabel und beliebig oft (nahezu kostenlos) auf unterschiedlichen Systemen wiederholbar
Falls sie implementiert wurden, um Bugfixes zu bestätigen, schließen sie einmal aufgetretene Fehler aus
Sie können als Bestätigung dienen, dass vereinbarte Anforderungen an die Software erfüllt sind. Im agilen Umfeld können sie sehr hilfreich für die Definition of Done sein
Tests kosten auch etwas:
Initialer Aufwand (weit weniger als man denkt)
Wartung und Pflege
Build-Zeit
Energie/Mental Load
Gefahren:
Zu viel Noise vs. Zu wenig Signal
False Positives
Langsameres Feedback
Hilfreiche Fragen, um herauszufinden, welche Tests sich lohnen
Risiko
Wie gravierend sind die Folgen?
Wie wahrscheinlich ist es, dass ein bestimmter (Fehler-)Fall auftritt?
Nutzen
Welche neuen Informationen bietet mein Test?
Wie schnell würde ein Fehler behoben werden?
Änderungswahrscheinlichkeit
Wie oft wird sich der Code zukünftig ändern?
Wie selten wird sich die Funktionalität zukünftig ändern?
Kosteneffizienz
Wie schwierig bzw. aufwändig ist es, einen Test zu schreiben?
Wie schnell kann ein Test geschrieben werden?
Die Erstellung von Tests kann helfen, den Fokus vom wie auf das was zu verlagern und eine Funktionalität aus unterschiedlichen Perspektiven zu betrachten
Gut und verständlich geschriebene Tests können als Codebeispiel und Dokumentation dienen, wie eine Funktionalität zu verwenden ist
Selbst-Tests regen dazu an, „einfachere“ Programmierkonstrukte zu verwenden, da sich diese leichter testen lassen – was wiederum positive Auswirkungen auf die Wartbarkeit des Codes hat
Durch das Entwickeln von Tests erhöht sich in der Regel das Verständnis für das Problem, das man zu lösen versucht. Unit-Tests sind also auch eine sehr sinnvolle Methode, um sich einem Problem zu nähern und auszuprobieren.
Der aus meiner Sicht jedoch wichtigste Vorteil, den eine solide, automatisierte Testbasis bietet, ist, dass sie die Voraussetzung für die Entwickler*innen schafft, stetig und selbstbewusst den eigenen Quellcode zu verbessern, also ständiges Refactoring zu betreiben.