Descriptive Programmering i QTP/UFTDynamisk och statisk
⚡ Smart sammanfattning
Descriptiv programmering låter en QTP or UFT Ett uttalande bär själva objektbeskrivningen, som egenskapsvärdepar eller som en Description-objektet, så ett steg körs även om objektet aldrig lagrades i objektarkivet.
Vad är Descripthar du programmering?
Descriptive programmering används för att utföra operationer på ett objekt i AUT:n vars definition inte lagras i ObjektförrådMed hjälp av den här mekanismen kan du kringgå identifiering från objektförrådet och tillhandahålla objektet Descripti själva uttalandet.
Ett objektnamn används helt enkelt för att mappa ett objekt i ett skript med dess beskrivning i ett objektarkiv. Det betyder att om du ändrar objektnamnet i både ditt skript och objektarkivet, ska skriptet fortfarande köras. Se följande video om detta koncept.
Klicka här. om videon inte är tillgänglig
Video Highlights
- Ta bort objektet Descriptav rutan Agentnamn WinEdit från objektförrådet. Om du kör testet igen kommer det att misslyckas eftersom det inte kan känna igen objektet. Låt oss undersöka orsaken till att skriptet misslyckas.
- Under körtid, UFT En identifierar åtgärden som utförs på WinEdit-rutan, och objektet Description i objektförrådet lagras som agentnamn. Den använder detta namn för att track objektet i objektförrådet. För ett förälderobjekt kan du inte ha två underobjekt med samma namn, så QTP mappar objektet unikt i arkivet. Den använder sedan den lagrade beskrivningen i objektarkivet, ersätter namnet med beskrivningen och använder den resulterande satsen för att identifiera objektet i applikationen som testas.
- Eftersom vi i vårt fall hade raderat objektbeskrivningen helt och hållet, misslyckas skriptet.
- Men tänk om, istället för QTP Om du som testare ersätter objektbeskrivningen, anger du då direkt objektbeskrivningarna i ditt skript? Detta är inget annat än “Descriptive programmering"
Den enda ansvarsförändringen är vad de två formulären nedan implementerar, och varje formulär passar en annan typ av manus.
Typer av Descriptive programmering
Du kan använda Descriptjag programmerar på två sätt
- Statisk
- Dynamisk
Statisk Descriptive programmering
I Static Method, för objektidentifiering, anger du ett objekts egenskap i följande format
property:=values,
Detta format kallas ett egenskapsvärdepar och omges av citationstecken. Skrivet i sin helhet ser ett statiskt uttalande ut så här:
TestObject("PropertyName1:=PropertyValue1", "PropertyName2:=PropertyValue2").Method
Om ditt objekt använder flera beskrivningar för identifiering kan du ange dessa med kommatecken.
Så i vårt fall blir beskrivningen för Agent Name
"nativeclass:=Edit", "attached text:=Agent Name:"
Statiska beskrivningar läses vid den punkt där satsen körs, vilket gör dem idealiska för engångssteg och för snabba korrigeringar av ett skript som du inte vill spela in igen.
Dynamisk Descriptive programmering
Den andra metoden för att göra samma åtgärd är att använda Dynamic Descriptive programmering
Om ditt skript använder den beskrivande programmeringsobjektkandidaten flera gånger, kommer det att vara väldigt tröttsamt att ange alla egenskapsvärdepar för varje påstående
I sådana fall kan du använda dig av Descriptjonklass tillhandahållen av QTP
Syntaxen för att skapa ett beskrivningsobjekt är
Set MyDescription = Description.Create() MyDescription("property").Value = "property-value"
Detta är den dynamiska metoden
Att fylla i objektet med Agentnamn-egenskaperna som används ovan ger en komplett, återanvändbar beskrivning:
Dim oDesc Set oDesc = Description.Create() oDesc("nativeclass").Value = "Edit" oDesc("attached text").Value = "Agent Name:"
Variabeln oBeskriv kan nu skickas till vilken sats som helst som behöver det objektet, så en redigering uppdaterar varje steg som använder det.
Statisk vs Dynamisk Descriptiv programmering: När man ska använda varje
Båda formulären producerar samma körtidsbeskrivning, så valet handlar om underhåll snarare än kapacitet.
| Kriterier | Statisk (inline) | Dynamisk (Descriptjonobjekt) |
|---|---|---|
| Hur beskrivningen är skriven | Egenskapsvärdepar som skrivits in i testobjektanropet | Egenskaper tillagda till ett objekt skapat med Description.Create() |
| Återanvändning | Upprepas i varje sats som behöver objektet | Lagras i en variabel och skickas dit den behövs |
| läsbarhet | Korta uttalanden förblir läsbara; långa blir otympliga | Extra inställningsrader, men själva satsen förblir kort |
| Ändringar i körtid | Värden är fasta om de inte sammanfogas från variabler | Egenskapsvärden kan omtilldelas före varje användning |
| Fungerar med barnobjekt | Nej, filterargumentet måste vara ett Descriptjonobjekt | Ja, detta är det obligatoriska formuläret |
| Passar bäst till | Ett eller två steg på ett objekt som inte finns i arkivet | Objekt som används upprepade gånger, eller samlingar som hämtas vid körning |
Varför använda Descripthar du programmering?
Transkriptet nedan åtföljer videogenomgången av ett verkligt scenario där antalet objekt inte kan vetas i förväg.
Videoutskrift
- Miljondollarfrågan är varför man ska använda DP när objektidentifieringsprocessen hanteras av QTP
- Anta att du har fått i uppdrag att testa en jobbportal. Du skriver in en sökfråga i portalen och testet förväntar sig att du väljer alla tillgängliga jobb och klickar på Ansök jobb.
- Men antalet jobb som reflekteras beror på sökfrågan och de jobb som är tillgängliga vid tidpunkten för skriptkörningen, och det finns inget sätt att i förväg förutsäga antalet jobb som skulle reflekteras.
- I sådana fall kan du använda beskrivande programmering. Även om du inte känner till antalet och namnen på kryssrutorna, känner du till klassen för objekten som "WebCheck".Box"
- Du kan använda ChildObjects-metoden att returnera objekt som tillhör en viss förälder
- En kodrad som –
Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()
returnerar alla underobjekt för den här sidan.
- Men vi vill bara ha WebCheckBox objekt. För att göra det kan vi skapa ett filterobjekt och sätta dess egenskap till web check box-klassen, och sedan skicka detta filter som ett argument till ChildObjects-metoden.
- I det här fallet returneras endast kryssrutorna.
- Sedan kan du skriva kod som denna, som kommer åt hela samlingen av kryssrutor från noll och sätter alla kryssrutor PÅ.
- Därefter kan du klicka på appliceringsknappen för att slutföra testet
- Du kan också använda Descriptive Programmering för att köra objekt som är svåra att spela in som Auto-Hide Panels, Objekt med ändrade hierarkier, kapslade inre objekt, undermenyer.
- Du kan också göra avancerade strängmanipulationer med beskrivande programmering
- I samband med indexegenskapen kan deskriptiv programmering vara mycket användbar för att identifiera svåra objekt.
- Om du använder programmatisk beskrivning för ett objekt i en objekthierarki måste du använda beskrivande programmering för efterföljande underobjekt.
- Om till exempel beskrivande programmering användes för Page-objektet men det efterföljande underordnade WinEdit-objektet kom från objektdatabasen, är satsen felaktig.
- Tvärtom, när beskrivande programmering används för både Page- och WinEdit-objekten, är påståendet korrekt.
Utskrivet ser filtret och loopen som beskrivs i transkriptet ut så här:
Dim oFilter, allCheckBoxes, i Set oFilter = Description.Create() oFilter("micclass").Value = "WebCheckBox" Set allCheckBoxes = Browser("Jobs").Page("QTP").ChildObjects(oFilter) For i = 0 To allCheckBoxes.Count - 1 allCheckBoxes(i).Set "ON" Next
Samlingen är nollbaserad, vilket är anledningen till att loopen stannar vid Antal – 1Eftersom filtret utvärderas när raden körs fungerar samma kod oavsett om sökningen returnerar tre jobb eller trettio.
Reguljära uttryck, ordinala identifierare och vanliga fallgropar
DescriptIv programmering beter sig på två sätt som överraskar de flesta första gången en sats misslyckas utan någon synlig anledning.
1) Varje egenskapsvärde behandlas som ett reguljärt uttryck. En bildtext som t.ex. Totalt (USD) matchar därför inte, eftersom parenteserna är syntax för reguljära uttryck. Undvik dem med ett bakåtsnedstreck, eller stäng av utvärdering av reguljära uttryck för den egenskapen på en Descriptjonobjekt:
Set oDesc = Description.Create() oDesc("name").Value = "Total (USD)" oDesc("name").RegularExpression = False
2) Ordinala identifierare bryter band. När en beskrivning fortfarande matchar mer än ett objekt, lägg till index, läge or skapelsetid som en extra egenskap. Indexräkningen börjar på noll:
WebEdit("name:=userName", "html tag:=INPUT", "index:=0").Set "guru99" WebEdit("name:=userName", "html tag:=INPUT", "index:=1").Set "guru99"
Tre ytterligare fallgropar är värda att kontrollera innan du börjar felsöka applikationen:
- Använda mikroklass, inte etiketten Klassnamn visas i Object Spy. Visningsnamnet är inte en giltig egenskap i en beskrivning.
- Egenskapsnamn är inte skiftlägeskänsliga men måste stavas exakt som tekniken rapporterar dem, inklusive mellanslag i bifogad text och html-tagg.
- Descriptiv programmering kringgår arkivet; det förbättrar inte objektigenkänningen. Om rätt tillägg inte laddas kommer ingen beskrivning att göra objektet identifierbart.
