Dúvida com Selenium

Olá pessoal, tudo bem?

Sou novo por aqui, e novo também no mundo dos testes com Selenium.

Nos meus testes de aceitação com o Selenium Webdriver, estou utilizando o padrão de PageObjects, e já consegui desenvolver alguns testes básicos de login na nossa aplicação aqui na empresa.

Uma dúvida que estamos tendo é como popular dados antes de realizar o teste. Por exemplo, ao efetuar o login setamos um usuário válido no código e sempre vai ser verificado esse usuário nos testes. Mas digamos que futuramente aquele usuário não seja mais válido, vai começar a quebrar os testes. Qual seria a melhor forma de trazer isso do banco de dados, ou até mesmo inserir antes de iniciar os testes?

Agradeço se puderem me ajudar!

Olá Willian blz?

Particularmente, eu crio meus pré-requisitos para execução dos testes antes de iniciar os testes.

Olá, aqui estamos migrando para utilização de dados pré cadastrados.
No início, utilizávamos a abordagem de primeiro cadastrar (utilizando o próprio sistema) e depois realizar os testes.

Porém isso começou a nos trazer alguns problemas, por exemplo, nossos testes mais importantes dependem de que muitos outros dados estejam previamente cadastrados, então para eu realizar o teste que realmente era relevante para mim, precisava cadastrar mais uns 5 ou 6 dados em diferentes telas. O problema disso é que se alguma dessas telas anteriores tivessem com erro o teste que eu realmente queria testar acabava falhando, por eu não ter o dado que eu precisava.

Agora nós estamos utilizando o docker para nos ajudar. Pessoal de devop’s criaram uma estrutura onde cada dev tem um base local onde sempre que eu for executar os testes eu volto a base para seu estado inicial.
Tenho a opção de criar os dados em uma base no servidor (como se fosse o master) e mandar replicar para todas as bases local dos dev’s.

A vantagem foi não se preocupar com a inserção de dados e nem com a exclusão.
Agora tenho vários cadastros pré definidos que eu faço a utilização deles para os meus testes.

Abraços

Olá Will,

Gostaria de informar que nos meus testes quando aplicava, era semelhante ao do Cássio. Começava cadastrando e depois utilizando o registro cadastrado. Porém como o próprio Cássio informou futuramente pode ter problemas para testar algo que é mais critico ou que realmente interessa e ter que percorrer um caminho mais longo para isso. É valida a alternativa que ele postou para pesquisar e conhecer melhor.

@Douglas-Machado-Baptista

Bom, gostaria de saber se agora podes me ajudar. Se teria como trazer (doar) aqueles docinhos da sensação gourmet, sempre participo das promoções mas nunca ganho, sempre indico e quando tem algum evento já aviso para levar a opção de compartilhar no  evento… Então fica a dica ae, sempre muito bem vinda a sugestão!!! :blush:

Hãm…o que esse trecho da tua resposta tem a ver com a conversa?

@Maycon obrigado por responder… mas fiquei na dúvida quanto a forma que você cria esses pré-requisitos.

@cassio
Obrigado pela dica!
Inicialmente estou fazendo da forma que você citou que usavam, efetuando cada teste um cenário que vai criar, editar, remover, listar os dados na página, de forma que eu tenha os dados sempre válidos.
Mas tem casos que vai ser complicado mesmo, criar todos os registros antes, via aplicação.
Quanto a outra alternativa, vou estudar melhor junto ao setor de infraestrutura da equipe. Atualmente temos algumas bases para desenvolvimento e homologação, porém são de uso comum entre todos os devs, auditores, homologadores, etc. Talvez a criação de bases individuais seria uma boa mesmo.
Um tempo atrás eu vi um colega dizendo que eles usavam serviços REST, criados especificamente para a criação e remoção dos dados necessários, e chamavam esses serviços antes da execução dos testes. É uma boa prática fazer dessa forma?

@Willian-Silvano-Maria
Aqui na empresa também utilizamos base de dados comum a todos os dev’s, por isso que resolvemos criar uma base de testes automatizados específica para os testes, e sempre retornar ao estado inicial dela antes de executar um teste no localhost.
Antes de tentar a implementação do docker, caso não seja possível utilizá-lo agora, recomendo a leitura dos posts abaixo.

Leia também as discussões dos posts, para complementar o compreendimento

Abraços.

http://www.aniche.com.br/2013/04/dependencia-de-cenarios-em-testes-de-sistema/

http://eliasnogueira.com/parametrizacao-de-dados-para-automacao-de-teste-introducao/

Boa Tarde.

Com relação a utilização de banco de dados eu já tive experiência em utilizar junto com os desenvolvedores um banco global e um banco separado local ou remoto. Ambos tem pontos positivos e negativos. Você tem que ver o que é mais fácil e rápido aí para você. No meu caso o banco local foi melhor.

Com relação a massa de dados inicial para os testes eu utilizo a criação de scripts que executo antes de rodar os testes. A execução destes scripts pode ser via sql mesmo ou dentro do próprio código utilizando selenium. Eu prefiro via SQL. Após inserir o necessário para os testes rodo os testes para verificar se tudo está funcionando como deveria.

Só uma atenção para seus testes. Não sei se é o caso, mas já passei por isso e ví que estava testando errado. Cheguei ao ponto de uma vez precisar inserir tanta informação em várias telas diferentes que ficou inviável testar e criar as informações no banco ou por scripts. De repente você esta deixando o seu código muito dependente. Tente simplificar mais os testes, refatora-los se necessário para evitar as dependências, mas como disse anteriormente, não sei se é este o caso

Obrigado! @cassio @gpd38

@Willian-Silvano-Maria
Olá Willian blz? Desculpe a demora em ‘responder’ (creio que a galera já te ajudou bastante ehhe)
Basicamente era assim meu cenário: webdriver + C# (NUnit + PageObject). Ao criar um novo Unit Test, já realizava a criação dos meus objetos através dos attributes: OneTimeSetUp ou SetUp. Chamando somente suas instâncias nos meus cenários,

Obrigado @Maycon !

Pessoal, vocês criam testes específicos para validar campos obrigatórios ou criam os testes apenas com o fluxo completo de um processo desejado?

Nesses casos de validação eu poderia adicionar mais de um assert no mesmo teste para verificar se as mensagens específicas estão sendo exibidas corretamente?

Valeu!

@Willian-Silvano-Maria

Já participei de dois cenários que são:

  • Criar os testes com base somente nos casos de aceite, mesmo que não seja suficiente para proteger todo o sistema no início, devido a prazo e pressa do cliente.
  • Criar os testes com base nos casos de teste ou histórias de usuário que foram descritos pelo analista de requisito e estão bem detalhadas pois possuem o fluxo principal do sistema, os fluxos alternativos e os de exceção.

Esta segunda opção é mais completa, demanda mais tempo e cobre mais possibilidades de ação / exceção no sistema o que dirianos que é um sistema que “não possui falhas”.

Com relação aos asserts, pode-se utilizar mais de um asserts por teste, eu mesmo já utilizei, mas tento evitar usar asserts em um mesmo teste verificando duas funcionalidades.

Cada teste é único.

Obrigado @gpd38 !

Vou seguir a estratégia de criar uma massa de dados via SQL antes de cada classe de teste.
Para isso irei criar uma pasta “sql” dentro do diretório do selenium e chamar a execução dos mesmos antes de iniciar a classe de teste específico de uma tela do sistema, e ao final dos testes executar um sql que remova os dados de teste.

@willsilvano no meu projeto desenvolvi alguns testes populando o banco de dados via SQL. Funciona, porém, comecei a ter retrabalho com a manutenção dos scripts devido a alterações nas tabelas.
Optei por realizar a carga de dados inicial e congelar o backup.
Ao iniciar os testes, é restaurado o banco de dados e realizado a equalização do banco com as novas alterações na estrutura do banco.
O processo de restore e update do banco foi automatizado via Jenkins.

@Anderson-Tavares entendi. Qual seria o tamanho da base de dados que você trabalha?
Aqui na empresa a base tem cerca de 160GB (produção com dados).
A ideia seria criar a base limpa, somente com a estrutura e executar um script que vai popular tudo que preciso para que sistema funcione nos meus testes?

@willsilvano A base que utilizamos tem 4GB.
No seu caso, pegaria uma base de dados limpa, criaria todos os registros requeridos para a execução dos testes e congelaria essa base.
Realizar esse procedimento sobre uma base de 160GB seria praticamente inviável devido ao tempo do restore e equalização da base.

@Anderson-Tavares Quando você diz congelar a base, seria apenas para aquela execução do teste? Por exemplo, executaria toda minha bateria de testes 1 vez por dia ou 1 vez na semana com essa base, e na execução seguinte com uma nova base e persistindo todos os dados novamente?

@willsilvano A abordagem que estamos utilizando agora é bem parecida com essa que @Anderson-Tavares está fazendo.
Porém estamos utilizando o docker para fazer o controle da base de dados.
Por enquanto só temos tido vantagens, não se preocupar com inserções pelo sistema e nem com as exclusões dos dados de testes criados, pois sempre voltamos a base base para seu estado original.
Dessa maneira cada teste fica separado e com uma única responsabilidade.

@willsilvano congelar seria guardar um bkp.
Então seria +/- esses passos:
1 - Criar uma base de dados nova (vazia);
2 - Realizar a carga de dados necessária para execução dos testes automatizados;
3 - Criar um backup da base de dados com os dados;

Passos para execução dos testes:
1 - Restore do backup gerado anteriormente;
2 - Atualização da estrutura do banco (DDL, DML via script ou comparação com uma base modelo);
3 - Execução dos testes;
No próximo ciclo de testes “deve” ser executado os mesmos passos.

O uso do docker como o @cassio citou também é uma excelente estratégia e em um futuro próximo estaremos migrando para o docker também.

Log in to reply

Looks like your connection to Agile Testers was lost, please wait while we try to reconnect.