Die Wichtigkeit einer ausführlichen Testabdeckung ist in der heutigen Softwarebranche unumstritten. Fehler, die möglichst früh entdeckt werden, sparen Kosten und Zeit, denn sie sind in der Regel leichter behebbar. Erfahrene IT-Mitarbeiter wissen auch: jede Software enthält Fehler, umso mehr, wenn es keine entsprechenden Testprozesse während der Entwicklung gibt. Welche Prozesse notwendig sind, um möglichst viele Fehlerquellen zu vermeiden, unterscheidet sich auch von der Art der Software-Applikation, die es zu testen gilt.
Welche Testarten gibt es?
Viele Leute denken bei Softwaretests in erster Linie an jene, welche den richtigen Ablauf der Funktionalität im Code überprüft. Doch das ist bei heutigen komplexen Anwendungs-Strukturen noch lange nicht ausreichend, um einen fehlerfreien Betrieb einer Applikation zu gewährleisten. Es gibt verschiedene Testarten mit unzähligen Unterkategorien.
Eine weit verbreitete Aufteilung ist jene, in ‘functional’ und ‘non-functional’ Tests.
Was ist functional testing?
Beim functional testing wird – wie der Name schon sagt – die Funktionalität der Software-Abläufe überprüft: wird die gewünschte Logik ausgeführt, werden Anforderungen erfüllt, arbeiten die einzelnen Softwarekomponenten entsprechend miteinander zusammen.
Beispiele für Functional Tests:
- Unit Tests
- Integration Tests
- End-to-end Tests
- Interface Tests
- Regression Tests
- Sanity Tests
- Acceptance Tests
- etc.
Was ist non-functional testing?
Das non-functional testing hingegen widmet sich jenen Aspekten der Anwendung, die Abseits der logischen Abläufe gegeben sein müssen, um diese zufriedenstellend nutzbar zu machen.
Beispiele für Non-Functional Tests:
- Performance / Load Tests
- Security Tests
- Usability Tests
- Stress Tests
- Scalability Tests
- Compatibility Tests
- Recovery Testing
- etc.
Qualitätscheckliste für Ihre Codebase!
Hier finden Sie die konkrete Objectbay Code Review Checkliste, mit der Sie eine hohe Codequalität gewährleisten können.
Wie hängt agile Softwareentwicklung mit Test Automation zusammen?
In der traditionellen Softwareentwicklung wurde Code über langen Zeitraum geschrieben und dann vermehrt am Ende (weil da ja erst verfügbar) manuell getestet. Fehler, die schließlich auffielen, waren oft schwer zu beheben und mussten durch mehrere Systemebenen hindurch abgeändert werden.
Der agile Ansatz stellt dieses Prinzip auf den Kopf. Die Devise – vor allem durch das regelmäßige Refactoring und Deployment bedingt – lautet: viele, kleine, granulare Tests, die möglichst früh geschrieben werden (im Test Driven Development sogar noch vor dem eigentlichen Code). Dadurch werden Fehler im besten Fall sofort erkannt und können noch während der Entwicklung leicht behoben werden.
Die Test Pyramide - Testen effizient gestalten
Die Functional Tests betreffend gibt es einen bekannten Ansatz, um darzulegen, wie viele Tests welcher Art sinnvoll sind: Die “Test Pyramide” stellt das bildlich dar. Die breite Basis sollten jene Tests sein, die den kleinsten Abdeckungsbereich haben: die Unit Test. Mit steigender Granularität sinkt die Anzahl der jeweiligen Testfälle.
Das originale Beispiel (entworfen von Mike Cohn - Mitwirkender bei der Entwicklung von Scrum) ist sehr einfach dargestellt und beinhaltet 3 Schichten:
- Unit Tests
- Service Tests
- User Interface Tests
Modernere Varianten haben oft mehr Layer, z. B.:
- Unit Tests
- Component Tests
- Integration / System Tests
- UI & API Tests
- Manual Tests
Wie maximiert man den Mehrwert von automatisierten Tests?
Viele Tests, die großteils auf niedrigeren Ebenen als der UI laufen, bedeuten aber auch die Notwendigkeit einer anderen Herangehensweise als ursprünglich: Automatisierung ist erforderlich, denn händisch wäre die Ausführung der Test Cases zu viel Aufwand oder würde oft vergessen werden. Außerdem kann der volle Mehrwert der frühzeitigen Feedbackschleifen umso mehr genutzt werden, je öfter die Tests laufen. Auch wirtschaftlich spiegelt sich das wider, denn sobald der Break-even-Point (unter Berücksichtigung der Erstellungs- und Maintenance-Kosten) überschritten wird, ist der ROI (Return on Investment) mit jedem weiteren Testdurchlauf positiv zu bewerten.
Eine wichtige Bedeutung bei der Integration dieser Testautomatisierung ist der DevOps Bereich und eine entsprechende Pipeline, die eine zuverlässige Ausführung der Tests garantiert. Im Zuge eines Continuous Delivery Ansatzes etwa befindet sich die Applikation auf verschiedenen Deployment-Stages in unterschiedlichen Testdurchlaufphasen (Unit / Integration Tests, e2e / UI Tests, Customer Acceptance Tests, User Acceptance Tests). So lässt sich sicherstellen, dass trotz kurzen Entwicklungszyklen keine fehlerhaften Features voreilig in die Produktionsumgebung gelangen.
Wozu dienen Test Automation Frameworks?
Sogenannte Test Automation Frameworks können einen zusätzlichen Rahmen bieten, um die Umsetzung der automatisierten Tests einheitlich und strukturiert zu gestalten. Hier können Richtlinien, Tools, Konzepte, Best Practices, etc. (projektübergreifend) definiert werden. Dabei sollte auf Skalierbarkeit, Wiederverwendbarkeit und Einheitlichkeit Wert gelegt werden.
Innerhalb dieses Frameworks sollte sich auf Arbeitsweisen geeinigt werden, die zur jeweiligen Art der Entwicklung passen.
Ein Beispiel wäre etwa die Verwendung des Testing Tools ‘Cucumber’ für end-to-end Tests, welches Behavior Driven Development unterstützt und damit gut in ein agiles Umfeld passt. Durch die textuelle Schreibweise der Test-/Anforderungsdefinition könnten die Test Cases direkt vom Fachbereich erstellt werden, etwa im Zuge der Ausarbeitung von User Storys / Acceptance Criteria. Die darunterliegenden Tools zur technischen Ausführung der Tests (z.B. Selenium für Web oder Appium für mobile) können dann unabhängig für die benötigte Technologien festgelegt werden.
Was sollte beim Testen von Web Applikationen beachtet werden?
Doch wie so oft beziehen sich die eben genannten Ansätze hauptsächlich auf funktionale Tests. Wie anfangs erwähnt, gibt es allerdings eine Vielzahl an verschiedener Testmöglichkeiten, und gerade bei Web-Applikationen ist es sehr wichtig, viele verschiedene Bereiche abzudecken.
Trotzdem wird es oft nicht möglich – oder sinnvoll – sein, alle Arten von Tests auszuführen. Abhängig von Nutzen und Art der Applikation sollte entschieden werden, worauf hoher Wert gelegt werden muss. Nachfolgend betrachten wir einige Frage, die in Bezug auf Webentwicklung beantwortet werden sollten – im Idealfall anhand eines ausreichenden Testkonzepts.
Wer sind die Nutzer und auf welchen Geräten werden sie die Applikation bedienen?
Dies ist eine wichtige Ausgangsfrage, die möglichst früh gestellt werden sollte, um die passenden Anforderungen und Designkonzepte ausarbeiten zu können. Wichtig ist zum Beispiel zu wissen, ob die User technisch affin sind, eine Einschulung bekommen oder die Applikation nur einmalig, in einer besonderen oder stressigen Situation, nutzen. Es sollte eine entsprechende Gruppe von Testpersonen gefunden werden, um die Applikation auf Verwendbarkeit und Verständnis zu testen. Auch die Frage nach den verwendeten Geräten ist sehr wichtig: werden Smartphones, Touchscreens oder ähnliches verwendet, so muss die Applikation regelmäßig explizit auf solchen Devices getestet werden.
Ein weiterer wichtiger Punkt ist, inwieweit die Applikation barrierefrei sein soll:
Wie einfach ist der Umgang mit der Software, wenn eine kurz- oder langfristige erschwerte Bedienung gegeben ist (z. B. bei einer Person, die kurzzeitig mit einer Hand ein Kleinkind hält oder eine gebrochene Hand hat, bis hin zur Verwendbarkeit mit Screen Reader). Ist die Anwendung öffentlich zugänglich? Gibt es gesetzliche Auflagen?
Beispiele für wichtige Tests:
- Usability Tests
- (automatisierte) UI Tests
- Accessibility Tests
- User Acceptance Tests
- (Browser, Platform) Compatibility Tests
Ist die Applikation sicher zu benutzen? Sind die (User-)Daten geschützt?
Gerade bei Applikationen im Web ist aufgrund der starken Vernetzung und meist öffentlichen Zugänglichkeit besondere Vorsicht geboten. Sowohl die User, als auch die Applikation muss vor Angriffen geschützt werden. Bekannte Phänomene wie
z. B. das Cross-Site-Scripting müssen unterbunden werden. Eine gute Anlaufstelle hierfür bietet der ‘web security testing guide’ von OWASP.
Besondere Vorsicht ist aber auch beim Handling von sensibler Daten geboten: Es muss genau darauf geachtet werden, welche Personendaten eingeben und auslesen dürfen und ob diese Personen mit ausreichender Sicherheit authentifiziert werden.
Beispiele für wichtige Tests:
- Security Tests (authentication, authorization, XSS, SQL-Injection, etc.)
- API Tests (Schnittstellen, die sensible Daten handhaben, müssen gesichert sein)
- Functional Tests der zuständigen Komponenten (z. B. Login)
Ist die Anwendung DSGVO-konform?
Bei den meisten Web-Applikationen gibt es in irgendeiner Art und Weise einen Umgang mit Userdaten – sei es in direkter Form, etwa durch Formular-Inhalte, oder indirekt durch Cookies. Für den Umgang mit diesen gibt es mittlerweile strenge Gesetze, die eingehalten werden müssen. Eine Applikation muss, bevor sie deployed wird, darauf geprüft werden, ob sie diese Standards einhält.
Beispiele für wichtige Tests:
- (User) Acceptance Tests
- Security Tests (Werden Daten ausreichend verschlüsselt gehandhabt und gespeichert?)
Mehr zu dem Thema: Sind Dienstleister im Bereich Softwareentwicklung automatisch auch Auftragsverarbeiter gemäß Art 4 Z 8 der DSGVO?
Welche Performance ist erforderlich?
Ein weiterer web-spezifischer Punkt ist der, der Performance. Im Gegensatz zu z. B. Desktop-Applikationen, die für bestimmte Anwendungsfälle konzipiert sind, kann man bei einem Web-Server oft eher schwer vorhersehen, welche Last auf ihn zukommt. Ist eine Web-Applikation öffentlich zugänglich, so könnte es zu einem plötzlichen Anstieg von Requests kommen, die der Server möglichst rasch verarbeiten muss. In Zeiten der Cloud-Applikationen ist das zwar ein lösbares Problem, der Umgang mit solchen oder ähnlichen Situationen muss jedoch mit eingeplant – und getestet – werden.
Beispiele für wichtige Tests:
- Performance Tests
- Load Tests
- Scalability Tests
- Stress Tests
- Endurance Tests
- Usability (Ist die Anwendung zu langsam?)
Wird der entsprechende Content angezeigt und funktionieren Interaktionselemente?
Die Inhalte von Web-Applikationen werden meist dynamisch geladen – weshalb es hier besonders wichtig ist zu überprüfen, ob die Inhalte an gewünschten Stellen und zu gewünschter Zeit angezeigt werden. Außerdem müssen sich User darauf verlassen, dass die Interaktion und Navigation (auch zu externen Websites etc.) verlässlich funktioniert.
Beispiele für wichtige Tests:
- Unit- / Integration- / End-to-end Tests
- (automatisierte) UI Tests
- Browser Compatibility Tests
- Accessibility Tests (Navigation mittels Screen-Reader, etc.)
- Umgang mit Applikations-Fehlern (Error-Pages, falsche Verlinkung, fehlende Server-Connection, etc.)
Ist die Applikation für Suchmaschinen optimiert (SEO)?
Dieser Punkt wird nicht für alle Web-Applikationen erforderlich sein, jedoch gerade für kommerziell genutzte Seiten ist das ein wichtiger Aspekt. Es gibt viele Faktoren, die zu beachten sind, um im World Wide Web nicht unterzugehen bzw. die Lösung hinsichtlich Suchmaschinen zu optimieren. Dafür gibt es eigene Tests und Analyse-Tools, um herauszufinden, ob die Applikation noch an SEO-Optimierung bedarf.
Zusammenfassung
Um eine qualitativ hochwertige Lösung zu entwickeln und in dem umfassenden Spektrum von Softwaretests nicht verloren zu gehen, sollte man sich fragen, was die Anforderungen und wichtigsten Aspekte der zu testenden Applikation sind. Welchen Eigenheiten ist sie in dem Umfeld, in dem sie läuft, ausgesetzt? Anhand dessen sollte möglichst früh ein durchdachtes, alle relevanten Bereiche abdeckendes Testkonzept erarbeitet werden.
Wichtig ist auch zu beachten, dass diese Konzepte und daraus resultierende Tests nur dann sinnvoll sind, wenn sie auch regelmäßig und verlässlich ausgeführt werden. Essenziell ist es also zu überlegen, in welchem Rahmen eine automatisierte Ausführung der definierten Tests sichergestellt werden kann.