Der Zusatzaufwand für automatische Tests lohnt sich in der Regel schon nach wenigen Releases. Die Tests helfen den Entwicklern dabei Fehler im Voraus zu vermeiden und den Quellcode gut zu strukturieren.
Manuelles Testing
Das Testing von umgesetzten Anforderungen nimmt immer eine gewisse Menge Zeit in Anspruch. Oft werden hierbei Fehler übersehen um z.B. Zeit zu sparen oder es werden nicht alle Testfälle "durchgespielt".Dieses "manuelle" Testing hat in der Regel weitere Releases zur Folge und der gesamte Test-Zyklus muss wiederholt werden. Dies kann dann für alle Beteiligten (Anforderer, Product Owner, Entwickler usw.) eine sehr stupide Tätigkeit werden. Hieraus ergibt sich die Empfehlung für die Einführung von automatischen Tests (Unit-Test).
Unit-Tests
Unit-Tests sind kleine Programme, welche die umgesetzten Anforderungen testen und prüfen, ob sie die Erwartungen der Anforderer erfüllen. Wichtig, jeder automatische Test sollte immer nur eine Eigenschaft einer Methode überprüfen (ein zu erwartender Output). Nichts desto trotz muss natürlich die jeweilige Methode vollständig (Verzweigungen, Sonderfälle usw.) getestet werden und so werden viele kleine Tests benötigt. Man spricht hierbei auch von vielen kleinen Einheiten (Units).Die Tests müssen zusätzlich zu den Anforderungen programmiert werden, so fallen bei einer "testgetrieben Entwicklung / Test Driven Development" höhere Aufwände an. Das Verständnis dafür sollte vorher beim Auftraggeber eingeholt werden.
Idealerweise stehen die Testfälle vorab für die Entwickler zusätzlich zu den Anforderungen (in der Regel als User Story beschrieben) bereit. So besteht die Möglichkeit zuerst die Unit-Tests zu entwickeln und im Nachgang erfolgt die Umsetzung des eigentlichen Quellcodes für die Anforderungen. Dies hilft den Entwicklern den Quellcode besser zu strukturieren und intuitive Ideen für die Umsetzung zu entwickeln. Ein weiterer Vorteil ist, dass jede Implementierung (Eincheken/Commit) bereits auf Basis der Unit-Tests überprüft wird. So können einzelne Funktionen (Features) gezielt umgesetzt werden, ohne die komplette Umsetzung der Anforderungen in Gänze in einem Schritt entwickeln zu müssen.
Werden im Anschluss die umgesetzten Funktionen in ihrer gesamten Komplexität getestet, spricht man von Integrationstests.
Siehe hierzu auch meinen Beitrag vom März 2018 "Softwaretest bei agiler Entwicklung durch Testautomatisierung".
Fazit
Wurde das Projekt mit automatischen Tests ausgestattet, ist das Entwickeln effizienter und macht mehr Spaß!So kann man zum Beispiel beim Refactoring schon sagen, welche Anpassungen am Quellcode notwendig sind, damit dieser korrekt funktioniert. Beim Einchecken einer Codeänderung in das Versionsverwaltungssystem werden die Tests gestartet und können den Commit z.B. automatisch zurückweisen (erstellen eines Issue), wenn diese fehlschlagen.
Gerade bei größeren Softwareentwicklungsprojekten zahlt sich der anfangs zusätzliche Aufwand im Nachgang wieder aus. Entwickler und Tester sparen mit jedem weiteren Release Zeit, das Refactoring wird optimiert und es treten zwangläufig weniger Fehler auf (im Vergleich zum manuellen Testing).