Ein Dozent an der Hochschule hatte mal zu mir gesagt, dass man jede einzelne Zeile einer Software testen MUSS. Dies würde eine Testabdeckung von 100% ergeben. Ich habe mich schon damals gefragt, ob das wohl sinnvoll ist?
Aber wo liegt dann die richtige Balance beim Software Testing? Was ist zu wenig? Was ist zu viel? Diese Frage versuchen wir in diesem Blogbeitrag zu klären.
Doch bevor wir dazu kommen, möchten wir zunächst einige Testverfahren und Best Practices anschauen. Zum Schluss zeigen wir einen beispielhaften Entwicklungsprozess mit verschiedenen Testverfahren.
Testverfahren
In der Softwarebranche werden unterschiedliche Testverfahren angewendet, um Software auf verschiedene Arten zu testen. In diesem Beitrag werden wir nicht auf jedes einzelne Testverfahren eingehen, sondern einige Aspekte aufzeigen, welche bei der Auswahl von Testverfahren wichtig sind. Um trotzdem eine Übersicht zu erhalten, haben wir hier einige Testverfahren aufgeführt.
Auswahl der Testverfahren
Jedes Testverfahren deckt einen ganz bestimmten Teil des Testings ab. So werden beispielsweise mit Unit Tests einzelne Softwarekomponenten isoliert getestet und mit Integrationstests das Zusammenspiel dieser Komponenten geprüft. Verschiedene Testverfahren sollten deshalb komplementär eingesetzt werden, um eine bessere Abdeckung zu erreichen. Ein Testverfahren alleine reicht nicht aus.
Je nach Testverfahren wird die Software auch aus unterschiedlichen Blickwinkeln betrachtet. Dies wird unter anderem im White Box und Black Box Testing angewendet. Beim Black Box Testing kennt der Tester das interne Design der Software nicht. Beim White Box Testing kennt der Tester das Design oder der Tester ist selbst Entwickler. Jede Person hat ein anderes Verständnis der Software und testet somit anders. Es ist deshalb wichtig die Testverfahren so zu wählen, dass mehrere Personen testen, um unterschiedliche Meinungen zu erhalten.
Qualität vor Quantität
Die ausgewählten Testverfahren werden entweder manuell oder automatisiert ausgeführt. Speziell bei der automatisierten Ausführung entsteht oft der Trugschluss, dass das Ziel erreicht ist, sobald alle Tests erfolgreich durchlaufen wurden. Doch was wurde eingentlich getestet?
Die Qualität der Tests ist dabei entscheidend und höher zu gewichten als die Quantität. Speziell bei komplexeren Testverfahren, wie bei Penetration Testing oder Load Testing müssen die erweiterten Umstände berücksichtig werden. Es ist deshalb sinnvoll vor dem Testing die Bedingungen und das erwartete Resultat zu definieren. Nur so kann verifiziert werden, ob das Ziel wirklich erreicht wurde.
Unterstützende Tools können ebenfalls helfen die Qualität der Tests weiter zu verbessern. Statische Codeanalyse Tools können beispielweise eingesetzt werden, um mögliche Fehlerquellen zu finden und Testabdeckungen automatisch zu ermitteln. Ebenfalls können automatisierte Bots bei Load Tests oder Penetration Tests eingesetzt werden, um weitere Fehler zu finden. Zudem wird auch künstliche Intelligenz neue Möglichkeiten für das Testing bieten.
Eine hohe Quantität an Tests kann langfristig auch zu einem Problem werden. Ändert sich der Programmcode, müssen auch dazugehörige Tests angepasst werden. Bei sehr vielen Tests, kann deren Anpassung viel Zeit in Anspruch nehmen und schlussendlich auch die Geschwindigkeit der Entwicklung beeinträchtigen.
Teamdynamik
Es gibt Softwareentwicklungsteams in verschiedenen Grössen und Konstellationen mit unterschiedlichen Praktiken. In einigen Unternehmen arbeiten mehrere Softwareteams kontinuierlich an einem gemeinsamen Produkt. In anderen Unternehmen arbeiten Teammitglieder grösstenteils alleine für einen oder mehrere Kundenprojekte. Jedes Teammitglied hat zudem einen anderen Ausbildungsstand. Aus diesem Grund lässt sich keine pauschale Aussage bezüglich geeigneter Testverfahren für ein Team treffen.
Passende Testverfahren
Grundsätzlich sollten alle Teammitglieder mit möglichen Testverfahren vertraut sein. Aber nicht alle Testverfahren sind für jedes Teammitglied geeignet. Es ist beispielsweise nicht empfehlenswert einen Lernenden für Systemtests einzusetzen, da dieser wahrscheinlich weniger Erfahrung mitbringt, um allfällige Abhängigkeiten und daraus resultierende Fehler zu erkennen. Stattdessen wäre ein Lernender für Smoke Testing oder Regression Testing besser geeignet. Es ist deshalb wichtig passende Testverfahren einzuführen, welche das Team unterstützen und nicht zusätzlich belasten.
Verantwortung für die Qualität
Ausgewählte Testverfahren müssen in die Entwicklungsprozesse eingebunden und gelebt werden. Dabei trägt in der Regel das ganze Team die Verantwortung für die Einhaltung der Prozesse und die Qualität der produzierten Software. Falls eine geteilte Verantwortung nicht funktioniert, kann aber auch eine einzelne Person für die Qualität zuständig gemacht werden. Trotz Testing und Verantwortungsbewusstsein können Fehler vorkommen. Dies bietet eine Gelegenheit bestehende Testverfahren zu verbessern und bestehenden Prozesse anzupassen.
Jeder fängt mal klein an
Es empfiehlt sich klein anzufangen. Eine gute Testabdeckung mit Unit-Tests und ein zusätzliches User Acceptance Testing oder Exploratory Testing kann Wunder wirken. Eine solche Herangehensweise ist langfristig weitaus effektiver als mehrere Testverfahren, welche nur teilweise gelebt werden.
Investition und Rentabilität
Wir können den ganzen Tag testen und trotzdem Fehler in unserer Software haben. Es besteht somit keine Garantie auf fehlerfreie Software. Deshalb braucht es ein Risikomanagement, um die Eintrittswahrscheinlichkeiten und Folgen abschätzen zu können.
Risikomanagement
Testing sollte immer als Investition zur Risikominimierung betrachtet werden. Die Frage sollte somit lauten: Welche Fehler können wir verkraften ohne Kunden-, Umsatz-, Imageverlust oder andere Schäden zu verursachen? Wie viel müssen wir dafür testen? Diese Frage zu beantworten ist keine leichte Aufgabe und erfordert Erfahrung, aber auch einen gesunden Menschenverstand.
Verschiedene Funktionsbereiche der Software können zudem unterschiedliche Risikobewertungen erhalten. Die Kernfunktionalität der Software birgt meist ein höheres Risko und muss besser getestet werden als eine nebensächliche Funktion.
Kosten
Die verschiedenen Testverfahren werden zu unterschiedlichen Zeitpunkten im Entwicklungsprozess ausgeführt. Unit-Tests werden beispielsweise während der Entwicklung oder mit Test-Driven-Development (TDD) sogar vor der Entwicklung erstellt. So können Fehler frühzeitig erkannt und behoben werden. Andere Testverfahren wie Usability Testing finden erst später im Entwicklungsprozess statt. Findet man einen Fehler erst im Usability Testing, kann dies hohe Kosten und Verzögerungen in der Entwicklung verursachen. Je früher im Entwicklungsprozess der Fehler also gefunden wird, desto besser.
Praktisches Beispiel
Manchmal braucht man einfach einen Startpunkt. Hier findet ihr deshalb einen modellierten Entwicklungsprozess mit verschiedenen Testverfahren. Die Testverfahren können dabei entweder manuell oder automatisiert ausgeführt werden. Es ist zu beachten, dass nicht alle Testverfahren vom selben Entwickler durchgeführt werden müssen.
UI Tests: Visuelle Prüfung der Änderungen an der Benutzeroberfläche.
Unit Tests: Testet die Funktionalitäten und Komponenten isoliert voneinander. Mit einem Code-Coverage Check kann definiert werden, wie viele Codezeilen vom gesamten Code bei den Unit-Tests durchlaufen werden müssen.
Integration Tests: Testet das Zusammenspiel der Komponenten auf einer Testumgebung. Die Umgebung sollte dabei möglichst ähnlich wie die produktive Umgebung sein.
Regression Tests: Prüft wiederkehrend die Kernfunktionalität der Software, damit keine unerwünschten Nebeneffekte auftreten.
Fazit
Um verschiedene Testverfahren erfolgreich in den Entwicklungsprozess einzuführen, braucht es Erfahrung. Die Balance zwischen zu viel und zu wenig Testing wird dabei massgeblich vom Risikomanagement beeinflusst.
Probiere verschiedene Testverfahren aus und entscheide, welche am besten funktionieren. Nimm dabei Rücksicht auf die Teamdynamik und passe die Prozesse laufend an, um sie zu optimieren.
Comments