TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE...

18
17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan van Beek MSc (Nedap) dr.ir. Axel Belinfante (FMT, University of Twente) Gijs Kant MSc (FMT, University of Twente) Pagina 1

Transcript of TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE...

Page 1: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

17 november 2014

STAGEVERSLAG

TEST GUIDANCE FOR THENEDAP TEST AUTOMATION TOOL

Jeroen Vonk

NEDAPUniversity of Twente

Comité:Daan van Beek MSc (Nedap)dr.ir. Axel Belinfante (FMT, University of Twente)Gijs Kant MSc (FMT, University of Twente)

Pagina 1

Page 2: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

Inhoudsopgave

1 Stage bij Nedap 31.1 AEOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 NTA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Stage-inhoud 5Mogelijke oplossingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3 TestAdvisor 63.1 Statespace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Statespace grootte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.2 BDD representatie van het model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Transities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7Functies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

3.3 Statische Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8Variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Functies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Opslag gegevens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Verkennen van het model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Travelers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

4 Conclusie 144.1 Tijdsbesteding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.2 Behaalde resultaten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.3 Aanbevelingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

Voltooiing van NTA2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Gebruik van een bestaande modelchecker . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Test Guidance op basis van eerdere verkenningen . . . . . . . . . . . . . . . . . . . . . . 15

Pagina 2

Page 3: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

Hoofdstuk 1

Stage bij Nedap

In het kader van mijn master Computer Science heb ik de afgelopen periode stage gelopen bij NedapSecurity. Gedurende een twintigtal weken ben ik bezig geweest met het ontwerpen van een systeemom het automatisch testen van software te versnellen. Het systeem, Nedap Test Automation (NTA),is een in-house test tool ontworpen door Daan van Beek. De lezer van dit verslag wordt geacht eenminimale kennis te beschikken betreffende model checken, inhoudende dat de gebruiker bekend is mettermen als: (bounded) model checking, model driven tests, use cases, en (Reduced Ordered) BinaryDecision Diagrams (BDD’s) 1.

1.1 AEOS

Het doel van NTA is het "Model Driven" testen van de AEOS-dashboard. AEOS is het integrale be-veiligingssysteem van Nedap. AEOS is een volledig softwareplatform dat met behulp van zogehetencontrollers een veelvoud aan functies kan vervullen. Dit kan toegangscontrole, al dan niet met RFID,inbraakdetectie, of het beheer van persoonlijke kluisjes zijn. Om personen in het systeem in te voeren ofbepaalde rechten toe te kennen, is er een dashboard. Het AEOS-dashboard is een in flash ontwikkeldeapplicatie. Dit dashboard communiceert vervolgens met de achterliggende back-end van AEOS. Ge-zien AEOS continu doorontwikkeld wordt, en sommige van deze nieuwe functies ook invloed hebben ophet functioneren van het dashboard is het noodzakelijk dat het dashboard getest wordt. Het testen vanhet dashboard gebeurde voorheen handmatig. Echter, neemt dit handmatige testen veel tijd in beslag.Dit betreft voornamelijk het testen of reeds geïmplementeerde functionaliteiten beïnvloed worden doornieuwe functies, de zogeheten regressie-testen.

1.2 NTA

Om deze regressietesten te vergemakkelijken is er besloten om een automatisch test-systeem te ont-werpen, NTA. NTA kan grafische interfaces bekijken en beïnvloeden. Daarmee kan NTA het gedragvan een gebruiker of handmatig tester emuleren. Om dit te doen heeft NTA een intern model van hette testen systeem. Door gelijktijdig een functie uit te voeren op het model als in de werkelijkheid kanNTA discrepanties tussen het model en de werkelijkheid detecteren. Zodra een fout gevonden is kan ditbetekenen dat er of: een fout in het model zit, of dat er een functionaliteit niet meer naar verwachtingwerkt. Mits je een goed model hebt zal het tweede het geval zijn.

Het model is non-deterministisch en bevat cykels. Het beste kan het gezien worden als een opeen-volging van verschillende use-cases, waarbij na de executie van een use-case één of meerdere andereuse-cases geselecteerd kunnen worden. Dit scala aan use-cases kunnen door de cykels en het non-determinisme in het model zeer complexe testen genereren, die een handmatig tester niet zo snel zouuitvoeren.

Een voorbeeld van een simpele login is getoond in Figuur 1.2. (Voor een uitgebreidere uitleg vanhet model verwijs ik naar hoofdstuk 3.3)

Tevens bevat NTA de mogelijkheid om variabelen te gebruiken. Hiermee kan er bijvoorbeeld be-paald worden of een use-case uitgevoerd kan worden. Een voorbeeld is het onthouden of de huidigeingelogde gebruiker al dan niet een administrator is. Het zou immers voor te stellen zijn dat bepaaldetesten enkel uitgevoerd dienen te worden wanneer er momenteel een administrator is ingelogd. Dezevariabelen tezamen met de huidige positie in het model zijn te beschouwen als de huidige staat van hetmodel in NTA.

1Daan van Beek, NTA NodeTypes

Pagina 3

Page 4: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

Pagina 4

Page 5: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

Hoofdstuk 2

Stage-inhoud

Doordat de tool het dashboard, of "System Under Test"(SUT), via de grafische interface benaderd iser soms sprake van een pauze in de executie. Zo kan de SUT bijvoorbeeld nog een scherm moetenladen. Daaruit kunnen we twee dingen concluderen:

• NTA zal niet altijd de volledige rekenkracht van de computer gebruiken.

• Het uitvoeren van tests neemt veel tijd in beslag, dus het is zaak zoveel mogelijk diverse testsbinnen een gegeven tijd uit te voeren.

Gedurende deze stage is het doel te kijken naar mogelijkheden om de executie van de hoeveelheidnuttige tests door NTA te vergroten. Wanneer het model enkel deterministisch zou zijn, dan zou dezeversnelling puur in de executie van de tests gevonden moeten worden. Het versnellen van de testsis niet wenselijk. De testmethode dient namelijk de interactie en invoer van een normale gebruiker tesimuleren. Wanneer de tests uitzonderlijk snel zouden worden uitgevoerd dan kan het gedrag van deSUT niet representatief zijn voor normaal gebruik.

Omdat de tests echter ook enig non-determinisme bevatten, is daar ruimte om enkele verbeteringendoor te voeren. De aanwezigheid van een keuze welke test of pad gekozen dient te worden na dehuidige test is aan NTA. Een random keuze garandeert uiteindelijk volledige dekking van het model(coverage), mits er een aanzienlijke hoeveelheid testen worden gedraaid.

Wellicht zou er een manier zijn om deze keuzes dusdanig te maken dat er; geen tests wordenovergeslagen, maar dat een voldoende verkenning van de tests sneller gegarandeerd zou zijn. Het doelis dus, gegeven een bepaalde testtijd meer diverse testen te kunnen uitvoeren. Door deze verhoogdecoverage zou de kans op het detecteren van bugs omhoog gaan. Voor het berekenen van de prioriteitvan de uit te voeren tests zou de idle-tijd van NTA gebruikt kunnen worden.

Mogelijke oplossingen

Na enig overleg hebben wij besloten dat hiervoor enkele oplossingen waren.Een optie is om de verkende paden, of tests, bij te houden. Hiermee zou een eerder genomen

pad een mindere voorkeur kunnen krijgen om te verkennen of bijvoorbeeld volledig uitgesloten kunnenworden. Probleem is echter dat bepaalde paden een noodzaak zijn om te nemen, wanneer iemand debereikbare paden na dat punt wenst te bereiken.

Een andere oplossing is om alle mogelijke toekomstige paden te verkennen. Hierbij zou bij pun-ten met een keuze beide opties verkend worden. Gezien het legio van de beslissingen niet non-deterministisch zijn, zou op deze manier een groot deel van het model verkend kunnen worden middelsbounded model checking. Op basis van deze verkenning zou vervolgens een geïnformeerde keuzekunnen worden gemaakt voor het te volgen pad. Deze keuze zou naar alle waarschijnlijkheid een aan-zienlijke verbetering zijn ten opzichte van de huidige random-tactiek, bij het kiezen van een vervolgpadvanaf een non-deterministische keuze.

De laatste oplossing, met een statische analyse, bied potentieel de meeste snelheidswinst. Te-vens lag deze oplossing in het verlengde van de interesses en voorkennis van zowel de stagiair alsbegeleider.

Pagina 5

Page 6: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

Hoofdstuk 3

TestAdvisor

Het doel van de stage is gesteld een zogeheten "Test Advisor"te ontwerpen voor NTA. Deze Test Advisordient op beslissingspunten een statische analyse te doen van het onderliggende model om te bepalenwat de meest geschikte keuze is om de exploratie te vervolgen.

Nota bene, bij deze exploratie zullen wij het gedrag van het model nabootsen, om te kunnen be-palen welke nodes bereikbaar zijn. Wij zijn dus in feite een model van het model aan het exploreren.Hierbij kunnen wij mogelijk gedrag van het originele systeem als non-deterministisch beschouwen. Eenvoorbeeld hiervan is of een tekstveld al dan niet zichtbaar is in een GUI. Derhalve zullen we beidemogelijkheden verkennen. Wel kunnen we de staat van variabelen modelleren. Met deze variabelenkunnen we de uitkomst van zogeheten guards uitrekenen. Daardoor kunnen bepaalde executiepadenbij voorbaat uitgesloten worden aangezien deze door de guards (in combinatie met de huidige staat vande variabelen) niet bereikbaar zullen zijn. Hiermee zal de statespace drastisch verminderd worden.

3.1 Statespace

Het model bevat een groot aantal mogelijke paden. Gezien het gebruikelijk is dat het model cykelsbevat, zijn er een oneindig aantal mogelijk paden. Een oneindig grote statespace is uiteraard nietvolledig te verkennen. Dit is zowel qua tijd als opslagruimte een onmogelijkheid. Een manier om tochbinnen afzienbare tijd tot een geschikt advies tijd te genereren voor NTA is om het model slechts deelste doorzoeken. Deze methode van enkel een deel van het model verkennen is ook bekend als boundedmodel-checking. Gegeven dat NTA bij een non-deterministisch punt is beland, zal de Test Advisor eenbounded model-check doen vanaf dat punt. Alle mogelijke paden zullen verkend worden, de bound kanof een maximale zoekdiepte behelzen, of een maximale tijd die de Test Advisor mag besteden aan hetzoeken. Na deze zoektocht zal er een verzameling van bereikbare nodes zijn. Uit deze verzamelingkan vervolgens volgens een nader te bepalen metriek een doelnode gekozen worden. Gegeven dit doelkan vervolgens het te nemen pad beredeneerd worden startend op de huidige positie van NTA. De tegebruiken metriek voor het kiezen van een node kan simpel zijn; uit de bereikbare nodes willekeurig eennode kiezen, maar er kan ook een complexere methode bedacht worden. Bij een complexe methodezou er bijvoorbeeld rekening gehouden kunnen worden met eerdere verkenningen van NTA (coverage)en de kans op het succesvol bereiken van deze node.

Statespace grootte

De huidige representatie van het model in NTA is een honderdtal megabytes groot. Wanneer wij boun-ded checking zouden willen doen zou dat inhouden dat er twee keuzes zijn. Of wij exploreren 1 padper keer, na elke exploratie het model terug brengend in de originele staat. Dit zou weinig tot geenextra ruimte kosten, ten slotte hoeven wij enkel na elke verkenning enkel de bereikbare nodes op teslaan. Een sequentiële exploratie zou echter veel tijd kosten. De tweede optie is de verkenning vanmeerdere paden gelijktijdig plaats te laten vinden. Bij een dergelijke parallelle verkenning zou bij elke(non-deterministische) keuze beide paden verkend moeten worden. Om beide paden te verkennen zoudus het model gedupliceerd moeten worden bij een dergelijke keuze. De grootte van het model in achtnemende is het makkelijk om te zien dat in een dergelijk geval het geheugenlimiet van de computeraanzienlijk sneller bereikt zou worden voordat het model voldoende diep verkend is. Daarom zou in eendergelijk geval de gehele verkenning een vruchteloze operatie zijn.

Een geschikte oplossing voor deze statespace explosie is het reduceren van het formaat van hetmodel. Dit kan door enkel de relevante informatie op te slaan in ons kopie. Deze relevante informa-tie zou enkel de beschrijving van de paden zijn die er in het model aanwezig zijn - en de relevantevariabelen. Deze variabelen zijn nodig omdat deze mede bepalen welke paden toegankelijk zijn. Alle

Pagina 6

Page 7: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

andere functionaliteiten die in het model zitten hoeven wij niet in het model over te nemen. Deze ove-rige functionaliteiten zijn bijvoorbeeld de nodige code en data in het model die nodig zijn om de SUTte besturen. Naast deze reductie kunnen we ook kiezen om de kopie op een alternatieve wijze op teslaan. Het gebruik van Binary Decision Diagrams (BDD’s) is hiervoor zeer geschikt. Een BDD is eenboomstructuur (graaf) waar bij elk niveau in de boom een binaire variabele representeert. Bij elk knoopin deze boom is de keuze tussen twee takken, één waarbij de gerepresenteerde variabele waar is, enéén tak waarbij de variabele onwaar is. Onderaan deze boom zijn de bladeren met enkel de waardeWAAR of ONWAAR. Elk pad wat eindigt in een WAAR blad is een geldige staat voor de keuze vanwaardes voor de gerepresenteerde variabele in de BDD. Één enkele BDD kan dus een veelvoud aangeldige staten representeren.

3.2 BDD representatie van het model

Gezien elk decimaal getal ook in het binaire stelsel omgezet kan worden, kunnen wij in de BDD getallenopslaan. Middels het toepassen van zogeheten relaties op de BDD kunnen we dan dit getal aanpassen.Het originele model zou dan versimpeld kunnen worden als een graaf, elke vertex met zijn eigen uniekenummer. De BDD representeert deze huidige vertex in de variabele V{} met V{} ⊆ Vertices. Geziende aard van de BDD kan een enkele BDD nu een set van momenteel bereikbare vertices beschrijven.Gegeven dat wij bij vertex 3 of 1 starten met verkennen (V{} = 1, 3). Vervolgens passen wij een relatieR toe die de transitie van vertex 3 of 8 naar vertex 4 of 5 beschrijft. Rv : V{3,8} → V{4,5}. Na toepassingop deze relatie zal de BDD als volgt veranderen:

V{1,3}Rv−−→ V{1,4,5}

Na deze transitie zullen vertex 4 & 5 dus ook bereikbaar zijn.

Variabelen

Wij kunnen nu ook de BDD verrijken door alle variabelen uit het model in de BDD te laden. Dit kanop een vergelijkbare manier als de vertex. Gegeven een variabele vi uit het model met de mogelijkewaarden wi,j ∈ vi die vi kan aannemen. Nu kunnen wij een variabeleWi ∈ {0..j} maken waarbijWi(j)de waarde van wi,j vertegenwoordigd. De zo verkregen BDD bevat dus V en W. De BDD zal nu duselke mogelijke variabele combinatie en vertex positie kunnen opslaan. Hiermee kunnen we met dezeBDD dus één of meerdere states van het systeem weergeven.

Transities

Zoals eerder aangegeven hebben we reeds een relatie Rv om een transitie van de ene naar de anderevertice aan te geven. Echter deze vertex is niet de volledige beschrijving van een state. Wat er mo-menteel nog mist bij deze relatie is een tweetal elementen. Beide elementen hebben betrekking op devariabelen (W) die tevens deel uitmaken van de state. Een eerste element is dat de transitie de waardevan een variabele kan veranderen.

RW :W →W ′

Een tweede element is het feit dat een transitie alleen toegestaan kan zijn wanneer een variabele eenbepaalde waarde heeft. Dit zijn zogeheten ’guards’.

Rg :W

Tezamen kunnen wij dus een relatie R definiëren die als volgt is samengesteld:

R = Rv ∧RW ∧Rg

Een transitie in de BDD zal dus gecodeerd worden als:

{V,W} R−→ {V ′,W ′}

Functies

NTA ondersteund ook nog het gebruik van functie-aanroepen. Dit gebeurt middels de JumpAndRe-turn-node, een voorbeeld van een functie aanroep is te zien in Figuur 3.2. Functies zouden zonderproblemen in de bovenstaande structuur geïmplementeerd kunnen worden. Immers, op het momentdat een functie wordt aangeroepen kan de code van de desbetreffende functie worden ingevoegd op

Pagina 7

Page 8: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

die positie, of ïnlining". Dit zou echter zorgen voor veel extra states. Idealiter zouden we de functiona-liteit van functieaanroepen verplaatsen naar de relaties over de BDD. Gezien functies geen variabelenmee krijgen, en tevens geen waarde retourneren is dit relatief simpel. Met een simpele stack in de BDDkunnen wij bij een functieaanroep de locatie van de aanroep opslaan. Op het moment dat de functiebeëindigt wordt zal de executie verder gaan vanaf het punt waar de functie is aangeroepen.

Wij definiëren in de BDD een set van variabele Si met i = 0..n en n de maximale diepte waarin defuncties genest zullen worden. Deze n zullen we met behulp van een statische analyse kunnen achter-halen. Si zal vervolgens de waarde bevatten van de vertex waar een functie aanroep vanaf is gedaan.Een relatie R met betrekking tot een functie-aanroep zal dus ook een element Rs bevatten. Deze Rs

geeft aan hoe de stack gemanipuleerd dient te worden. Gegeven drie vertices:

• Vs: De plek waar de functie aangeroepen wordt

• Vr: De plek waar na de functie verder gegaan dient te worden

• Vfs: Het begin van de functie

• Vfr: Het einde van de functie

• V∅: Gebruikt om een leeg element in de stack aan te geven.

Bij een functie aanroep zal deze dus in de vorm zijn van:

V = Vs ∧ Sd = V∅ → V = Vfs ∧ Sd = Vr ∧ d = d− 1

Hierbij is d de huidige top van de stack Bij het retourneren ziet de relatie er als volgt uit:

V = Vfr ∧ Sd = Vr → V = Vr ∧ Sd = V∅ ∧ d = d + 1

3.3 Statische Analyse

Wij hebben hierboven een simpele weergave gegeven hoe wij het model willen representeren in eenBDD. Tevens is er beschreven welke informatie uit het model in de BDD gebruikt zal worden. Echter,wij hebben nog niet gekeken hoe de data nodig voor de BDD uit het model wordt geëxtraheerd. Debenodigde informatie zal middels een statische analyse uit het model gehaald worden.

Pagina 8

Page 9: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

Variabelen

Voor de variabelen willen wij weten welke waardes alle variabelen kunnen aannemen. Pas als wehiervan een bovengrens hebben bepaald kunnen wij de variabele in de BDD opslaan. Indien wij eenvariabele vinden die maar één mogelijke waarde kan aannemen, dan is deze variabele als statisch tebeschouwen. In plaats van de variabele in de BDD aan te maken kunnen we dan overal de desbetref-fende variabele vervangen met zijn waarde.

Functies

Voor functies willen we de volgorde van geneste functie-aanroepen bepalen. Zodoende kunnen we hetminimale formaat van de stack bepalen voor de BDD. Ook kan op deze manier de relatie voor elkemogelijke functie-aanroep gegenereerd worden.

Model

Het originele model bestaat uit een aantal submodellen. Deze submodellen bevatten vervolgens zoge-naamde ModelElements (ME’s). Een ModelElement is middels lijnen verbonden aan één of meerdereandere ME’s. Elke ME heeft een specifieke functie in het model 1. Een ME kan ook een Guard bevatten,dit is een expressie die geëvalueerd wordt tot een booleaanse waarde. Alleen wanneer deze expressieWAAR is zal NTA deze ME verkennen. Als laatste kan een ME een expressie bevatten, deze expressiekan bepalend zijn voor het gedrag van het ModelElement. Het kan bepalen welke lijnen vanuit dezeME gevolgd mogen worden (deterministisch gedrag) of bijvoorbeeld de waarde aanpassen van eenvariabele.

Opslag gegevens

In Figuur 3.3 staat een simpele weergave van het model. Om informatie met betrekking tot het modelop te slaan hebben we een aantal klassen ontworpen die informatie bevatten over het model, de ME’s,en de variabelen in het model. Op deze manier kunnen we op een makkelijke manier informatie opslaanin het model, zonder het model heel erg aan te hoeven passen. ModelInfo bevat algemene informatieover het model. Ook wordt hier relevante informatie opgeslagen met betrekking tot de voortgang van destatische analyse. VertexInfo is gekoppeld aan een ModelElement, zijnde een groep die ModelElemen-ten bevat, of een losse node. in VertexInfo wordt onder andere informatie opgeslagen met betrekkingtot het type node.

1Daan van Beek, NTA NodeTypes

Pagina 9

Page 10: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

De laatste hulpklasse VariableInfo, bevat alle mogelijke waarde die een variabele kan aannemen. Naastdeze waarde wordt ook opgeslagen welke waardes andere variabelen dienen aan te nemen om dezewaarde aan te nemen. Men neme bijvoorbeeld een variabele a en een variabele b, van b is bekend datdeze de waarde 1 of 2 kan aannemen. a komt voor in drie expressies: a = 5, a = b, en a = 3 ∗ b. Van akan nu vermeld worden dat het de volgende waardes kan aannemen:

• a = 5

• a = 1 gegeven b = 1

• a = 2 gegeven b = 2

• a = 3 gegeven b = 1

• a = 6 gegeven b = 2

Ook wordt er in VariableInfo opgeslagen of een variabele refereert naar een andere variabele (verge-lijkbaar met pointers).

Analyse

In plaats van één enkele functie om het gehele model te analyseren is er gekozen dit in stappen te doen.Een probleem bij de analyse is dat NTA ontwikkeld is naar gelang wat nodig was bij het testen. NTAheeft dus geen zeer duidelijke omschrijving van het innerlijk functioneren van de tool. Bij het uitvoerenvan expressies kunnen er dus ambiguïteiten optreden. An sich is dit geen probleem, NTA functioneerttenslotte naar behoren. Maar bij het vertalen van het model naar een BDD dient het exacte gedrag vanNTA geïmiteerd te worden. Mocht dit niet het geval zijn dan kan het zijn dat de NTA Test Advisor (NTA2)bepaalde bestaande paden niet kan bereiken. Of zelfs niet bestaande paden verkend en adviseert.

Recycling van functies

Om het gedrag van NTA zo exact mogelijk na te bootsen zullen we voor zover mogelijk gebruik makenvan de bestaande functies in NTA. Een eerste functie in NTA is de functie die expressies evalueert.Deze functie, calculate(), retourneert een string met daarin de geëvalueerde expressie. De functiewordt recursief aangeroepen op een expressie. Een expressie bestaat vervolgens uit een linker- enrechtergedeelte. Men neme bijvoorbeeld de expressie a = b + 3, dit evalueert tot:

=

+

3b

a

Wanneer wij de calculate functie aanroepen, dan zal de waarde van b opgehaald worden. Vervol-gens wordt de waarde van 3 opgehaald. Dan wordt de operator + uitgevoerd op b & 3. De variabele awordt geladen. En vervolgens wordt het resultaat van de som opgeslagen in a. Wij willen echter voorde statische analyse alle mogelijke waardes van een variabele weten. Daarom hebben wij de func-tie calculate() omgeschreven naar: calculate(boolean calculateStatic=false). Wanneer deboolean calculateStatic ge-enabled is, dan zal calculate alle mogelijke waardes uitrekenen, gegevende mogelijke waardes van de variabeles. Deze mogelijke waardes voor de variabele zijn opgeslagen inde klasse VariableInfo.

Verkennen van het model

Zoals eerder vermeld zullen wij het model in stappen verkennen. Om NTA zelf minimaal aan te hoe-ven passen hebben we gekozen voor een soort visitor-pattern. Elk ModelElement zal een functietraverseModelElement(func) krijgen die aangeroepen zal worden met een functie visitModelElement()als argument en vervolgens:

• visitModelElement() aanroept met het huidige ModelElement als argument

• visitModelElement() zal vervolgens de verzamelde data opslaan in het VertexInfo-object gekop-peld aan dit ModelElement

• traverseModelElement() aanroept voor alle ModelElementen verbonden met dit ModelElement,hetzij via een normale verbinding, hetzij via een functie-aanroep (jumpAndReturn).

Pagina 10

Page 11: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

Voor expressies hebben wij eenzelfde patroon gebruikt. Echter, waar de traversal-functie voor ME’seen top-down benadering gebruikt, zullen expressies bottom-up geëvalueerd worden. Er zal dus eerstde traversal-functie aangeroepen worden voor de linker- en rechter-subexpressie. Vervolgens wordt devisitExpression() aangeroepen voor de huidige expressie. Resultaten zullen, indien van toepassing,opgeslagen worden in VariableInfo.

Travelers

Het model zal in een paar iteraties verkend worden met verscheidende travelers, de gebruikte travelersworden in de volgorde gebruikt waarin deze hieronder zijn beschreven. Elk van deze ModelElement-travelers zal worden aangeroepen op het initiële ModelElement van het model. Vervolgens zullen dezerecursief door het model heen gaan, totdat elk element bezocht is. De Expression-travelers zullenindien nodig worden aangeroepen worden door een ME-traveler op de expressie van het betreffendeModelElement.

GraphEdges

Deze klasse zorgt ervoor dat alle verbindingen tussen de ME’s opgeslagen worden in VertexInfo. Tevensslaat het op of een klasse een JumpAndReturn is. Indien dat het geval is, dan wordt dit tezamen metde locatie opgeslagen in VertexInfo.

GraphReturns

Nadat alle verbindingen zijn opgeslagen worden alle JumpAndReturns geanalyseerd. Zodra deze func-tie een JumpAndReturn tegenkomt zal hij zichzelf recursief aanroepen op de locatie waar de JumpAnd-Return heen wijst. De recursie wordt beëindigd zodra de functie een Return tegen komt. Op dezemanier kunnen we de maximale diepte van functies achterhalen. Deze diepte wordt opgeslagen - engebruikt om het formaat van de functie-stack van de BDD te bepalen. Ook worden alle mogelijke func-tiecalls met hun huidige recursiediepte opgeslagen. Met deze informatie kan uiteindelijk de relatie voorde BDD worden aangemaakt die stack manipuleert. Waarmee de BDD de functiecalls emuleert zonderalle functies te hoeven inlinen.

VariableAssignments

De VariabeleAssignments-klasse, evalueert of het huidige ModelElement een variabeletoewijzing doet.Dit kan of doordat het ModelElement een zogeheten MultipleOptionsChooser is, of omdat de expressievan de huidige ME een BecomesExpression bevat. Een MultipleOptionsChooser (MOC) heeft als ar-gument (expressie), een variabele en een lijst van waardes. De MOC zal uit de lijst een waarde randomkiezen en toekennen aan de variabele.

Becomes De ExpressionTraveler Becomes kijkt of een expressie een instantie is van een becomes-Expression. Vervolgens wordt de linkerkant van de expressie geëvalueerd om te weten te komen aanwelke variabele een waarde toegekend dient te worden. Laten we deze variabele "LHS-var"noemen.De rechterzijde kan of een expressie zijn, of het kan een pointer zijn naar een andere variabele.

RetrieveVars Met behulp van de expressionTraveler RetrieveVars wordt gekeken welke variabelen inde rechter subexpressie zitten. Vervolgens wordt in de VariableInfo van LHS-var worden opgeslagendat LHS-var afhankelijk is van deze variabelen.

Pagina 11

Page 12: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

VariableBounds

Nu alle afhankelijkheden voor de variabelen zijn uitgeplozen kunnen wij proberen een upperbound temaken voor de waardes die een variabele kan aannemen. Dit wordt gedaan door de "TravExprBounds-klasse

TravExprBounds Het verkennen van de expressie met behulp van de TravExprBounds-klasse kanhet best worden uitgelegd met behulp van een stuk psuedo-code. Zie hiervoor de code in Listing 3.1.

1 while ( not VariableBounds . al lBound )VariableBounds . al lBound = true

3 f o r a l l (ME as me)bound = true

5 i f (me. expression instanceof BecomesExpression )f o r a l l (me. expression . i n f o ( ) . usedVar iables as var )

7 i f ( not var . isBound ( ) )bound = fa lse

9 i f ( bound )i n f o . addValues (me. expression . c a l c u l a t e ( ) )

11 elseVariableBounds . al lBound = fa lse

Listing 3.1: Pseudo code voor het verkennen van de bounds van variabelen

Alleen wanneer all variabelen waar een LHS-var van af hangt bounded zijn kan de waarde voor dezevariabele uitgerekend worden. Dit proces zal dus herhaald worden tot er geen ongebonden variabelenmeer zijn.

VariableReferences

Wij hebben momenteel voor elke variabele de mogelijke waardes uitgerekend. We missen echter nogeen aantal waardes. Er is namelijk nog geen rekening gehouden met het gebruik van pointers. Ophet moment dat a bijvoorbeeld naar b wijst, en er een andere waarde aan a wordt toegekend zal dezeeigenlijk aan b worden toegekend. VariableReferences zal voor elke LHS-var recursief een functieaanroepen. Deze functie zal alle mogelijke waarden van deze LHS-var toevoegen aan alle variabelenwaar LHS-var naar kan refereren. De functie wordt vervolgens weer aangeroepen op de gerefereerdevariabelen. Aan het einde hebben we een bovengrens bepaald voor elke variabele, rekening houdendemet pointers.

StaticVars

Nu we een bovengrens hebben bepaald kunnen we kijken of er variabelen geëlimineerd kunnen worden.Indien de bovengrens bestaat uit precies één waarde dan is de variabele statisch. StaticVars-travelergaat alle variabelen na, en markeert deze variabelen. Bij het bouwen van de BDD kunnen deze varia-belen dan genegeerd worden, en vervangen worden met de waarde van de variabele.

For loops

Na alle bovenstaande analyses is er nog een constructie in NTA waar we geen rekening mee hebbengehouden. Te weten de Groups, en specifiek de foreach-group. De foreach zal een loop-variabelevoor elke waarde uit een gegeven list initialiseren - en de ModelElements in de foreach-group voorelke waarde van die variabele uitvoeren. Er is voor gekozen om deze loops uit te vouwen (loop un-rolling) teneinde ze in de BDD te passen. In een eerste poging is er getracht de uitgevouwde loopsin het NTA-model onder te brengen. Dit bleek echter niet mogelijk om alleen lokaal te doen geziende aard van NTA. NTA wil namelijk elke verandering aan het model doorgeven aan de server, zodatalle andere clients eenzelfde model hebben. Hierna is besloten om zodra de bovengrens van alle va-riabelen is uitgerekend, er een boolean in ModelInfo wordt aangepast. Deze boolean geeft aan datbij het verkennen van het model ook in de for-groups gekeken dient te worden. Bij de verkenning zalelke foreach dus geinitialiseerd worden met elke mogelijke waarde uit de lijst. Gezien de forloop ookweer invloed kan hebben op de waardes van variabelen worden bovenstaande ME-travelers allemaalopnieuw uitgevoerd, deze keer rekening houdende met foreach-groups. Mogelijke problemen hierbij isdat alle initialisaties van foreach-executies onderling moeten worden verbonden in de BDD. Verder zaler bij een JumpAndReturn uit een foreach-group een inlining van die code vereist zijn. Verder is het ooktoegestaan om foreach-groups in for-each-groups te plaatsen. Dit alles heeft gedurende de stage eenaanzienlijke hoeveelheid tijd gekost om te doorgronden en proberen te vangen in code.

Pagina 12

Page 13: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

BuildBDD

De BuildBDD traveler zet de informatie in de Info-klasses om in een BDD. Dit gebeurt door achtereen-volgens de variabelen en stack aan te maken. Vervolgens worden alle relaties toegevoegd. Als laatstewordt de BDD in de begin-state gezet. Gegeven deze BDD en de gegenereerde relaties kan het modelverkend gaan worden.

DotBuilder

De DotBuilder is een klasse die .dot-bestanden kan lezen. Deze bestanden beschrijven een graaf.Het gegenereerde dot-bestand is een grafische weergave van hoe de ModelElement-travelers doorhet model heen gaan. Een voorbeeld van een dergelijke weergave is te zien in Figuur 4.3 & 4.3.Deze figuren zijn het best te bekijken in de PDF, daar er dan ingezoomd kan worden. Tevens is ditdus een weergave van hoe het model door de BDD geinterpreteerd zal worden. Deze klasse is puurontworpen om in de ontwerpfase visuele feedback te hebben over hoe het model geanalyseerd wordt.Op vergelijkbare wijze kan er ook een graaf worden gecreëerd die alle variabelen en hun onderlingenverbanden toont.

Pagina 13

Page 14: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

Hoofdstuk 4

Conclusie

In de vorige hoofdstukken is uitgeweid over verscheidende dingen. Het probleem is aangeduid, zijndeeen model gedreven testtool die naar mate het model groter wordt aanzienlijk complexer wordt. Eris gekeken naar wat een mogelijke oplossing zou zijn om dit tegen te gaan. We hebben uiteindelijkvoor een van deze oplossingen gekozen om deze gedurende een twintigtal weken uit te werken. Ditidee is hierboven uitgelegd, tezamen met een uitweiding hoe deze oplossing binnen de code van NTAuitgevoerd dient te worden. Uiteraard zijn er ook nog subtiliteiten die niet in dit rapport beschreven zijn,daar deze zichzelf wijzen wanneer iemand de code zou doornemen.

4.1 Tijdsbesteding

Gedurende de eerste weken heb ik mij bekend gemaakt met mijn werkomgeving en NTA. Ik heb eerstals gebruiker met NTA kennis gemaakt om een idee te krijgen van de functionaliteiten van NTA. Hierbijwas ik ook zeer geholpen door de tutorials geschreven door Daan van Beek, die zowel diende om mijbekend te maken met het systeem als documentatie, en een goed handvat om de werking van hetsysteem te doorgronden. Gedurende deze weken hebben we ook in overleg de exacte opdracht vormgegeven. De contouren van de opdracht waren reeds tijdens onze eerste gesprekken voor aanvangvan de stage bepaald. Om bij de exacte invulling als stagair ook meer mee te kunnen denken waseen eerste kennismaking met NTA echter onmisbaar. De weken hierna heb ik literatuur gelezen metbetrekking tot model driven testing, en BDD’s. Verder heb ik een aantal papers over JTorx bestudeerd.JTorx is een model driven test-tool, ontwikkeld door Axel Belinfante. Met deze tool ben ik reeds bekendvia een vak dat ik heb gevolgd in het kader van mijn master, en het leek mij nuttig deze tool nogmaalste bekijken in het kader van mijn huidige opdracht. Gelijktijdig ben ik begonnen met een raamwerk ommet behulp van JavaBDD van een graaf een BDD te kunnen maken. Later ook met de toevoeging vanvariabelen, stacks, transitierelaties en een methode om een pad te bepalen gegeven een beginnode enéén van de bereikbare nodes die met behulp van de transitierelaties te bereiken is. Na dit raamwerkben ik begonnen met het ophalen van informatie uit het model. In eerste instantie met behulp van veleextra (nieuwe) functies binnen het bestaande model. Later met behulp van "Travelersëen methode dieerg op het bekende visitors-pattern lijkt. Waarbij het model gedecoreerd werd met klasses waar deverkregen informatie in opgeslagen werd. Hierna is er nog een aantal weken nodig geweest om destatische analyse van variabelen correct te implementeren, en nog enige tijd om pointers te kunnenanalyseren. Een veelvoud aan weken is vervolgens besteed aan het verkennen van for-loops. Eerstdoor deze binnen het model uit te vouwen. Later door deze op een andere manier te verkennen metbehulp van de travelers. Dit zorgde echter weer voor de nodige complicaties in het creëren van deBDD. Rond dat punt was echter de tijd voor mijn stage inmiddels ten einde gelopen. Reste mij enkelnog verslaglegging en een (interne) presentatie. Bij de presentatie heb ik de inhoud van dit project ende behaalde resultaten toegelicht. Ook heb ik toen een aantal mogelijk in de toekomst te volgen ideeenbesproken, waaronder de haalbaarheid en wenselijkheid voor het afronden van deze benadering.

4.2 Behaalde resultaten

Helaas is het niet gelukt gegeven de tijd die voor de stage stond de gehele opdracht af te ronden. Ge-lukkig hebben we wel alsnog nuttige resultaten kunnen behalen. Allereerst kunnen we met de statischeanalyse nuttige informatie over het model extraheren. Deze informatie kan worden gebruikt voor deverkenning van het model, zij het met behulp van BDD’s of op een andere manier. Ook kunnen er doorde traveller-klasses makkelijk bepaalde functionaliteiten aan NTA worden toegevoegd. Deze functiona-liteiten waren voorheen al bedacht en gewenst verklaard. Het implementeren van deze functionaliteitenzonder het traveler-raamwerk kosten echter dusdanig veel tijd dat deze onderaan de featurelijst waren

Pagina 14

Page 15: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

beland. Een feature waar men aan kan denken is bijvoorbeeld opzoeken waar een variabele exactgebruikt wordt, en wat de impact is wanneer een gebruiker een variabele zou wijzigen. Momenteel ishet verwijderen of aanpassen van een variabele een zeer precaire klus, gezien de neveneffecten nietgoed zichtbaar zijn. Men zou dus of op blind vertrouwen een variabele moeten aanpassen, of eenvolledige kennis van het model hebben. In de praktijk betekend dit dat in een dergelijk geval vaak eennieuwe variabele geïntroduceerd wordt. Dit zal in de toekomst een hoop legacy variabelen, en dus eenonnodig grote state-space kunnen opleveren. Gedurende deze stage zijn er ook al een aantal bugs enonvolledigheden in NTA gevonden en opgelost. Ook kunnen we nu een (veel) betere schatting makenvan de haalbaarheid om NTA een op BDD-gebaseerde test-advisor te geven. Indien dat het geval iszou ook het raamwerk voor de BDD generatie kunnen gebruikt worden als basis hiervoor. Het is echterdiscutabel of een op BDD’s gebaseerde advisor een wijze keuze is in retrospect.

4.3 Aanbevelingen

Indien dit gelukt zou zijn zou het een zeer efficiënte en misschien wel de beste oplossing zijn om eengoed advies uit te brengen aan NTA. Het probleem is echter dat de implementatie perfect dient te zijn,dit omdat er anders geen enkele garantie kan worden gedaan over de verkenning van het model mochtde BDD een fout bevatten. De complexiteit van dit project is wellicht uit te drukken door te trachten eennaam te bedenken voor wat de NTA2eigenlijk is. Het is een test guidance advisor voor een model basedtesting tool, gebaseerd op het verkennen van een model van het model middels een BDD. Misschienwel een:

"BDD-based meta-Model Exploration based Test Guidance Tool for a Model Based Test Tool"

Ook al zou deze tool correct werken, dan nog zou NTA2in sommige aspecten complexer zijn dan NTAzelf. Dit klinkt niet als een wenselijke eigenschap. Al helemaal niet wanneer in de toekomst het gedragvan NTA wijzigt, dit kan bijvoorbeeld door een uitbreiding van functionaliteiten komen, of door de intro-ductie van een extra NodeType. Maar ook iets simpels als een bug-fix kan ervoor zorgen dat het gedragvan NTA2niet meer overeenkomt met NTA. Wat zou vereisen dan iemand deze functionaliteit dus ook inNTA2aanpast.

Voltooiing van NTA2

Daargelaten dat de volledige correcte implementatie van een BDD-based Test advisor nog een aan-zienlijke hoeveelheid werk zou betekenen. Mede doordat NTA nog wat ambiguïteiten bevat, verwachtik dat NTA nog wel een aantal verassingen in petto heeft die de vlekkeloze implementatie van NTA2inde weg zullen staan. Met betrekking tot de implementatie van foreach-Nodes stel ik voor deze ook inde BDD te encoderen, zoals bij JumpAndReturns ook gedaan is. Het uitrollen van for-loops lijkt eennodeloos ingewikkelde zaak te worden, ondanks dat dit op het eerste gezicht eenvoudig lijkt.

Gebruik van een bestaande modelchecker

Een andere optie is om de verkregen informatie van de statische analyse in een model te stoppen datdoor een traditionele modelchecker kan worden verkend. Persoonlijk lijkt mij dit geen heel goed idee. Ditomdat een volwaardige modelchecker NTA een stuk complexer maakt en dat nog steeds al het gedragvan NTA een vertaalslag dient te maken van NTA-model naar een andere modelleertaal. Daargelatendat deze modelchecker bounded reachability checking op een manier implementeert die voor ons doelbruikbaar is.

Test Guidance op basis van eerdere verkenningen

Ondanks dat een benadering met test-guidance op basis van (bounded) verkenning van de state-spacewaarschijnlijk het beste advies genereert denk ik dat in de praktijk een andere keuze handiger is. Mo-menteel verkend NTA heel oppervlakkig door te kijken of de aangrenzende nodes al zijn bezocht, enkiest de helft van de tijd voor de minst bezochte node. Om te zorgen dat wel elke node eventueel geko-zen wordt zal NTA de andere helft van de tijd een willekeurige richting kiezen. Ik denk dat wanneer indeze oppervlakkige keuze de huidige waarde van de variabelen mee wordt genomen, welke verkregenkunnen worden met de statische analyse, dat er al een iets betere keuze kan worden gemaakt. Eengrotere verbetering verwacht ik wanneer de coverage van het model centraal wordt opgeslagen. Ophet moment dat er getest wordt zal NTA namelijk met meerdere instanties tegelijkertijd draaien. Ik denkdat wanneer van al deze instanties centraal wordt bijgehouden waar ze zijn geweest, dat er vanuit diecentrale plek een betere en snellere coverage bereikt kan worden. Deze server zou dan ook kunnenmeewegen in de te kiezen richting voor NTA. In plaats van 5 instanties die allemaal op vergelijkbare

Pagina 15

Page 16: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

manier door het model gaat zou de server de verschillende instanties kunnen sturen om gezamelijk hetmodel te verkennen. Met behulp van de statische analyse zou op de server van te voren al kunnenworden bepaald of een bepaalde node wel of niet bereikbaar is, dit zou onnodig verkennen kunnenminimaliseren. Ook zou deze server verdachte plekken in het model in kaart kunnen brengen. Dit zijnplekken waar NTA of nooit komt, of maar een enkele keer. Dit kan meewegen in de beslissing om dezeplekken te verkennen. Wanneer op een dergelijke manier het model wordt verkent zal dit zorgen voor:een minder complex systeem voor de test-advisor dan de BDD-oplossing Een robuuste verkenner diegrotendeels ongevoelig is voor de interne werking van NTA. Tenslotte hoeven we niks te weten daar-van, we sturen enkel op basis op verkregen data over het bezoeken van locaties. En hiervoor zoudenreguliere algorithmen kunnen worden gebruikt voor het verkennen van grafen. Ik denk dat dit redelijkmakkelijk te passen is binnen de huidige structuur van NTA. De complexiteit van de verkenningstac-tieken zou in eerste instantie tamelijk simpel kunnen zijn, maar zou eenvoudig uit te breiden zijn. Integenstelling tot de BDD-oplossing, wat meer een alles-of-niets-benadering is. Tevens denk ik dat erdan ook verschillende verkenningstechnieken gebruikt kunnen worden door verschillende instanties vanNTA.

Pagina 16

Page 17: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

2463

1530

4

1513

898

1399

899

900

1533

755

2724

2313

2726

187

2728

2727

2729

2683

2659

2660

2499

2514

2513

2500

2501

2502

2503

2672

2673

1

2716

2720

1712

2723

2714

2718

2

2721

74

62

65

55

242

2571

1713

66

2573

1708

183

162

1890

75

600

2592

2575

1957

2576

165

124

1892

92

597

116

120

159

952

880

852

881

865

2741

2021

2019

2018

2407

2020

2736

1014

1008

1005

2408

1011

1012

1013

18

87

1009

84

1010

15

85

185

824

86

161

2412

823

1252

298

1098

534

559

1261

1282

1278

1271

297

303

1097

1099

535

537

558

560

1512

1479

1487

1477

1293

1288

1255

2413

1297

1298

1290

1345

1289

1461

1291

1299

1294

1346

1296

1026

1440

1295

1384

1385

1439

2015

1386

1387

1388

1462

1427

1428

1430

1429

1431

1

830

831

308

833

832

1030

1

2

2

2

1038

1

1021

2

1031

2

851

2

1447

1039

1022

1445

334

1333

1337

573

1338

1316

2442

1340

1319

2431

1342

1328

438

2432

1435

1

446

1329

2

1356

3

464

3

1377

2

1331

3

1363

2

327

465

1378

449

1362

439

440

444

441

1320

442

443

628

2

1321

3

1327

574

1317

580

577

1318

581

576

578

584

2

587

3

457

3

435

3

1357

2

1494

2

13732

331

459

437

1358

1495

1374

582

1109

575

1661

1110

583

1662

1111

1663

1664

1665

579

1375

2441

1365

2429

460

1

2430

1434

461

1366

2

1368

3

1371

1359

2440

1347

1433

332

1

328

1348

2

1350

3

2439

1302

1443

1463

1221

1442

1453

1996

1454

1987

1457

1991

1458

1459

2013

2014

1311

1460

1313

1382

1314

1024

1

2016

834

837

313

836

835

1025

2

1062

2

1028

2

1659

3

1090

3

2022

2

919

2

1263

2

1042

316

1132

1474

1125

866

1264

1989

1990

1993

2006

2

2012

2

2017

4

417

2

1995

2

2007

3

1994

2

2008

3

2024

4

1052

1186

980

1041

1080

625

1182

1448

1449

1100

1451

1450

1103

538

1444

2

2

1241

541

400

544

542

401

566

563

565

543

564

1262

1508

1484

1465

1486

1478

1

1485

1254

1260

1469

1488

290

1489

1259

1491

1492

1493

1496

1497

1498

1499

1500

1501

1641

1642

1643

1470

2

2

2

1475

3

281

285

2023282283284

280

278279

1087

1088

1490

1089

533

4

10934

1003

1004

368

369 370

1631

1632

1633

1562

1656

1561

1585

1584

1678

1587

2027

1597

1599

1588

2037

1600

1602

2640

1603

2643

2642

1590

1679

1591

1606

1592

1607

1658

1593

1636

2026

1611

1608

1564

1609

4

4

1666

2

1629

4

886

1628

1610

1660

2635

2639

2636

2637

2638

1649

2231

2631

2632

1601

2227

2633

2230

1594

1595

1596

1565

1567

1580

1578

1569

1572

1575

1573

1582

1576

1574

1650

2641

1577

1586

1598

1639

1644

1653

1645

1651

373

992

590

1065

522

1084

524

260

1085

589

528

261

525

591

529

530

1466

1481

2

1467

3

1483

592

593

264

1086

1502

1506

106

1507

2038

2071

2041

2072

2057

2052

2055

2059

2136

107

2101

2074

1

1

1

652

2

2004

2

1

1

647

2

654

2

1

1

1

2098

2133

2088

300

2106

2093

2127

9572005

947

2414

953

955

306

2107

3

2096

2097

2100

2089

3

2094

4

2064

2067

2066

2063

2060

2065

2068

2061

2070

3

2069

2062

2080

2081

2091

2082

2092

2083

2084

2134

2135

2138

2073

2137

3

2139

2045

2075

2044

2051

2043

2076

3

2077

2046

2078

2047

994

1476

1472

372

294

295

296

1094

1473

3

1091

1092

1070

307

1096

1068

2196

416

1127

1951

821

364

429

1131

1952

336

402

894

432

431

2438

1129

850

617

2197

618

1071

1069

1

1067

1

1037

1072

620

2417

2030

2028

1073

2426

2032

2422

2425

2416

2421

2420

2419

2423

596

377

595

2424

2418

2415

626

2

598

382

1

3

619

3

1077

3

1683

623

1078

911

1684

820

1833

1845

398

383

2

2

2

385

384

389

388

392

796

390

391

1237

1238

798

1227

802

807

1228

808

799

810

809

804

800

817

805

801

1116

797

615

397

982

985

399

1112

806

1113

803

814

811

812

815

816

1114

1115

813

1231

1235 3

3

394

395

456

603

602

605

604

607

606

608

1118

1119

1081

616

613

614

610

609

612

1120

611

1082

1121

1844

1842

3

2577

2

1846

1705

1847

1700

1843

1817

2010

2579

1818

1819

1820

1821

4

1956

2

1823

2

1717

1888

1701

1702

1703

1704

1706

4

1822

2 2

1834

1801

2031

1075

1076

2035

2036

1079

2029

621

622

2033

2034

624

838

840

839

842

844

825

843

822

1

2

1034

1

81

1133

1170

1177

1168

1171

2

1169

1165

1172

1173

1174

1175

1176

1183

1184

1185 1188

1192

1196

3

1190

1191

1193

1194

1141

1195

1179

1142

4

1151

1152

1153

1154

1155

1156

1157

1158

1161

1159

1162

1160

5

1181

4

1145

1143

1146

1147

1148

5

1150

4

1197

1198

1199

1201

1200

1203

1202

1204

4

1135

1136

1137

1134

3

1955

2435

1948

1953

2434

2141

1932

1934

1931

1936

1937

1933

1941

1935

2149

1954

2294

2150

1950

2146

2148

2147

2

2151

360

361

344

345

346

347

348

349

350

353

352

354

2

2

356

363

1942

1938

2159

2152

2172

2157

2158

2155

2153

2226

407

409

408

757

410

2

415

2

403

413

758

759

2176

2177

2179

2182

2178

2180

2188

2156

2189

2190

3

2166

3

2174

3

2170

3

2165

2173

2169

2191

2192

2195

2193

2183

2184

2181

2185

2186

2194

2187

2175

776

775

774

778

783

779

784

785

786

787

788

789

792

790

793

2

760

2

770

780

782

781

1939

1943

2168

2171

510

512

511

519

518

2

480

2

481

769

768

516

1940

1944

2167

488

490

818

819

491

499

496

492

493

494

495

767

498

2

477

2

476

766

503

2433

2140

2143

2144

2145

2142

2

433

434

2289

2288

453

2

2286

2287

2291

2290

2201

2292

2211

2210

2204

2206

2209

2215

2295

2205

2212

2214

2213

2207

2300

2299

2208

3

2221

3

2274

3

2280

3

2270

3

2262

3

2305

3

2277

3

2219

2273

2279

2269

2261

2304

2276

2296

2302

2301

2216

2203

2298

2297 2307

2303

469

2

479

895

319

2199

357

2220

358

2217

2218

2198

473

359

320

2264

2265

2266

2271

2272

322

2

2268

2275

2267

2281

2278

761

762

764

2250

771

2251

772

2255

2256

2257

2260

2258

2259

2263

2285

773

777

2284

506

2244

507

508

509

2245

2248

2246

2247

2249

763

765

484

2283

485

2242

2241

2240

2235

2236

2239

2238

2237

2234

2243

486

487

2232

404

2233

405

472

406

2282

2223

2225

2224

2222

309

1242

1239

1243

1240

546

547

475

568

548

474

311

1104

569

549

551

550

1

1

1

1

552

1105

571

570

572

1107 1106

1108

312

1244

167

166

1826

174

1828

999

1841

1835

1854

1836

1838

1848

1862

1855

1856

1870

1863

1850

1852

1878

1871

1864

1858

1860

1886

1872

1879

1866

1868

1880

1887

1874

1876

1875

1877

1873

1884

1882

1

1885

1883

1881

1867

1869

1865

1859

1861

1857

1851

1853

1849

1837

1839

1840

1000

169

168

176

170

175

177

2409

2406

2410

2405

2739

2738

2737

2740

2731 2713

2707

2710

2694

2693

2695

2698

2717

2696

2709

2711

2705

1

2701

2702

2704

2703

2

2699

1015

91

1016

88

89

186

90

163

14

83

1006

80

1007

184

1017

164

82

1018

1033

1083

1020

1036

2310

1044

2312

1045

1405

1046

1047

1048

1049

1050

1057

1

1056

2311

1023

1040

1

16

860

862

859

863

864

921

967

948

854

855

856

857

858

867

912

868

913

869

914

870

871

872

874

873

876

877

878

879

882

875

883

884

885

887

888

889

892

949

1

651

649

2003 650

648

655

2002

653

656

960

657

956

958

736

966

965

1

969

641

642

643

644

645

713

670

711

671

661

672

706

674

675

707

676

677

959

680

2

646

662

663

668

664

660

1214

751

712

3

998

3

722

3

698

723

1999

665

667

669

2000

666

1216

2001

1997

1215

739

963

961

737

740

684

685

686

687

688

699

700

742

964

2

743

702

744

968

717

718

719

720

721

724732

725

729

726

733

734

735

728

748

727

738

962

2

730

731

1893

1895 1894

1913

1914

1915

1916

1917

1918

1919

1921

1920

1922

19241923

1925

1927

1926

1928

1

2630

2581

2580

2583

2582

1

2586

2578

2587

1810

18091813

1811

1815

1812

1814

1807

1806

1808

1805

1803

1804

1799

1798

1797

1800

1796

1795

1791

1792

1793

1790

1788

1789

1785

1787

1784

1786

1783

1781

1782

1780

1725

1724

1715

1721

1716

1779

1777

1778

1

1794

1802

56

640

2551

2552

57

58

59

60

61

63

1

188

189

2556

2555

190

192

193

194

199

195

196

198

200

201

202

203

205

206

207

208

209

210

211212

213

27191

983 981

24

23

22

2715

1

637

639

217

2554

2553

218

219

220

221

222

223

224

225

226

227

228

229

2722

1

1538

1514

1

Figuur 4.1: Weergave van het NTA-model zoals verkend door NTA2

Pagina 17

Page 18: TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL17 november 2014 STAGEVERSLAG TEST GUIDANCE FOR THE NEDAP TEST AUTOMATION TOOL Jeroen Vonk NEDAP University of Twente Comité: Daan

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.host:host

NO

NO

NO

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeContractor

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:identification

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor2:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.mainButtons.widgets.entrances

false

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeVisitor

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.department:value

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.userBlok:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed3:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setMobilePhoneNo

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee1:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.findFreeFieldDefinition:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.user

"userAdministrator"

NO

NO

NO

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.userReadOnly

NO

NO

YES

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.userVisitorsOnly

NO

NO

YES

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.userReplaceOnly

NO

NO

YES

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.userAdministrator

NO

NO

YES

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.userBadgeOnly

NO

NO

YES

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.userNoFunctions

NO

NO

YES

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.badgeXS105

clean

NO

NO

YES

clean

name:

default:

persistent:

static:

referencedto:

local.personVehicle.currentRequest:setIdentification

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:badgeID

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.blockToken

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.userBosse:visit

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDate:value

2013-09-14

YES

NO

NO

2013-09-14

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeContractor:setId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addVisitor:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addCarrierAuthorizations:setCarrierId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.temporary

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDate

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.dashBoard.carrier:visit

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findEmployee

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.replaceToken:setBadgeNumberTo

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.replaceToken:setBadgeNumberFrom

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.visit.findVisit

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDate:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.withdrawToken:setBadgeNumber

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor2:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDateTime:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addCarrierAuthorizations:setTemplateId.TemplateAuthorisationOnline

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier:mode

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.findDepartment

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.AEPUAvailable

true

NO

YES

NO

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findCar

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkMode

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.main.currentField

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeTime

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeString

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.language

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.department

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDateTime

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeBoolean

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.personnelNo

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeStringLookup

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.user:monitorPresenceViewPresenceVehicles

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDateTime:value

2014-08-21T16:01:21

YES

NO

NO

2014-08-21T16:01:21

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setIdentification

YES

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.findFreeFieldDefinition:setName

NO

NO

NO

Department

freeBoolean

Language

freeTime

freeDateTime

PersonnelNr

freeDate

freeStringLookup

freeString

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:lastName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier:licensePlate

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.userBlok

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.currentRequest

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findContractor

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findVisitor

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.badgeEditorOpenSuccess

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.unblockToken:setIdentifierType

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.userBosse:lastName

Bosse

YES

NO

NO

Bosse

name:

default:

persistent:

static:

referencedto:

local.personVehicle.currentRequest:getId.ContractorInfo

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed3:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.environmentPrepared

false

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.department:name

Department

YES

NO

NO

Department

name:

default:

persistent:

static:

referencedto:

local.personVehicle.reloadCarrier

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkCarrier2:created

NO

NO

NO

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addEmployee

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier:middleName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeTime:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.personnelNo:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkListEmployee

bulkEdit.bulkEmployee1 bulkEdit.bulkEmployee2 bulkEdit.bulkEmployee3

NO

NO

YES

bulkEdit.bulkEmployee1 bulkEdit.bulkEmployee2 bulkEdit.bulkEmployee3

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee3:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addContractor

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDate:name

freeDate

YES

NO

NO

freeDate

name:

default:

persistent:

static:

referencedto:

global.badgeXS17

clean

NO

NO

YES

clean

name:

default:

persistent:

static:

referencedto:

global.carrierVehicle

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed1:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.replaceToken:setReason

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee3:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor3:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeStringLookup:name

freeStringLookup

YES

NO

NO

freeStringLookup

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addCarrierAuthorizations

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeString:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.blockCarrierRequest:setCarrierId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.removeCar

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.dashBoard.replace:ID

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkCarrier3:created

NO

NO

NO

true

name:

default:

persistent:

static:

referencedto:

global.user:username

NO

NO

NO

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

local.httpLoginProcedure.password

aeosrules

NO

NO

NO

aeosrules

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeTime:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkListContractor

bulkEdit.bulkContractor1 bulkEdit.bulkContractor2 bulkEdit.bulkContractor3

NO

NO

YES

bulkEdit.bulkContractor1 bulkEdit.bulkContractor2 bulkEdit.bulkContractor3

name:

default:

persistent:

static:

referencedto:

global.userOeveren:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.findDepartment:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.mainButtons.widgets.presence

false

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDateTime:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.currentInterface

dashboard

NO

YES

NO

dashboard

name:

default:

persistent:

static:

referencedto:

local.personVehicle.removeVisitor

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeBoolean:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findBlockReason:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeCar

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.badge

NO

NO

NO

clean

name:

default:

persistent:

static:

referencedto:

global.badgeXS86

clean

NO

NO

YES

clean

name:

default:

persistent:

static:

referencedto:

global.badgeXS23

clean

NO

NO

YES

clean

name:

default:

persistent:

static:

referencedto:

global.badgeXS59

clean

NO

NO

YES

clean

name:

default:

persistent:

static:

referencedto:

global.user:password

NO

NO

NO

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

local.personVehicle.replaceToken:setIdentifierTypeTo

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.replace

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.badgeXS96

clean

NO

NO

YES

clean

name:

default:

persistent:

static:

referencedto:

global.badgeXS46

clean

NO

NO

YES

clean

name:

default:

persistent:

static:

referencedto:

global.badgeXS38

clean

NO

NO

YES

clean

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeCar:setId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeString:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee2

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeContractor:setValue

NO

NO

NO

2014-08-21T16:01:21

15:02

value1

2013-09-14

testString

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addCar

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee1

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.carrier

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.userBosse

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.userOeveren

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor3:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.language:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.user:entranceEntranceProvideAccess

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee3

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addEmployee:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.httpLoginProcedure.username

administrator

NO

NO

NO

administrator

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.user:personVisitorSearch

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.currentRequest:getId.EmployeeInfo

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addVisitor

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.assignToken:setCarrierId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.department:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.success

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:ID

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addCar:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.personnelNo:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.unblockCarrierRequest

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeBoolean:value

true

YES

NO

NO

true

name:

default:

persistent:

static:

referencedto:

global.userOeveren:host

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.removeContractor

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.blockToken:setIdentifierType

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor3:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkCarrier3

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor3

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor3

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkCarrier2

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor2

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor2

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkCarrier1

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor1

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor1

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeEmployee:setDefinitionId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeStringLookup:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeCar:setDefinitionId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.replaceToken:setIdentifierTypeFrom

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed1

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.personVehicle.replace

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeVisitor:setId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.carrier:lastName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDate:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.personnelNo:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeBoolean:name

freeBoolean

YES

NO

NO

freeBoolean

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed3

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.replace:ID

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed2

NO

NO

YES

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier:lastName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDateTime:name

freeDateTime

YES

NO

NO

freeDateTime

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.personnelNo:value

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.user:monitorEventMonitorTextEvents

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.language:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeEmployee:setValue

NO

NO

NO

2014-08-21T16:01:21

15:02

value1

2013-09-14

testString

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.withdrawToken

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.dashBoard.badge:ID

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findIdentifierType:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeCar:setValue

NO

NO

NO

2014-08-21T16:01:21

15:02

value1

2013-09-14

testString

true

name:

default:

persistent:

static:

referencedto:

global.htmlEnabled

false

NO

YES

NO

false

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed1:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeStringLookup:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.carrierVehicle:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.success

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor1:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.dashBoard.replace

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.department:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeTime:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.replaceToken

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeString:value

testString

YES

NO

NO

testString

name:

default:

persistent:

static:

referencedto:

local.personVehicle.currentRequest:setLastName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.blockCarrierRequest:setReason

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeEmployee:setId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:visit

NO

NO

NO

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkList

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkListMixed

bulkEdit.bulkMixed1 bulkEdit.bulkMixed2 bulkEdit.bulkMixed3

NO

NO

YES

bulkEdit.bulkMixed1 bulkEdit.bulkMixed2 bulkEdit.bulkMixed3

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkListVisitor

bulkEdit.bulkVisitor1 bulkEdit.bulkVisitor2 bulkEdit.bulkVisitor3

NO

NO

YES

bulkEdit.bulkVisitor1 bulkEdit.bulkVisitor2 bulkEdit.bulkVisitor3

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeTime:name

freeTime

YES

NO

NO

freeTime

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeVisitor:setDefinitionId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:created

NO

NO

NO

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.bulkCarrier1:created

NO

NO

NO

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.assignToken:setIdentifierType

YES

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee2:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeBoolean:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setLanguage

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.host:lastName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.user:personVisitorSearchVisits

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setMiddleName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeStringLookup:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier:mobile

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor3:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed2:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findBlockReason:setName

NO

NO

NO

Carrier Replacement

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee2:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDate:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.removeEmployee

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.blockToken:setReason

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeString:mandatory

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.language:name

Language

YES

NO

NO

Language

name:

default:

persistent:

static:

referencedto:

local.loginProcedure.username

administrator

NO

NO

NO

administrator

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

global.userBlok:host

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.user:monitorPresenceViewPresencePersons

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.unblockToken

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.user:monitorEventMonitorPhotoEvents

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.dashBoard.carrier:mode

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor1:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:attachment

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier:identification

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setFirstName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.visit.removeVisitRequest

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeBoolean:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.mainButtons.widgets.photoEvents

false

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.currentRequest:getId.VisitorInfo

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.findFreeFieldDefinition

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findIdentifierType

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.assignToken:setBadgeNumber

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setLastName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.host

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setLicenceNumber

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.loginProcedure.password

aeosrules

NO

NO

NO

aeosrules

"userAdministrator"

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:blocked

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.mode

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.language:value

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.dashBoard.carrier

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.badge:ID

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor2:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier:firstName

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.visitSelected

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeVisitor:setValue

NO

NO

NO

2014-08-21T16:01:21

15:02

value1

2013-09-14

testString

true

name:

default:

persistent:

static:

referencedto:

local.dashBoard.badge

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.visit.findVisit:getId.VisitInfo

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:mode

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor2:blocked

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.userBosse:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.findBlockReason

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.dashBoard.carrier:blocked

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.department:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeStringLookup:value

value1

YES

NO

NO

value1

name:

default:

persistent:

static:

referencedto:

local.createEmployee.findTemplate:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeDateTime:readable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.replace:ID

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentFreeField:DefinitionId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeEmployee

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeString:name

freeString

YES

NO

NO

freeString

name:

default:

persistent:

static:

referencedto:

local.createEmployee.changeContractor:setDefinitionId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.mainButtons.widgets.detailedEvents

false

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkContractor1:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setPersonnelNo

NO

NO

NO

512

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.badge

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.freeTime:value

15:02

YES

NO

NO

15:02

name:

default:

persistent:

static:

referencedto:

local.createEmployee.replicateMode

false

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier:created

NO

NO

NO

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentFreeField:value

NO

NO

NO

2014-08-21T16:01:21

15:02

value1

2013-09-14

testString

true

name:

default:

persistent:

static:

referencedto:

local.personVehicle.withdrawToken:setIdentifierType

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.mainButtons.widgets.textEvents

false

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.createEmployee.mode

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.carrier:host

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.currentRequest:setDepartmentId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.language:writeable

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.blockToken:setBadgeNumber

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.unblockToken:setBadgeNumber

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.quickLaunch.carrier:badgeID

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkMixed2:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.person

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

local.mainButtons.widgets.upcomingVisits

false

NO

NO

NO

false

true

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkVisitor1:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

local.personVehicle.assignToken

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.addContractor:getId

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.createEmployee.carrier

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.currentRequest:getId.CarInfo

NO

NO

NO

name:

default:

persistent:

static:

referencedto:

global.bulkEdit.bulkEmployee1:created

NO

NO

NO

true

false

name:

default:

persistent:

static:

referencedto:

global.fieldPermissions.personnelNo:name

PersonnelNr

YES

NO

NO

PersonnelNr

name:

default:

persistent:

static:

referencedto:

local.createEmployee.findTemplate

NO

YES

NO

name:

default:

persistent:

static:

referencedto:

local.personVehicle.blockCarrierRequest

NO

YES

NO

Figuur 4.2: Weergave van de variabelen na statische analyse door NTA2

Pagina 18