Software und Elektronik gewinnen in der Automatisierung zusehends an Relevanz. In dem Maße wie die Intelligenz der Steuerungen zunimmt, wächst auch die Komplexität der Aufgaben, die durch Software erfüllt werden sollen. Immer häufiger sind auch Aufgaben zu bewältigen, die den Einsatz verteilter intelligenter Steuergeräte erfordern und die bekannten Probleme bei der Spezifikation der Aufgabe, der Kommunikation und Synchronisation der Steuergeräte sowie bei Integrationstests induzieren.
Der Einfluss der Software auf den Geschäftserfolg ist bereits heute gravierend. Daher sind die nachteiligen Auswirkungen mangelnder Softwarequalität umso dramatischer. In der Softwareentwicklung wird seit jeher versucht, einen sinnvollen Kompromiss zwischen Effizienz des Entwicklungsprozesses und akzeptabler Qualität des Ergebnisses zu finden. Beide Ziele stehen in offensichtlichem Widerspruch zueinander. Verbesserung der Effizienz - die sich in der Regel in kürzerer Markteinführungszeit niederschlägt - bedeutet Verkürzung der Projektlaufzeiten; Verbesserung der Qualität macht längere Projektlaufzeiten erforderlich. Im Ergebnis reflektiert der Entwicklungsprozess ein äußerst fragiles Gleichgewicht zwischen den Erfordernissen der kostenorientierten und der qualitätsorientierten Unternehmensziele. Dem liegt die weithin akzeptierte Annahme zugrunde, dass die Verbesserung der Qualität nur durch die Verlängerung der für die Testzyklen vorgesehenen Zeit erreichbar ist. Dies ist wiederum eine Schlussfolgerung aus der ebenfalls weit verbreiteten These, dass sich Qualität nachträglich in Software ‚hineintesten‘ ließe. Die tägliche Erfahrung bei der Entwicklung komplexer Software zeigt hingegen, dass dies jedoch nur selten, und dann auch nur mit extremen Aufwendungen an Zeit und Nerven möglich ist. So wird Softwarequalität zum Zufallsfaktor, der bestimmt wird durch die Erfahrung und individuelle Leistung der Mitarbeiter des Projektteams. Ergebnisse sind nicht vorhersagbar und nicht sicher wiederholbar. Daher liegt die Herausforderung für die Softwareentwicklung nicht mehr nur in der Konzeption und Implementierung intelligenter Algorithmen zur Lösung der Einzelaufgaben, sondern in ganz besonderem Maße im Qualitätsmanagement.
Qualität vs. Time-to-market...
...ist nur ein scheinbarer Widerspruch! Effizientes Qualitätsmanagement bedeutet, dass die Maßnahmen zur Qualitätssicherung nicht erst nach Ende der Implementierung beginnen! Sie begleiten das gesamte Projekt zeitlich parallel. Moderne Methoden für die Messung und Kontrolle von Softwarequalität sind mit dem kompletten Entstehungsprozess eng verzahnt, so dass die Projektlaufzeit sich verkürzt anstatt verlängert. Leistungsfähige Qualitätssicherungssysteme greifen schon vor der Codierung und unterstützen bei der Auswahl und Anpassung von Regeln, die bei in einem konkreten Projekt einzuhalten sind. Die konsequente Einhaltung aller Regeln, die für ein Projekt als verbindlich definiert worden sind, wird automatisch überprüft. So wird ein einheitlich hoher Standard für die Codierung auch in großen Teams mit unterschiedlichem individuellen Erfahrungsniveau sichergestellt. Mit führenden Werkzeugen zur Regelprüfung werden umfangreiche Regelwerke mitgeliefert, die auf die Zielsprache zugeschnitten sind. Ein konsistentes, zielorientiertes Regelwerk stellt unter anderem sicher, dass die Wartung und Weiterentwicklung erleichtert wird, dass mögliche Fehlerquellen (z.B. in Iterationen) minimiert werden und dass die Portabilität gewährleistet ist. Das Produkt Logiscope RuleChecker aus der Tau-Produktlinie von Telelogic liefert z.B. für die Programmiersprache C einen umfangreichen Satz von vordefinierten Regeln mit, die sich an erprobten Industriestandards orientieren und bei Bedarf um weitere projektspezifische Regeln ergänzt werden können. Weitere Programmiersprachen, die mit vordefinierten Regelwerken unterstützt werden, sind C++, Java und ADA. Die Software überprüft automatisch die Einhaltung der verbindlichen Regeln und generiert entsprechende Reports. Etwaige Regelverletzungen werden direkt im Quellcode identifiziert und angezeigt, so dass Korrekturen sehr schnell durchgeführt werden können (Abb. 1).
Software-Metriken - Qualität wird messbar
Je komplexer die Software, desto höher ist das Fehlerrisiko. Diese Erkenntnis ist unmittelbar einleuchtend, die daraus folgenden Implikationen jedoch beschäftigen hochrangige Forscher bereits seit den 70er Jahren. Das Ergebnis sind Software-Metriken, mathematische Berechnungsvorschriften, die z.B. aus der Schachtelung von Kontrollkonstrukten im Quellcode eine Reihe objektiver Maßzahlen für den Grad der Softwarekomplexität ermitteln. Basierend auf einem Qualitätsmodell (z.B. ISO/IEC 9126) werden anhand dieser Metriken Aussagen über Qualitätsmerkmale getroffen. Die ermittelten Maßzahlen erlauben eine sichere Einschätzung des Fehlerrisikos und ermöglichen damit den gezielten Eingriff in den Entwicklungsprozess. Eine klassische und gleichzeitig eine der wichtigsten Metriken ist die sogenannte Cyclomatic Number V(G), welche die zyklomatische Komplexität misst. Diese Maßzahl beruht auf dem Graphenmodell der Software und wird mittels einer algebraischen Funktion aus der Anzahl der Knoten und Kanten des Graphen errechnet. Inzwischen gibt es eine Vielzahl von Metriken, deren einzelne Werte in der Gesamtbetrachtung einen brauchbaren Indikator für die zu erwartenden Probleme liefern. Die Cyclomatic Number ist eine prozedurale Metrik. Solche Metriken helfen bei der Bewertung der Komplexität der einzelnen Module oder Prozeduren anhand der verwendeten Kontrollstrukturen wie Iterationen, Rekursionen oder Verzweigungen. Die Schachtelungstiefe ist ein gutes Beispiel für eine relativ simple prozedurale Metrik, deren Wert jedoch besonders aussagekräftig ist: erfahrungsgemäß steigt die Wahrscheinlichkeit für das Auftreten von Fehlern überproportional zur Schachtelungstiefe des Quellcodes. Der Code wird unübersichtlich (was die Fehleranfälligkeit noch fördert), und die für Laufzeittests notwendige Zeit erhöht sich dramatisch, da die Kombination von Konditionen, die für den Test aller Schachtelungsvarianten erforderlich ist, schnell zu einer astronomisch hohen Zahl von Testfällen führen kann. Objektorientierte Metriken liefern ein Maß für die Komplexität der Klassen und ihrer hierarchischen Verknüpfungen. Zu dieser Kategorie gehören z.B. die Anzahl der Ahnen- und Nachkommenklassen oder auch die Tiefe des Vererbungsbaumes. Eine hohe Anzahl von Nachkommen einer Klasse kann weitreichende Auswirkungen auf die Stabilität des Systems haben, wenn in dieser Klasse Änderungen erforderlich sind. Mit den Werkzeugen zur Überprüfung von Software-Metriken werden typischerweise je nach Programmiersprache unterschiedliche Metriken mitgeliefert, die gezielt die Konstrukte der konkreten Sprache untersuchen und bewerten. Das Werkzeug Logiscope Audit aus der Telelogic-Tau-Familie beinhaltet ca. 50 prozedurale und ca. 30 objekt-orientierte vordefinierte Software-Metriken. Dieses Werkzeug bietet die Möglichkeit, für ein konkretes Projekt genau die Metriken auszuwählen, die berücksichtigt werden sollen, und die jeweils einzuhaltenden Grenzwerte zu bestimmen. Die Software untersucht den Source Code und berechnet die Werte für die anzuwendenden Metriken. Als Ergebnis werden mehrere textuelle und graphische Darstellungsformen angeboten (Abb. 2).
Vollständiges Testen - der Nachweis
Die Testsequenzen, die zur Überprüfung der Stabilität und semantischen Korrektheit durchgeführt werden, müssen im Idealfall so umfassend sein, dass jeder mögliche Pfad mindestens einmal durchlaufen wird. Aber wie kann man das feststellen? So ist z.B. bei komplexen Embedded Systemen - insbesondere bei Realtime- Anwendungen - das Zeitverhalten besonders kritisch. Eine Veränderung des Zeitverhaltens zur Laufzeit, die z.B. durch Testausgaben oder ähnliche Mechanismen verursacht wird, kann völlig andere Resultate erbringen und eine zuverlässige Aussage über Fehlerfreiheit der getesteten Software ist nicht mehr möglich. Professionelle Qualitätsmanagementsysteme wie z.B. Logiscope TestChecker von Telelogic liefern auch dafür eine Lösung: Während die Testsequenzen ausgeführt werden, überprüfen sie, ob es Module oder Pfade gibt, die dabei nicht ausgeführt werden. Dazu wird der Code entsprechend instrumentiert, um feststellen zu können, welche Pfade bei der Bearbeitung der Testfälle durchlaufen werden. Eine Fülle von Informationen und Hinweisen kann generiert werden, wie z.B. welche Teile des Codes nicht durchlaufen worden sind, welche Tests ineffizient sind, welche Module von welchen Tests ausgeführt worden sind und vieles mehr. Je nach Informationstyp erfolgt die Darstellung in graphischer Form oder in Listen (Abb. 3). Auf diese Weise können die durchzuführenden Testsequenzen und Eingabevektoren schrittweise vervollständigt werden, bis eine 100prozentige Testabdeckung aller möglichen Pfade in der Software sichergestellt ist. Bei den abschließenden Tests auf dem Zielsystem wird nicht instrumentierter Code verwendet, so dass das Laufzeitverhalten nicht verfälscht wird. Das Zielsystem arbeitet alle vorher ermittelten Eingabevektoren ab, damit wird der Code im Zielsystem systematisch und vollständig getestet. Bei dieser Methode ist gewährleistet, dass der freigegebene Code kein Statement mehr enthält, das nicht getestet wurde.
Fazit
Ein hohes Qualitätsniveau der Software lässt sich auch ohne die lange Leidenszeit einer nachträglichen Testphase erreichen. Der Einsatz wirksamer Qualitätssicherungsmaßnahmen basierend auf Werkzeugen wie Tau Logiscope für die Softwareentwicklung verkürzt die Projektlaufzeit ganz entscheidend, weil die Maßnahmen einen schwer beherrschbaren Aufgabenbereich greifbarer und besser planbar machen. Unmittelbare Vorteile sind Verkürzung der Zeit bis zur Markteinführung, geringere Entwicklungsaufwendungen und wirkungsvolle Unterstützung in Zertifizierungsverfahren nach ISO/IEC 9126 & 9001 sowie DO-178B. Darüber hinaus gibt es indirekt weitere Vorteile, z.B. Einsparungen aufgrund von weniger Reklamationsfällen sowie Verbesserung der Wahrnehmung des Herstellers bei existierenden und potentiellen Kunden.
Abb. 1: Logiscope RuleChecker Abb. 2: Logiscope Audit Abb. 3: Logiscope TestChecker |
| |
|
 |
|