Maven Test: Surefire VS Failsafe

André Chaves
Code Maestro
Published in
3 min readApr 29, 2016

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:

pom.xmlcom o failsafe

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 =)

--

--

André Chaves
Code Maestro

Empreendedor, CTO, desenvolvedor e apaixonado por automação.