Strategien zur Testfallgenerierung aus UML-Zustandsautomaten Dipl.-Ing. Carsten Paulus (FKFS), Dipl.-Ing. Michael Wolff (ZF Friedrichshafen AG), Prof. Dr.-Ing. Hans-Christian Reuss (FKFS)
Gliederung Motivation und Ziele Testprinzip Modellierung und Testsequenzerstellung Anwendung und Erfahrung Zusammenfassung und Ausblick ZFF TE-NLFKFS 2
Motivation Regler Modell des SUT Aus Einschalten Ausschalten Ein Qualitäts- und Effizienzsteigerung durch Testsequenzgenerierung ZFF TE-NLFKFS 3
Ziele Automatische Testsequenzgenerierung aus Zustandsautomaten Qualitätssteigerung durch systematisches Vorgehen Effizienzsteigerung durch Automatisierung Randbedingungen Hohe Nutzerakzeptanz Wiederverwendung von Informationen aus dem Entwicklungsprozess Fragestellungen Welche Fehlerarten können gefunden werden? Analyse des Testsequenzerstellungsvorgangs Wie kann die Anzahl der Testsequenzen beeinflusst werden? Wie können nachvollziehbare Testsequenzen erstellt werden? ZFF TE-NLFKFS 4
Softwaredesign Formale Basis für die Testspezifikation System- Architekturdesign Software- Anforderungsanalyse Softwaretest Software-Design UML MATLAB SIMULINK Zustandsdiagramme... CC++ Softwareintegration und Integrationstest ZFF TE-NLFKFS 5 Software- Erstellung Unit-Test
Testprinzip Regler Modell des SUT Aus Einschalten Ausschalten Ein Modelliert Regler - System under Test Manuell aus dem Software-Design abgeleitet ZFF TE-NLFKFS 6
Testprinzip Testsequenzen Regler Modell des SUT Strategie Aus Einschalten Ausschalten Ein Regler - System Under Test ZFF TE-NLFKFS 7
Testprinzip Testsequenzen Regler Modell des SUT Strategie Aus Einschalten Ausschalten Ein Stimulation ZFF TE-NLFKFS 8 Regler - System Under Test Testimplementierung Prüfung Testschritt 1: System im erwarteten Ausgangszustand? Testschritt 2: Stimulation eines Übergangs. Testschritt 3: System im erwarteten Zielzustand?
Modellierung Übergang: Event [Guard] Action Hierarchie Parallelität ZFF TE-NLFKFS 9
Testsequenzerstellung Strukturelle Überdeckung All-States: Jeder Zustand wird mindestens einmal besucht Anzahl der Testschritte = 2 n All-Transitions: Jeder Übergang wird mindestens einmal durchlaufen Anzahl der Testschritte* = k n N+: Ausgehend von jedem Zustand werden alle Übergangs- Bedingungen aktiviert Anzahl der Testschritte* = k 2 n2 ZFF TE-NLFKFS 10 E nter_m odus 1 Regeln_Modus1 Regeln_Modus2 E nter_m odus 2 [p_ist < p_zul] k: Anzahl der Übergänge n: Anzahl der Zustände [p_is t > p_zul] Begrenzen *: Faustformel für die Anzahl der Testschritte nach [Bin99]
Auffindbare Fehler Deak tivieren [t > t_max]ausschalten() Aktiv Inaktiv Ausgeschaltet A k tivieren Falscher Übergang: Die Implementierung durchläuft einen nicht aus der Spezifikation stimulierten Übergang Falsche Aktion: Die an einen Übergang geknüpfte Aktion ist fehlerhaft Nicht spezifizierter Übergang: Bei dem Aufruf eines Events wird in der Implementierung ein Übergang stimuliert, welcher in dem Modell nicht vorgesehen war Nicht spezifizierter Zustand: Bei dem Aufruf eines Events wird in der Implementierung ein Zustand erreicht, welcher in dem Modell nicht vorgesehen war ZFF TE-NLFKFS 11
Auswahl einer Methode All-States All-Transitions N+ Falsche Transition Nein Ja Ja Falsche Aktion Nein Ja Ja Nicht spezifizierter Übergang Nicht spezifizierter Zustand Nein Nein Ja Nein Nein Ja Faustformel Testschrittanzahl 2 n k n k 2 n2 Strategien, welche eine Bedingungsüberdeckung des Modells berücksichtigen, erhöhen die Testschrittanzahl weiter Die angegebenen Formeln gehen von einem flachen Zustandsautomaten aus. Hierarchie und Parallelität erhöhen die Testschrittanzahl ebenfalls ZFF TE-NLFKFS 12
A us sc halten Regeln Aus Autodeaktivieren «SMUT» Regeln_Modus1 Regeln_Modus2 Aktiv E ins c halten E nt er_modus 2 Ein E nt er_modus 1 Ak t ivieren [p_ist > p_zul] Deaktivieren [p_ist < p_zul] Inaktiv Begrenzen Wert_Absenken after( t = = 5 ) Regeln_Modus3 [t>t _max] Auss chalten() Ausgeschaltet Metastrategie zum Strukturerhalt Modellbildung Regler Modell des SUT Beibehalten der Struktur, Identifikation von: Hierarchie Parallelität Unabhängige Testsequenzerstellung All States All Transitions N+ Geeignete Kombination der Testsequenzen Beibehalten der Struktur, um die Testsequenzen übersichtlich zu halten Beeinflussung der Testsequenzanzahl Gezieltes Testen von Modellteilen ZFF TE-NLFKFS 13
Metastrategie zum Umgang mit Hierarchie State_1 SubState1 Substate SubState2 Übergangsbaum nach Kombination State_2 SubState4 SubState3 State_1 Substate State_2 1. 2. 3. Beibehalten der Hierarchie Substate Initial Initial1 SubState_1 State_2 SubState_3 SubState_4 Substate SubState_1 SubState_2 SubState_3 SubState_1 Die Hierarchie wird beibehalten Die vollständige Testsequenz wird inkrementell zusammengesetzt Äußerer Übergangsbaum Innerer Übergangsbaum ZFF TE-NLFKFS 14
Testen des inneren Übergangsbaumes Um die Testsequenzen für den inneren Übergangsbaum auszuführen, muss der Rest des Zustandsautomaten durchlaufen werden (State_1 oder State_2) Initialisierung Mit dem Dijkstra Algorithmus wird der kürzeste Initialisierungspfad gewählt. Parameter: Anzahl der Zustände Anzahl der Transitionen Anzahl der zu bedatenden Argumente ZFF TE-NLFKFS 15
Metastrategie zum Umgang mit Parallelität Aus A uss c halten E ins c halten Ein Regeln Regeln_Modus1 E nter_m odus 2 E nter_m odus 1 [p_ist > p_zul] Autodeaktivieren Regeln_Modus2 [p_ist < p_zul] Begrenzen Wert_Absenken after( t = = 5 ) Regeln_Modus3 Unabhängige Testsequenzableitung Automat 1 Automat 2 «SMUT» Regeln_Modus1 Enter_Modus1 Enter_Modus2 [p_ist > p_zul] Regeln_Modus2 Begrenzen [p_ist < p_zul] «SMUT» Aktiv A k tivieren Inaktiv [t>t_max]a usschalten() Ausgeschaltet «SMUT» Deaktivieren [t > t_max]ausschalten() Aktiv Inaktiv Ausgeschaltet Deak tivieren Aktivieren Für alle Regionen werden unabhängig Testsequenzen erstellt Es kann anwendungsbasiert entschieden werden, wie die Testsequenzen miteinander kombiniert werden Die Art der Kombinatorik entscheidet über die Anzahl der Testfälle ZFF TE-NLFKFS 16
«SMUT» «SMUT» Enter_Modus1 Komplexität des Produktautomaten Regeln_Modus1 Regeln_Modus2 Enter_Modus2 [p_ist < p_zul] Deaktivieren [p_ist > p_zul] Begrenzen Aktiv Inaktiv Ausgeschaltet Aktivieren [t > t_max]ausschalten() Getrennte Betrachtung Zustände: n 1 = 3 Transitionen: k 1 = 5 Zustände: n 2 = 3 Transitionen: k 3 = 4 Summe Testschritte All Transition Methode Anzahl Testschritte (k n) 15 12 27 Konfigurationen des Produktautomaten Produktautomat Zustände: n p Transitionen: k p All Transition Methode Anzahl Testschritte (k n) n 1 n 2 k 1 n 2 + k 2 n 1 + k 1 k 2 ZFF TE-NLFKFS 17 Summe Testschritte n 1 n 2 (k 1 n 2 +k 2 n 1 +k 1 k 2 ) 9 (15+12+ 20) = 513 19 Mal so viele Testschritte!
Ausführungsmöglichkeiten der unabhängig erstellten Pfade Initial Implementierungsabhängige Entscheidung: Automat 1 Regeln_Modus1 Pfad A12 Initial Pfad A21 Regeln_Modus2 Initial Regeln_Modus1 Begrenzen Verzahnte Regeln_Modus1 Aktiv Regeln_Modus2 Ausführung Regeln_Modus2 Inaktiv Begrenzen Pfad A11 Pfad A12 Regeln_Modus2 Aktiv Pfad A11 Pfad A21 Automat 2 Sequenzielle Initial Initial Ausführung Regeln_Modus1 Aktiv ZFF TE-NLFKFS 18 Pfad A21 Pfad A22 Regeln_Modus2 Regeln_Modus1 Inaktiv Aktiv
Kombinationsmöglichkeiten der Tetsequenzen Automat 1 Automat 2 Pfad A11 Pfad A12 Pfad A21 Pfad A22 Jeder Pfad mindestens einmal Jeder Pfad mit jedem Pfad 1. 2. 1. 2. 3. 4. ZFF TE-NLFKFS 19
Anwendung Testsequenzen Testfallbeschreibungssprache Ausführbarer Testcode Unit-Test (C++) Die Kontrollflussüberdeckung des zu testenden Codes kann gemessen werden und stellt ein Maß für die Güte der Testsequenzen dar Auswahl der All-Transitions Methode Nicht spezifizierte Zustände und Übergänge werden durch die Kontrollflussmessung identifiziert Die Anzahl der Testfälle bleibt überschaubar Abhängigkeit zwischen Modell und Testsequenzen ist transparent ZFF TE-NLFKFS 20
Erfahrung Die Automatisierung wurde gegen eine manuelle Referenzimplementierung getestet. Der manuell erstellte Testcode besteht aus ca. 4000 Zeilen. Die Werkzeugkette generiert ca. 2000 Zeilen Testcode In dem Projekt konnte mit einem Modell bereits eine Bedingungsüberdeckung des zu testenden Codes von 50 % nachgewiesen werden Fehlende Überdeckung geht nicht zu Lasten der Modellierung oder der Methode. Das zustandsbasierte Verhalten des zu testenden Codes macht in dieser Anwendung nur ca. 70 % aus Die transparenten strukturellen Testsequenzen können manuell ergänzt werden Funktioniert ein Pfad bei mehrmaligem Durchlauf? Überprüfen, einer nicht im Modell spezifizierten Bedingung Unterschiedliches Zeitverhalten: Ereignisse mit verschiedenen Zeitabständen ZFF TE-NLFKFS 21
Zusammenfassung und Ausblick Zusammenfassung Qualitätssteigerung durch transparent nachvollziehbare strukturelle Testsequenzen Effizienzsteigerung durch automatische Testcodegenerierung Analyse des Testsequenzerstellungsprozesses Identifikation von Faktoren zur Steuerung der Testsequenzanzahl und ihrer Transparenz Auswahlkriterien für eine Testsequenzerstellungsmethode Metastrategien zum Umgang mit Parallelität und Hierarchie Ausblick Einsatz der Methoden in anderen Testphasen Verbreitung der Methoden in den Projekten ZFF TE-NLFKFS 22
Vielen Dank für Ihre Aufmerksamkeit! Gerne stehe ich für Fragen zur Verfügung ZFF TE-NLFKFS 23
Literatur [Bin99] Robert V. Binder: Testing Object-Oriented Systems, Models, Patterns and Tools. Addison Wesley, 1999. ZFF TE-NLFKFS 24