Aktueller Stand: Tool zur Überdeckungsmessung und zum ... · Entwicklungsziele Erstellung eines...

31
Aktueller Stand: Tool zur Überdeckungsmessung und zum strukturorientierten Softwaretest Ronny Treyße & Hendrik Seffler HU Berlin Aktueller Stand – p.1/31

Transcript of Aktueller Stand: Tool zur Überdeckungsmessung und zum ... · Entwicklungsziele Erstellung eines...

Aktueller Stand: Tool zurÜberdeckungsmessung und zumstrukturorientierten Softwaretest

Ronny Treyße & Hendrik Seffler

HU Berlin

Aktueller Stand – p.1/31

Entwicklungsziele

Erstellung eines Programms, das den strukturorientiertenSoftwaretest unterstützt

Analyse (d.h. Parsen) von Quellcode in C++ und Java

Ableitung von Komplexitätsmaßzahlen

Ermittlung von Überdeckungsmaßen (imZusammenspiel mit ATOS)

Instrumentierung von Programmcode in beidenSprachen

Auswertung und Darstellung der Resultate

Aktueller Stand – p.2/31

Entwicklungsziele

Darstellung des Kontrollflusses

Nachvollziehen des Kontrollflusses für einzelneTestfälle bzw. Programmdurchläufe

Architekturinformationen gewinnen

Aktueller Stand – p.3/31

Struktur

Wie haben die Aufgabenstellung in zwei Teile zerlegt

Parser/InstrumentiererParsen des QuelltextesInstrumentierung des Quelltextes

Parser sowohl stand-alone als auch aus der grafischenOberfläche einsetzbar

Auswertung/SteuerungGrafische Oberfläche zurKonfiguration/ProjekterstellungAuswertung der Ergebnisse und deren Darstellung

Kapselung der Sprachabhängigkeiten im Parser

Aktueller Stand – p.4/31

GrundsätzlicheImplementierungentscheidungen

Implementierung in Java (Instrumentierer undAuswerter)

Nutzung eines Parser-Generators (JavaCC)

Kontrollflussgraphen mit JGraph-Bibliothek

keine weiteren Abhängigkeiten

Aktueller Stand – p.5/31

Überblick Parserkomponente

Die Parserkomponente muss Folgendes leisten:

Parsen von C++ und Java-Programme

Filtern von Strukturinformationen des Programmes

Konstruktion eines Abstrakten Syntaxbaums (AST)

Erstellen einer instrumentierten Version desProgramms anhand des AST

Aktueller Stand – p.6/31

Subsystem Parser im Gesamtsystem

Logdateien

Testauswertung

Instrumentierer−komponente

TestsystemCompiler +

Hauptprogrammauswertendes

Quellcode

instrument. QC

reduz. SyntxbaumKonfig.daten

Aktueller Stand – p.7/31

wesentliche Komponenten desSubsystems

Parser-Klassen für C++ und Java

ASTManager-Klasse und entsprechendeKnotenstrukturen

Klassen/Funktionen, die Logausschriften in C++ bzw.Java übernehmen

Aktueller Stand – p.8/31

JavaCC

ist populärster CompilerCompiler für Javaprojekte

entwickelt bei Sun Labs

seit letztem Sommer OpenSource und unterBSD-Lizenz

geschrieben in Java und produziert Java-Code

generiert Lexer und TopDown-Parser (LL(1)) auseinem (EBNF-)Grammatikfile

bietet syntaktischen und semantischen Lookahead fürKonfliktauflösung

Aktueller Stand – p.9/31

vorgefundene Grammatiken fürJavaCC

Java-Grammatik:aktuell und wird gewartetbisherige Testläufe ohne Probleme

C++-Grammatik:Date 97 ?!arbeitet nur auf präprozessierten Quellcodekein namespace, typename, type_id, keinedifferenzierten Casts (dynamic_cast, ...)bei Testläufen kleinere Unverträglichkeiten beispeziellen Konstrukten (z.B.: const double Pi(3); )

Aktueller Stand – p.10/31

aktueller Stand - Parser

Java-Parser:funktionstüchtig, aber noch nicht umfangreichgetestet

C++-Parser:parst mit gefixter Grammatik neuere SchlüsselworteUnverträglichkeiten sind noch zu beseitigenoffene Fragen:

lässt sich das Präprozessieren umgehen?wie mit Makros umgehen?

Aktueller Stand – p.11/31

Abstrakte Syntaxbaum

AST-Managerbaut während des Parsens den AST aufführt Aktionen über den AST aus

AST-Strukturentspricht strukturell dem Kontrollflussgraphenenthält spezielle Knoten für kontrollflussrelevanteStrukturen (if, while, ..)lässt komplette Rekonstruktion des Quellcodes inkl.Instrumentiereungsansweisungen zuspeichert Informationen über die Erfüllung vonÜberdeckungsmaßen nach Logauswertung

Aktueller Stand – p.12/31

aktueller Stand - AST

Konstruktion des AST für Javaprogramme undrudimentäre Instrumentierung funktioniert

noch zu erledigen:Bedingungsanalyse vollendenInstrumentierung nach verschiedenen Levelimplementieren

Aktueller Stand – p.13/31

Logger-Klasse

stellt Klassen bzw. Funktionen zur Verfügung, die dieLogging-Funktion im instrumentierten Programmübernehmen

globale Struktur, die überall im Quellcode zugänglichsein muss

offene Fragen:Synchronisation des Logfilezugriffs und derDatenaktualisation bei geforkten Prozesseneleganteste Logging-Methode

Aktueller Stand – p.14/31

Logging-Testversuch

Testsystem: Simulationsprogramm(24kB) auf Basis derOdem-Bibliothek (J.Fischer)

Laufzeit: <2 Sek, startet ca. 1000 Prozesse

Ergebnis: naives, episodisches Logging erstelltLogfile >1MB

Ergo: Logging-Struktur muss während LaufzeitDatenstruktur halten, warten und sichern

Aktueller Stand – p.15/31

Fazit - Parsersubsystem

Parser für Java einsatzbereit

Parser für C++ noch mit grundlegenden Problemen

AST wird optimiert und bzgl. der Bedürfnisse bei derAuswertung modifiziert

Logger-Funktionalität muss geeignet für komplexereSzenarien entworfen werden

Aktueller Stand – p.16/31

Aufgaben des Hauptprogramms

Aufgaben des Hauptprogramms

Projekterstellung und SpeicherungPfade, Parameter und Einstellungen

statische Quelltextanalyse

Ergebnisse von Testdurchläufen auswerten

Aktueller Stand – p.17/31

Struktur

Grundsätzliche Struktur der Oberfläche

Projekt-Management

Komplexitätsauswertung

Überdeckungsmaße bestimmen

Architektur

Aktueller Stand – p.18/31

Projekt-Management

Daten über Projekte werden in Projekt-Dateien abgelegt

beim Laden: Prüfung auf Aktualität

Ablage in XML

enthalten: Schlüssel-Wert Zuordnungen in Kategorien

Erstellung von Projekt manuell oder mit Assistent

Format festgelegt, wird gelesen und geschrieben. Abzule-

gende Daten festgelegt.

Aktueller Stand – p.19/31

Sichten auf ein Projekt

Drei grundsätzliche Sichten auf ein geladenes Projekt

Komplexität

Architektur

Überdeckung

Diese Sichten werden jeweils zusammengesetzt aus

Grundtypen, die auf den gleichen Daten operieren und die-

se jeweils passend darstellen

Aktueller Stand – p.20/31

Sichten auf ein Projekt

Sichten auf ein Projekt

Kontrollflüsse

Quelltextansicht

Klassen-/Struktursicht

Testfälle

Aktueller Stand – p.21/31

Kontrollfluss

Aufgabe der Komponente: Darstellung des Kontrollflusseseiner Methode

Darstellung von Graphen komplexe Materie

Verwendung einer Grafik-Bibliothek: JGraph

Open-Source unter LGPL

Alternativen? Grappa (Java Graph Package von AT&T)vergleichbar, Doku aber leider grausig

Aktueller Stand – p.22/31

Kontrollfluss

Stand der EntwicklungJGraph bietet keinen Layout-Algorithmus für Graphen, dasLayout ist selbst auszuführen

Nutzung eines generischen Algorithmus´ vs. Nutzungeines eigenen?

Einfachere Prüfung der Korrektheit vs. Kontrolle überdas Layout

Noch nicht entschieden. Im Moment eigener, nichtkompletter Algorithmus, der nicht alleSprachkonstrukte kennt

Algorithmus wählen, Unterstützung allerSprachkonstrukte

Aktueller Stand – p.23/31

Quellcodeansicht

Sicht auf einzelne Methoden des Programms

Quellcodeanzeige

Formatierung wie im Original-Programm

Farbige Hervorhebung von Kontrollflüssen

Anzeige von (atomaren) Bedingungen und derenBelegungen

Aktueller Stand – p.24/31

Quellcodeansicht

Stand der Dinge

Einfache Darstellung von Quellcode ohne weitereFormatierung realisiert

Darstellung von strukturiertem, formatiertem Text mitJava-Mechanismen möglich, aber recht komplexerMechanismus

Aktueller Stand – p.25/31

Testfalldarstellung

Darstellung von Testfällen

Primär Anbindung an ATOS

Auslesen und Verwalten von Testfällen ausATOS-Projektdateien

Zusammen mit den Informationen, die der instrumentier-

te Quellcode liefert, ist so eine Zuordnung zwischen Pro-

grammdurchläufen und Testfällen, die sie ausgelöst haben,

möglich

Aktueller Stand – p.26/31

Klassen-/Strukturansicht

Darstellung der logischen Struktur des zugrundeliegendenQuellcodes: Klassen und Methoden

Darstellung in einem Baum

Übersicht über Programm

Navigationshilfe

Auswahl eines Elementes fokussiert andere Ansichtenmit ausgewähltes Objekt

Fertig, funktioniert. Allerdings reagieren nicht alle Sichten

auf Fokussierung

Aktueller Stand – p.27/31

Logik

Von den GUI-Komponenten getrennt existiert eineLogikschicht, die die Auswertung der Ergebnisse derstatischen und dynamischen Analyse übernimmtInsbesondere

Komplexitätsbestimmung (essentiell, zyklomatisch)

Überdeckungsbewertung

Aktueller Stand – p.28/31

Logik-Komplexität

Auswertung der Komplexität von Quelltext

Da Graph intern schon konstruiert relativ einfach

Durchlauf durch Datenstruktur einer Methode undzählen von Knoten und Kanten

essentieller Komplexität: nicht alle Knoten zählen, jenach Typ

Noch nicht realisiert, aber Infrastruktur dafür schon da

Aktueller Stand – p.29/31

Logik-Überdeckung

Komplex. Erfordert intensive Auswertung der Daten derLog-Dateien des instrumentierten Codes inkl. überwachenvon Konditionalen

abhängig von instrumentiertem Programm

Instrumentierung noch nicht fertig

daher noch nicht in Angriff genommen

Aktueller Stand – p.30/31

Ende

Aktueller Stand – p.31/31