Dank der durch Wiederverwendung vorgefertigter und
betriebsbewährter Software-Bausteine ermöglichten
Einsparung an Entwicklungs- und Zertifizierungskosten
gewinnen komponentenbasierte Software-Systeme sowohl
wirtschaftlich als auch qualitativ zunehmend an
Attraktivität. Selbst im Falle neu zu entwickelnder
Module unterstützt das strukturbetonte Bausteinprinzip
die Transparenz und somit auch die Verständlichkeit
logisch komplexer Entwürfe.Obgleich diese inzwischen weit verbreitete Vorgehensweise
die Konstruktion komplexer Entwurfslogik deutlich
erleichtert, erfordert sie gleichzeitig die Anwendung
neuer Ansätze zur Überprüfung der Angemessenheit der
zwischen Komponenten realisierten Interaktion. Zahlreiche
Vorfälle des vergangenen Jahrzehnts weisen auf die
zunehmende Gefahr fehlerhafter Schnittstellen zwischen
inhärent korrekten Komponenten hin.
Einerseits wurden in der Vergangenheit bereits Ansätze
zum Erstellen von Testfällen entwickelt, die verschiedene
Überdeckungskriterien sowohl auf Ebene des Programmcodes
als auch auf Modellebene erfüllen. Diese Testfallmengen
sind allerdings nicht zur Herleitung einer quantitativen
Zuverlässigkeitsaussage geeignet.
Andererseits existiert mit der statistischen
Stichprobentheorie bereits ein fundierter Ansatz zur
Herleitung eben einer solchen Zuverlässigkeitsaussage.
Bei diesem reinen Black-Box-Test wird jedoch die innere
Struktur des untersuchten Programms nicht berücksichtigt.
Ziel des Forschungsvorhabens ist es, die Testphase so zu
gestalten, dass nicht nur eine möglichst hohe Überdeckung
hinsichtlich der Interaktion der Komponenten auf
Programmcodeebene erreicht wird, sondern zusätzlich eine
quantitative Zuverlässigkeitsbewertung der Software für
verschiedene funktionale Anforderungen abgeleitet werden
kann.
Dazu wurden zunächst verschiedene Teilziele definiert,
die sich aus den Voraussetzungen der statistischen
Stichprobentheorie und der Überdeckung der Interaktion
von Komponenten ergeben.
Zum Zweck der Messung der drei identifizierten Teilziele
– statistische Unabhängigkeit, Betriebsprofiltreue und
Überdeckungsgrad der Interaktion – wurden adäquate
Metriken identifiziert.
Der neu entwickelte Ansatz evaluiert und kombiniert diese
Metriken mittels genetischer Algorithmen, um eine
Testfallmenge zu generieren, die sowohl eine fundierte
quantitative Zuverlässigkeitsbewertung, als auch eine
möglichst hohe Interaktionsüberdeckung zwischen
vorgegebenen Komponenten gewährleisten kann.
Das Vorhaben bestand aus folgenden Arbeitsschritten:
Erweiterung der kopplungsbasierten
Integrationstestkriterien. Die Überdeckungskriterien
nach Jin & Offutt wurden dahingehend erweitert, dass
einige bisher noch nicht behandelte Sonderfälle bei der
Interaktion zwischen Komponenten berücksichtigt werden.
Statische Analyse. Um die erzielbare Überdeckung eines
Programms gemäß einem vorgegebenen Überdeckungskriterium
zu ermitteln, wurde ein statischer Analysator
implementiert, welcher alle dynamisch zu überdeckenden
Def-Use-Paare bestimmt. Die statische Analyse arbeitet
dabei sowohl fluss- als auch kontextsensitiv.
Dynamische Analyse. Zwecks dynamischer Analyse wird der
Quellcode derart automatisch instrumentiert, dass die
erzielte Überdeckung gemäß den kopplungsbasierten
Integrationskriterien von Jin & Offutt bei Ausführung des
Programms mit vorgegebenen Testfällen gemessen werden
kann. Der so ermittelte Wert wird anschließend zur
Optimierung der Testfallmengen verwendet.
Einsatz des entwickelten Verfahrens. Das entwickelte
Verfahren wurde auf ein selbst erstelltes
Beispielprogramm angewendet und die Ergebnisse
veröffentlicht. Dabei wurde gezeigt, dass die
Schnittstellentestüberdeckung – bei gleichzeitiger
Aufrechterhaltung der Bedingungen zur Anwendung der
statistischen Stichprobentheorie – wesentlich erhöht
werden konnte.
Berücksichtigung der Sicherheitsrelevanz einzelner
Kopplungspaare. Der Ansatz wurde derart erweitert, dass
nicht nur ein kumulativer Überdeckungswert ermittelt
wird, sondern einzelne Kopplungspaare entsprechend ihrer
Relevanz mit unterschiedlicher Intensität getestet werden
können.
Automatische Erstellung eines Testtreibers für
instrumentierte Programme. Infolge der relativ hohen
Anzahl notwendiger Testfälle hat die Testausführung
besonders effizient zu erfolgen. Dazu wurde ein Programm
zur automatischen Erstellung performanter Testtreiber
entwickelt. Diese Testtreiber garantieren die
Unabhängigkeit der Testfallausführung und ermöglichen
eine auf mehrere Kerne und Rechner verteilte Ausführung
der Testfallmengen.
Lokale Optimierung zur Auffindung schwer zu
überdeckender Entitäten. Zwar vermag die automatische
Testfallgenerierung mittels genetischer Algorithmen mit
verhältnismäßig geringem Aufwand qualitativ hochwertige
Testfallmengen zu erstellen, allerdings gibt es keine
Garantie, dass alle relevanten Entitäten durch die
verwendete Heuristik tatsächlich überdeckt werden. Der
Ansatz wurde deshalb um eine lokale Optimierung
erweitert, die eine gezielte Suche nach Testfällen für
die Ausführung bisher noch nicht überdeckter Entitäten
ermöglicht. Diese Testfälle können dann in der globalen
Optimierung zur weiteren Steigerung der
Interaktionsüberdeckung verwendet werden.
Erweiterung des Ansatzes im Hinblick auf eine möglichst
gleichmäßige Überdeckung der Kopplungsdefinitionen. Der
Ansatz wurde dahingehend erweitert, dass im Falle nicht
vollständiger Überdeckung der Kopplungspaare die
relativen Anteile überdeckter Kopplungspaare pro
Kopplungsdefinition möglichst gleichmäßig sind.
Erweiterung des Ansatzes im Hinblick auf eine möglichst
gleichmäßige Überdeckung der Kopplungspaare. Darüber
hinaus wurde der Ansatz auch dahingehend erweitert, dass
im Falle vollständiger Überdeckung der Kopplungspaare die
Häufigkeit ihres Auftretens möglichst gleichmäßig ist.
Automatische Unterstützung des Mutationstests.
Die im davorliegenden Zeitraum bereits implementierte
Instanziierung kopplungsbasierter Mutationsoperatoren zur
Erzeugung von Programmmutanten wurde im Rahmen einer
studentischen Abschlussarbeit effizienter gestaltet. Nach
Generierung der mutierten Programmvarianten ist das
Werkzeug in der Lage, die während der Testausführung
beobachtbaren Verhaltensunterschiede zwischen dem
ursprünglichen Programm und seinen Mutanten aufzuzeichnen
und damit die nach verschiedenen Strategien generierten
Testfälle im Hinblick auf ihr Fehleraufdeckungspotenzial
vergleichend zu bewerten.
Evaluierung des Ansatzes mit Hilfe des Mutationstests.
Optimierte Testfallmengen wurden mit Hilfe des
entwickelten Werkzeugs im Hinblick auf ihre Fähigkeit zur
Aufdeckung typischer Interaktionsfehler bewertet.
Grenzen der praktischen Einsetzbarkeit des Ansatzes. Im
Rahmen einer weiteren industriellen Kooperation wurden im
Zusammenhang mit einer Machbarkeitsstudie signifikante
Erkenntnisse hinsichtlich der Randbedingungen gewonnen,
unter denen der zur Interaktionsüberdeckung entwickelte
Ansatz in seiner derzeitigen Form die Grenzen seiner
Praxistauglichkeit erreicht: etwa im Hinblick auf die vom
zugrundeliegenden genetischen Algorithmus zu erwartenden
Datentypen, die derzeit auf skalare Datentypen bzw. aus
skalaren Datentypen zusammengesetzte Objekte beschränkt
sind, während weitere Datentypen, wie Zeichenketten bzw.
Dateien, bisher nicht vorgesehen sind.
Dieses Forschungsprojekt wurde im vergangenen
Berichtszeitraum 2015 schließlich durch die
Fertigstellung einer Dissertation mit dem Titel
„Quantitative Bewertung der Softwarezuverlässigkeit unter
Berücksichtigung der Komponenteninteraktionen“ und
Abschluss des zugehörigen Promotionsverfahrens
erfolgreich beendet.