sexta-feira, 15 de junho de 2012

QTP Tips: Repositório de Objetos Global x Local

Para as pessoas da área de testes que usam o QTP (QuickTest Professional) como ferramenta para a criação de testes automatizados, certamente esta é uma questão recorrente, em especial quando se está iniciando um novo projeto ou um suite de regressão para uma aplicação existente.
Afinal, o que é melhor? Utilizar um repositório de objetos global, onde todos os scripts vão compartilhar os mesmos objetos ou deixar um repositório sendo utilizado localmente, para cada script criado?

O uso de um repositório local pode parecer mais fácil, especialmente se você estiver desenvolvendo seu script através da função Record/Playback. Você clica no botão de gravar, segue os passos definidos na aplicação e, ao final, todos os objetos com os quais você interagiu estarão gravados no repositório daquele script. Grosso modo, bastaria clicar no play para que o QTP executasse automaticamente as mesmas ações gravadas previamente. Sua única preocupação seria ajeitar o código VBScript gerado, parametrizar algumas entradas e pronto: utilizar o script sempre que precisar.

Conheço muita gente que utiliza a ferramenta dessa forma. Mas, a meu ver, há dois problemas com esse tipo de abordagem que podem aparecer individualmente ou simultaneamente, dependendo de como estiver o seu projeto:

1 - Manutenção: a menos que exista apenas um script interagindo naquela aplicação, haverá um grande trabalho com a manutenção dos objetos. E é bem fácil entender por que: à medida que o suite vai crescendo e dezenas de scripts passam pelas mesmas telas, qualquer mudança em um objeto em comum ou nas suas propriedades significa cada um dessas dezenas de scripts terá de ser acessado para que sejam feitas as mudanças necessárias nos seus repositórios de objetos locais. Especialmente em aplicações web, é comum os desenvolvedores alterarem características de objetos em uma página ou formulário. Imagine que uma dropdown utilizada em todos os seus scripts tenha mudado alguma propriedade usada na verificação? O QTP não vai reconhecer o novo objeto durante a execução a menos que este seja capturado de novo. E essa alteração teria de ser feita em todos os scripts, pois o objeto foi gravado uma vez em cada um deles. Isso certamente demandaria algumas horas de trabalho. Utilizar programmatic descriptions também não resolve, pois, embora essa técnica não precise de objetos físicos gravados no repositório, ela requer que as propriedades dos objetos que foram escolhidas para a validação não mudem. Se a página mudar, você não precisa alterar nos repositórios, mas terá de alterar o código VBScript de cada teste. Ou seja, dá na mesma, praticamente.

2 - Um repositório local pode jogar contra a organização do processo: com os mesmos objetos repetidos em vários lugares, fica difícil ter uma ideia do tamanho do repositório, da quantidade de objetos manipulados até de se estabelecer um padrão de nomenclatura ou classificação, por exemplo. Isso fica ainda mais difícil quando há várias pessoas envolvidas na criação dos scripts, pois elas podem seguir padrões distintos. E mesmo que um sistema de nomenclatura ou classificação exista e seja seguido por todos, ainda assim não se terá a visualização nem as características globais de todos os objetos. Também pode acontecer de as pessoas terem capturado objetos diferentes entre os scripts para uma mesma página da aplicação, pois cada uma delas interagiu com aquela tela de forma diferente.



Particularmente, considero que a abordagem de se ter um repositório global, compartilhado por todos os scripts, seja mais adequada. Ela tem algumas limitações, mas me parece melhor do que manter um repositório para cada script, desde que bem feita. Algumas coisas que eu pude notar com o tempo e que podem ajudar bastante:

Defina alguns padrões mínimos antes de tudo: É muito importante, antes de começar qualquer script ou capturar os objetos, estabelecer os padrões a serem utilizados. Há muitas formas de criar padrões e muitas opções de critérios. Eu diria que, no mínimo, deva-se considerar:

·      Local de armazenamento: A partir da versão 10, o Quality Center introduziu uma aba chamada “Test Resources”, onde podem ser criados e armazenados, por exemplo, bibliotecas de funções, recovery scenarios e repositórios de objetos. Você pode estabelecer uma estrutura de pastas internas e armazenas esses dados ali, diretamente no servidor. O QTP pode ser integrado ao Quality Center e aproveitar a mesma estrutura;

·      Padrões de nomenclatura dos objetos: os objetos ficam ordenados no repositório primeiramente por tipo. Portanto, todos os objetos de mesmo tipo ficarão agrupados um abaixo do outro ao se visualizar o repositório. Nem sempre os desenvolvedores se preocupam com algum sistema para nomear ou classificar os objetos ou então não há no projeto algo que considere isso. Vê-se de tudo nesses ambientes! Então, ter um padrão de nomenclatura facilita a identificação e utilização. Renomeie os objetos capturados para um padrão estabelecido, de preferência por tipo. Você pode até aproveitar o nome original, mas ponha um prefixo que identifique o seu tipo, ao menos. Por exemplo, use “img“ para imagens, “dpw” para dropdowns, “edt” para editboxes, etc. No caso de sistemas web, não se esqueça de estabelecer um padrão para nomear cada página armazenada também, pois elas serão como diretórios que conterão os demais objetos.


Capture todos os objetos antes de iniciar a criação dos scripts: Essa é uma parte importante do processo que vai gastar um tempo considerável no começo, mas que certamente irá economizar muito mais tempo lá na frente. Definidos local de armazenamento e padrões de nomenclatura, acesse a aplicação e utilize o QTP para capturar e renomear todos os objetos possíveis, não apenas aqueles que você acredita que irá precisar. Só depois que o repositório estiver com todos os objetos capturados, associe o script a ele. Assim, ao gravar os passos pelo QTP, a ferramenta já vai identificar e reconhecer os objetos do repositório (sem ficar adicionando-os como se fossem novos) e irá colocá-los no código VBScript automaticamente e da forma como você os definiu. Isso é muito útil especialmente em aplicações web, que possuem diversas páginas e as usam para separar os objetos. Uma vez feito isso, você só precisará adicionar novos objetos quando e se a aplicação mudar, o que é uma manutenção razoavelmente pequena.

Mantenha os objetos do tipo checkpoint localmente. Diferentemente dos demais tipos de objetos, os checkpoints só dizem respeito ao script que estão validando e, portanto, não faz sentido enviá-los para o repositório global. E, no caso de ser usado o controle de versão (QTP 10 ou superior), você não precisa ficar fazendo check-out/check-in do servidor cada vez que precisar atualizá-los. Basta abrir o objeto e alterar manualmente ou rodar o script em update mode, para que os novos valores sejam atualizados. Resumindo: ao final, haverá um repositório com todos os objetos interativos vindos do servidor (repositório global) e apenas os checkpoints do script corrente como objetos locais.



Como nem tudo é perfeito, e sempre algo pode sair diferente do que se espera, há algumas observações que considero importantes serem feitas para o bom funcionamento dessas dicas:

1 – Até a versão 9.2, quando ainda era uma ferramenta da Mercury, o QTP não mostrava os objetos tipo checkpoint no repositório. Você só conseguia editá-los se fosse direto ao código, clicasse com o botão direito em cima do nome do checkpoint e selecionasse a opção “checkpoint properties”. Se por acaso o seu checkpoint estivesse escrito em forma de variável parametrizada (utilizando-se a referência da data table em vez do nome), você simplesmente não teria como acessá-lo. A partir da versão 9.5 (já como produto da Hewlett-Packard), os checkpoints passaram a ser tratados como qualquer outro objeto, estando disponíveis no repositório, visualmente. Dessa forma, ficou muito mais fácil editá-los ou renomeá-los, bastando um click em cima deles para isso. Portanto, a utilização de alguns padrões mencionados antes pode depender muito da versão do QTP que você está utilizando.

2 – Uma coisa que notei é que a migração de versões pode causar certa incompatibilidade ao converter os repositórios de objetos. Uma vez migramos da versão 9.2 direto para a versão 10 (sem passar pela 9.5). Acontece que os repositórios criados na versão 9.2 não eram prontamente reconhecidos pela versão 10. Ao tentar gravar um script em uma página cujos objetos já estavam no repositório, o esperado era que o código VBScript utilizasse esses objetos. Mas o QTP sempre os adicionava localmente, como se fossem novos. Em alguns casos, o simples fato de editar o repositório e excluir e incluir um objeto novamente já fazia o QTP reconhecer normalmente os demais. Mas houve casos em que isso não funcionou. Daí o jeito foi gravar o código e editar manualmente cada objeto não reconhecido. É uma grande mão-de-obra, mas é necessário. Da versão 10 para a 11 isso não aconteceu mais.


3 – A versão 10 apresenta um bug no gerenciamento de alterações nos objetos locais de diferentes actions, quando feitas diretamente pela janela do repositório. Se você possui um script com mais de uma action e abre o repositório de objetos, notará que há uma dropdown onde é possível escolher a action cujos objetos devem ser mostrados. Suponha que o script esteja aberto na Action1. Abre-se a janela do repositório e, como padrão, a Action1, que estava sendo utilizada, aparece com seus objetos. Se por acaso a Action2 for selecionada na dropdown, for feita qualquer mudança em um checkpoint, por exemplo, e acionado o botão de salvar, essa alteração não fica gravada. Só funciona se for alterada a mesma action que estava sendo usada na tela do script. Se você quiser alterar alguma coisa nos objetos da Action2, deve fechar o repositório, voltar para a tela principal do script, selecionar a Action2 e só então abrir o repositório e alterar os objetos dela. O pior é que, no meu caso, só descobri isso depois de alterar dezenas de checkpoints. Por isso, preste atenção nesse detalhe se estiver usando a versão 10. A partir da 11 isso não acontece mais.



Essas dicas são oriundas da minha experiência com a ferramenta, espero que sejam úteis de alguma forma para quem trabalha com ela e que resolva algumas dúvidas que vocês tenham. São sugestões apenas, mas funcionaram bem no meu caso e creio que podem ser úteis para outras pessoas. Prometo que tentarei colocar mais algumas dicas aqui no blog referente à utilização do QTP como ferramenta de automação de testes. Fiquem ligados!



0 comentários:

Postar um comentário