White-Box-Test
Was ist ein White-Box-Test?
Ein White-Box-Test ist eine Methode für Softwaretests, die den Quellcode eines Programms verwendet, um Tests und Testfälle für die Qualitätssicherung (Quality Assurance, QA) zu entwerfen. Beim White-Box-Test ist die Codestruktur dem Tester bekannt und wird von ihm verstanden, im Gegensatz zum Black-Box-Test, einer Methodik, bei der die Codestruktur dem Tester nicht bekannt ist, und dem Gray-Box-Test, einem Ansatz für Qualitätssicherungstests, bei dem der Tester einen Teil der Codestruktur kennt.
Beim White-Box-Testen werden das interne Framework und die Komponenten einer Anwendung unter die Lupe genommen, um die interne Struktur und das Design der Software zu testen. Aus diesem Grund wird White-Box-Testing auch als transparentes oder Glas-Box-Testing bezeichnet. Dieser Testtyp kann bei Unit-, System- und Integrationstests angewendet werden.
Beim White-Box-Testing werden in der Regel mögliche Ausführungspfade durch den Code nachverfolgt und es wird herausgefunden, welche Eingabewerte die Ausführung dieser Pfade erzwingt. Der Tester, bei dem es sich in der Regel um den Entwickler handelt, der den Code geschrieben hat, verifiziert den Code entsprechend seinem Design – daher ist die Vertrautheit mit dem Code wichtig für denjenigen, der den Test initiiert.
Der Code wird getestet, indem Eingabewerte den Code durchlaufen, um festzustellen, ob die Ausgabe dem entspricht, was zu erwarten ist. Tester können die kleinste Anzahl von Pfaden ausarbeiten, die zum Testen des gesamten Codes erforderlich sind, oder den gesamten Code abdecken. Statische Analysewerkzeuge helfen bei dieser Aufgabe.
White-Box-Tests allein können Probleme, die durch Abweichungen zwischen den tatsächlichen Anforderungen oder der Spezifikation verursacht werden, nicht ermitteln, aber sie können unterstützen, Designschwächen im Code zu identifizieren. Beispiele hierfür sind Kontrollflussprobleme (zum Beispiel geschlossene oder unendliche Schleifen oder nicht erreichbarer Code) und Datenflussprobleme.
Die statische Codeanalyse (durch ein Tool) kann ebenfalls diese Arten von Problemen finden, hilft dem Tester/Entwickler aber nicht, den Code in dem Maße zu verstehen, wie es das persönliche Design von White-Box-Testfällen erreicht. Zu den Tools, die bei White-Box-Tests unterstützen, gehören Veracode, Googletest, Junit 5 und RCUNIT.
Vor- und Nachteile von White-Box-Tests
Zu den Vorteilen von White-Box-Tests gehören:
- gründliche Tests
- unterstützt automatisierte Tests
- Tests und Testskripte können wiederverwendet werden
- das Testen wird in früheren Entwicklungsstadien unterstützt
- optimiert den Code, indem unnötiger Code entfernt wird
- unterstützt bei der Suche nach Fehlern oder Schwächen im Code
Zu den Nachteilen von White-Box-Tests gehören:
- Testfälle sind oft nicht repräsentativ dafür, wie die Komponente verwendet wird
- White-Box-Tests sind oft zeitaufwendig, komplex und teuer
- es werden Tester mit internen Kenntnissen über die Software benötigt
- wird die Software häufig implementiert, ist die Methode kosten- und zeitintensiv
White-Box-Tests versus Black-Box-Tests
Der Black-Box-Test ist die dem White-Box-Test entgegengesetzte Form des Tests. Beim Black-Box-Testing kennt man das Innenleben der Anwendung nicht. Beim Black-Box-Test werden Testfälle entworfen, die alle für die Komponente festgelegten Anforderungen abdecken. Anschließend wird mithilfe eines Tools zur Überwachung der Codeabdeckung aufgezeichnet, welcher Teil des Codes ausgeführt wird, wenn die Testfälle durchlaufen werden.
Im Gegensatz zu White-Box-Tests werden für Black-Box-Tests keine Entwickler benötigt, die am Code gearbeitet haben. Die Tester müssen lediglich mit den Funktionen der Software vertraut sein. Ein weiterer Unterschied zwischen Black-Box- und White-Box-Tests besteht darin, dass Black-Box-Tests auf Anforderungsspezifikationen und nicht auf Entwurfs- und Strukturspezifikationen basieren. Black-Box-Tests können bei System- und Akzeptanztests sowie bei Unit- und Integrationstests eingesetzt werden.
Gray-Box-Tests werden häufig für interne Softwarestrukturen verwendet, die Code enthalten, zum Beispiel Klassenhierarchien oder Aufrufbäume für Module.