loadrunner vugen scripting challenges
Introduzione alle sfide coinvolte nello scripting di LoadRunner VuGen:
In questo Serie di formazione LoadRunner informativa , abbiamo esplorato Miglioramenti allo script VuGen nel nostro precedente tutorial. Dai nostri tutorial precedenti fino ad ora, abbiamo fatto grandi progressi con VuGen.
Abbiamo imparato come registrare uno script in protocollo Web HTTP / HTML, come prendersi cura di dati / valori con correlazione e parametrizzazione, come assicurarsi che la risposta sia corretta con i checkpoint, come inserire transazioni che misurano tasso e tempo di risposta dell'utente azioni e altre cose.
Con questi, dovremmo essere in grado di creare con successo script per quasi tutte le applicazioni web.
=> Fare clic qui per una serie completa di tutorial su LoadRunner
Linguaggio LR
Potrebbero esserci situazioni in cui dobbiamo svolgere compiti più impegnativi in uno script VuGen. In questo tutorial, discuteremo alcune delle sfide di scripting insieme alle tecniche disponibili per gestirle.
Prima di discuterne, capiamo alcune cose. VuGen (o Load Runner) può comprendere solo il proprio linguaggio (chiamiamolo linguaggio LR, poiché LR è l'abbreviazione di Load Runner). Quindi qualunque script genera si può dire che è in linguaggio LR. Nel linguaggio LR, esiste un solo tipo di dati: String (e più precisamente 'LR String').
Ora, per apportare miglioramenti in uno script VuGen, generalmente utilizziamo il linguaggio C.
Sappiamo che nel linguaggio C ci sono molti tipi di dati come int, char, float, long ecc. Se definiamo e usiamo direttamente i valori C in una richiesta, VuGen non capirà (poiché comprende solo le 'stringhe LR') e lancerà un errore. Quindi dobbiamo convertire qualsiasi valore C (di qualsiasi tipo di dati) in 'stringa LR' prima di utilizzarlo in una richiesta.
Avendo capito questo, passiamo ad alcuni scenari stimolanti in tempo reale.
Scenario 1:Come utilizzare una stringa C in una richiesta VuGen
Supponiamo che in uno script VuGen abbiamo una richiesta che ha un campo chiamato 'PlanName' (supponiamo che questo script sia per alcune applicazioni di pianificazione finanziaria). Durante la registrazione, abbiamo inserito il valore come 'NewPlan'.
web_submit_data('MyPlan', 'Action= {pURL} ', 'Method= POST ', 'TargetFrame=', 'RecContentType= text/html ', 'Snapshot= t21.inf ', 'Mode= HTML ', ITEMDATA , 'Name= PlanId ', 'Value= 67213 ', ENDITEM , 'Name= PlanName ', 'Value= NewPlan ', ENDITEM , 'Name= Age ', 'Value= 57 ', ENDITEM , 'Name= MaritalStaus ', 'Value= Married ', ENDITEM , LAST );
Supponiamo di voler utilizzare una stringa definita dall'utente come nome del piano.
Quindi, dobbiamo dichiarare e definire una stringa come mostrato di seguito
char sPlanName() = ' MyFinancialPlan ';
'SPlanName' è una stringa C e quindi dobbiamo convertirlo in stringa LR (per usarlo nella richiesta).
Lo facciamo utilizzando la funzione 'lr_save_string' come mostrato di seguito:
lr_save_string(sPlanName,”LRPlanName”);
Questa funzione assegna un valore al parametro / variabile LR. Richiede due attributi: il primo attributo è la sorgente (stringa C) e il secondo attributo è la destinazione (parametro / variabile LR).
Quindi questa funzione salva il valore della variabile C che abbiamo definito nel parametro LR 'LRPlanName'.
Ora possiamo sostituire 'LRPlanName' come qualsiasi altro parametro nella richiesta VuGen.
web_submit_data('MyPlan', 'Action= {pURL} ', 'Method= POST ', 'TargetFrame=', 'RecContentType= text/html ', 'Snapshot= t21.inf ', 'Mode= HTML ', ITEMDATA , 'Name= PlanId ', 'Value= 67213 ', ENDITEM , 'Name= PlanName ', 'Value= {LRPlanName} ', ENDITEM , 'Name= Age ', 'Value= 57 ', ENDITEM , 'Name= MaritalStaus ', 'Value= Married ', ENDITEM , LAST );
Nota che quando eseguiamo questo script, tutti i Vuser e tutte le iterazioni assumeranno lo stesso valore del nome del piano. Quindi, per rendere il nome del piano univoco per ogni esecuzione, possiamo fare qualcosa di simile.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Qui 'pVuserId' e 'pIteration' sono i parametri 'Vuser ID' e 'Iteration Number' (che abbiamo discusso nei tipi di parametro nei nostri tutorial precedenti). Questi vengono utilizzati nel nome del piano per garantire che abbiamo nomi univoci per ogni utente virtuale e iterazione.
Il 'Lr_eval_string' restituisce la stringa di input dopo aver valutato i parametri incorporati. Quindi, in questo caso, l'output di questa funzione sarà 'Il mio piano finanziario_1_1' per la prima prima iterazione di Vuser, 'Il mio piano finanziario_1_2' per la prima seconda iterazione di Vuser e così via.
E, naturalmente, sappiamo cosa 'Lr_save_string' la funzione fa.
Ora possiamo sostituire il parametro 'LRPlanName' come mostrato sopra.
Scenario 2:Come convertire una variabile load runner in un intero C.
Nell'ultimo tutorial, abbiamo visto un esempio per capire come si passa o falliamo manualmente una transazione a seconda di una condizione.
Esempio:
web_reg_find('Text= Welcome ','SaveCount= WelcomeCount ', LAST ); web_submit_data('login.pl', 'Action= http://127.0.0.1:1080/cgi-bin/login.pl ', 'Method= POST ', 'TargetFrame= body ', 'RecContentType= text/html ', 'Referer=http://127.0.0.1:1080/cgi-bin/nav.pl?in= home ', 'Snapshot= t2.inf ', 'Mode= HTML ', ITEMDATA , 'Name= userSession ', 'Value= {corUserSession} ', ENDITEM , 'Name= username ', 'Value= jojo ', ENDITEM , 'Name= password ', 'Value= bean ', ENDITEM , 'Name= JSFormSubmit ', 'Value= off ', ENDITEM , 'Name= login.x ', 'Value= 66 ', ENDITEM , 'Name= login.y ', 'Value= 12 ', ENDITEM , LAST ); if( atoi (lr_eval_string('{WelcomeCount}'))>0) { lr_end_transaction('Login', LR_PASS ); } else { lr_end_transaction('Login', LR_FAIL ); }
Abbiamo utilizzato 'if statement' qui con l'attributo 'SaveCount'. Il parametro 'WelcomeCount' che salva il numero di occorrenze del testo non può essere utilizzato direttamente nella condizione 'if' in quanto è una stringa del runner di caricamento. Quindi questo parametro deve essere convertito prima in una stringa C e poi in un intero C. 'Lr_eval_string' e 'Atoi' le funzioni sono usate (rispettivamente) per occuparsene.
Il 'Atoi' La funzione C converte una stringa C in un intero C.
Dopo questa conversione, questo può essere utilizzato come qualsiasi altro numero intero C.
Scenario 3:Come inviare un valore casuale in una richiesta
Molto spesso ci troviamo in scenari applicativi in cui dobbiamo selezionare un valore casuale (ad esempio da un menu a discesa). Come lo gestiamo negli script VuGen? Come ci assicuriamo che il valore casuale sia selezionato per ogni iterazione? Vediamolo in dettaglio.
Prendiamo l'esempio della nostra applicazione 'Web Tours'. Come abbiamo visto in precedenza, abbiamo una pagina 'Trova volo' in cui dobbiamo selezionare un volo.
Supponiamo di selezionare il primo nell'elenco. La richiesta corrispondente nello script è così (dove il valore corrispondente per il volo selezionato).
web_submit_data('reservations.pl_2', 'Action= http://127.0.0.1:1080/cgi-bin/reservations.pl ', 'Method= POST ', 'TargetFrame=', 'RecContentType= text/html ', 'Referer= http://127.0.0.1:1080/cgi-bin/reservations.pl ', 'Snapshot= t5.inf ', 'Mode= HTML ', ITEMDATA , 'Name= outboundFlight ', 'Value= 020 ;338;04/03/2018', ENDITEM , 'Name= numPassengers ', 'Value= 1 ', ENDITEM , 'Name= advanceDiscount ', 'Value= 0 ', ENDITEM , 'Name= seatType ', 'Value= Coach ', ENDITEM , 'Name= seatPref ', 'Value= None ', ENDITEM , 'Name= reserveFlights.x ', 'Value= 39 ', ENDITEM , 'Name= reserveFlights.y ', 'Value= 10 ', ENDITEM , LAST );
Dobbiamo prima acquisire i valori corrispondenti per tutti e quattro i voli da una delle risposte precedenti. Possiamo farlo utilizzando la funzione di correlazione (web_reg_save_param) con l'attributo 'ORD = ALL' prima della richiesta la cui risposta ha questi valori.
L'output di questo sarà come questo in cui il parametro correlato 'cFlight' ha un array di quattro valori corrispondenti ai quattro voli.
Il passaggio successivo consiste nel selezionare in modo casuale uno di questi valori e inviarlo nella richiesta. Questo può essere fatto usando 'Lr_paramarr_random' funzionare come mostrato di seguito.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
L'input per 'Lr_paramarr_random' funzione è un array di parametri e l'output è un valore casuale da questo array. Quindi qui l'output di questa funzione è uno dei quattro valori di volo. E poiché questo valore casuale è una stringa LR, viene utilizzata la funzione 'lr_eval_string' (per convertire lo stesso in una stringa C).
'Strcpy' La funzione C copia infine questo valore in una variabile di stringa C 'flightVal'.
Ora dobbiamo ancora convertire questa variabile C String in stringa LR per poter inviare la richiesta.
lr_save_string(flightVal,'randomFlight'); web_submit_data('reservations.pl_2', 'Action= http://127.0.0.1:1080/cgi-bin/reservations.pl ', 'Method= POST ', 'TargetFrame=', 'RecContentType= text/html ', 'Referer= http://127.0.0.1:1080/cgi-bin/reservations.pl ', 'Snapshot= t5.inf ', 'Mode= HTML ', ITEMDATA , 'Name= outboundFlight ', 'Value= {randomFlight} ', ENDITEM , 'Name= numPassengers ', 'Value= 1 ', ENDITEM , 'Name= advanceDiscount ', 'Value= 0 ', ENDITEM , 'Name= seatType ', 'Value= Coach ', ENDITEM , 'Name= seatPref ', 'Value= None ', ENDITEM , 'Name= reserveFlights.x ', 'Value= 39 ', ENDITEM , 'Name= reserveFlights.y ', 'Value= 10 ', ENDITEM , LAST );
Scenario 4:Come dividere una stringa in token
Supponiamo che ci sia uno scenario in cui dobbiamo dividere una stringa in pezzi / gettoni. Prendiamo l'esempio della nostra applicazione 'Web Tours' dal valore del volo 020 ; 338; 04/03/2018 dice che dobbiamo usare solo '338', quindi dobbiamo dividere questa stringa e memorizzarla in una variabile.
Per farlo 'Strtok' viene utilizzata la funzione.
'Strtok' La funzione C restituisce un token da una stringa delimitata da caratteri specificati. Dopo la prima chiamata, dobbiamo passare 'NULL' come valore della stringa per ottenere il token successivo. L'esempio seguente mostra come questa funzione viene utilizzata per dividere il valore di volo in base al delimitatore punto e virgola (;).
Esempio:
Supponiamo che il valore del volo venga catturato dalla risposta pertinente nel parametro 'cFlight'.
char string(100); char *token; int i=1; strcpy(string,lr_eval_string('{cFlight}')); token=(char *)strtok(string,';'); lr_output_message('Token %d is %s',i,token); while(token != NULL) { i=i+1; token=(char *)strtok(NULL,';'); lr_output_message('Token %d is %s',i,token); }
L'output di questo può essere visualizzato nel registro di riproduzione.
Possiamo copiare il token richiesto in un parametro e usarlo.
Scenario 5:Come leggere e scrivere dati in un file di testo
A volte potrebbe essere necessario leggere dati da un file esterno o scrivere dati su un file esterno. Vediamo come lo facciamo in uno script VuGen.
Vediamo prima come leggere i dati da un file di testo.
Esempio: Supponiamo di dover leggere un XML da un file di dati esterno e usarlo come richiesta nello script.
Per fare questo, usiamo 'Fread' Funzione C.
Questa funzione accetta quattro attributi:
buffer - Il buffer in cui memorizzare il flusso di dati.
taglia - La dimensione del buffer.
contare - Il numero di byte da leggere.
file_pointer - Il puntatore del file
Codice di esempio (con commenti) per lo stesso
char buffer(1000); //The buffer to store the read data stream char *filename = 'C:\Temp\mysamplefile.txt'; /* name and path of the file to be read from */ char * accessmode = 'r'; /* access mode r /r+ = open for reading , w /w+ = open for writing ,a /a+ = open for appending */ /* '+' sign indicates that the file must already exist */ long filepointer; /* declaring a file pointer */ int count=500; /* number of bytes to be read */ filepointer = fopen (filename, accessmode); /* open file in read mode */ fread (buffer,sizeof(char),count,filepointer); /* read from output file */ lr_save_string(buffer,'requestbody'); //we can use this as a LR parmeter and can use in the script now fclose (filepointer); //close the file pointer
Nota che nel codice mostrato sopra leggiamo 500 byte dal file di testo. Ovviamente, potremmo non conoscere sempre la dimensione del file. Quindi possiamo usare 'Fseek' e 'Ftell' Funzioni C (lo lascerò esplorare) per trovare la dimensione del file e utilizzare l'estensione 'contare' attributo del 'Fread' funzionare di conseguenza.
Ora vediamo come scrivere dati in un file di testo.
Esempio: Supponiamo di avere uno script che crea ordini e genera 'orderid'. Se vogliamo conoscere tutti gli ID ordine creati dal nostro script in un test, possiamo fare in modo che il nostro script copi questi ID ordine in un file di testo esterno.
'Fprintf' - La funzione C scrive l'output formattato in un file.
Questa funzione accetta questi attributi:
file_pointer - Il puntatore del file
format_string - La stringa formattata da scrivere nel file.
args - Uno o più argomenti di stampa opzionali.
Il codice di esempio è mostrato di seguito. Supponiamo di aver correlato e salvato 'orderid' nel parametro 'cOrderId'.
Esempio:
char *filename = 'C:\Temp\mysamplefile.txt'; /* name and path of the file to be created or edited */ char * accessmode = 'a+'; /* access mode r /r+ = open for reading , w /w+ = open for writing ,a /a+ = open for appending */ /* '+' sign indicates that the file must already exist */ long filepointer; /* declaring a file pointer */ filepointer = fopen (filename, accessmode); /* open file in append mode */ fprintf (filepointer, '%s
', lr_eval_string('{cOrderId}')); /* write orders id to output file */ fclose (filepointer); /* close the file pointer */
Spero che ora siamo bravi con i concetti di lettura o scrittura di dati su un file esterno (ovviamente potrebbero esserci altri modi per fare la stessa cosa rispetto a quanto discusso sopra). Sarebbe molto utile fare uno studio approfondito sulle operazioni sui file in C (puoi fare riferimento a qualsiasi buon tutorial o libro in C) poiché questi sono molto richiesti in molti scenari in tempo reale.
Scenario 6:Come gestire la correlazione quando i confini stanno cambiando
Nel tutorial sulle correlazioni, abbiamo utilizzato le funzioni di correlazione basate sui limiti per acquisire i valori dinamici dalla risposta. Ma cosa succede se abbiamo uno scenario in cui i confini stanno cambiando? Esistono diversi modi per gestire tali situazioni. Vediamoli in dettaglio.
a) Utilizzo dei flag 'IC', 'DIG' e 'ALNUM':
CIRCUITO INTEGRATO - Questo flag indica a VuGen di ignorare le maiuscole / minuscole nel confine Sinistra / Destra.
Esempio: Se il confine sinistro è a volte in maiuscolo e talvolta in minuscolo, usiamo questo flag.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
VOI - Questo flag indica a VuGen di considerare ogni singolo numero in cui viene utilizzato il carattere jolly '#' nel confine sinistro / destro.
test delle prestazioni intervista domande per esperti
Esempio: Se il limite sinistro (o il limite destro) cambia in questo modo (solo un numero in una particolare posizione).
GJHi3rty
1GJHi8rty
GJHi7rty
Possiamo utilizzare il flag 'DIG' come mostrato di seguito poiché ciò si occuperà della modifica del numero.
LB / DIG = GJHi # rty
ontano - Questo flag indica a VuGen di considerare ogni singolo carattere alfanumerico in cui viene utilizzato il carattere jolly '^' nel confine sinistro / destro.
Esempio: Se il limite sinistro (o il limite destro) cambia in questo modo (solo un carattere alfanumerico in una posizione particolare).
GJHi3rty
GJHiKrty
GJHitrty
Possiamo utilizzare il flag 'ALNUM' come mostrato di seguito in quanto ciò si occuperà della modifica del carattere alfanumerico
LB / ALNUM = GJHi ^ rty
Inoltre, possiamo utilizzare due flag insieme, come 'ALNUMIC' che è sia 'ALNUM' che 'IC'.
b) Utilizzo degli attributi 'SaveLen' e 'SaveOffset':
Possiamo usare questi due attributi di 'Web_reg_save_param' funzione in modo appropriato per immettere solo la parte statica dei limiti sinistro / destro.
c) Utilizzo di espressioni regolari:
Possiamo usare 'Web_reg_save_param_regexp' funzione di correlazione per salvare il valore dinamico (in un parametro) che corrisponde a un'espressione regolare.
Esempio: Supponiamo che il valore dinamico che vogliamo acquisire sia '3959339' dal testo specificato,
PriceControl_ctl01 'Name = jack', 'Refid = 3959339' saldo
Non possiamo utilizzare la funzione di correlazione basata sul limite qui perché il valore e la lunghezza del campo come 'Nome' sopra possono cambiare (e quindi non possiamo usarlo nel confine sinistro o destro).
Possiamo usare il file 'Web_reg_save_param_regexp' funzione di correlazione come mostrato di seguito per risolvere questo problema.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
I gruppi di espressioni regolari vengono messi tra parentesi e l'attributo 'Group' decide quale gruppo considerare per salvare la corrispondenza corrispondente al parametro specificato (nel primo attributo).
Di seguito sono riportate alcune corrispondenze di espressioni regolari:
d - corrisponde a una singola cifra
w - corrisponde a una singola parola
(A-Z) + - trova qualsiasi parola in maiuscolo
(a-z) + - trova qualsiasi parola in minuscolo
(0-9) + - corrisponde a qualsiasi valore numerico
Scenario 7:Come scrivere e utilizzare una funzione in uno script VuGen
Come in qualsiasi altro linguaggio di programmazione, possiamo scrivere / definire una funzione manualmente (solitamente chiamata funzione definita dall'utente) e utilizzarla ovunque nello script VuGen.
Supponiamo di dover inviare un nome di piano univoco in ogni richiesta di un particolare script. Quindi, invece di scrivere più volte il codice richiesto (che genera un nome univoco), possiamo definire una funzione (che genera un nome univoco) e chiamare ogni volta (e ovunque) sia richiesto nello script VuGen.
Sebbene la funzione in uno script VuGen possa essere scritta all'interno di qualsiasi azione, generalmente è scritta all'interno del file 'Globals.h' file (nella sezione Extra Files dello script VuGen) o all'interno di un file appena creato (sotto la stessa sezione 'Extra Files'). Una volta scritta, la funzione può essere chiamata da qualsiasi azione.
L'immagine sotto mostra una funzione definita dall'utente 'MyFunction' scritta all'interno del file 'globals.h'.
Come discusso sopra, l'altro modo è creare un nuovo file e scrivere la funzione al suo interno.
L'unica cosa da ricordare quando si crea un nuovo file è che dobbiamo includerlo nel file 'globals.h' (senza il quale VuGen non riconoscerà questo file).
Conclusione
Pertanto, in questo tutorial, abbiamo visto come gestire alcune sfide in tempo reale nello scripting VuGen e ovviamente ci saremmo imbattuti in molti altri scenari quando lavoriamo su varie applicazioni.
Inoltre, ti saresti reso conto che le funzioni stringa C e le operazioni sui file C sono molto richieste (e utili) nella gestione di vari scenari. Tuttavia, ti consiglierei di dedicare un po 'di tempo a padroneggiarli.
Nel nostro prossimo tutorial, vedremo e capiremo alcune importanti funzioni predefinite che vengono utilizzate negli script VuGen (abbiamo già visto alcune delle funzioni).
=> Visita qui per una serie completa di tutorial su LoadRunner
Tutorial PREV | PROSSIMO Tutorial
Lettura consigliata
- Test delle prestazioni dei servizi Web mediante LoadRunner VuGen Scripting
- Scripting shell Unix avanzato: array, operatori di test di file e stringhe, variabili speciali
- Test di carico con HP LoadRunner Tutorial
- Opzioni di registrazione VUGen in LoadRunner
- Come configurare i file di script LoadRunner VuGen e le impostazioni di runtime
- Funzioni importanti di LoadRunner utilizzate negli script VuGen con esempi
- Introduzione a Micro Focus LoadRunner - Test di carico con LoadRunner Tutorial n. 1
- Scripting di JMeter BeanShell, parte 2