Identificando e filtrando testes JUnit

Identificando e filtrando testes JUnit

1. Visão geral

É muito comum executar todos os nossos testes JUnit automaticamente como parte da construção de CI usando Maven. Isso, no entanto, geralmente consome tempo.

Portanto,we often want to filter our tests and execute either unit tests or integration tests or both at various stages of the build process.

Neste tutorial, veremos algumas técnicas de filtragem para casos de teste comJUnit 5. Nas seções a seguir, também veremos vários mecanismos de filtragem antes do JUnit 5.

2. Tags JUnit 5

2.1. Anotando testes JUnit comTag

Com o JUnit 5, podemos filtrar testes marcando um subconjunto deles com um nome de tag exclusivo. Por exemplo, suponha que tenhamos testes de unidade e testes de integração implementados usando o JUnit 5. Podemos adicionar tags nos dois conjuntos de casos de teste:

@Test
@Tag("IntegrationTest")
public void testAddEmployeeUsingSimpelJdbcInsert() {
}

@Test
@Tag("UnitTest")
public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() {
}

Doravante podemosexecute all tests under a particular tag name separately. Também podemos marcar a classe em vez de métodos. Incluindo todos os testes em uma classe sob uma tag.

Nas próximas seções, veremos várias maneiras de filtrar e executar os testes JUnit marcados.

2.2. Filtrando tags com o Test Suite

O JUnit 5 nos permite implementar conjuntos de testes através dos quais podemos executar casos de teste com tags:

@RunWith(JUnitPlatform.class)
@SelectPackages("com.example.tags")
@IncludeTags("UnitTest")
public class EmployeeDAOUnitTestSuite {
}

Agora, se executarmos esta suíte,all JUnit tests under the tag UnitTest would be executed. Da mesma forma, podemos excluir testes com a anotaçãoExcludeTags .

2.3. Filtrando tags com o plug-in Maven Surefire

Para filtrar os testes JUnit nas várias fases da construção do Maven, podemos usar o plug-in Maven Surefire. The Surefire plugin allows us to include or exclude the tags in the plugin configuration:


    maven-surefire-plugin
    2.20.1
    
        UnitTest
    

Se agora executarmos este plugin, ele executará todos os testes marcados comoUnitTest. . Da mesma forma, podemos excluir casos de teste com um nome de marca:

IntegrationTest

2.4. Filtrando tags com um IDE

Os IDEs agora permitem filtrar os testes JUnit por tags. Dessa forma, podemos executar um conjunto específico de testes marcados diretamente do nosso IDE.

O IntelliJ permite essa filtragem através de uma Configuração de Execução / Depuração personalizada:

JUnit5 Tags in IntelliJ

Como mostrado nesta imagem, selecionamos o Tipo de teste como tags e o tag a ser executado na Expressão de tags.

O JUnit 5 permite váriosTag Expressions que podem ser usados ​​para filtrar as tags. Por exemplo,to run everything but the integration tests, we could use !IntegrationTest as the Tag Expression. Ou para executarUnitTest andIntegrationTest, we pode usarUnitTest | IntegrationTest.

Da mesma forma, o Eclipse também permite incluir ou excluir tags nas configurações JUnit Run / Debug:

JUnit5 Tags in Eclipse

3. Categorias do JUnit 4

3.1. Categorizando testes JUnit

O JUnit 4 nos permite executar um subconjunto de testes JUnit, adicionando-os em diferentes categorias. Como resultado, podemos executar os casos de teste em uma categoria específica e excluir outras categorias.

We can create as many categories by implementing marker interfaces where the name of the marker interface represents the name of the category. Para nosso exemplo, implementaremos duas categorias,UnitTest:

public interface UnitTest {
}

eIntegrationTest:

public interface IntegrationTest {
}

Agora, podemos categorizar nosso JUnit anotando-o com a anotaçãoCategory:

@Test
@Category(IntegrationTest.class)
public void testAddEmployeeUsingSimpelJdbcInsert() {
}

@Test
@Category(UnitTest.class)
public void givenNumberOfEmployeeWhenCountEmployeeThenCountMatch() {
}

Em nosso exemplo, colocamos a anotaçãoCategory annotation nos métodos de teste. Da mesma forma, também podemos adicionar esta anotação na classe de teste, adicionando todos os testes em uma categoria.

3.2. Categories Runner

Para executar testes JUnit em uma categoria, precisamos implementar uma classe de conjunto de testes:

@RunWith(Categories.class)
@IncludeCategory(UnitTest.class)
@SuiteClasses(EmployeeDAOCategoryIntegrationTest.class)
public class EmployeeDAOUnitTestSuite {
}

Este conjunto de testes pode ser executado a partir de um IDE e executaria todos os testes JUnit na categoriaUnitTest. Da mesma forma, também podemos excluir uma categoria de testes no conjunto:

@RunWith(Categories.class)
@ExcludeCategory(IntegrationTest.class)
@SuiteClasses(EmployeeDAOCategoryIntegrationTest.class)
public class EmployeeDAOUnitTestSuite {
}

3.3. Excluir ou incluir categorias no Maven

Por fim, também podemos incluir ou excluir as categorias de testes JUnit da compilação Maven. Assim, podemos executar diferentes categorias de testes JUnit em diferentes perfis Maven.

Usaremos o plugin Maven Surefire para isso:


    maven-surefire-plugin
    2.20.1
    
        com.example.categories.UnitTest
    

Da mesma forma, podemos excluir uma categoria da compilação do Maven:


    maven-surefire-plugin
    2.20.1
    
        com.example.categories.IntegrationTest
    

Isso é semelhante ao exemplo que discutimos na seção anterior. The only difference is that we replaced the tag name with the fully qualified name of the Category implementation.

4. Filtrando testes JUnit com o plug-in Maven Surefire

Ambas as abordagens que discutimos foram implementadas com a biblioteca JUnit. Uma maneira independente de implementação de filtrar casos de teste é seguindo uma convenção de nomenclatura. Para nosso exemplo, usaremos o sufixo UnitTest para testes de unidade e IntegrationTest para testes de integração.

Agora usaremosMaven Surefire Plugin para executar os testes de unidade ou os testes de integração:


    maven-surefire-plugin
    2.20.1
    
        
            **/*IntegrationTest.java
        
    

The excludes tag here filters all integration tests and executes only the unit tests. Essa configuração economizaria uma quantidade considerável de tempo de compilação.

Além disso, podemos executar o spluginSurefire em vários perfis Maven com diferentes exclusões ou inclusões.

EmboraSurefire mude bem para filtragem, é recomendado usarFailsafe Plugin para executar testes de integração no Maven.

5. Conclusão

Neste artigo, vimos uma maneira de marcar e filtrar casos de teste com o JUnit 5. We used the Tag annotation and also saw various ways for filtering the JUnit tests with a specific tag through the IDE or in the build process using Maven.

Também discutimos alguns dos mecanismos de filtragem antes da JUnit 5.

Todos os exemplos estão disponíveis emGithub.