JUnit Tutorial de anotações com exemplo: O que é @Test e @After

⚡ Resumo Inteligente

JUnit As anotações são uma forma de metadados sintáticos adicionados ao código. Java código-fonte para que um executor de testes saiba quais métodos executar, quando executá-los e quanto tempo cada um pode levar.

  • 🔘 @Teste: Marca um método público vazio que JUnit Executa como um único caso de teste.
  • ☑️ Ciclo da vida: @Before e @After envolvem todos os testes, enquanto @BeforeClass e @AfterClass envolvem a classe.
  • Ao controle: @Ignore ignora um teste, @Test(timeout) limita o tempo de execução, @Test(expected) verifica se uma exceção foi lançada.
  • 🧪 Asserções: org.junit.Assert fornece assertEquals, assertTrue, assertNull, assertSame e fail().
  • 🛠️ Legado: TestCase, TestResult e TestSuite pertencem ao pacote junit.framework mais antigo.
  • 📊 JUnit 5: Jupiter renomeia esses parâmetros para @BeforeEach, @AfterEach, @BeforeAll, @AfterAll e @Disabled.

JUnit Tutorial de anotações abordando @Test, @Before e @After.

O que é a JUnit Anotações?

JUnit anotações são uma forma especial de metadados sintáticos que podem ser adicionados a Java O código-fonte permite melhor legibilidade e estruturação. Variáveis, parâmetros, pacotes, métodos e classes podem ser anotados. As anotações foram introduzidas em JUnit 4, o que dá 4 Java código mais legível e simples. Essa é a grande diferença entre JUnit 3 e JUnit 4: JUnit O item 4 é baseado em anotações.

Com um conhecimento prático dessas anotações, é possível aprender e implementar facilmente um JUnit teste. Abaixo estão os importantes e frequentemente usados JUnit lista de anotações, com o JUnit 5 (Júpiter) equivalente ao lado de cada um:

S.No. Anotações Descrição JUnit 5 equivalente
1. @Teste Esta anotação substitui a anotação junit.framework.TestCase e indica que o método público void ao qual ela está associada pode ser executado como um caso de teste. @Test (org.junit.jupiter.api)
2. @Antes Esta anotação é usada se você deseja executar alguma instrução, como pré-condições, antes de cada caso de teste. @AntesDeCada
3. @Antes da aula Essa anotação é usada se você quiser executar algumas instruções antes de todos os casos de teste, por exemplo, uma conexão de teste que deve ser aberta antes de todos os outros casos de teste. @AntesDeTudo
4. @Depois de Esta anotação pode ser usada se você quiser executar algumas instruções após cada Caso de testePor exemplo, redefinir variáveis ​​ou excluir arquivos temporários. @AfterEach
5. @Depois da aula Essa anotação pode ser usada se você quiser executar algumas instruções após todos os casos de teste, por exemplo, liberar recursos após a execução de todos os casos de teste. @Afinal
6. @Ignorar Essa anotação pode ser usada se você quiser ignorar algumas instruções durante a execução do teste, por exemplo, desativando alguns casos de teste durante a execução. @Desabilitado
7. @Teste(tempo limite=500) Essa anotação pode ser usada se você quiser definir um tempo limite durante a execução do teste, por exemplo, se estiver trabalhando sob um SLA (acordo de nível de serviço) e os testes precisarem ser concluídos dentro de um prazo específico. @Timeout ou assertTimeout
8. @Test(esperado=IllegalArgumentException.class) Essa anotação pode ser usada se você quiser tratar alguma exceção durante a execução do teste. Por exemplo, se você quiser verificar se um método específico está lançando uma exceção específica ou não. assertThrows

JUnit Exemplo de anotações

Vamos criar uma classe cobrindo importantes JUnit anotações com instruções de impressão simples e execute-as com uma classe de executor de teste:

Passo 1) Considere o seguinte: Java Classe que possui vários métodos associados às anotações listadas acima:

Exemplo de anotações Junit.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

Passo 2) Vamos criar uma classe de execução de testes para executar o teste acima:

TestRunner.java

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

resultado esperado

  • Todos os casos de teste serão executados um a um, e todas as instruções de impressão poderão ser visualizadas em um console.
  • Conforme discutido na tabela acima, @Before e @BeforeClass em JUnit [os métodos m2() e m1() ] serão executados antes de cada caso de teste e antes de todos os casos de teste, respectivamente.
  • Da mesma forma que @After e @AfterClass em JUnit Os métodos m4() e m3() serão executados após cada caso de teste e após todos os casos de teste, respectivamente. A anotação @Ignore no método m6() será interpretada como ignorando o teste.

Vamos analisar os casos de teste usados ​​acima. Java aula em detalhes:

  1. Considere o método m5() conforme apresentado abaixo:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

No método acima, você está adicionando uma string à variável “lista”:

  • lista.isEmpty() retornará falso.
  • assertFalse(list.isEmpty()) deve retornar verdadeiro.
  • Como resultado, o caso de teste passar.

Como você adicionou apenas uma string à lista, o tamanho é um.

  • lista.tamanho() deve retornar o valor inteiro “1”.
  • So assertEquals(1, list.size()) deve retornar verdadeiro.
  • Como resultado, o caso de teste passar.
  1. Considere o método m7() conforme apresentado abaixo:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Como discutido acima, @Teste(tempo limite = 10) é usado para impor um tempo limite no caso de teste. O valor está em milissegundos, portanto m7() deve terminar em 10 ms.

  1. Considere o método m8() conforme apresentado abaixo:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Como discutido acima, @Teste(esperado) O teste verificará a exceção especificada durante sua execução, portanto, o método m8() lançará a exceção "No Such Method Exception". Como resultado, o teste será executado com uma exceção.

Nota sobre a precisão: A função m8() apenas imprime uma linha, portanto a exceção declarada nunca é de fato lançada. JUnit O número 4 indica que o teste falhou. Alinhe o tipo esperado com o tipo que o método realmente lança. JUnit 5 escreve isso com assertThrows.

Como todos os casos de teste são aprovados, isso resulta em uma execução de teste bem-sucedida.

Resultado atual

Como existem três casos de teste no exemplo acima, todos os casos de teste serão executados um após o outro. Veja a captura de tela do console abaixo:

Eclipse Saída do console mostrando as instruções de impressão @BeforeClass, @Before, @After e @AfterClass.
Saída do console produzida por JunitAnnotationsExample

Veja abaixo as instruções de impressão que podem ser vistas no console:

Usando @BeforeClass , executado antes de todos os casos de teste

Usando anotações @Before, executadas antes de cada caso de teste

Usando @After, executado após cada caso de teste

Usando anotações @Before, executadas antes de cada caso de teste

Usando @Test(timeout), pode ser usado para impor o tempo limite em JUnit4 caso de teste

Usando @After, executado após cada caso de teste

Usando anotações @Before, executadas antes de cada caso de teste

Usando @Test(expected) , ele verificará a exceção especificada durante sua execução

Usando @After, executado após cada caso de teste

Usando @AfterClass, executado após todos os casos de teste

JUnit Afirmar classe

As anotações definem quando um método é executado; os métodos de asserção definem se ele é bem-sucedido.

Esta classe fornece diversos métodos de asserção úteis na escrita de casos de teste. Se todas as asserções forem aprovadas, os resultados do teste serão bem-sucedidos. Se alguma asserção falhar, os resultados do teste serão considerados reprovados. O método dedicado JUnit afirmar O tutorial aborda cada método em detalhes.

Como você viu anteriormente, a tabela abaixo descreve os métodos Assert importantes e suas respectivas descrições:

S.No. Forma Descrição
1. void assertEquals(booleano esperado, booleano real) Ele verifica se dois valores são iguais, de forma semelhante ao método equals da classe Object.
2. void assertFalse (condição booleana) A funcionalidade consiste em verificar se uma condição é falsa.
3. void assertNotNull (objeto objeto) A funcionalidade “assertNotNull” serve para verificar se um objeto não é nulo.
4. void assertNull (objeto objeto) A funcionalidade “assertNull” serve para verificar se um objeto é nulo.
5. void assertTrue (condição booleana) A funcionalidade “assertTrue” serve para verificar se uma condição é verdadeira.
6. falha nula() Se você deseja lançar um erro de asserção, fail() sempre resulta em um veredicto de falha.
7. void assertSame([String mensagem] A funcionalidade “assertSame” serve para verificar se os dois objetos se referem ao mesmo objeto.
8. void assertNotSame([String mensagem] A funcionalidade “assertNotSame” serve para verificar se os dois objetos não se referem ao mesmo objeto.

JUnit Classe de casos de teste

Para executar vários testes, a classe TestCase está disponível no junit.framework pacote. A anotação @Test indica JUnit que este método público vazio (um caso de teste aqui) ao qual ele está anexado pode ser executado como um caso de teste.

Nota de versão: Caso de teste, Resultado do teste e Suíte de teste pertencem ao legado junit.framework pacote de JUnit 3. Eles ainda são distribuídos dentro do artefato JUnit 4.x, mas os testes baseados em anotações não estendem TestCase.

A tabela abaixo mostra alguns métodos importantes disponíveis no junit.framework.TestCase classe:

S.No. Forma Descrição
1. int contagemTestCases() Este método é usado para contar quantos casos de teste são executados pelo... executar (TestResult tr) método.
2. ResultadoTeste createResult() Este método é usado para criar um Resultado do teste objeto.
3. String getName () Este método retorna uma string que nada mais é do que um Caso de teste nome.
4. Execução do resultado do teste() Este método é usado para executar um teste, que retorna um Resultado do teste objeto.
5. execução nula (resultado TestResult) Este método é usado para executar um teste com um Resultado do teste objeto, que não retorna nada.
6. void setName (nome da string) Este método é usado para definir o nome de um Caso de teste.
7. configuração vazia() Este método é usado para escrever código de associação de recursos, por exemplo, para criar uma conexão com um banco de dados.
8. vazio tearDown() Este método é usado para escrever código de liberação de recursos, por exemplo, liberando uma conexão de banco de dados após a execução de uma operação de transação.

JUnit Classe TestResult

Ao executar um teste, ele retorna um resultado (na forma de um Resultado do teste objeto). Este objeto TestResult pode ser usado para analisar o objeto resultante. O resultado deste teste pode ser falha ou sucesso.

Consulte a tabela abaixo para obter informações sobre os métodos importantes usados ​​na classe junit.framework.TestResult:

S.No. Forma Descrição
1. void addError(Teste de teste, Throwable t) Este método é utilizado caso seja necessário adicionar um erro ao teste.
2. void addFailure(Teste de teste, AssertionFailedError t) Este método é utilizado caso seja necessário adicionar uma falha à lista de falhas.
3. void endTest (teste de teste) Este método é utilizado para notificar que um teste foi realizado (concluído).
4. contagem de erros int() Este método é utilizado para obter os erros detectados durante a execução do teste.
5. Enumeração erros() Este método simplesmente retorna uma coleção (uma enumeração neste caso) de erros.
6. int falhaCount() Este método é utilizado para obter a contagem de falhas detectadas durante a execução do teste.
7. execução nula (teste TestCase) Este método é usado para executar um caso de teste.
8. int runCount() Este método simplesmente conta os testes executados.
9. void startTest (teste de teste) Este método é usado para notificar que um teste foi iniciado.
10. parada nula() Este método é usado para interromper a execução do teste.

JUnit Classe de conjunto de testes

Se você deseja executar vários testes em uma ordem específica, isso pode ser feito combinando todos os testes em um só lugar. Esse lugar é chamado de suíte de testes. JUnit suíte de teste O tutorial apresenta um exemplo completo.

Consulte a tabela abaixo para obter informações sobre os principais métodos utilizados no processo. junit.framework.TestSuite classe:

S.No. Forma Descrição
1. void addTest (teste de teste) Este método é usado se você deseja adicionar um teste ao conjunto.
2. void addTestSuite(Classe classe de teste) Este método é usado se você deseja especificar a classe ao adicionar um teste ao conjunto.
3. int contagemTestCases() Este método é usado se você deseja contar o número de casos de teste.
4. String getName () Este método é usado para obter o nome do conjunto de testes.
5. execução nula (resultado TestResult) Este método é usado para executar um teste e coletar o resultado do teste em um Resultado do teste objeto.
6. void setName (nome da string) Este método é usado para definir o nome do Suíte de teste.
7. Teste testAt(índice int) Este método é utilizado se você deseja retornar o teste em um índice específico.
8. int testCount() Este método é utilizado se você deseja retornar o número de testes no conjunto de testes.
9. aviso de teste estático (mensagem de string) Este método retorna um teste que falhará e registrará uma mensagem de aviso.

Perguntas Frequentes

Sim. Um método geralmente carrega @Test junto com @Ignore, ou @Test com um tempo limite e uma exceção esperada. Você não pode empilhar duas anotações de ciclo de vida, como @Before e @After, em um mesmo método.

@Ignore apenas suprime um método JUnit já é reconhecido como um teste. Sem o @Test ao lado, o executor nunca coleta o método, portanto ele não é executado nem listado como ignorado.

JUnit O método é executado em uma thread separada e falha com uma exceção TestTimedOutException assim que o orçamento expira. A thread é interrompida, não finalizada, portanto uma chamada bloqueante pode continuar em execução.

Somente através do motor vintage. Adicionar junit-vintage-engine permite o JUnit A plataforma executa os testes org.junit existentes sem alterações, mas os testes Jupiter precisam importar org.junit.jupiter.api. Misturar ambos os conjuntos de importações em uma mesma classe resulta em falha.

Apenas para fins de manutenção. Conjuntos de testes legados que estendem a classe `TestCase` e ​​criam objetos `TestSuite` ainda são comuns em bases de código mais antigas, portanto, reconhecer a API ajuda. Novos testes devem ser baseados em anotações.

JUnit Cria uma nova instância da classe de teste para cada método de teste, portanto, nenhuma existe quando a configuração em nível de classe precisa ser executada. Um método estático não precisa de instância, e JUnit rejeita uma declaração não estática.

Os assistentes de IA leem o método em teste e sugerem se a configuração deve ser feita em `@Before` ou `@BeforeClass`, e se um caminho de falha precisa de `@Test(expected)` ou `assertThrows`. Trate cada sugestão como um rascunho.

Copiloto do GitHub Geralmente, a montagem e a desmontagem são feitas corretamente, mas frequentemente há confusão. JUnit 4 e Jupiter importam tudo em um único arquivo. Verifique o bloco de importação antes de executar o pacote.

Resuma esta postagem com: