Maven Test: Surefire VS Failsafe
Quando estamos buildando um projeto com Maven ele segue algumas phases desde validate até deploy. Por padrão, nossos testes são executados na phase test.
Porém, que testes serão executados? Os de unidade ou de Integração? Ou ambos?
Conhecendo o Surefire
Quando buildamos nosso projeto, por padrão os testes da pasta src/test/java são rodados pelo plugin Surefire (infalível, em português). O Surefire procurará neste diretório, qualquer classe de teste que termine ou comece com a palavra Test:
**/Test*.java
**/*Test.java
ou que termine com a palavra TestCase:
**/*TestCase.java
Pois, este é o padrão de nomenclatura para testes de unidade. E é justamente esse tipo de teste que o plugin Surefire foi desenvolvido para gerenciar. Logo, se rodarmos o comando:
$ mvn test
Somente os testes de unidade serão executados. Mas, e os testes de integração? Como fazemos para executar?
Conhecendo o Failsafe
Os testes de integração são gerenciados pelo plugin Failsafe (à prova de falhas, em português) e, diferente do Surefire, este plugin não vem habilitado por padrão.
Quando queremos rodar nossos testes de integração precisamos configurar no nosso POM.xml:
Com o Failsafe adicionado aos nossos plugins, agora ao buildar nosso projeto ele procurará no nosso diretório de testes src/test/java os testes de integração, assim como o Surefire.
Entretanto, ao inves de procurar pelos arquivos com Test ou TestCase no nome, ele procurará pelos arquivos com IT (Integration Test):
**/*IT.java
**/IT*.java
ou ITCase:
**/*ITCase.java
Fases do Failsafe
Quando utilizamos o Failsafe, são executadas 4 phases: pré teste de integração (pre-integration-test), teste de integração (integration-test), pós teste de integração (post-integration-test) e verificação (verify).
Portanto, diferente do Surefire, agora temos como configurar o ambiente dos testes na phase pre-integration-test e derrubar este ambiente na post-integration-test
Quando rodamos o comando:
$ mvn verify
Todos os testes de integração são rodados, com o ambiente configurado e certificando que este ambiente será limpo após os testes!
Além de rodar todos os testes de integração, o comando verify, antes disso, roda também os testes de Unidade!
Rodando o comando test executamos apenas os testes de unidade. Rodando o comando verify, executamos tanto os de unidade quanto os de integração.
Mas e se um dos nossos testes de unidade falhar? Não serão executados os testes de integração. Porém, como podemos rodar apenas os testes de integração?
Executando os testes separadamente
Neste caso, precisamos configurar nosso POM.xml. Há diversas formas de se fazer essa configuração, uma delas é excluir tudo o que não queremos que seja rodado, com a tag <exclude>:
É interessante destacar a importância de seguir os padrões de nomenclatura, pois se não definirmos nossos testes de unidade com o prefixo ou sufixo Test/TestCase neste momento haveria uma grande dificuldade em selecionar tudo que queremos excluir!
Com isso, conseguimos separar nossos testes de integração e de unidades, podemos rodar cada um isoladamente com mvn test e mvn verify ou ambos com qualquer phase após verify! E aplicamos os plugins certos para sua implementação especifica. Além de entender o que acontece por baixo dos panos da phase test!
Para saber mais
Mais informações sobre os plugins Surefire e Failsafe, entre outros plugins, podem ser encontradas na página oficial do Apache Maven maven.apache.org/plugins (disponível em inglês).
E você, como separa a execução dos seus testes no processo de build? Compartilha aqui com a gente nos comentários =)