Ordenando os testes com Selenium com JUnit

Olá pessoal!

Muitas pessoas me perguntam como elas podem ordenar a execução de testes pelo JUnit.
Antes de responder este questionamento é importante explicar todos os porquês envolvidos nesta ação…

Porque o JUnit não executa os testes sempre em uma mesma ordem?
Uma das prerrogativas em teste unitário é o isolamento, ou seja, nenhum  teste pode afetar outro. A dependência de testes, em unidades, pode nos trazer um resultado falso-positivo e diversos efeitos colaterais.
É comum utilizar alguma IDE de desenvolvimento em Java, como o Eclipse IDE, e ver que a ordem as vezes é alterada.
Dê uma olhada no código abaixo. Se você executá-lo diversas vezes ele vai trazer a saida de forma diferente.

 

Como informar uma ordem de execução?
A partir do JUnit 4.11 é possível informar uma ordem de execução através da anotação @FixMethodOrder.
Existem três formas de ordenação, que entram como parâmetro da anotação:

  • MethodSorters.DEFAULT: maneira padrão determinístico do JUnit
  • MethodSorters.JVM: deixa a JVM determinar (pode não vir da forma que está no código)
  • MethodSorters.NAME_ASCENDING: ordena pelo nome do método de teste

Para fazer com que o código acima seja executado pelo nome do método, apenas devemos informar no topo da classe @FixMethodOrder(MethodSorters.NAME_ASCENDING)

Este explicação pode ser obtida diretamente do site do JUnit
https://github.com/junit-team/junit/wiki/Test-execution-order

 

 

 

Execute o teste e verifique a saida do console da sua IDE favorita 🙂

Depois deste exemplo basta aplicar a ordenação nas classes dos seus testes com Selenium.

Minha opinião sobre a utilização de ordenação de teste do Selenium com o JUnit
Este é um bom caminho para quem utiliza o suporte do JUnit com o Selenium, mas o ideal é utilizar o padrão de projeto de Page Objects para controlar melhor e não haver duplicidade de código.

Se você já tem seus testes e quer ordená-los dentro da classe de teste, essa é uma boa saida em conjunto com a criação de suites de teste até você refatorar o código (ou não) para Page Objects.

 

4 thoughts to “Ordenando os testes com Selenium com JUnit”

  1. Perfeito! Sem muito a acrescentar. Realmente, no meu ponto de vista, casos de teste devem ser independentes uns dos outros. E a sua dica sobre o uso do Page Object é perfeita!!

    Parabéns!

  2. Oi Elias, parabéns pelo post.

    Realmente temos sempre que tomar cuidado com dependência entre testes. Porém, existem casos em que isso se torna necessário.

    Como exemplo posso citar um sistema que trabalhei, tendo que testar diversas correções e mudanças que estavam sendo implementadas a partir de solicitações dos usuários. O sistema não tinha testes automatizados em nenhum nível, então, para começar, automatizei com Selenium os testes dessas correções/mudanças.

    Visto que eram fluxos bastante end-to-end, mesmo usando Page Objects, acabavam ficando com métodos de teste muito longos, prejudicando a legibilidade. O TestNG caiu com uma luva pra esse caso, já que ele tem o recurso de fazer um método de teste depender de outro(s). Pude separar um cenário grande em mais de um método e, caso o cenário falhasse no meio, os métodos seguintes não eram executados (ficavam como skipped). Ficou bem mais fácil também pra descobrir onde o teste tinha falhado.

    No JUnit, já usei uma vez uma implementação de ordenação sobrescrevendo o método ‘computeTestMethods()’ da classe BlockJUnit4ClassRunner, mas dá na mesma que usar o @FixMethodOrder, porque caso um dos métodos falhe no meio, os seguintes também vão ser executados e falhar.

    Também podemos citar o Arquillian Graphene, que tem vários recursos bacanas pra desenvolver testes com Selenium WebDriver. Na API, implementaram essa ordenação pro JUnit através da annotation @InSequence(n). Mas também é apenas uma ordenação, se um teste falhar no meio, os outros serão executados mesmo assim.

    Abs!
    Stefan.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *