Schreibtischtest durchführen
In dieser interaktiven Lerneinheit erlernst du die systematische Durchführung von Schreibtischtests - eine fundamentale Methode zur manuellen Code-Überprüfung. Du übst, wie du Algorithmen Schritt für Schritt nachvollziehst, Variablenwerte verfolgst und typische Programmierfehler frühzeitig erkennst. Diese Fähigkeit ist besonders wertvoll beim Debuggen und der Qualitätssicherung deiner eigenen Programme.
Einführung
Stell dir vor: Du entwickelst eine Software für die Steuerung einer Ampelanlage. Ein kleiner Fehler im Code könnte hier fatale Folgen haben - zwei grüne Ampeln zur gleichen Zeit wären eine Katastrophe!
Oder denk an eine Banking-App: Ein Rundungsfehler bei Geldtransaktionen könnte tausendfach auftreten und großen finanziellen Schaden anrichten. In der professionellen Softwareentwicklung können wir uns solche Fehler nicht leisten.
Doch wie können wir sicherstellen, dass unser Code wirklich das tut, was er soll? Wie finden wir Fehler, bevor sie in der Praxis auftreten?
Hier kann uns der Schreibtischtest helfen - eine Methode, mit der du systematisch und Schritt für Schritt überprüfen kannst, ob dein Code korrekt arbeitet. Ohne Computer, nur mit Stift und Papier, kannst du potenzielle Probleme aufdecken und beheben.
Lernziele
Nach dieser Lerneinheit kannst du:
-
Den Schreibtischtest als Prüfverfahren in der Softwareentwicklung präzise definieren und seine Bedeutung erklären
-
Die methodischen Schritte eines Schreibtischtests systematisch durchführen und deren Relevanz für die Codeprüfung begründen
-
Die praktische Anwendung und den Nutzen des Schreibtischtests in der Softwareentwicklung fundiert erläutern
-
Eigenständig einen Algorithmus mittels Schreibtischtest schrittweise analysieren und die Zwischenergebnisse strukturiert dokumentieren
-
Potenzielle Programmfehler durch systematische Schreibtischtests identifizieren und deren Ursachen fachgerecht analysieren
Überleitung
Ob einfache Programme oder komplexe Anwendungen – fehlerfreier Code ist entscheidend. Der Schreibtischtest ist eine wichtige Technik, die dir hilft, die Qualität deines Codes zu sichern.
Lass uns genauer anschauen, wie der Schreibtischtest funktioniert und welchen konkreten Nutzen er dir bringt.
Was ist ein Schreibtischtest?
Ein Schreibtischtest ist eine manuelle Methode zur Code-Prüfung. Du führst ihn ohne Computer durch, typischerweise am Schreibtisch mit Stift und Papier oder einer Tabelle.
Das Prinzip: Du simulierst die Ausführung des Programms. Du gehst den Code Zeile für Zeile durch und protokollierst, welche Auswirkungen jede Anweisung hat.
Hinweis: Da die Eingabemenge eines Algorithmus häufig sehr groß oder sogar beliebig groß sein kann, ist ein Schreibtischtest nur mit einer begrenzten Anzahl von Eingaben möglich. Insbesondere bei komplexeren Algorithmen liefert dieser Test daher lediglich ein Indiz, aber keinen endgültigen Beweis für die Korrektheit.
Beispiel
Damit du dir gleich vorstellen kannst, wie so ein Schreibtischtest abläuft, schauen wir uns eine kurze Code-Sequenz an. Angenommen, wir haben folgenden Pseudocode, der prüft, ob eine Zahl positiv ist und sie dann verändert:
--> Eingabe: x = 5 # Startwert setzen
Wenn (x > 0):
x = x + 10
Sonst:
x = x - 10
Ausgabe: x
Schritt 1: Startwert hinzufügen
| Schritt | x (Wert) | Bedingung | Ergebnis / Kommentar |
|---|---|---|---|
| Start | 5 | - | Startwert |
Erklärung: x wird mit 5 initialisiert.
Beispiel
Damit du dir gleich vorstellen kannst, wie so ein Schreibtischtest abläuft, schauen wir uns eine kurze Code-Sequenz an. Angenommen, wir haben folgenden Pseudocode, der prüft, ob eine Zahl positiv ist und sie dann verändert:
Eingabe: x = 5
--> Wenn (x > 0): # x ist 5, also wahr
x = x + 10
Sonst:
x = x - 10
Ausgabe: x
Schritt 2: Bedingung prüfen
| Schritt | x (Wert) | Bedingung | Ergebnis / Kommentar |
|---|---|---|---|
| Start | 5 | - | Startwert |
| Prüfung | 5 | (x > 0) → wahr | Wir nehmen den „wenn“-Zweig |
Erklärung: Die Bedingung x > 0 ist wahr, daher wird der „Wenn“-Zweig ausgeführt.
Beispiel
Damit du dir gleich vorstellen kannst, wie so ein Schreibtischtest abläuft, schauen wir uns eine kurze Code-Sequenz an. Angenommen, wir haben folgenden Pseudocode, der prüft, ob eine Zahl positiv ist und sie dann verändert:
Eingabe: x = 5
Wenn (x > 0):
--> x = x + 10 # x wird auf 15 gesetzt
Sonst:
x = x - 10
Ausgabe: x
Schritt 3: Update durchführen
| Schritt | x (Wert) | Bedingung | Ergebnis / Kommentar |
|---|---|---|---|
| Start | 5 | - | Startwert |
| Prüfung | 5 | (x > 0) → wahr | Wir nehmen den „wenn“-Zweig |
| Update | 15 | - | x = 5 + 10 |
Erklärung: x = 5 + 10, also wird x = 15 gespeichert.
Beispiel
Damit du dir gleich vorstellen kannst, wie so ein Schreibtischtest abläuft, schauen wir uns eine kurze Code-Sequenz an. Angenommen, wir haben folgenden Pseudocode, der prüft, ob eine Zahl positiv ist und sie dann verändert:
Eingabe: x = 5
Wenn (x > 0):
x = x + 10
Sonst:
x = x - 10
--> Ausgabe: x # x hat den Wert 15
Schritt 4: Endwert ausgeben
| Schritt | x (Wert) | Bedingung | Ergebnis / Kommentar |
|---|---|---|---|
| Start | 5 | - | Startwert |
| Prüfung | 5 | (x > 0) → wahr | Wir nehmen den „wenn“-Zweig |
| Update | 15 | - | x = 5 + 10 |
| Ausgabe | 15 | - | Endwert, der zurückgegeben wird |
Erklärung: Das Programm gibt 15 aus.
Warum machen wir Schreibtischtests?
1. Frühe Fehlererkennung
- Schreibtischtests helfen, logische Fehler in Algorithmen zu identifizieren, bevor der Code kompiliert oder ausgeführt wird.
- Je früher Fehler gefunden werden, desto geringer sind die Kosten für ihre Behebung.
2. Verbesserter Algorithmusverständnis
- Durch die detaillierte Abarbeitung des Codes vertiefst du dein Verständnis des Algorithmus.
- Potenzielle Schwachstellen oder Verbesserungsmöglichkeiten werden frühzeitig erkannt.
3. Beherrschung komplexer Logik
- Besonders bei komplexen Algorithmen mit Schleifen und bedingten Anweisungen hilft der Schreibtischtest, den Überblick zu behalten.
- Die korrekte Implementierung kann dadurch besser sichergestellt werden.
4. Qualitätssicherung im Team
- Schreibtischtests eignen sich für Code-Reviews im Team.
- Sie fördern ein gemeinsames Verständnis des Codes und helfen, Fehler gemeinsam zu identifizieren.
Voraussetzungen für einen Schreibtischtest
1. Klar definierter Algorithmus
- Der zu testende Algorithmus oder Code muss in einer verständlichen Form vorliegen.
- Dies kann Pseudocode, ein Struktogramm oder Code in einer Programmiersprache sein.
2. Geeignete Eingabewerte
- Repräsentative Eingabewerte sind notwendig, um den Test durchzuführen.
- Beginne mit einfachen, typischen Werten und erweitere den Test auf Grenzfälle und ungültige Eingaben, falls relevant.
3. Erwartete Ausgabewerte (optional, aber empfehlenswert)
- Die Kenntnis der erwarteten Ergebnisse erleichtert die Überprüfung der tatsächlichen Ergebnisse des Schreibtischtests.
- Dies ermöglicht eine gezielte Analyse von Abweichungen und Fehlerquellen.
Durchführung eines Schreibtischtests - 1. Code verstehen
Hinweis: Es gibt nicht die eine richtige Methode für einen Schreibtischtest. Die genaue Vorgehensweise kann je nach Art des Algorithmus, Komplexität des Codes und persönlichen Vorlieben variieren. Wichtig ist, dass du systematisch und nachvollziehbar vorgehst. Die folgenden Schritte stellen einen strukturierten Ansatz dar, der dir als Leitfaden dienen kann.
Schritte für einen systematischen Schreibtischtest
1. Code verstehen
Schau dir zunächst den folgenden Code genau an und versuche zu verstehen, was er macht:
Eingabe: passwordIsCorrect (Boolean), userIsActive (Boolean)
userIsAuthorized = passwordIsCorrect || userIsActive
Wenn (userIsAuthorized == true):
Ausgabe: "Autorisiert"
Sonst:
Ausgabe: "Nicht autorisiert"
Erklärung des Codes
Eingaben
passwordIsCorrect: Gibt an, ob das eingegebene Passwort korrekt ist (trueoderfalse).userIsActive: Gibt an, ob der Benutzer gerade aktiv ist (trueoderfalse).
Funktionsweise
- Diese beiden Werte werden mit einer booleschen Operation (
||, ODER) verknüpft. - Je nachdem, ob das Ergebnis
trueoderfalseist, erhält man entweder „Autorisiert“ oder „Nicht autorisiert“.
Durchführung eines Schreibtischtests - 2. Eingabewerte definieren
2. Eingabewerte definieren
Um zu testen, ob der Code funktioniert, definieren wir nun gezielt Eingabewerte und die jeweils erwarteten Ausgaben.
Nehmen wir an, dass wir folgende Anforderungen (Soll-Verhalten) haben:
Ein Nutzer soll nur dann autorisiert werden, wenn beide Bedingungen (passwordIsCorrect, userIsActive) erfüllt sind.
Aus diesen Informationen lässt sich eine Tabelle mit Testfällen und den erwarteten Ausgaben erstellen.
| Testfall | passwordIsCorrect | userIsActive | Erwartete Ausgabe |
|---|---|---|---|
| 1 | true | true | Autorisiert |
| 2 | true | false | Nicht autorisiert |
| 3 | false | true | Nicht autorisiert |
| 4 | false | false | Nicht autorisiert |
Durchführung eines Schreibtischtests - 3. Schrittweise Simulation
3. Schrittweise Simulation - Testfall 1 (true / true)
Jetzt testen wir die erste Kombination

- Zeile/Schritt: Hier wird angegeben, welcher Programmteil betrachtet wird. Die erste Zeile beschreibt die Eingabephase, in der die Variablen gesetzt werden.
- Variablen/Operation: Hier werden die betroffenen Variablen und Operationen notiert. In der ersten Zeile setzen wir die Variablen
passwordIsCorrectunduserIsActiveauftrue. - Ausgabe/Kommentar: Diese Spalte enthält Erklärungen oder die tatsächliche Ausgabe des Programms. In diesem Fall wird vermerkt, dass die Startwerte gesetzt wurden.
Durchführung eines Schreibtischtests - 3. Schrittweise Simulation
3. Schrittweise Simulation - Testfall 1 (true / true)
Jetzt testen wir die erste Kombination

-
Operation
userIsAuthorized = passwordIsCorrect || userIsActive- Hier wird
userIsAuthorizedauf das Ergebnis des logischen ODER-AusdruckspasswordIsCorrect || userIsActivegesetzt.
- Hier wird
-
Ergebnis
true || true => true- Da sowohl
passwordIsCorrectals auchuserIsActiveauftruestehen, liefert der Ausdrucktrue || truedas Ergebnistrue. - Somit wird
userIsAuthorizedzutrue.
- Da sowohl
Durchführung eines Schreibtischtests - 3. Schrittweise Simulation
3. Schrittweise Simulation - Testfall 1 (true / true)
Jetzt testen wir die erste Kombination

- Bedingung
userIsAuthorized == true- Hier wird geprüft, ob die Variable
userIsAuthorizedden Werttruehat. - Da dies der Fall ist wird der
wenn-Zweig (If-Block) ausgeführt.
- Hier wird geprüft, ob die Variable
Durchführung eines Schreibtischtests - 3. Schrittweise Simulation
3. Schrittweise Simulation - Testfall 1 (true / true)
Jetzt testen wir die erste Kombination

- Ausgabe
"Autorisiert"- Wird ausgegeben, sobald die Bedingung
userIsAuthorized == trueerfüllt ist.
- Wird ausgegeben, sobald die Bedingung
- Die Ausgabe stimmt mit der Erwartung überein.
Durchführung eines Schreibtischtests - 3. Schrittweise Simulation
3. Schrittweise Simulation - Testfall 2 (true / false)
Jetzt testen wir die zweite Kombination

- Eingabe
- Die beiden Variablen
passwordIsCorrectunduserIsActivewerden als boolesche Werte (true/false) eingelesen. - In diesem Testfall:
passwordIsCorrect = trueuserIsActive = false
- Die beiden Variablen
Durchführung eines Schreibtischtests - 3. Schrittweise Simulation
3. Schrittweise Simulation - Testfall 2 (true / false)
Jetzt testen wir die zweite Kombination

-
Operation
userIsAuthorized = passwordIsCorrect || userIsActive- Hier wird die Variable
userIsAuthorizedauf das Ergebnis des logischen ODER-Ausdrucks gesetzt.
- Hier wird die Variable
-
Ergebnis
true || false => true- Da
passwordIsCorrectden WerttrueunduserIsActiveden Wertfalsehat, ergibt die ODER-Verknüpfung insgesamttrue. - Somit wird
userIsAuthorizedauftruegesetzt.
- Da
Durchführung eines Schreibtischtests - 3. Schrittweise Simulation
3. Schrittweise Simulation - Testfall 2 (true / false)
Jetzt testen wir die zweite Kombination

-
Bedingung
userIsAuthorized == true- Überprüfung, ob die Variable
userIsAuthorizedden Werttruehat.
- Überprüfung, ob die Variable
-
Ergebnis:
true- Da
userIsAuthorizedtatsächlich auftruegesetzt wurde, ist die Bedingung erfüllt. - Folglich wird der
wenn-Zweig (If-Block) ausgeführt.
- Da
Durchführung eines Schreibtischtests - 3. Schrittweise Simulation
3. Schrittweise Simulation - Testfall 2 (true / false)
Jetzt testen wir die zweite Kombination

-
Ausgabe
"Autorisiert"- Das Programm hat aufgrund der gesetzten Variablen den Wert
truefüruserIsAuthorizedermittelt und entsprechend „Autorisiert“ ausgegeben.
- Das Programm hat aufgrund der gesetzten Variablen den Wert
-
Fehler: Erwartet
"Nicht autorisiert"- Laut vorher festgelegtem, erwarteten Ergebnis hätte die Ausgabe „Nicht autorisiert“ lauten sollen.
Durchführung eines Schreibtischtests - 4.. Abweichung erkennen
4. Abweichungen erkennen
Tatsächliche vs. Erwartete Ausgabe
- Tatsächliche Ausgabe: „Autorisiert“
- Erwartete Ausgabe: „Nicht autorisiert“
Erkenntnis aus dem Schreibtischtest
Hier hast du eine klare Abweichung entdeckt. Die Ursache liegt in der booleschen Operation:
||(ODER) führt dazu, dass schon eine einzelne Bedingungtrueausreicht, um als „autorisiert“ zu gelten.- Deine Anforderung verlangt jedoch, dass beide Bedingungen erfüllt sein müssen – dies erfordert ein logisches UND (
&&).
Durchführung eines Schreibtischtests - 5.. Ergebnis dokumentieren
5. Ergebnis dokumentieren
Fehlerursache
Verwendung von || (ODER) anstatt von && (UND).
Korrekturvorschlag
Ersetze userIsAuthorized = passwordIsCorrect ODER userIsActive durch userIsAuthorized = passwordIsCorrect UND userIsActive.
Testprotokoll aufbewahren
Die Tabelle und Notizen dienen später bei Code-Reviews oder erneuten Tests als Hilfe.
Praxisnahes Szenario
Szenario:
Du bist Softwareentwickler in einem E-Commerce-Unternehmen. Dein Team entwickelt einen neuen Onlineshop. Eine zentrale Funktion ist die Berechnung von Rabatten für Kunden. Du sollst die Funktion calculateDiscount(customerType, purchaseAmount) prüfen, die den Rabatt basierend auf dem Kundentyp und dem Bestellwert ermittelt.
Hinweis: Über die folgenden Links kannst du dir das Aufgaben- und Lösungsblatt für die Aufgabe zum Szenario herunterladen und bearbeiten.
Aufgabenblatt
Lösungsblatt
Zusammenfassung und Ausblick
Zusammenfassung:
In dieser Lerneinheit hast du die wichtigsten Aspekte des Schreibtischtests kennengelernt. Wir haben folgende Kernpunkte behandelt:
Grundlagen des Schreibtischtests
- Der Schreibtischtest ist eine manuelle Methode zur Code-Prüfung, die ohne Computer durchgeführt wird.
- Vorteile des Schreibtischtests:
- Frühe Fehlererkennung: Probleme werden entdeckt, bevor der Code ausgeführt wird.
- Besseres Algorithmusverständnis: Durch das schrittweise Durchgehen wird die Logik klarer.
- Beherrschung komplexer Logik: Hilfreich für Algorithmen mit Schleifen und Bedingungen.
- Unterstützung der Teamarbeit: Schreibtischtests eignen sich für Code-Reviews.
- Voraussetzungen für einen erfolgreichen Schreibtischtest:
- Ein klar definierter Algorithmus (Pseudocode oder Code in einer Programmiersprache).
- Geeignete Eingabewerte, um typische und Grenzfälle zu testen.
- Erwartete Ausgabewerte (empfohlen zur besseren Fehleranalyse).
Durchführung eines Schreibtischtests
- Systematische Vorgehensweise: Code verstehen: Sicherstellen, dass jede Anweisung nachvollziehbar ist. Eingabewerte definieren: Geeignete Testwerte wählen. Tabelle erstellen: Eine strukturierte Tabelle zur Nachverfolgung der Werte anlegen. Schrittweise Ausführung: Code Zeile für Zeile durchgehen. Ergebnis überprüfen: Erwartete und tatsächliche Werte vergleichen. Dokumentation archivieren: Testergebnisse für spätere Fehleranalysen festhalten.
Ausblick:
In der nächsten Lerneinheit beschäftigen wir uns mit der Fehlersuche im Quellcode, die über den Schreibtischtest hinausgeht. Dabei lernen wir:
- Typische Fehlerquellen kennen.
- Werkzeuge und Methoden, die Entwicklern helfen, Fehler effizient zu beheben.