Timed Testing Christian Röller Lehrstuhl für Software Modeling and Verification RWTH Aachen [email protected] Zusammenfassung Diese Ausarbeitung thematisiert das Testen von zeitkritischen Systemen und stellt dabei den Ansatz von Nielson und Skou [NiSk03] in den Mittelpunkt. Die Gliedeung sieht drei Kapitel vor. Kapitel 2 beschäftigt sich mit den Grundlagen zum modellbasierten Testen, indem erst kurz auf das Testen mit Modellen allgemein eingegangen wird, um dann die nötigen Modelle zum timed testing einzuführen. Weitergehend wird noch auf die Grundlagen für den speziellen Ansatz eingegangen, also den Hennessy Tests und der symbolic representation. Das nächste Kapitel 3 beschreibt dann den eigentlichen Testablauf für den Ansatz, bevor Kapitel 4 eine Zusammenfassung der Ausarbeitung gibt. Inhaltsverzeichnis 1 Motivation 2 2 Grundlagen zur Modellierung von zeitkritischen Systemen 2.1 Model-based-testing . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Hennesy Test . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Timed automata . . . . . . . . . . . . . . . . . . . . . . . . . 2.4 Event recording automata . . . . . . . . . . . . . . . . . . . . 2.5 Symbolic representation . . . . . . . . . . . . . . . . . . . . . 2.5.1 Timed trace Berechnung . . . . . . . . . . . . . . . . . 2.6 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 4 5 7 9 11 13 3 Testen mit Hilfe des Modells 3.1 Test selection . . . . . . . . . . . . . 3.2 Zustandspartitionierung . . . . . . . 3.3 Dekorierter Äquivalenzklassengraph 3.4 Testalgorithmus . . . . . . . . . . . . 3.5 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 15 16 18 19 20 4 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 1 1 Motivation Sowie die Softwareentwicklung fester Bestandteil der Informatik ist, ist auch das Testen neuer Systeme fester nicht wegzudenkender Bestandteil der Softwareentwicklung. Testen ist in der Softwareentwicklung immer noch die dominanteste Validierungsaktivität, um ein System auf Korrektheit zu prüfen. Und trotz steigender Komplexität in der Softwaretechnik mangelt es immer noch an leistungsstarken, automatisierten Testverfahren, sodass das Testen immernoch eine sehr zeitaufwändige und kostenintensive Komponente einnimmt. Es besteht also ein großer Bedarf an effektiven automatisierten Testverfahren, wobei Effektivität in diesem Kontext drei Dinge meint. Zum einen müssen Tests effektiv hinsichtlich ihrer Ausführungszeit sein, zum Anderen dürfen die Tests dabei nicht zuviele Resourcen des Systems verwenden, denn diese sind schließlich begrenzt und gleichzeitig müssen effektive Testverfahren aber auch für eine hohe Abdeckung des Test-Objekts sorgen, da eine volle Abdeckung meist praktisch nicht umsetzbar ist. Eine sehr vielversprechende Technik ist das modellbasierte Testen, bei der das Verhalten des zu testenden Systems mit einem Modell dargestellt wird, um aus diesem automatisiert Tests zu erstellen, auszuführen und auszuwerten. Es existiert eine Vielzahl solcher modellbasierter Testansätze, wobei sich die meisten auf das qualitative Verhalten von Software beschränken und die quantitativen Aspekte von Software außer Acht lassen, wie zum Beispiel Echtzeiteigenschaften. Der immer größer werdende Anteil an eingebetteten Systemen und Kommunikationssoftware, bei denen Echtzeit eine Voraussetzung zum korrekten Ablauf sind, führte zur Erweiterung des modellbasierten Testens um den Zeitfaktor. Dies führt uns direkt zum eigentlichen Thema dieser Arbeit, dem sogenannten timed modelbased testing oder auch kurz timed testing genannt, bei dem die aktuellen Modelle so erweitert wurden, dass nun auch quantitative Aussagen zum zeitlichen Ablauf der getesteten Software möglich sind. Die folgende Ausarbeitung beschäftigt sich genau mit den angesprochenen Problemen und zeigt einen Ansatz für modellbasiertes blackbox testing bei Systemen mit einer vorhandenen externen Zeitbeobachtung. 2 2 Grundlagen zur Modellierung von zeitkritischen Systemen Dieses Kapitel beschäftigt sich mit den Grundlagen des modellbasierten Testens, um dann aufbauend das hier verwendete Modell für timed testing einzuführen, den sogenannten timed automata, beziehungsweise eine Spezialform dieser, den event recording automata. Zusätzlich werden noch die zum Verständnis benötigten Hennesytests eingeführt und eine effiziente Darstellung unserer Automaten vorgestellt, die symbolic representation, welche uns das Berechnen von timed traces ermöglicht. 2.1 Model-based-testing Modellbasiertes Testen impliziert automatisiertes Testen. Denn es geht darum das erwartete Verhalten der zu testenden Software in einem Modell zu spezifizieren, um daraus automatisch Testcode ableiten zu können. Die so enstehenden Testfälle werden dann von einem speziellen Tool, welches die Testfälle interpretieren kann, auf dem zu testenden System ausgeführt und mit den zu erwartenden Testergebnissen verglichen. Die unten angegebene Abbildung illustriert das Verhalten nochmal ein bischen anschauchlicher. Abbildung 1: model-based testing Links ist die formale Spezifikation zu erkennen, in diesem Fall ein timed automaton, welcher als Input für das Testgenerierungstool dient. Das Tool ist zum Einen dafür verantwortlich, die Testfälle zu erzeugen, aber auch gleichzeitig eine Auswahl dieser vorzunehmen, denn wie in den weiteren Kapiteln noch erläutert wird, lassen sich unendlich viele Testfälle aus unserem Modell ableiten. Die so erhaltene Testsammlung wird jetzt vom Testausführungstool in eine Sprache übersetzt, die für unsere Implementierung unter Test verständlich ist und automatisch ausgeführt werden kann. Die sogenannte implementation relation beschreibt exakt die Konformität zwischen Spezifikation und Implementierung. Wie schon an der Abbildung zu erkennen ist(timed automata als Modell) soll es nun aber nicht um das modellbasierte Testen von normalen Systemen gehen, sondern um das Testen von zeitkritischen 3 Systemen. Bei diesen Systemen ist nicht nur der richtige Output, sondern auch die erwartete Zeit für diesen Output entscheident für die Korrektheit ist. Das Modell, welches diese Zusatzeigenschaft spezifizieren soll, sind die timed automata, welche im Kapitel 2.3 genauer erläutert werden. 2.2 Hennesy Test Dieses Kapitel dient als Grundlage für den im Anschluss vorgestellten Ansatz von Nielson und Skou [NiSk03], bei dem die implementation relation auf Hennessy Tests basiert. Bei Hennessy’s Testingtheorie wird die Spezifikation mit Hilfe eines labelled transition system mit endlichem Aktionsalphabet dargestellt. Weiter wird angenommen, dass die Implementierung durch endlich viele Beobachtungen observiert werden kann. Die endliche Sequenz an Kommunikation zwischen Tester und Implementierung unter Test wird Berechnung genannt und im weiteren mit Comp(T k I) bezeichnet. Jeder Ausführung eines Test wird ein Verdikt(PASS, FAIL, INCONCLUSIVE) zugeordnet. Endet eine Berechnung mit einer Beobachtung, welche dem Verdikt PASS entspricht, so war die Berechnung erfolgreich. Grundsätzlich unterscheidet man zwischen drei Tests mit folgender Syntax: • after σ must A • can σ • after σ must ∅ (cannot σ) Dabei ist Test 1 erfolgreich, wenn mindestens eine Beobachtung aus A gemacht wird, nachdem trace σ beobachtet wird. Test 2 ist erfolgreich, wenn σ ein Präfix des beobachteten Systems ist und Test 3 ist erfolgreich wenn σ gerade kein Präfix darstellt. Die Basisidee der Hennessy-Theorie ist es, zwei Systeme nur anhand ihrer Tests zu vergleichen. Somit sind zwei Systeme äquivalent, wenn ein Tester sie nicht anhand von Tests unterscheiden kann. Da manche Berechnungen erfolgreich ausfallen und manche nicht, lässt sich das Bestehen eines Tests nun auf zwei verschiende Varianten definieren. Entweder besteht die Implementierung den Test, wenn eine erfolgreiche Berechnung ausreicht oder die Implementierung besteht den Test, wenn alle Berechnungen erfolgreich ausfallen müssen. Diese beiden Varianten werden auch als may- beziehungsweise als must-preorder bezeichnet und sind wie folgt definiert: 1. S must T gdw. ∀ Σ ∈ Comp(T k S) : Σ ist erfolgreich 2. S may T gdw. ∃ Σ ∈ Comp(T k S) : Σ ist erfolgreich 3. S vmust I gdw. ∀ T : S must T impliziert I must T 4. S vmay I gdw. ∀ T : S may T impliziert I may T 5. S vte I gdw. S vmust I und S vmay I Bei nicht deterministischen Systemen ist zwischen diesen beiden Preorders zu unterscheiden, denn sie sind nicht gleich ausdrucksstark. Nehmen wir dazu folgendes Beispiel an: Beispiel: S2 stellt zwar unter der may-preorder eine korrekte Implementierung von S1 dar, allerdings nicht unter der must-preorder. Denn der Test after coin must(cof ) lässt den Unterscheid der beiden Systeme erkennen. Wohingegen alle 4 coin coin coin coin cof tea cof Abbildung 2: S1 coin cof tea tea Abbildung 3: S2 Abbildung 4: S3 vodka tea Abbildung 5: S4 Berechnungen von S1 erfolgreich ausfallen würden ist dies bei S2 nicht der Fall. Somit stehen diese beiden Systeme nicht in der must-preorder aber wären unter der may-preorder konform. Ein zweites Beispiel, indem ein may Test den Unterscheid erkennen lässt wäre der Fall, dass S3 keine korrekte Implementierung von S2 darstellt. Denn der Test may coin•cof lässt den Unterscheid der beiden Systeme erkennen. Wohingegen es in S2 eine erfolgreiche Berechnung für diesen Test gibt, ist das bei S3 nicht der Fall. Die dritte Art von Tests eignet sich um unerwünschtes Zusatzverhalten zu testen. So ist zum Beispiel S4 keine korrekte Implementierung von S1 , denn mit dem Test after coin•vodka must ∅(cannot coin•vodka) lassen sich die beiden Systeme unterscheiden, insofern das S1 diesen Test immer besteht und S4 nicht. Wichtig ist also bei der Wahl der preorder darauf zu achten ob Determinismus vorliegt oder nicht. Die hiermit vorgestellten Hennessy Tests werden im späteren Verlauf als Grundlage der implementaion relation dienen. Mit Hilfe dieser Test werden später sogenannte deadlock observations formuliert, die zu bestimmten traces auftauchen müssen, möglich sein müssen oder nicht auftauchen dürfen. Um die Hennessy Tests auch für den vorgestellten Ansatz verwenden zu können, stellen die traces im folgenden timed traces dar und die Berechnung findet auf timed automata statt. Die Ableitung dieser timed traces wird Inhalt des Kapitels 2.5.1 sein. 2.3 Timed automata Die timed automata erweitern die klassischen endlichen Automaten um eine endliche Menge von Uhren über einem dichten Zeitintervall. Alle Uhren ticken dabei monoton in einer einheitlichen Rate, sodass sie die vergangene Zeit von ihrem Startpunkt oder ihrem letzten Reset messen können. Im Gegensatz zu normalen Automaten hängt das Schaltverhalten von timed automata nicht nur von Inputsymbolen ab, sondern auch von den Werten der einzelnen Uhren. Jede Transition kann beliebige Uhren des Automatens zurücksetzen und hat eventuell Schaltbedingungen, welche sich auf die Werte der Uhren beziehen. Eine Transition ist also schaltbar, wenn das zugehörige Inputsymbol gelesen wird und die Werte der Uhren den Zeiteinschränkungen auf der Transition entsprechen. Diese Zeiteinschränkungen haben die folgende Syntax. Für eine Menge C von Uhren wird die Menge Φ(C) der Zeiteinschränkungen ϕ induktiv wie folgt definiert: ϕ = c < k | c > k | c ≤ k | c ≥ k | ϕ1 ∧ ϕ2 wobei c ∈ C und k ∈ Q+ 5 Ein timed automata A ist ein Tupel (S,S0 ,Σ,C,Inv,E) wobei • S ist endliche Menge an Zuständen • S0 ist endliche Menge an Startzuständen • Σ ist endliches Aktionsalphabet • C ist endliche Menge an Uhren • Inv : S → Φ(C) ordnet jedem Zustand eine Invariante zu • E ⊆ S × Σ × Φ(C) × 2c × S ist die Menge an Transitionen Eine Transition (s,a,ϕ,λ,s’) beschreibt also den Übergang von Zustand s nach s’ bei einem Symbol a ∈ Σ. Die Uhrbeschränkung ϕ ∈ Φ (guard ) beschreibt wann eine Transition schaltbar ist und λ ⊆ C enthält die Uhren, welche beim Übergang zurückgesetzt werden sollen. Die Zustandsinvarianten beschränken die Zeit, wielange sich der Automat in diesem Zustand befinden darf. Beispiel: Als Beispiel soll im folgenden ein Lichtschalter dienen, welcher wie folgt als timed automaton dargestellt werden kann. • S = {s0 , s1 } • S0 = {s0 } • Σ = {on,off} • C = {c} • Inv(s0 ) = true, Inv(s1 ) = c ≤ 5 Das Verhalten des Automaten lässt sich wie folgt beschreiben. Der Automat verfügt über zwei Zustände s0 , welcher den Zustand in dem das Licht aus ist repräsentieren soll und Zustand s1 , indem sich der Automat befindet wenn das Licht an ist. Das Licht kann angeschaltet werden durch Betätigen des Knopfes on. Dies entspricht dem Zustandswechsel von s0 nach s1 . Sollte der on Knopf nicht innerhalb von fünf Zeiteinheiten wieder gedrückt werden, um so das Licht weiter leuchten zu lassen, wechselt der Automat selbstständig nach genau fünf Zeiteinheiten wieder in den Zustand s0 und löscht damit das Licht, indem er die off Aktion durchführt. on?, c < 5, {c} on?, true, {c} start s1 c≤5 s0 off!, c = 5, ∅ Abbildung 6: Beispielautomat - Lichtschalter Dies soll als Grundlagen zu timed automata genügen, denn dieses Kapitel dient lediglich der Einführung in das Thema. Der Hauptteil dieser Ausarbeitung wird 6 sich mit einem speziellen Ansatz zum Thema timed testing beschäftigen, bei dem eine spezielle Variante der timed automata verwendet wird, den sogenannten event recording automaton. Für weitere Informationen zum Thema timed automata verweise ich auf das Papier von Alur und Dill [AlDi]. 2.4 Event recording automata In diesem Abschnitt wird nun der timed automaton für den speziellen Ansatz von Nielson und Skou [NiSk03] beschrieben, den sogenannten event recording automaton(ERA). Vorgeschlagen wurde diese spezielle Subart der timed automata von Alur, Fix und Henzinger in [AlFH]. Formal besteht ein event recording automaton aus folgenden Bestandteilen. Ein ERA ist ein Tupel (Act, N, l0 , G(X), X, E), wobei 1. Act = endliche Menge von Aktionen 2. N = endliche Menge von Zuständen 3. l0 = Startzustand 4. G(X) = Menge von Guards (Uhrbeschränkungen) 5. X = Menge der Uhren = {xa | a ∈ Act} 6. E ⊆ N × G(X) × Act × N = Menge der Transitionen ist. Genauso wie ein timed automaton, besitzt also auch ein ERA eine endliche Menge an Uhren, wobei jede Uhr genau einer Aktion zugeordnet ist, die sogenannte eventclock. Diese Uhr misst die Zeit zwischen dem aktuellen und dem letzten Auftreten dieser Aktion, denn sie wird automatisch bei der Ausführung ihrer Aktion zurückgesetzt. Keine weiteren Uhren dürfen zurückgesetzt werden. Des Weiteren sind keine τ Transitionen erlaubt und auch nur ein Startzustand ist gestattet. Diese Einschränkungen führen zur Determinierbarkeit von ERAs. Als Letztes wird noch angenommen, dass alle Aktionen sofort umgesetzt werden und keine Synchronisierung mit der Umwelt nötig ist. Ohne diese Annahme könnte man keine Aussagen treffen, ob die Zeitgrenzen eingehalten wurden, da man nicht weiß, wie lange die Synchronisation gedauert hat. Das folgende Beispiel soll dem besseren Verständnis beitragen. 7 start s1 coin? s2 give?, xcoin≥2 ∧ xcoin≤4 give?, xcoin≥4 s3 s4 cof!, xgive≥2 thincof!, xgive≥1 s5 s6 Abbildung 7: Beispiel ERA Kaffeeautomat(n. det.) Beispiel: Der oben abgebildete Kaffeeautomat hat die besondere Funktion das er auf die Schnelligkeit seiner Benutzer reagiert und dementsprechend dünnen beziehungsweise normalen Kaffee brüht und ist im Detail wie folgt zu verstehen. Der Benutzer startet mit dem Einwurf einer Münze(coin? ), wodurch die eventclock für coin zurückgesetzt wird. Im Zustand s2 muss der Benutzer den Knopf give(give? ) betätigen. Je nachdem in welcher Zeit dies geschieht, wechselt der Automat in Zustand s3 (bei größergleich vier Zeiteinheiten) oder in s4 (bei einer Zeiteinheit zwischen zwei und vier) und erhält somit entweder dünnen oder normalen Kaffee. Schnell zu erkennen ist, dass dieser Automat nicht deterministisch ist, denn es ist unklar wie sich der Automat verhält, wenn der Benutzer nach genau vier Zeiteinheiten den give Knopf betätigt, denn dann sind laut Spezifikation normaler sowie auch dünner Kaffee möglich. Wie schon anfangs erwähnt, lassen sich ERAs aber determinieren. Die genaue Prozedur ist in [AlFH] nachzulesen und ist der Potenzmengenkonstruktion von normalen Automaten sehr ähnlich. Das folgende Beispiel soll die Prozedur illustrieren. 8 start s1 coin? s2 give?, xcoin≥2 ∧ xcoin<4 give?, xcoin>4 give? xcoin=4 s3,4 s3 s4 thincof! xgive≥1 cof! xgive≥2 cof!, xgive≥2 thincof!, xgive≥1 s5 s6 Abbildung 8: Beispiel ERA Kaffeeautomat(det.) Beispiel: Wie man sieht entsteht also ein neuer Zustand s3,4 , zusammengesetzt aus s3 und s4 , welcher alle ausgehenden Transitionen seiner Teilzustände erhält. Sodass nun von Zustand s2 nur noch eine deterministische Wahl der Transitionen möglich ist. Semantisch gesehen ist ein timed automata ein labelled transition system mit unendlichen vielen Zuständen aufgrund des dichten Zeitintervalls. Es benötigt also einer Technik, die diese Unendlichkeit auf eine endliche Art und Weise ausdrücken kann und effizient Berechnungen darauf anstellen kann. Daher wird nun im folgenden Kapitel 2.5 eine symbolische Repräsentation der Zustände eingeführt. 2.5 Symbolic representation Wie schon im Kapitel zuvor erwähnt lassen sich timed automata nicht mit endlichen Zustandstechniken, die alle konkreten Zustände betrachten, analysieren. Daher verwendet der hier vorgestellte Ansatz eine symbolische Repräsentation. Ein Zustand in einem Automaten kann als Paar (l, u) verstanden werden, wobei l dem aktuellen Zustand des Automatens entspricht und u dem Vektor der aktuellen Uhrenwerte. Da es von diesen Zuständen unendlich viele gibt, wird der Begriff der zone eingeführt. Wobei eine zone eine Konjunktion von Uhrbeschränkungen und Uhrdifferenzen darstellt, oder anders gesagt die Lösungsmenge der zulässigen Uhrenwerte darstellt. 9 Ein symbolischer Zustand [l,z] repräsentiert also eine unendliche Menge an Automatenzuständen der Form {( l, u ) | u ∈ z }. Zones können mithilfe von difference bound matrices dargestellt und effizient manipuliert werden, das genaue Vorgehen wird von Dill in [Dill89] formuliert. Das Aussehen und die Nützlichkeit von zones soll das folgende Beispiel illustrieren. start start [s1 ,z] z=Xcoin ∈ [0,∞) ∧ Xgive ∈ [0,∞) ∧ Xcoin − Xgive = 0 coin? s1 [s2 ,z] z=Xcoin = 0 ∧ Xgive ∈ [0,∞) ∧ Xgive − Xcoin ∈ [0,∞) coin? s2 give?, Xcoin ∈ [2,4) give?, Xcoin ∈ [2,4) s4 [s4 ,z] z=Xcoin ∈ [2,4) ∧ Xgive = 0 ∧ Xcoin − Xgive ∈ [2,4) thincof!, Xgive ∈ [1,∞) s6 thincof!, Xgive ∈ [1,∞) [s6 ,z] z=Xcoin ∈ [3,∞) ∧ Xgive ∈ [1,∞) ∧ Xcoin − Xgive ∈ [2,4) Abbildung 9: Ausschnitt aus Kaffeemaschinenautomat und zugehörige symbolische Zustände Beispiel: Die obige Abbildung beschreibt zwei Dinge. Auf der linken Seite ist ein Ausschnitt des zuvor abgebildeten deterministischen Kaffeeautomatens zu erkennen und zwar der rechte Teil bei dem der Benutzer sich für einen dünnen Kaffee entschieden hat. Auf der rechten Seite sind die zugehörigen symbolischen Zustände zu erkennen. Man erkennt an diesen Zuständen die Intervalle beziehungsweise Werte der Uhren, die sie beim Eintritt zu erfüllen haben und die Differenzen der einzelnen Uhren. Man erhält den nächsten Zustand indem man Zeit entsprechend der guards 10 auf den Transitionen vergehen lässt. So sieht man zum Beispiel am symbolischen Zustand [s4 ,z], dass die Xcoin -Uhr beim Eintritt im Intervall [2,4) liegen muss und die Xgive -Uhr beim Eintritt zurückgesetzt wurde. Die Differenz entspricht somit dem Wert von der Xcoin -Uhr. Wenn man nun Zeit entsprechend des guards an der Transition vergehen lässt, also mindestens eine Zeiteinheit, dann erhält man die zone für Zustand [s6 ,z]. Hierbei ändert sich die Differenz nicht, da weder die Xcoin noch die Xgive -Uhr zurückgesetzt wurde. Die symbolische Repräsentation liefern also eine Möglichkeit den unendlichen Zustandsraum eines timed automata auf eine endliche Weise darzustellen und darauf effizient Erreichbarkeitsberechnungen anstellen zu können. Desweiteren ist es nun auch möglich, mithilfe der symbolischen Zustände, timed traces im Automaten zu berechnen. Was dabei zu beachten ist und wie die Berechnung aussieht wird exemplarisch im Abschnitt 2.5.1 erläutert. 2.5.1 Timed trace Berechnung Dieser Abschnitt gibt eine exemplarische Beschreibung der Ableitung von timed traces, welche als Grundlage für die Hennessy Tests dienen werden, mit dessen Hilfe die deadlock-observations formuliert werden sollen. Das genaue Vorgehen wird in Kapitel 3 beschrieben, hier soll es nun erstmal nur um die Ableitung gehen. Zur Berechnung werden, wie schon erwähnt, die im Kapitel zuvor vorgestellten symbolisches Zustände verwendet. Ist ein symbolischer Zustand erreichbar so impliziert das, dass auch alle von ihm repäsentierten konkreten Zustände erreichbar sind, allerdings ist bei der Berechnung des timed traces zu diesem Zustand zu beachten, dass nicht alle konkreten Zustände auf diesem Pfad zum gewünschten ausgewählten konkreten Zustand führen, sondern nur eine Teilmenge. Die Wahl eines konkreten Zustands beeinflusst also die Wahl der Zustände auf dessen Pfad. Grundsätzlich läuft die Berechnung eines timed traces wie folgt ab. Von dem ausgewählten symbolischen Zustand, bei dem der Pfad enden soll, wählt man einen konkreten Zustand, dass heißt man wählt konkrete Uhrenwerte, welche in diesem Zustand gelten können. Nun errechnet man die Zustände auf dessen Pfad durch back-propagation und Einbeziehung der einzelnen guards auf den gewählten Transitionen, indem man auch konkrete Werte für diese Zustände wählt, wobei hier natürlich die anfangs erwähnte Problematik zu beachten ist. Das folgende Beispiel soll diesen Prozeß ein wenig genauer beschreiben. Beispiel: Das Beispiel ist wie folgt zu verstehen. Auf der rechten Seite der Abbildung 10 sind die symbolischen Zustände aus dem Beispiel zuvor wieder zu erkennen, welche benutzt werden sollen um einen can σ • thincof Hennessytest zu generieren. Da eine korrekte Implementierung in diesem Zustand, bei korrekter Wahl der Uhrenwerte, dünnen Kaffee produzieren können muss. Und genau um die Berechnung dieses korrekten Pfads geht es in diesem Beispiel. So sind auf der linken Seite die konkret gewählten Zustände zu erkennen, welche ein Beispiel für genau so einen Pfad darstellen. Angefangen in Zustand s4 musste so für die eventclock (EC) von Xgive ein Wert im Intervall [1,∞) gewählt werden damit der guard der thincof ! -Transition erfüllt ist. Hier wurde der Wert zwei gewählt. Diese Wahl beeinflusste aber indirekt die Wahl von der EC von Xcoin in diesem Zustand, denn die Differenz der beiden Uhren muss im Intervall [2,4) liegen. Somit ist der Wert nun auf das Intervall [4,6) beschränkt. Hier wurde der Wert fünf gewählt. Die Wahl dieser beiden Werte beeinflusst aber auch die Wahl der Werte im Zustand davor. Denn die Tatsache das im Zustand s4 zwei Zeiteinheiten verblieben wird, 11 start start s1 Xcoin = 1 Xgive = 1 [s1 ,z] z=Xcoin ∈ [0,∞) ∧ Xgive ∈ [0,∞) ∧ Xcoin − Xgive = 0 coin? [s2 ,z] z=Xcoin = 0 ∧ Xgive ∈ [0,∞) ∧ Xgive − Xcoin ∈ [0,∞) coin? s2 Xcoin = 3 Xgive ∈ [3,∞) = 4 give?, Xcoin ∈ [2,4) give?, Xcoin ∈ [2,4) s4 Xcoin ∈ [4,6) = 5 Xgive ∈ [1,∞) = 2 [s4 ,z] z=Xcoin ∈ [2,4) ∧ Xgive = 0 ∧ Xcoin − Xgive ∈ [2,4) thincof!, Xgive ∈ [1,∞) can σ • thincof Abbildung 10: Timed trace Berechnung Beispiel da die EC Xgive gleich zwei ist und die EC von Xcoin beim Übergang von s2 nach s4 nicht zurückgesetzt wurde legt indirekt fest, dass der Wert von der EC für Xcoin im Zustand s2 gleich drei sein muss. Da sonst der Wert von fünf im Zustand s4 durch Verbleiben von zwei Zeiteinheiten nicht möglich gewesen wäre. Durch die Festlegung des Wertes auf drei wird auch wieder indirekt das Intervall von der EC für Xgive im Zustand s2 auf das Intervall [3,∞) eingeschränkt, denn der Wert muss mindestens dem Wert von der EC für Xcoin entsprechen, denn diese wurde beim Übergang in den Zustand zurückgesetzt. Hier wurde sich für den Wert vier entschieden. Natürlich beeinflusst auch die Wahl dieses Wertes die Wahl der beiden Werte im Zustand davor, beziehungsweise schränkt sie diesmal sogar auf genaue Werte ein. Denn durch die Tatsache, dass im Zustand s2 nun drei Zeiteinheiten verbracht werden soll, da die EC für Xcoin den Wert drei hat, muss auch im Zustand s1 eine Zeiteinheit verbracht werden, da sonst nicht der Wert vier von der EC von Xgive im Zustand s2 erreicht werden kann. Da diese Uhr beim Übergang von s1 nach s2 nicht zurückgesetzt wird. Da die Differenz im Zustand s1 null betragen muss, nehmen beide Uhren den Wert eins an. Der genaue timed trace für den can-Test sieht also wie folgt aus, can 1coin3give2thincof . Semantisch ist dieser Test wie folgt zu verstehen. Warte eine Zeiteinheit, führe die Aktion coin aus, warte wieder drei Zeiteinheiten, führe Aktion give aus, warte zwei 12 Zeiteinheiten, dann erfolgt der Output thincof. In einer korrekten Implementierung muss es eine erfolgreiche Berechnung für diesen Test geben. Die Wartezeiten sind an den Uhren, die zuvor zurückgesetzt wurden, abzulesen. Zu erkennen ist also, dass die Wahl der delays völlig beliebig ist solange sie den guards, beziehungsweise den daraus resultierenden Intervallen genügen. Eine begründete Frage ist also: Wie soll die Wahl der delays aussehen? Da es natürlich nicht möglich ist alle Werte der Intervalle zu testen wählt man in der Praxis meist die folgenden. 1. Ein delay an der unteren Schranke des Intervalls, um die Unverzüglichkeit (promptness) des Systems zu testen. 2. Ein delay in der Mitte des Intervalls, um die Beständigkeit(persistence) des Systems zu testen. 3. Ein delay an der oberen Schranke des Intervalls, um die Ausdauer(patience) des Systems zu testen. Auch wenn vielleicht die untere Schranke das wichtigste delay eines Tests darstellt, um deadline-errors zu erkennen, so kann es durchaus auch wichtig sein die obere Schranke zu testen, um eventuell frühzeitig abgelaufene timer zu erkennen. 2.6 Zusammenfassung In diesem Kapitel wurde zunächst das Thema model-based testing(MBT) ganz allgemein eingeführt und auf die einzelnen Konponenten Bezug genommen. So ist klar geworden, dass es beim MBT um die automatische Testgenerierung aus einem Modell geht, welches das eigentlich zu testende System spezifiziert. Weitere Aufgaben eines solchen test frameworks sind neben der eigentlichen Ableitung der Testfälle auch die Auswahl und Ausführung geeigneter Test, denn oft existieren unendlich viele Tests. Gerade beim timed testing ist dies aufgrund des dichten Zeitintervalls immer der Fall. Bei der Ausführung muss natürlich auch ein Tool existieren, welches die abstrakten Tests in eine für die implementation under test verständliche Sprache bringt und die Tests auswertet. Im Weiteren ging es dann nurnoch um das modellbasierte timed testing und es wurde das Modell der timed automata vorgestellt. Diese Automaten stellen eine Erweiterung der normalen endlichen Automaten dar, indem auch noch eine endliche Menge an Uhren zum Modell gehören, welche die relative Zeit zwischen dem aktuellen und dem zuletzt aufgetreten Symbol messen können. Besondere Merkmale dieser Automaten, wie zum Beispiel die nicht allgemein geltende Determinierbarkeit wurden in dieser Ausarbeitung nicht behandelt und nur auf das Papier von Alur und Dill [AlDi] verwiesen. Im nächsten Unterkapitel wurden dann die Hennessy Tests beschrieben, denn auf Diesen basiert die implementation relation des ERA-Ansatz von Nielson und Skou [NiSk03]. Mit Hilfe dieser Tests werden die nötigen deadlock-observations beschrieben, welche im Kapitel 3 genauer beschrieben werden. Basisidee der Hennessy Theorie ist es, Systeme nur anhand von Tests zu unterscheiden. Hierbei ist aber darauf zu achten ob es sich um deterministische Systeme handelt oder nicht, wie es im Beispiel gezeigt wurde. Der nächste Abschnitt beschäftigte sich mit dem eigentlich Modell des Ansatzes, den sogenannten event recording automata. Diese stellen eine determinierbare Subklasse der timed automata dar. Die Determinierbarkeit wird durch das Einführen von eventclocks und dem Verbieten von τ Transitionen erreicht. Ein großes Problem beim Ableiten von Tests von einem timed automata(TA) ist die Tatsache, dass jeder TA über einen unendlichen Zustandsraum verfügt, welchen es in den Griff zu 13 bekommen gilt. Die hierfür eingeführte Variante der symbolischen Zustände löst das über sogenannte zones, welche eine unendlich Menge an konkreten Automatenzuständen repräsentieren kann. Somit wurde eine endliche Darstellung geschaffen mit der auch über die sogenannten difference bound matrices effiziente Berechnungen zum erreichbaren Zustandsraum und der timed traces angestellt werden kann. Genauer wurde dieses Verfahren im Papier von Dill [Dill89] beschrieben. Im letzten Teil dieses Kapitels wurde dann nochmal exemplarisch auf die Berechnung der timed traces eingegangen um auf die Schwierigkeiten hinzuweisen. Zusammenfassend hat dieses Kapitel die Grundlage zum Spezifizieren und Ableiten der Testfälle geliefert, im nächsten Kapitel muss jetzt noch der Fragestellung nachgegangen werden, wie die Tests auf eine endliche Menge selektiert werden. Und wie die Tests im allgemeinen, also auch die schon mehrfach angesprochenen deadlock-observations, genau aussehen. 14 3 Testen mit Hilfe des Modells Dieses Kapitel behandelt das wichtige Thema der Testselektion, denn das Abdecken aller Testfälle ist beim timed testing aufgrund der Zeitkomponente nicht möglich. In dem vorgestellten Ansatz wird das über einen sogenannten Äquivalenzklassengraphen gelöst, welcher Zustände des Automatens anhand von Uhreinschränkungen zusammenfasst und gefordert wird, dass für jede dieser Äquivalenzklassen mindestens ein Test durchgeführt wird. Des weiteren wird auch noch die Einführung von deadlockobservations mit Hilfe der Hennessy Tests thematisiert um die Korrektheit des getesteten Systems zu gewährleisten. Am Ende des Kapitels wird noch der Algorithmus vorgestellt, welcher das Zusammenspiel aller kennengelernten Komponenten beschreibt. 3.1 Test selection Wie schon oft zuvor erwähnt, ist gründliches Testen, also das Abdecken aller Testfälle, praktisch nicht durchführbar, denn es existieren meist schon bei normalen Systemen, durch zum Beispiel Schleifen im Programmcode, unendlich viele dieser Testfälle. Beim timed testing wird dies durch die Zeitkomponente noch erschwert, da hier durch das dichte Zeitintervall immer unendlich viele Testfälle existieren. Um praktisch Testen zu können ist also eine Selektion von Testfällen unumgänglich. Grundsätzlich beschreibt eine solche Selektion eine endliche Menge an relevanten Vertretern für die unendliche Zustandsmenge. Was im konkreten Fall für Relevant gehalten wird hängt ganz speziell vom gewählten selection criterion ab, denn dieses beschreibt welche Tests gewählt werden sollen um die coverage zu maximieren. Coverage, Selektion und praktische Ausführbarkeit stehen also im ständigen Konflikt, so führt eine detailliertere Selektion zwar zu einem höheren coverage-Maß, allerdings wächst die Testsammlung dadurch auch an, was sich negativ auf die Ausführungszeit auswirkt. Ein Kompromiss ist also aus praktischen Ausführungsgründen nicht zu vermeiden. Die in Kapitel 2.2 vorgestellte implementation relation basierend auf den Hennessy Tests beschreibt welche Tests generiert werden sollen. Allerdings ist auch die Einschränkung, dass nur Hennessy Tests, welche von der Spezifikation erfüllt werden auch erzeugt werden nicht genug, denn damit ist das Problem der unendlichen Testfälle noch nicht gelöst. Daher wird für diesen Ansatz ein selection criterion gewählt, welches den Zustandsraum des Automatens in grobe Äquivalenzklassen einteilt. Die Partitionierung wird anhand der möglichen Uhrenwerte in den einzelnen Zuständen vorgenommen. Es wird also insgeheim angenommen das sich jeder Zustand aus solch einer Klasse äquivalent verhält und man somit nicht jeden einzelnen konkreten Zustand testen muss. Zusätzlich wird jede Äquivalenzklasse mit allen benötigten deadlockobervations dekoriert und gefordert, dass für jede Observation jeder Klasse mindestens ein Test generiert wird um Korrektheit zu gewähren so wie es die testing preorder aus Kapitel 2.2 vorschreibt. In der Literatur wurde dieses Kriterium stable edge set criterion benannt, da die Spezifikation stabil hinsichtlich der beobachteten Zustände bleibt. Nur die Uhrenwerte sind entscheident für den Übergang in die einzelnen Zustände. Es kann also angenommen werden, dass auch die Implementierung stabil ist, denn es müssen keine weiteren Aktionen ausgeführt werden um das Verhalten der Spezifikation zu gewährleisten. Wenn die Implementierung also unerwartet den Zustand ändert, muss dafür ein internes Signal verantwortlich sein und das Verhalten sollte somit noch einmal überprüft werden. Das folgende Beispiel 15 beschreibt das Aussehen und die Bildung der Äquivalenzklassen. [s3,4 , p5 ] p5: Xgive ≥2 cannot coin cannot give can cof can thincof must{cof,thincof} [s3,4 , p6 ] p6: Xgive ∈[1,2) [s3,4 , p7 ] p6: Xgive <1 cannot coin cannot give cannot cof can thincof cannot cannot cannot cannot coin give cof thincof Abbildung 11: Äquivalenzklassen für Zustand s3,4 Beispiel Das obige Beispiel zeigt die Äquivalenzklassen für den Zustand s3,4 aus dem deterministischen Kaffeeautomaten aus Kapitel 2.4. Für diesen Zustand wurden die entscheidenen Uhrenwerte für die eventclock von Xgive in drei Domänen partitioniert. Zum einen die Domäne Xgive ≥ 2, bei der beide Transitionen erfüllt sind, zum anderen Xgive ∈[1,2), bei der nur die thincof Transition erfüllt ist und zuletzt Xgive < 1 bei der keine Transition erfüllt ist. Jede Klasse wird mit den angesprochenen deadlock-observations dekoriert, so muss es beispielsweise in der Äquivalenzklasse [s3,4 , p5 ] möglich sein sowohl Kaffee als auch dünnen Kaffee erhalten zu können. Weiter noch muss sogar eine der beiden Beobachtungen bei jeder Berechnung gemacht werden und der Einwurf von einer Münze beziehungsweise das Drücken der give Taste muss in diesem Zustand verboten sein. Das nächste Kapitel beschreibt den genauen Algorithmus zur Erzeugung eines solchen Äquivalenzklassengraphs und zeigt den vollständigen Graphen für das Beispiel des Kaffeeautomatens. 3.2 Zustandspartitionierung Dieses Kapitel soll den Algorithmus zur Partitionierung des Zustandsraums und Erzeugung des Äquivalenzklassengraphs beschreiben. Eine Äquivalenzklasse wird repräsentiert von einem Paar [S’,p], wobei S’ die Menge der Zustandsvektoren enthält und p ist die Ungleichung, welche die Uhreneinschränkungen bescheibt, die in dieser Klasse gelten muss. Um die Wiederverwendung der symbolischen Repräsentaion zu gewährleisten, werden die Einschränkungen in disjunktive Normalform gebracht. Hierzu einige Notationen. Zustandspartitionierung Ψ(S’) • S’ = Menge der Zustandsverktoren • E(S’) = Menge der Transitionen von einem Zustand aus S’ −→ • τ (E) = Menge der Guards von E = {ϕ ∈ Φ(C) | s − ϕ, a s0 ∈ E} • P = Beschränkung über die Uhrungleichungen γ W V • DNF(P) = P in disjunktiver Normalform i j γij = P Jedes Disjunkt in disjunktiver Normalform kann als guard ϕ ∈ Φ(C) geschrieben werden. Die DNF kann somit als Disjunktion über den guards interpretiert 16 werden, sodass W i ϕi = W V i j γij . V V 0 Lasse Ψ(S 0 ) = {PE 0 | E 0 ∈ 2E(S ) ∧ PE 0 = ϕ∈τ (E 0 ) ϕ ∧ ϕ∈τ (E(S 0 )−E 0 ) ¬ϕ}, dann ist GDNF die Menge an guards ϕi , dessen Disjunktion der DNF entspricht. GDNF(PE 0 ) = {ϕi ∈ Φ(C) | W i ϕi = DN F (PE 0 )} und schließlich ist ΨDN F (S 0 ) = S PE 0 ∈Ψ(S 0 ) GDN F (PE 0 ). Beispiel Als Beispiel soll hier der Zustand s3,4 aus dem deterministischen Kaffeeautomaten dienen, für den schon die Äquivalenzklassen in Kapitel 3.1 ohne Algorithmus bestimmt wurden. Somit ist S’ = {s3,4 } und die Transitionen von S’ lauten E(S’) = {(s3,4 , cof !, Xgive ≥ 2, s5 ), (s3,4 , thincof !, Xgive ≥ 1, s6 )}, die guards von S’ sind τ (E(S 0 )) = {Xgive ≥ 2, Xgive ≥ 1} Zur Vereinfachung betrachten wir 2τ (E(S 2τ (E(S 0 )) 0 )) anstatt 2E(S 0 ) = {∅, {Xgive ≥ 2, Xgive ≥ 1}, {Xgive ≥ 2}, {Xgive ≥ 1}} und Ψ(S 0 ) = {(Xgive < 2) ∧ (Xgive < 1), (Xgive ≥ 2) ∧ (Xgive ≥ 1), (Xgive ≥ 2) ∧ (Xgive < 1), (Xgive ≥ 1) ∧ (Xgive < 2)} Die DNF von Ψ(S 0 ) lautet ΨDN F (S 0 ) = {Xgive < 1, Xgive ≥ 2, ∅, Xgive ∈ [1, 2)} Damit lauten die Äquivalenzklassen genau wie in Kapitel 3.1 [s3,4 , Xgive < 1], [s3,4 , Xgive ≥ 2] und [s3,4 , Xgive ∈ [1, 2)] 17 Abbildung 12: vollständiger Äquivalenzklassengraph Die obige Abbildung zeigt nochmal den vollständigen Äquivalenzklassengraph für das deterministische Kaffeeautomatenbeispiel aus Kapitel 2.4. Die oberen drei Klassen in der dritten Spalte von links stellen genau die zuvor algorithmisch erstellten Klassen dar. Kapitel 3.3 beschreibt nochmal genauer das Dekorieren des Äquivalenzklassengraphen, also das Finden der richtigen Deadlock-Observations. 3.3 Dekorierter Äquivalenzklassengraph Um die Mengen an Aktionen für die einzelnen Tests(must, may, cannot) zu finden berechnet der Algorithmus folgende Mengen. − Sort([L,p]) = {a | ∃(L, u) ∈ [L, p] : (L, u)→ a } und Must([L,p]) = {A | ∃(L, u) ∈ [L, p] : (L, u) |= after must A} Damit sehen die Mengen für die einzelnen Tests wie folgt aus: • M([L,p]) = Must([L,p]). • C([L,p]) = Sort([L,p]). • R([L,p]) = Act - Sort([L,p]). M enthält also alle nötigen Mengen um die must-Tests zu generieren, C für die may-Tests und R für die refusal -Tests(cannot-Test). Wenn also σ ein Pfad zur Klasse [L,p] darstellt und A ∈ M ([L, p]) dann ist after σ must A ein Test, welcher für die Klasse bestanden werden muss. Analog sind can σ • a und after σ • a must ∅(cannot σ • a) Tests, falls a ∈ C([L, p]) beziehungsweise a ∈ R([L, p]). 18 3.4 Testalgorithmus Dieses Kapitel soll näher beschreiben, wie die Testableitung mittels der symbolischen Repräsentation aus Kapitel 2.5 und die Testselektion über den Äquivalenzklassengraphen aus dem vorherigen Kapitel 3.2 in Kombination genutzt werden um zulässige Tests zu generieren. Zulässig meint hier, dass nur die Tests abgeleitet werden, welche von der Spezifikation erfüllt werden, um soundness zu gewährleisten. Denn die Konstruktion des Äquivalenzklassengraphs beinhaltet zwar alle nötigen Informationen zum Generieren der Hennessy Tests, allerdings darüber hinaus auch noch Informationen die nicht in der Spezifikation auftauchen. Ein so abgeleiteter Test könnte also unsound sein, im Sinne, dass das Resultat des Tests als nicht bestanden ausfällt, obwohl die Implementierung konform zur Spezifikation ist. Um also wirklich nur die Hennessy Tests zu erzeugen, welche von der Spezifikation erfüllt werden und somit soundness zu garantieren wird die symbolische Repräsentation genutzt, welche nur die erreichbaren Zustände in Betracht zieht. Zum Beispiel darf es keinen Test für Zustand s3,4 geben bei dem die Uhren für Xcoin und Xgive jeweils den Wert zwei haben, denn immer wenn Zustand s3,4 beobachtet wird ist der Wert für Xcoin mindestens vier. (siehe Besipiel aus Kapitel 2.4) Der Gesamtalgorithmus zur Erzeugung und Selektion der relevanten Tests sieht also wie folgt aus: 1. Berechne Sp = Äquivalenzklassengraph. 2. Berechne Sr = symbolic reachabilty graph von Sp . 3. Dekoriere jedes Zustand [L,z/p] ∈ Sr mit den Mengen M,C,R. 4. Tested := ∅ 5. Sr durchlaufen. f orall[L, z/p] ∈ Sr : if 6 ∃ z’ : [L,z’/p] ∈ Tested then Tested := Tested ∪ {[L,z/p]} und berechne Tests (1) wähle (l, u ∈) [L,z/p] (2) berechne konkreten Pfad von (l0 , 0) zu (l, u) (3) erzeuge Testfälle: if A ∈ M([L,p]) then after σ must A ist relevanter Test if a ∈ C([L,p]) then can σ • a ist relevanter Test if a ∈ R([L,p]) then after σ • a must ∅ ist relevanter Test Der oben aufgeführte Algorithmus ist wie folgt zu verstehen. Schritt eins erzeugt den Äquivalenzklassengraph wie beschrieben in Kapitel 3.2. Schritt zwei erzeugt den symbolic reachability graph, exemplarisch beschrieben in Kapitel 2.5. Ein symbolischer Zustand [L,z/p] in diesem Graph charakterisiert die Menge an erreichbaren Uhrenwerten, welche auch für p gelten. Eine Kante in diesem Graph drückt aus, dass der Zielzustand erreichbar ist durch Ausführung einer Aktion a und dem Warten einer bestimmten Zeit. In Schritt drei werden diese Zustände mit den in Kapitel 3.3 angesprochenen Mengen an Aktionen für die einzelnen Hennessy Tests dekoriert. Und Schritt fünf stellt den eigentlich Testgenerierungsschritt anhand dieser Mengen dar. Bei der Berechnung der timed traces in Schritt fünf gilt es natürlich clevere Delays zu wählen so wie zum Beispiel beschrieben in Kapitel 2.5.1. Also zum Beispiel die unteren und oberen Schranken der Intervalle zu testen, da diese wohl die wichtigsten Tests für die Unverzüglichkeit und Ausdauer des Systems in der Praxis darstellen. 19 3.5 Zusammenfassung In diesem Kapitel ging es um die Testselektion beim timed testing, welche bei dieser Art des Testens einen ganz besonderen Stellenwert einnimmt, denn auch wenn vollständiges Testen schon bei normalen Systemen meist nicht möglich ist, so hat man beim timed testing immer das Problem der unendlichen Testfälle. Und da theoretisch grundsätzlich jeder Test gleich wichtig ist, gilt es eine Selektion zu finden, die den Zustandsraum in eine möglichst sinnvolle Partitionierung bringt, sodass davon auszugehen ist, dass sich jeder konkrete Zustand in dieser Partition äquivalent verhält. In dem hier konkret gewählten Ansatz wird diese Partitionierung durch einen Äquivalenzklassengraph 3.2 vorgenommen, welcher für jeden Zustand des Automatens Äquivalenzklassen erzeugt. Grundlage für die Erzeugung sind die guards auf den ausgehenden Transitionen jedes Zustandes, sodass die Uhrenwerte in sogenannte Domänen eingeteilt werden, dass entweder keine Transition schaltbar ist(Refusalzustand, sofern Konjunktion der guards keine Tautologie darstellt), jede Transition einzeln schaltbar ist(soweit möglich wenn sich guards nicht überschneiden) und alle Transitionen gleichzeitig schaltbar(sofern möglich wenn sich guards nicht gegenseitig ausschließen) sind. Jede so erzeugte Klasse wird mit den beschriebenen deadlock-observations dekoriert 3.3, welche den in Kapitel 2.2 eingeführten Hennessy Tests entsprechen. Diese Observationen sollen das mögliche, erwartete und nicht mögliche Verhalten der Zustände, welche von diesen Klassen repräsentiert werden, definieren. Der letzte Abschnitt dieses Kapitels hat den Gesamtalgorithmus für die Testgenerierung beschrieben, also das Zusammenspiel zwischen der symbolischen Repräsentation, zum Berechnen der timed traces und dem erreichbaren Zustandsraum, und dem Äquivalenzklassengraph zur Testselektion. 20 4 Zusammenfassung Zunächst wurde kurz das Thema des modellbasierten Testens beschrieben, wobei es darum geht das erwartete Verhalten einer Implementierung anhand eines Modells zu spezifizieren, um aus diesem Modell automatisch Testfälle ableiten und selektieren zu können. Das Modell beim timed testing sind die timed automata, welche die endlichen Automaten um eine endliche Menge an Uhren erweitern um somit auch die Zeit zwischen den einzelnen Aktionen messen zu können. Ein weiteres gundlegendes Thema waren die Hennessy Tests, welche im weiteren Verlauf des beschriebenen Ansatzes die Grundlage für die zu testenden deadlock-observations darstellten. Basisidee der Hennessytheorie ist es zwei Systeme nur anhand ihrer Test zu unterscheiden. Im weiteren Verlauf wurde das eigentliche Modell des Ansatzes beschrieben, den event recording automata, welche eine determinierbare Subklasse der timed automata darstellen. Im nächsten Abschnitt des Grundlagenkapitels wurde die symbolische Repräsentation eingeführt, welche den unendlichen Zustandsraum eines timed automata mithilfe der zones auf eine endliche Darstellung bringt und gleichzeitig die Berechnung von zulässigen timed traces sowie den erreichbaren Zustandsraum ermöglicht. Im nächsten Kapitel wurde dann das Thema der Testselektion beschrieben, welches wie schon angesprochen eine sehr wichtige Rolle beim timed testing einnimmt. Im präsentierten Ansatz wurde die Selektion durch den sogenannten Äquivalenzklassengraph durchgeführt, welcher den Zustandsraum anhand der möglichen Uhrenwerte in Partitionen einteilt und jede Klasse mit den angesprochenen deadlock-observations dekoriert. Im letzten Abschnitt wurde der Gesamtalgorithmus beschrieben, welcher alle vorgestellten Techniken in Zusammenklang bringt und somit das algorithmische Vorgehen der gesamten Testerzeugung beschreibt. 21 Literatur [AlDi] R. Alur und D. Dill. The theory of timed automata. In Real-Time: Theory in Practice. Springer, S. 45–73. [AlFH] R. Alur, L. Fix und T. Henzinger. A determinizable class of timed automata. In Computer Aided Verification. Springer, S. 1–13. [BBBr04] L. Brandan Briones und H. Brinksma. A test generation framework for quiescent real-time systems-extended version. 2004. [Dill89] D. Dill. Timing assumptions and verification of finite-state concurrent systems. In Automatic Verification Methods for Finite State Systems. Springer, 1989, S. 197–212. [KrTr04] M. Krichen und S. Tripakis. Black-box conformance testing for real-time systems. Model Checking Software, 2004, S. 109–126. [NiSk03] B. Nielsen und A. Skou. Automated test generation from timed automata. International Journal on Software Tools for Technology Transfer (STTT), 5(1), 2003, S. 59–77. [ScTr] J. Schmaltz und J. Tretmans. On conformance testing for timed systems. Formal Modeling and Analysis of Timed Systems, S. 250–264. 22
© Copyright 2024 ExpyDoc