loadrunner vugen scripting challenges
Introdução aos desafios envolvidos no script LoadRunner VuGen:
Nisso Informativo LoadRunner Training Series , nós exploramos sobre Aprimoramentos de script VuGen em nosso tutorial anterior. De nossos tutoriais anteriores até agora, fizemos um grande progresso com o VuGen.
Aprendemos como gravar um script no protocolo Web HTTP / HTML, como cuidar de dados / valores com correlação e parametrização, como garantir se a resposta está correta com checkpoints, como inserir transações que medem taxa e tempo de resposta do usuário ações e outras coisas.
Com eles, devemos ser capazes de criar scripts com sucesso para quase todos os aplicativos da web.
=> Clique aqui para uma série completa de tutoriais do LoadRunner
Linguagem LR
Pode haver situações em que precisamos realizar tarefas mais desafiadoras em um script VuGen. Neste tutorial, discutiremos alguns dos desafios de script junto com as técnicas disponíveis para lidar com eles.
Antes de discutir isso, vamos entender algumas coisas. VuGen (ou Load Runner) só pode entender sua própria linguagem (vamos chamá-la de linguagem LR, LR sendo a forma abreviada de Load Runner). Portanto, qualquer script que ele gerar pode ser considerado em linguagem LR. Na linguagem LR, há apenas um tipo de dados - String (e mais precisamente 'String LR').
Agora, para fazer melhorias em um script VuGen, geralmente usamos a linguagem C.
Sabemos que na linguagem C existem muitos tipos de dados como int, char, float, long etc. Se definirmos e usarmos diretamente os valores C em uma solicitação, o VuGen não entenderá (pois só entende 'strings LR') e lançará um erro. Portanto, temos que converter qualquer valor C (de qualquer tipo de dados) em 'string LR' antes de usá-lo em uma solicitação.
Tendo entendido isso, vamos para alguns cenários desafiadores em tempo real.
Cenário 1:Como usar uma string C em uma solicitação VuGen
Vamos supor que em um script VuGen temos uma solicitação que tem um campo chamado ‘PlanName’ (suponha que este script seja para algum aplicativo de planejamento financeiro). Durante a gravação, inserimos o valor como ‘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 );
Digamos que queremos usar uma string definida pelo usuário como o nome do plano.
Então, temos que declarar e definir uma string como mostrado abaixo
char sPlanName() = ' MyFinancialPlan ';
O ‘sPlanName’ é uma string C e, portanto, precisamos convertê-lo em uma string LR (para usá-lo na solicitação).
Fazemos isso usando a função ‘lr_save_string’ conforme mostrado abaixo:
lr_save_string(sPlanName,”LRPlanName”);
Esta função atribui um valor ao parâmetro / variável LR. Leva dois atributos - O primeiro atributo é a origem (C String) e o segundo atributo é o destino (parâmetro / variável LR).
Portanto, esta função salva o valor da variável C que definimos no parâmetro LR ‘LRPlanName’.
Agora podemos substituir o ‘LRPlanName’ como qualquer outro parâmetro na solicitação 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 );
Observe que quando executamos esse script, todos os Vusers e todas as iterações terão o mesmo valor que o nome do plano. Portanto, para tornar o nome do plano exclusivo para cada execução, podemos fazer algo assim.
char sPlanName() = ' MyFinancialPlan _{pVuserId}_{pIteration}'; lr_save_string( lr_eval_string(sPlanName),'LRPlanName' );
Aqui, ‘pVuserId’ e ‘pIteration’ são os parâmetros ‘Vuser ID’ e ‘Iteration Number’ (que discutimos em tipos de parâmetro em nossos tutoriais anteriores). Eles são usados no nome do plano para garantir que tenhamos nomes exclusivos para cada usuário V e iteração.
O ‘Lr_eval_string’ função retorna a string de entrada após avaliar quaisquer parâmetros incorporados. Portanto, neste caso, a saída desta função será ‘MyFinancialPlan_1_1’ para a primeira iteração do usuário V, ‘MyFinancialPlan_1_2’ para a segunda iteração do primeiro usuário V e assim por diante.
E claro, sabemos o que ‘Lr_save_string’ função faz.
Agora podemos substituir o parâmetro ‘LRPlanName’ conforme mostrado acima.
Cenário 2:Como converter uma variável de execução de carga em C inteiro
No último tutorial, vimos um exemplo para entender como aprovamos ou reprovamos manualmente uma transação dependendo de uma condição.
Exemplo:
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 ); }
Usamos ‘if statement’ aqui com o atributo ‘SaveCount’. O parâmetro ‘WelcomeCount’ que salva o número de ocorrências do texto não pode ser usado diretamente na condição ‘if’, pois é uma string de execução de carga. Portanto, este parâmetro deve ser convertido em string C primeiro e depois em C inteiro. ‘Lr_eval_string’ e ‘Atoi’ funções são usadas (respectivamente) para cuidar disso.
O ‘Atoi’ A função C converte uma string C em um C inteiro.
Após essa conversão, ele pode ser usado como qualquer outro C inteiro.
Cenário 3:Como enviar um valor aleatório em uma solicitação
Freqüentemente, encontramos cenários de aplicação em que temos que selecionar um valor aleatório (digamos de um menu suspenso). Como lidamos com isso em scripts VuGen? Como podemos garantir que um valor aleatório seja selecionado para cada iteração? Vamos ver isso em detalhes.
Tomemos o exemplo de nosso aplicativo ‘Web Tours’. Como vimos antes, temos uma página ‘Encontrar voo’ onde temos que selecionar um voo.
Digamos que selecionemos o primeiro da lista. A solicitação correspondente no script é assim (onde o valor correspondente para o vôo selecionado).
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 );
Temos que primeiro capturar os valores correspondentes para todos os quatro voos de uma das respostas anteriores. Podemos fazer isso usando a função de correlação (web_reg_save_param) com o atributo ‘ORD = ALL’ antes da solicitação cuja resposta tem esses valores.
A saída disso será assim, onde o parâmetro correlacionado 'cFlight' tem uma matriz de quatro valores correspondentes aos quatro voos.
A próxima etapa seria selecionar aleatoriamente um desses valores e enviar na solicitação. Isso pode ser feito usando ‘Lr_paramarr_random’ função conforme mostrado abaixo.
strcpy (flightVal,lr_eval_string(lr_paramarr_random('cFlight')));
A entrada para ‘Lr_paramarr_random’ function é uma matriz de parâmetro e a saída é um valor aleatório dessa matriz. Portanto, aqui a saída desta função é um dos quatro valores de voo. E como este valor aleatório é uma string LR, a função ‘lr_eval_string’ é usada (para converter o mesmo em string C).
'Strcpy' A função C finalmente copia este valor em uma variável de string C 'flightVal'.
Agora, novamente, temos que converter essa variável C String em uma string LR para poder enviar a solicitação.
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 );
Cenário 4:Como dividir uma string em tokens
Digamos que haja um cenário em que tenhamos que dividir uma string em pedaços / fichas. Vamos pegar o exemplo de nosso aplicativo ‘Web Tours’, de onde o valor do voo 020 ; 338; 04/03/2018 dizem que temos que usar apenas '338', então precisamos dividir essa string e armazená-la em uma variável.
Para fazer isso 'Strtok' função é usada.
'Strtok' A função C retorna um token de uma string delimitada por caracteres especificados. Após a primeira invocação, temos que passar ‘NULL’ como o valor da string para obter o próximo token. O exemplo abaixo mostra como essa função é usada para dividir o valor do voo com base no delimitador de ponto e vírgula (;).
Exemplo:
Vamos supor que o valor do voo seja capturado da resposta relevante para o parâmetro '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); }
A saída disso pode ser vista no log de reprodução.
Podemos copiar o token necessário em um parâmetro e usá-lo.
Cenário 5:Como ler e gravar dados em um arquivo de texto
Às vezes, pode ser necessário ler dados de um arquivo externo ou gravar dados em um arquivo externo. Vamos ver como fazemos isso em um script VuGen.
Vamos primeiro ver como ler dados de um arquivo de texto.
Exemplo: Digamos que tenhamos que ler um XML de um arquivo de dados externo e usá-lo como uma solicitação no script.
Para fazer isso, usamos ‘Fread’ Função C.
Esta função tem quatro atributos:
amortecedor - O buffer no qual armazenar o fluxo de dados.
Tamanho - O tamanho do buffer.
contar - O número de bytes a ler.
file_pointer - O ponteiro do arquivo
Código de exemplo (com comentários) para o mesmo
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
Observe que no código mostrado acima, lemos 500 bytes do arquivo de texto. Obviamente, podemos não saber o tamanho do arquivo sempre. Então podemos usar ‘Fseek’ e ‘Ftell’ Funções C (vou deixar isso para você explorar) para encontrar o tamanho do arquivo e usar o 'contar' atributo do ‘Fread’ funcionar em conformidade.
Agora vamos ver como gravar dados em um arquivo de texto.
Exemplo: Digamos que temos um script que cria pedidos e gera ‘orderid’. Se quisermos saber todos os ids de pedidos criados por nosso script em um teste, podemos fazer nosso script copiar esses ids de pedidos para um arquivo de texto externo.
‘Fprintf’ - A função C grava a saída formatada em um arquivo.
Esta função assume estes atributos:
file_pointer - O ponteiro do arquivo
format_string - A string formatada para gravar no arquivo.
args - Um ou mais argumentos opcionais de impressão.
O código de exemplo é mostrado abaixo. Vamos supor que correlacionamos e salvamos ‘orderid’ no parâmetro ‘cOrderId’.
Exemplo:
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 */
Espero que agora estejamos bons com os conceitos de leitura de dados ou gravação de dados em um arquivo externo (é claro que podem haver outras maneiras de fazer a mesma coisa além do que discutimos acima). Seria muito útil fazer um estudo completo sobre as operações de arquivo em C (você pode consultar qualquer bom tutorial ou livro em C), pois eles são muito necessários em muitos cenários de tempo real.
Cenário 6:Como lidar com a correlação quando os limites estão mudando
No tutorial de Correlações, usamos funções de correlação baseadas em limite para capturar os valores dinâmicos da resposta. Mas, e se tivermos um cenário em que os limites estão mudando? Existem várias maneiras de lidar com essas situações. Vamos ver isso em detalhes.
a) Usando os sinalizadores ‘IC’, ‘DIG’ e ‘ALNUM’:
IC - Este sinalizador instrui o VuGen a ignorar maiúsculas e minúsculas no limite esquerdo / direito.
Exemplo: Se o Limite esquerdo às vezes estiver em maiúsculas e às vezes em minúsculas, usamos este sinalizador.
web_reg_save_param ('corUserSession','LB/IC= name='userSession' value='','RB='/>', LAST);
VOCÊS - Este sinalizador instrui VuGen a considerar qualquer número único onde o caractere curinga '#' é usado no limite Esquerdo / Direito.
como visualizar arquivos bin no android
Exemplo: Se o limite esquerdo (ou o limite direito) está mudando assim (apenas um número em uma posição particular).
GJHi3rty
1GJHi8rty
GJHi7rty
Podemos usar o sinalizador ‘DIG’ conforme mostrado abaixo, pois isso cuidará da alteração do número.
LB / DIG = GJHi # rty
amieiro - Este sinalizador instrui o VuGen a considerar qualquer caractere alfanumérico único onde o caractere curinga '^' é usado no limite Esquerdo / Direito.
Exemplo: Se o limite esquerdo (ou o limite direito) está mudando assim (apenas um caractere alfanumérico em uma determinada posição).
GJHi3rty
GJHiKrty
GJHitrty
Podemos usar a sinalização ‘ALNUM’ conforme mostrado abaixo, pois isso cuidará da alteração do caractere alfanumérico
LB / ALNUM = GJHi ^ rty
Além disso, podemos usar dois sinalizadores juntos - como ‘ALNUMIC’ que é ‘ALNUM’ e ‘IC’.
b) Usando os atributos ‘SaveLen’ e ‘SaveOffset’:
Podemos usar esses dois atributos do ‘Web_reg_save_param’ função apropriadamente para inserir apenas a parte estática dos limites Esquerdo / Direito.
c) Usando expressões regulares:
Podemos usar ‘Web_reg_save_param_regexp’ função de correlação para salvar o valor dinâmico (em um parâmetro) que corresponde a uma expressão regular.
Exemplo: Digamos que o valor dinâmico que queremos capturar seja ‘3959339’ do texto fornecido,
PriceControl_ctl01 “Nome = jack”, “Refid = 3959339” saldo
Não podemos usar a função de correlação baseada em limite aqui porque o valor e o comprimento do campo como ‘Nome’ acima podem mudar (e então não podemos usá-lo no limite esquerdo ou direito).
Podemos usar o ‘Web_reg_save_param_regexp’ função de correlação como mostrado abaixo para cuidar deste problema.
web_reg_save_param_regexp('ParamName=corName', 'RegExp= PriceControl_ctl01 'Name=((a-z)+)', 'Refid=((0-9)+)' balance', 'Group=1','Ordinal=All', LAST);
Os grupos de expressão regular são colocados entre parênteses e o atributo 'Grupo' decide qual grupo considerar para salvar a correspondência correspondente ao parâmetro especificado (no primeiro atributo).
Algumas correspondências de expressões regulares são mostradas abaixo:
d - corresponde a um único dígito
w - corresponde a uma única palavra
(A-Z) + - corresponde a qualquer palavra em maiúsculas
(a-z) + - corresponde a qualquer palavra em minúsculas
(0-9) + - corresponde a qualquer valor numérico
Cenário 7:Como escrever e usar uma função em um script VuGen
Como em qualquer outra linguagem de programação, podemos escrever / definir uma função manualmente (geralmente chamada de função definida pelo usuário) e usá-la em qualquer lugar no script VuGen.
Vamos supor que temos que enviar um nome de plano exclusivo em cada solicitação de um script específico. Portanto, em vez de escrever o código necessário (que gera um nome exclusivo) várias vezes, podemos definir uma função (que gera um nome exclusivo) e chamá-la sempre que (e onde quer que) seja necessária no script VuGen.
Embora a função em um script VuGen possa ser escrita dentro de qualquer ação, geralmente é escrita dentro do ‘Globals.h’ (na seção Arquivos extras do script VuGen) ou dentro de um arquivo recém-criado (na mesma seção 'Arquivos extras'). Depois de escrita, a função pode ser chamada de qualquer Ação (ões).
A imagem abaixo mostra uma função definida pelo usuário ‘MyFunction’ escrita dentro do arquivo ‘globals.h’.
Conforme discutido acima, a outra maneira é criar um novo arquivo e escrever a função dentro dele.
A única coisa a lembrar ao criar um novo arquivo é que temos que incluí-lo no arquivo ‘globals.h’ (sem o qual o VuGen não reconhecerá este arquivo).
Conclusão
Portanto, neste tutorial, vimos como lidar com alguns desafios em tempo real no script VuGen e, obviamente, encontraríamos muitos outros cenários quando trabalhamos em vários aplicativos.
Além disso, você deve ter percebido que as funções de string C e as operações de arquivo C são muito necessárias (e úteis) para lidar com vários cenários. No entanto, eu recomendo que você passe algum tempo aprendendo isso.
Em nosso próximo tutorial, veremos e entenderemos algumas funções predefinidas importantes que são usadas em scripts VuGen (já vimos algumas das funções).
=> Visite aqui para obter uma série completa de tutoriais do LoadRunner
PREV Tutorial | PRÓXIMO Tutorial
Leitura recomendada
- Teste de desempenho de serviços da Web usando script LoadRunner VuGen
- Scripting Unix Shell avançado: matrizes, operadores de teste de arquivo e string, variáveis especiais
- Teste de carga com tutoriais HP LoadRunner
- Opções de gravação VUGen no LoadRunner
- Como configurar arquivos de script e configurações de tempo de execução do LoadRunner VuGen
- Funções importantes do LoadRunner usadas em scripts VuGen com exemplos
- Introdução ao Micro Focus LoadRunner - Teste de carga com LoadRunner Tutorial # 1
- JMeter BeanShell Scripting - Parte 2