BT
x A sua opinião é importante! Por favor preencha a pesquisa do InfoQ sobre os seus hábitos de leitura!

Categorizando testes com Junit 4.8

por Pedro Mariano em 27 Abr 2010 |

É bastante comum existir testes de diversas categorias em um projeto, testes de integração e testes unitários são as categorias mais comuns. Necessita-se, em alguns casos, que seja feita uma categorização destes testes, diferenciando um dos outros, seja no modo de rodar ou mesmo nas características peculiares dos mesmos. A nova versão do Junit 4.8 faz com que isso seja feito de uma forma natural e fácil.

Por que?

Muitas vezes precisamos, principalmente quando utilizamos uma ferramenta de integração contínua, criar fases para os nossos testes, rodando primeiro os de uma determinada categoria e depois os de outra.

Como?

Para diferenciar as diferentes categorias de testes, antes da versão 4.8 do JUnit, possuiamos duas formas:

  • Criar os testes em diretórios diferentes, testes de integração podem ficar em /tests/integration e unitarios em /tests/unit.
  • Adicionar um sufixo comum(convenções) para os testes de determinada categoria, como: AlunoIntegrationTest

Pensando em facilitar a vida e também fazer o que outros frameworks como o TestNG já fazia, o Junit 4.8 decidiu implementar um controle de categorias, isto é, agora você pode categorizar os seus testes e depois rodar apenas aqueles da categoria desejada. Para utilizar essas vantagens você precisa utilizar o JUnit na versão 4.8.x. Além de também possuir a vatntagem de rodar seus testes através de suites. A primeira coisa que se deve fazer é criar interfaces que representem as Categorias desejadas.

public interface TesteDeIntegracao {}

Após criar sua categoria é necessário que você adicione a mesma em seu teste.

@Category(TesteDeIntegracao.class)
public class UsuarioTest {

    @Test
    public void deveRemoverOUsuario() {
        ...
    }

    @Test
    public void deveAdicionarOUsuario() {
        ....
    }
}

Você também pode categorizar o método de teste e não a classe:

public class AlunoTest {

    @Test
    @Category(TesteDeIntegracao.class)
    public void deveRemoverOAluno() {
        ...
    }

    @Test
    public void deveAdicionarOAluno() {
        ....
    }
}

Rodando os Testes

Após categorizar, precisamos rodar os nossos testes e os mesmos devem rodar conforme a categoria solicitada. Para fazer isso é necessário criar uma suite de testes e nela adicionar as categorias que envolvem os testes, para dizer que você quer rodar os testes utilizando uma determinada categoria, basta que sua suite contenha a anotação @RunWith(Categories.class) e que você adicione as categorias com @IncludeCategory.

Lembrando que apartir do JUnit 4.8 uma suite de testes nada mais é do que uma classe vazia onde você coloca uma anotação @SuiteClasses e inclui as classes que possuem determinados testes dentro dela.

@RunWith(Categories.class)
@IncludeCategory(TestesDeIntegracao.class)
@SuiteClasses( { AlunoTest.class, UsuarioTest.class })
public class rodaTestesDeIntegracaoSuite {}

Você também pode rodar seus testes excluindo categorias que não serão consideradas utilizando a anotação @ExcludeCategory. Abaixo uma classe que rodaria apenas todos os testes que não são de integração.

@RunWith(Categories.class)
@ExcludeCategory(TesteDeIntegracao.class)
@SuiteClasses( { AlunoTest.class, UsuarioTest.class })
public class TestesUnitariosSuite {}

Agora basta você fazer com que sua task do ANT, por exemplo, rode suas suites individualmente. Muito mais simples do que ter que adicionar classe por classe em sua suite, não acha?

Uma critíca vista na comunidade é o fato de ser possível rodar os testes categorias apenas em suites, não sendo possível rodar os mesmos de outra forma. Porém este não deve ser um grande impedimento já que em futuras versões isso será implementado, visto que os outros frameworks, como o TestNG já possui grupos, o que podem ser útil quando se utiliza o Maven com o plugin Surefile para rodar os testes.

E você leitor, o que achou dessa novidade? Quais outras utilidades você vê para a utilização das categorias? Você utilizaria as categorias mesmo com a limitação de rodar apenas em suites de teste?

Olá visitante

Você precisa cadastrar-se no InfoQ Brasil ou para enviar comentários. Há muitas vantagens em se cadastrar.

Obtenha o máximo da experiência do InfoQ Brasil.

Dê sua opinião

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

Categorizando no Nunit, pra galera .Net by Jovan Costa

[Test]
[Category("Integracao")]
Na hora de rodar o teste, basta especificar a categoria desejada, dentro da suite do Nunit na aba Categories.
É possível excluir também marcando a checkbox de exclusão e preenchendo a combo de acordo com esse padrão:
/exclude=categoria1;categoria2;...
se houver mais de uma categoria, basta separa com ;
==
Respondendo os questionamentos do final desse artigo:
Eu utilizaria essas categorias para separar os testes prioritários, os mais demorados e/ou os mais rápidos, de acordo com a necessidade.

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

Receber mensagens dessa discussão

1 Dê sua opinião

Conteúdo educacional

Feedback geral
Bugs
Publicidade
Editorial
InfoQ Brasil e todo o seu conteúdo: todos os direitos reservados. © 2006-2014 C4Media Inc.
Política de privacidade
BT