Bei der Qualitätssicherung in der Softwareentwicklung handelt es sich um die strategische und operative Überprüfung, Identifikation und Lösung von Softwarefehlern mit dem Ziel, eine funktionierende Lösung bereitzustellen.
„Qualität ist kein Zufall, sie ist immer das Ergebnis angestrengten Denkens.“
John Ruskin
Zur Sicherung der Softwarequalität gibt es verschiedene Methoden und Modelle. Im Folgenden sind einige Beispiele genannt.
Modelle der Qualitätssicherung:
- Organisatorische Qualitätsmodelle (z.B. Automotive SPICE oder Capability Maturity Model)
- Prozessmodelle, wie zum Beispiel:
- Capability Maturity Model Integration
- Rational Unified Process (RUP)
- Hardware in the Loop (HIL)
- Agile Methoden
- V-Modell
Methoden zur Qualitätssicherung:
- Spiralmodell
- Refactoring
- Iterative Softwareentwicklung
- Testgetriebene Entwicklung
- Unterschiedliche Testarten und Methoden bei Softwaretests, zum Beispiel:
- UnitTest
- Intergrationstest
- Funktionstest
- Systemtest
- Regressionstest
- Abnahmetest
- Oberflächentest
Wie sieht Qualitätssicherung bei ccc aus?
Wir bei ccc stellen hohe Ansprüche an die Qualität unserer Softwarelösungen. Tests bedeuten jedoch auch immer ein gewisses Maß an Zeit und Aufwand. Umso wichtiger ist es deshalb, für sich eine gute Mischung aus den Testarten zu finden. Wir nutzen verschiedene der oben genannten Methoden, um die Qualität unserer Anwendungen sicherzustellen und möchten diese kurz vorstellen.
Agile Methoden
Im Vordergrund stehen bei uns die Methoden der agilen Softwareentwicklung. Diese setzen wir ein, um folgende Ziele zur erreichen:
- Wissensverteilung
- Wissenstransfer
- Schnelleres Erkennen von Hürden und Problemen bei der Umsetzung
- Wenig Inselwissen
- Absicherung bei Ausfall von Mitarbeitern,
Agile Entwicklung wird bei uns jedoch nicht „nach Lehrbuch“ angewendet, sondern wurde auf die Bedürfnisse unserer Kunden und Mitarbeiter angepasst.
Die zentrale Dokumentation erfolgt im Azure DevOps (ehemals Visual Studio Team Services) von Microsoft. Besonders wichtig ist dabei die Nachvollziehbarkeit – jeder Entwickler sollte zu jeder Zeit in der Lage sein, nachzuvollziehen, warum welches Stück Code entstanden ist. Dafür werden Git Commits mit User Stories bzw. Tasks verknüpft. Ein Commit darf dabei auch nur einer User Story zugeordnet werden. Wichtig ist, dass die User Stories entsprechende Detailinformationen enthalten – inklusive entsprechender Dokumente wie E-Mails, Skizzen usw.
Um eine gute Grundlage für agiles Arbeiten zu schaffen, werden daneben verschiedene Standards aus dem Bereich Clean Code umgesetzt. Das Ziel ist es, eine gewisse Einheitlichkeit in der Arbeitsweise und damit im Code zu schaffen. Gleichzeitig soll so das Verständnis der Mitarbeiter für Code, der von anderen Kollegen geschrieben wurde, erhöht werden. Dabei wird beispielsweise darauf geachtet, dass Funktionen möglichst kleinteilig sind und nicht untereinander vermischt werden, oder Abhängigkeiten unter den verschiedenen Klassen bzw. Projekten so gering wie möglich zu halten. Gerade für Unit Tests ist das wichtig – dazu später mehr.
Testgetriebene Entwicklung
In einigen Bereichen kommen auch die Prinzipien des Test Driven Development (TDD) zum Einsatz. Hier geht es darum, dass erst die notwendigen Tests definiert werden, bevor auch nur eine Zeile Code geschrieben wird. Denn wenn Testfälle schon im Voraus definiert werden, hilft das, die Entwicklung inklusive der Struktur und nötiger Klassen besser zu durchdenken.
Die testgetriebene Entwicklung ist zwar zeitintensiv, macht aber an einigen Stellen Sinn. Denn: So wird verhindert, dass nur die Tests entwickelt werden, zu denen auch Code geschrieben wurde.
Unit Tests
Regelmäßige Unit Tests, also Tests einzelner Funktionen und Algorithmen, sichern die Funktionsfähigkeit der Software, insbesondere nach Updates.
Der Vorteil hier: Der Code funktioniert immer so wie er soll und bei Änderungen wird sofort deutlich, ob ungewollte Auswirkungen auftreten. Schnittstellen können auch gekapselt getestet werden. Das macht die Fehlersuche weniger aufwändig.
Sämtliche Unit Tests werden automatisch im Rahmen der Kontinuierlichen Integration (Continuous Integration) auf dem Buildsystem ausgeführt, sobald Quellcode auf dem Hauptentwicklungszweig eingecheckt wird. Jeder Entwickler kann sie auch in seiner Entwicklungsumgebung ausführen.
Manuelle Funktionstests
Ergänzend zu den Unit Tests finden in seltenen Fällen auch manuelle Funktionstests statt. Diese sind jedoch sehr zeitintensiv, sodass sie lediglich bei der Entwicklung von einzelnen Features oder in Ausnahmefällen bei Fehlern eingesetzt werden.
Abnahmetests
Gemäß den Prinzipien der agilen Entwicklung werden dem Kunden bei Neuentwicklungen regemäßig neue Versionen bereitgestellt. Dabei werden oft einzelne Abnahmetests vereinbart, um sicherzustellen, dass der Kunde ordnungsgemäß mit dem Programm arbeiten kann. Diese Tests kommen insbesondere bei neuen Schnittstellen oder bei einzelnen neuen Features zum Einsatz.
Oberflächentests
Noch nicht im Einsatz, aber in der Planung sind zusätzliche Oberflächentests. Spezielle Frameworks bzw. Programme testen die Software aus Sicht des Users. Dabei werden Oberflächenelemente und Interaktionen automatisiert getestet – also Texte, Icons, Bedienelemente wie Buttons, Fehlermeldungen, etc.
Hierfür gibt es verschiedene Methodiken, wie ein Bedienelement ermittelt werden kann – über die Angabe des Namens des Bedienelements oder die pixelgenaue Position. Anschließend kann das Bedienelement ausgelesen oder bedient werden.
Fazit: Qualitätssicherung in der Softwareentwicklung ist besonders langfristig wichtig
„Natürlich kostet Qualität, aber fehlende Qualität kostet mehr.“
Prof. Dr. Hans-Jürgen Quadbeck-Seeger
Tests sind zwar in der Regel zeitintensiv, bringen aber auf lange Sicht und besonders für den Kunden einen hohen Nutzen, indem der Aufwand für Änderungen oder Support geringer wird. Der Verzicht auf Tests aus Gründen der Zeit oder Kosten, ist aus unserer Sicht oft zu kurz gedacht.
Trotzdem versuchen wir natürlich den Aufwand für Tests zu minimieren. Wann immer möglich setzen wir deshalb auf praxisbewährte (und getestete) Module und gemeinsame Bibliotheken.
Das könnte Sie auch interessieren: IT-Systeme ausfallsicher gestalten – am Beispiel MES
finn meint
Der Sohn interessiert sich für den Beruf des Softwareentwicklers. Um den Code zu schreiben, sind bestimmt die Fachkenntnisse benötigt. Aber die ersten Bemühungen auf diesem Weg brauchen doch Selbstüberprüfen. Meinen Dank für die Hinweise! Werde sie an ihn weiterleiten. Qualität ist doch immer das Ergebnis angestrengten Denkens!
Christian meint
Das Thema Qualitätssicherung in der Softwareentwicklung interessiert mich besonders und ich habe diesen Artikel sehr gerne gelesen. Ich wünsche https://blog.ccc-industriesoftware.de/ weiterhin viel Erfolg. Macht weiter so.