Riecht nach einer Hausaufgabe.
Sind Tests im Softwarebereich erforderlich?
Ja. Absolut. Auf allen Ebenen. Außerhalb einiger spezialisierter Domänen sind wir noch nicht in der Lage, mathematisch zu beweisen, dass unser Code gegen bestimmte Bugs korrekt ist (zumindest nicht in einem angemessenen Zeitrahmen). Wir müssen also Steine darauf werfen, um zu sehen, ob und wo es bricht.
Wenn wir eine Software mit größter Sorgfalt erstellen, warum sollten wir dann testen?
Beim Testen geht es nicht nur darum, Codierungsfehler zu finden. Es geht auch darum, sicherzustellen, dass Sie alle Ihre Anforderungen erfüllt haben und dass das Gesamtsystem wie erwartet funktioniert. Wenn ich die Anforderung habe, dass eine fehlgeschlagene Transaktion einen bestimmten Fehlercode zurückgeben muss, muss ich einen Test schreiben, um zu überprüfen, ob die Funktionalität vorhanden ist und ordnungsgemäß funktioniert.
Und das alles setzt voraus, dass die Spezifikation und das Design vollständig, korrekt und in sich konsistent sind, was häufig nicht der Fall ist. Selbst wenn Sie die Spezifikation bis zum letzten Punkt und Semikolon einhalten und dem Design folgen, kann es bei schlechten Spezifikationen oder Designs zu Problemen bei der Integration kommen. Häufig werden System- oder Integrationstests durchgeführt, wenn Sie feststellen, dass die Spezifikation selbst fehlerhaft ist und überarbeitet werden muss (siehe Kriegsbericht unten).
Können wir nach dem Testen sicher sein, dass wir dieses Ziel erreicht haben (das Produkt / die Software funktioniert wie beabsichtigt), weil wir die Tests dafür durchgeführt haben? Ist es möglich?
Nein, nicht zu 100%. Wir können nicht jede nur denkbare Kombination von Eingaben oder Ausführungspfaden in dem einfachsten Code testen. Wir können nicht alle Umweltfaktoren berücksichtigen. Wir können uns nicht alle möglichen Fehlermodi vorstellen.
Wir können bis zu einem Punkt testen, an dem wir ziemlich sicher sind, dass es keine großen Probleme gibt. Auch dies ist der Grund, warum wir auf allen Ebenen testen müssen. Schreiben Sie eine Reihe von Tests, um sicherzustellen, dass Ihr Code die Randbedingungen richtig verarbeitet (fehlerhafte Eingaben, unerwartete Ergebnisse, Ausnahmen usw.). Komponententest, um zu überprüfen, ob Ihr Code den Anforderungen entspricht. Systemtest zur Verifizierung der End-to-End-Verarbeitung. Integrationstest, um sicherzustellen, dass alle Komponenten korrekt miteinander kommunizieren. Machen Sie Usability-Tests, um sicherzustellen, dass das Ganze so funktioniert, dass Kunden Sie nicht erschießen möchten.
Szenario in der Realität - Ich arbeitete an einem Back-End-System, das gelegentlich Aktualisierungen an einen GUI-Dienst zur Anzeige in einer Tabelle auf dem Bildschirm sendete. Während des Projekts wurde eine Anforderung hinzugefügt, um die Anzeige zu filtern (z. B. kann der Bediener eine Teilmenge der Einträge in der Tabelle anzeigen). Designfehler Nr. 1 - Die Filterung sollte vom GUI-Dienst durchgeführt worden sein (ich bin der Meinung, dass die Display-Verwaltungsfunktionen in der Verantwortung der Display-Verwaltungssoftware liegen sollten), aber aufgrund der Politik und meiner Unfähigkeit, Probleme zu erkennen, bevor sie auftreten Probleme , wurde diese Anforderung an den Back-End-Service gestellt. Na gut, kein Problem, das kann ich. Wenn sich der Filterstatus ändert, erhalte ich eine Nachricht und sende dann eine Nachricht zum Erstellen oder Löschen fürjede Zeile in der Tabelle , da die Benutzeroberfläche so funktioniert (Designfehler Nr. 2 - Es gibt keine Möglichkeit, Aktualisierungen an mehrere Zeilen in einer einzelnen Nachricht zu senden; wir konnten nicht einmal eine einzelne "clear" - oder "delete" -Nachricht senden, um sie zu löschen die gesamte Tabelle).
Nun, alles funktioniert gut während der Entwicklung; Unit-, System- und Integrationstests zeigen, dass ich die richtigen Informationen sende und die Filteränderungen korrekt behandle. Dann kommen wir zu Usability-Tests, und das Ganze fällt schwer , weil das Datenvolumen überwältigend war. Die Netzwerklatenz zwischen meinem Back-End-Service und der GUI lag in der Größenordnung von 0,15 bis 0,25 Sekunden. Nicht schlecht, wenn Sie nur etwa ein Dutzend Zeilen aktualisieren müssen. Tödlich, wenn Sie Updates für mehrere hundert senden müssen. Wir bekamen Fehlermeldungen, dass die Benutzeroberfläche nach dem Ändern des Filterstatus abstürzte. Nun, nein, was geschah war, dass es in der Größenordnung von mehreren Minuten dauerte zum Aktualisieren der Anzeige, da das Nachrichtenprotokoll "Aktualisieren einer Zeile nach dem anderen" kein realistisches Szenario verarbeiten konnte.
Beachten Sie, dass all dies von jedem vom Hauptauftragnehmer bis zu meinem kleinen Alter hätte erwartet werden können und sollten , wenn wir uns die Mühe gemacht hätten, im Voraus die grundlegendsten Analysen durchzuführen. Die einzige Verteidigung, die ich anbieten werde, ist, dass wir das zweite Jahr eines sechsmonatigen Projekts abschließen, das fast unmittelbar nach der Auslieferung ausrangiert werden sollte, und wir alle wollten unbedingt den Hintergrund sehen.
Das bringt uns zum letzten Testgrund - CYA. Projekte der realen Welt scheitern aus einer Vielzahl von Gründen, von denen viele politisch sind, und nicht jeder handelt in gutem Glauben, wenn etwas schief geht. Finger zeigen, Anschuldigungen werden erhoben, und am Ende des Tages müssen Sie auf eine Aufzeichnung verweisen können, die zeigt, dass zumindest Ihr Zeug so funktioniert hat, wie es sollte.
If we create a software with care in during its development period then why should we go for Test?
- denn egal was passiert, selbst der erfahrenste Programmierer macht Fehler.