Das Bild soll den Erfolg durch Test driven Development darstellen. Es zeigt einen Dartpfeil im "Bull´s eye" einer Dartscheibe.

Softwareentwicklung

17.10.2024

Investitionen in Softwaretests: Für den Erfolg digitaler Projekte unverzichtbar

Profilbild von Lucas Falkowsky

Lucas Falkowsky

Fullstack Development

Eine komplexe Software zu schreiben, die 100% frei von Fehlern ist, ist nahezu unmöglich. Immer wieder treten sogenannte “Bugs”, also Fehler oder Störungen im Code auf, die dafür sorgen, dass das Programm nicht wie erwartet funktioniert. Was jedoch durchaus möglich ist, ist, den Code mittels Softwaretests so zu testen, dass es die meisten dieser Bugs nie zum Nutzer schaffen, sondern bereits vorher beseitigt werden. Und wer die richtigen Methoden hierfür von Beginn an beherzigt, wird am Ende mit einer fehlerresilienten und soliden Software belohnt.

<p dir="ltr">&ldquo;Ist die App nicht irgendwann fertig?&rdquo; - Diese Frage wird mir als Softwareentwickler bei typedigital h&auml;ufig seitens der Kunden gestellt. Diese Frage ist durchaus berechtigt, denn digitale Produktentwicklung, wie die von Apps, unterscheidet sich in Bezug auf die Finalisierung von Projekten ma&szlig;geblich von der Finalisierung klassischer Projekte. Zum Beispiel beendet ein Schreiner seine Arbeit mit einem funktionsf&auml;higen M&ouml;belst&uuml;ck, ein Maurer mit einem wetterfesten Rohbau und ein Koch mit einem Gericht, welches er zum Gast bringen l&auml;sst.</p> <p dir="ltr">Warum schaffen wir Softwareentwickler es nie, unsere Projekte so zu beenden, wie klassische Projekte beendet werden?</p> <p dir="ltr">Anstatt die Zahlreichen komplexen Interaktionen von unserem Code mit anderer Software, Hardware, externen Anbietern etc. aufzuschl&uuml;sseln, bietet folgendes Statement einen ersten Erkl&auml;rungsversuch:</p> <p dir="ltr">&ldquo;WhatsApp wird von Meta, dem Konzern hinter Instagram und Facebook&nbsp;gebaut und sogar die bekommen ihre Software nicht frei von Fehlern.&rdquo;</p> <p dir="ltr">Eine komplexe Software zu schreiben, die 100% frei von Fehlern ist, ist nahezu unm&ouml;glich. Immer wieder treten sogenannte &ldquo;Bugs&rdquo;, also Fehler oder St&ouml;rungen im Code auf, die daf&uuml;r sorgen, dass das Programm nicht wie erwartet funktioniert.</p> <p dir="ltr">Was jedoch durchaus m&ouml;glich ist, den Code mittels Softwaretests so zu testen, dass es die meisten dieser Bugs nie zum Nutzer schaffen, sondern bereits vorher beseitigt werden. Und wer die richtigen Methoden hierf&uuml;r von Beginn an beherzigt, wird am Ende mit einer Fehler-Resilienten und soliden Software belohnt.</p> <h2 dir="ltr">Test Driven Development</h2> <p dir="ltr">Der Begriff &ldquo;Test Driven Development&rdquo; sollte heute, in der Welt der IT, niemandem mehr fremd sein. Seinen Code auf anforderungsbasierte Tests zu st&uuml;tzen, verringert langfristig Kosten, da der Wartungsaufwand und die Dauer der Fehleranalyse stark reduziert werden.</p> <h2 dir="ltr">Automatisiertes Testing</h2> <p dir="ltr">Wenn in diesem Beitrag von Software-Testing gesprochen wird, sind vor allem automatisierte Tests gemeint. Das bedeutet, dass die Anforderungen an die Software in Form von Tests in den Code einflie&szlig;en. Diese Pr&uuml;fung von neu geschriebenem Code kann w&auml;hrend des Entwicklungsprozesses eingesetzt werden, um Fehler zu erkennen, bevor den Usern das Programm zur Verf&uuml;gung gestellt werden soll. Durch solch ein Vorgehen lassen sich laut Fr&uuml;hauf et al.&nbsp; &ldquo;85% der Fehler beseitigen&rdquo;&sup1;, und das f&uuml;r einen geringen Kostenaufwand. Zieht man in Betracht, dass Bugfixing wesentlich kostspieliger ist und Fehler in der Software die Nutzer-Erfahrung so einschr&auml;nken w&uuml;rden, dass die Nutzer das Produkt ablehnen k&ouml;nnten.</p> <h2 dir="ltr">Die Bausteine eines guten Testsystems</h2> <p dir="ltr">Als Agentur f&uuml;r digitale Produkte arbeiten wir in unserer Softwareabteilung mit drei unterschiedlichen Arten von Tests: Unit-Tests, Integration-Tests und System-Tests (End-to-End-Tests).</p> <p dir="ltr">Bei Unit-Tests geht es darum, einzelne Funktionen und Methoden unseres Programms isoliert zu testen, um die Funktionsf&auml;higkeit des Codes schnell und unkompliziert zu &uuml;berpr&uuml;fen.</p> <p dir="ltr">Der Nachteil ist hier, dass die Interaktion mit anderen Funktionalit&auml;ten letzten Endes trotzdem f&uuml;r Fehler sorgen k&ouml;nnte. Diese Interaktion zwischen Modulen und Services zu testen, bezeichnet man dann als Integration-Tests. Wir stellen sicher, dass unsere Komponenten richtig zusammenarbeiten und dass bei deren Interaktion das von uns gew&uuml;nschte Verhalten auftritt. Solche Tests zu schreiben dauert l&auml;nger, ist ein wenig komplexer und deckt hierbei trotzdem nicht alle m&ouml;glichen Interaktionen ab.</p> <p dir="ltr">Wollen wir sicherstellen, dass aus Sicht des Nutzers alles l&auml;uft wie gew&uuml;nscht, k&ouml;nnen wir auf Systemtests zur&uuml;ckgreifen. Bei dieser Art von Test pr&uuml;fen wir die Funktionalit&auml;t des Systems als Ganzes und dessen Interaktion mit externen Systemen. Somit k&ouml;nnen wir als Entwickler feststellen, ob alles funktioniert, ungeachtet der m&ouml;glichen Fehlerquellen, sollte der Test fehlschlagen.</p> <p dir="ltr">Fr&uuml;her wurde bei der Quantit&auml;t verschiedener Testarten oft das Modell der &ldquo;Testing Pyramide&rdquo; herangezogen, bei dem die Basis auf umfangreichen Unit-Tests lag, w&auml;hrend nach oben hin weniger Integration- und End-to-End-Tests stattfanden. Heute spricht man jedoch vermehrt vom &ldquo;Testing Pokal&rdquo;. Bei diesem Modell stehen Integrationstests im Vordergrund, w&auml;hrend die Anzahl an Unit-Tests verringert wird und End-to-End-Tests weiterhin oben angesiedelt sind. Dieser Wechsel zeigt den modernen Ansatz, in der Entwicklung auf umfassendere Tests zu bauen, die ein h&ouml;heres Ma&szlig; an Realit&auml;tsn&auml;he bieten. Jede dieser drei Testmethoden findet trotzdem seinen Anwendungsbereich und ein gutes Zusammenspiel aus Unit-, Integration- und System-Testing hilft uns dabei, die Fehleranf&auml;lligkeit unserer Software stark zu verringern.</p> <p dir="ltr"><img src="https://typedig.uber.space/assets/6f931982-2ad8-469d-9477-afd480fab0ab?width=1898&amp;height=1017" alt="Testing Methods"></p> <p dir="ltr"><em>Eine Testing-Gegen&uuml;berstellung des modernen Verfahrens "Testing-Pokal" vs. "Testing-Pyramide"</em></p> <h2 dir="ltr">Durch Tests Softwarequalit&auml;t verbessern</h2> <p dir="ltr">Jetzt, da klar ist, dass die Fehleranf&auml;lligkeit unserer Software durch gut geschriebene Tests sinkt, gehen wir darauf ein, was das f&uuml;r die Arbeit von Entwicklern bedeutet. Denn Tests helfen nicht nur dabei Fehler zu vermeiden, sondern auch, besseren Code zu schreiben.</p> <p dir="ltr">Anforderungsbasierte Tests haben zur Folge, dass der Code, der getestet wird, den vordefinierten Anforderungen auch gerecht wird. Und nicht nur das! Werden verschiedene Funktionalit&auml;ten beim Aufsetzen von Tests in kleinere Teile gegliedert, liegt es in der Natur der Sache, dass Programmierer letzten Endes auch ihren Code in Funktionen aufteilen, was die Lesbarkeit stark verbessert und potenzielle Refactorings, also das &Uuml;berarbeiten von Software, vereinfacht. Durch das nun testgetriebene Entwicklung des eigenen Codes und dessen Dokumentation in Tests (Tests dienen Entwicklern auch als eine Art Dokumentation von gew&uuml;nschtem Verhalten), schaffen wir es letzten endes auch, Duplikationen zu vermeiden, kontinuierliches Arbeiten an neuen Features zu vereinfachen und langfristig eine hohe Entwicklungsproduktivit&auml;t zu garantieren.</p> <h2 dir="ltr">Durch die richtigen Softwaretests langfristig Kosten sparen</h2> <p dir="ltr">Eine solide Software zu entwickeln ist mit Kosten verbunden und viele Auftraggeber:innen sind dazu verleitet, auf das Testen von Code zu verzichten, da hier Kosten eingespart werden sollen. Zieht man jedoch in Betracht, dass 75 - 80% der Ressourcen f&uuml;r die Entwicklung eines Systems in die Instandhaltung und Erweiterung flie&szlig;en&sup2;, sollte man in diesem Fall nicht am falschen Ende sparen.</p> <p dir="ltr">Ein Gro&szlig;teil der Arbeit an unserer Software beginnt nach dem ersten Release und diese Arbeit, effizient und kosteng&uuml;nstig zu gestalten, erfordert initial die zus&auml;tzlichen Kosten f&uuml;r Testing auf sich zu nehmen.</p> <p dir="ltr">Du hast Fragen zu deinem aktuellen Softwareprojekt? Dann nimm gern Kontakt mit uns auf! Wir unterst&uuml;tzen Dich gerne bei deinem Vorhaben.</p> <p dir="ltr">_ _ _</p> <h6>&sup1; Fr&uuml;hauf, K., Ludewig, J., Sandmayr, H. (1988). Qualit&auml;tssicherung. In: Software-Projektmanagement und -Qualit&auml;tssicherung. Leitf&auml;den der angewandten Informatik. Vieweg+Teubner Verlag, Wiesbaden. https://doi.org/10.1007/978-3-322-94671-3_5</h6> <h6>&sup2; <strong id="docs-internal-guid-63ae9ff4-7fff-9ec3-f346-f38d2f8f83f1">Lientz, B., Swanson, E., &amp; Tompkins, G. (1978). Characteristics of application software maintenance. Commun. ACM, 21, 466-471. https://doi.org/10.1145/359511.359522.</strong></h6>

Wir sind gespannt von deinem Projekt zu hören!

Profilbild von Andreas Kottre