Como estruturar testes automatizados?



  • Olá pessoal, estou iniciando nesse mundo sombrio e gostaria de algumas dicas de vocês. Estou construindo uma suíte de teste em java com Selenium e JUnit tentando utilizar Page Object. Minha dúvida é como organizar testes q possuem dependência de outros?
    Ex: Preciso cadastrar um usuário, porém para isso não posso ter cadastrado as notas desse usuário, portanto preciso criar um método q verifica e deleta caso existam notas cadastradas. Vocês criam um método privado na própria classe de teste que chama o PageNotas, você cria um método publico na classe TesteNotas e chama esse método na classe TesteCadastroUsuario? Ou Outra sugestão? Lembrando q deletarNotas faz parte de um conjunto de ações sendo um @Test na classe TesteNotas e não um método da PageNotas.


  • MVP

    A minha opinião é: tente fazer os seus testes o mais independentes possíveis.
    Criar muitas dependencias (de massa de dados, ou ações para poder prosseguir, etc…etc…) podem deixar os testes instáveis (ou flaky’s no jargão popular) e a manutenção ou execução podem ser dolorosos. O que aconselho é ter um pré-step onde tu pode validar a massa de dados que vai utilizar. Se puder criar melhor.
    Caso seja como grande maioria, sem poder de elaboração da massa de dados, pode se tentar reduzir o flakiness em uma condição antes do teste para limpar os dados, ou pelo menos analisar ela antes de usar. Assim tu consegue antes de iniciar tu já pode ter a informação que precisa antes de sair executando e ter um problema lá na frente.

    Sobre métodos privados ou públicos. Dependendo da estrutura, pode ser um método publico dentro da ações da tela que está, o qual tu pode chamar no teu teste e executar o que precisa. Se deixar ele privado na classe de teste não é algo que gosto não…Mas é um pensamento meu…



  • @ramses-saccol-de-almeida eu entendo o ponto negativo em relação a dependencia, meu questionamento é sobre a criação de um metodo anterior ao teste q vou executar, que pode ser um @BeforeClass por exemplo. To na duvida de como criar esse metodo ja q ele se refere a outra classe. Acho q nao estou sabendo me explicar né kkkk E aproveitando q falou sobre dependencias, quando cria-se testes para cadastro, valiadacao e exclusao você utiliza algo pra ordenar os testes ou cria um novo metodo e coloca eles dentro na ordem que quer?


  • MVP

    Dependendo do que se usa, tu pode colocar uma prioridade, ou executar tal teste e depois. Eu sempre deixo os meus testes independentes para conseguir uma certa elasticidade quando quero executar.

    Sobre o método eu falei mais no fim. Mas acho que não resolve o seu caso. Tu poderia criar um método publico para tal situação em uma outra classe para utilizar dentro de um after ou before test se precisar.
    Ou até uma interface se quiser deixar bem estranho.hehehe. O ponto, pra mim é: Tu precisa definir onde quer colocar o que vai usar para entender como elaborar o uso.
    Ex: Se tu tem uma classe de Setup, e tu extende ela para as classes de teste, poderia ver em deixar na de setup o que quer usar e não precisaria implementar na de testes.
    Talvez se expor um pouco da arquitetura que utiliza, podemos entender melhor o problema.
    Testes que envolvem CRUD (create, read, update and Delete) eu sempre tento fazer os dados que vou utilizar antes (e no fim deleto se posso). Quando estou em ambientes que não tenho muito acesso, eu normalmente crio um serviço para fazer isso. Ou um sql script. O que quero deixar dito é: eu não deixo a responsabilidade de deletar/criar o que uso dentro do app que estou usando. (Salvo casos que o app seja nativo e não comunica externamente com nada, fica tudo salvo no app).
    Nesses casos, ainda tem como resetar o app (se resolver deletar tudo) ou procurar meios de deletar via linha de comnado.
    Não sei se consegui ser “entendível”…hehehe



  • @ramses-saccol-de-almeida eu possuo classes de teste q extendem de uma TesteBase que inicializa o sistema em um @BeforeClass, faz login e sai do sistema no @AfterClass. E tenho classes com os webElementos q extendem da classe PaginaBase que possui elementos comuns a todas as paginas, um construtor com uma instancia do Webdriver e inicializo os elementos via PageFactory.
    Dito isso eu crio paginas para cada contexto do sistema e crio os testes de acordo com os elementos dessa pagina, porém esse sistema possui muitas dependencias como a citada acima, existem regras de negocio que impedem ações caso uma ação de outra classe nao seja realizada e para rodar uma suite com dezena de testes eu preciso de certas pre-configuracoes para cada tipo de teste.
    E por isso que fiquei nessa duvida de qual seria a melhor forma de fazer isso, já que existem diversas formas possiveis.


  • MVP

    Well, vamos por parte:
    Eu entendi a questão das dependencias. O problema me parece é que tu está utilizando dados os quais podem ter o que tu precisa ou não. E tu está tentando confirmar isso a nível de interface. E para isso não existe mágica. Tu vai ter que criar alguns “try/catch” em certos pontos do teste. O que tu pode deixar no base, é algo relacionado ao que precisa para testar.
    Se é público ou privado, isso não é a importante, na minha visão, nesse momento.
    O teu problema é “mais acima”.
    Se tu não pode manipular os dados “on the fly”, a escolha menos ruim (veja bem, nesse ponto não existem soluções boas…só "workarounds menos dolorosos) seria tu ter uma suite só para gerar os usuários com o que tu precisa e na hora de rodar tu usar isso.
    Pode resolver? Talvez sim…Talvez não…Mas pode te isentar de ficar cobrindo teu teste de try/catch.
    Se nem isso resolve. O que posso dizer é, cria no teste os métodos para tais modificações para não ter conflito com outros testes. E se quiser reaproveitar, cria nas classes de ações dentro do pagefactory e utiliza inicializa elas dentro dos testes e usa.
    Mas como falei, para esse tipo de problema, via app não existe solução boa…só “cover your ass points”…


  • MVP

    E não querendo ser chato, se está usando pageFactory, e caso não viu FluentWait, por favor: Veja!..o pooling ajuda pra caramba com problemas de elementos não encontrados e exceções que ocorrem…



  • @ramses-saccol-de-almeida Obrigada pelas dicas Ramses vou dar uma pesquisada pq estou iniciando nisso.