Qualität in der Softwareentwicklung

“Was muss ich machen, um qualitative hochwertige Software zu produzieren” oder “Wie verhindere ich Bugs” . Dieses sind bestimmt die meist gestellten Fragen in der Softwareentwicklung. Jeder Softwareentwickler versucht bugfreie Software zu entwickeln, aber oft bekommen sie nicht die Gelegenheit dazu.

Denn man muss Wissen : Qualitätsarbeit kostet.

Zeit Kosten Qualitäts Dreieck
Bild von Dirk Wouters auf Pixabay

Betrachten wir das obige Bild mit dem magischen Dreieck oder besser das Spannungsdreieck des Projektmanagements.

Hier sehen wir die 3 Dimensionen ZEIT , KOSTEN und QUALITÄT.
Unter Zeit versteht man hier den für das Projekt bzw. für Aufgabe vorhandenen Zeitrahmen (Starttermin, Einführungstermin und sonstige Meilensteine)
Kosten beantwortet die Frage : Wie viel Geld darf ich ausgeben ? Was das das Ergebnis kosten ?
Und unter Qualität versteckt sich die Frage : Was sind die Ziele bzw. das erwartete Ergebnis.

Aber was bedeutet es nun für uns Softwareentwickler. Ganz einfach :
Ist der Zeitraum auf Kante geplant, hat man eine kürzere Zeitspanne für Implementierung und Tests (und natürlich auch für Design und Architektur, aber das steht auf einem anderen Zettel). Hat man kein Budget und muss das Produkt trotzdem auf dem Markt bringen , leidet ebenfalls die Qualität, da hier ebenfalls Test- / Entwicklungsaufwände zusammengestrichen werden.

Obwohl es heißt

Je eher ein Fehler gefunden wird, desto besser ist es.
Oder je eher ein Fehler gefunden wird, desto billiger ist es ihn zu fixen.

ist es immer eine Gratwanderung zwischen Wirtschaftlichkeit und Qualität.
Im folgenden gehen wir mal von der optimalen strahlenden Welt aus. Wir haben genug Kohle und unendlich viel Zeit.

Qualitätseigenschaften von Softwareprodukten

Qualität in Softwareprodukten kann man nicht nur auf Fehlerfreiheit eingrenzen.
Generell sind die folgende Kriterien für ein erfolgreiches Softwareprodukt ausschlaggebend:

  1. Korrektheit
    Das was vom Stakeholder angefordert wurde, muss auch geliefert werden.
    (Sonst klappt auch nicht die Floskel “Works as designed” )
  2. Robustheit
    Im Fehlerfall sollte es nicht zu größeren Ausfällen oder ähnlichem kommen. Eine Fehlermeldung für den Anwender wäre besser.
  3. Portabilität
    Die Software sollte im optimalsten weitestgehend Infrastruktur unabhängig sein.
    Dieses ermöglicht z.B. Umzüge der Hardware zwischen Windows und Linux Servern.
  4. Security
    Die Komponenten einer Anwendung sollten über einen entsprechenden Schutz verfügen.
  5. Erweiterbarkeit / Wartbarkeit
    Die Software sollte ohne Probleme gewartet und ggf. erweitert werden können. Ist dieses nicht der Fall hat man unnötig hohe Kosten in der Zukunft.
  6. Benutzerfreundlichkeit
    Nur eine benutzerfreundliche Software wird vom Anwender akzeptiert.
  7. Überwachung und Monitoring
    Im produktiven Betrieb sollte der Status der Software zu jeder Zeit sichtbar / ermittelbar sein.

Testverfahren

Generell kann man die Testverfahren in 3 Obergruppen einteilen

Verifizierende Testverfahren

Analysierende Testverfahren

Statische und Dynamnische Test

Unter verifizierende Testverfahren versteht man den Gut Test, dieses bedeutet dass die angeforderten Features erfolgreich ausgeführt werden können.

Unter analysierende Testverfahren man zum Beispiel Metriken wie den McCabe Metriken für die Komplexität von Software oder Lines of Code , Non-Commented Source Statement oder NOC (Number Of Children of a class) . Daneben gibt es viele mehr. Meistens wird die Gewinnung dieser Kennzahlen durch Tools wie SonarQube , oder ähnlichen, durchgeführt.

Statische Testverfahren

Bei den statischen Testverfahren wird unter anderem das Review und die statische Codeanalyse genutzt. Bei der statischen Codeanalyse werden unter anderem die “Lines of Code und die Komplexität von Methoden und Klassen ermittelt. Neben diesem wird der Code auf bekannte Bugs , Sicherheitsprobleme und CodeSmells analysiert.

Im Review wird von einer zweiten Partei der Code bzw. die Funktionalitäten der Anwendung durchgesehen und bewertet.

Dynamische Tests

Die Anwendung wird mit realitätsnahen Testdaten durch einen Tester oder einen automatisierten Prozess befüttert.

Blackbox Tests

Der funktionale Test wird mit aus der Spezifikation ermittelten Testfälle getestet

Whitebox Test

Hierbei werden anhand des entwickelten Codes alle Zweige des Codes getestet.

Schritte bei der Testplanung

Für jede Testphase sollte man die folgenden Schritte durchführen:

Vorbereitung

In diesem Schritt werden die Voraussetzungen für den Test geschaffen. Hierzu zählen unter anderem das Aufsetzen einer Testumgebung, Berechtigungseinrichtung oder Softwareinstallationen.

Spezifikation

Hier werden die Testfälle, die Testdurchführung und die Testdaten beschrieben.

Durchführung

Hier werden die Testfälle ausgeführt und die Ergebnisse protokolliert.

Auswertung

Die Testergebnisse werden ausgewertet und gefundene Fehler an die Entwickler zur Behebung gegeben. Die durchgeführten Tests werden archiviert und die Dokumentation vervollständigt. Je nach Branche kann es hier noch spezielle Vorgaben geben.