Testes de unidade com JUnit

Introdução a Testes em Java

Maria Milusheva

Senior Software Engineer

Teste de unidade - definição

Dois conceitos-chave:

Unidade - a menor parte testável de um aplicativo, como um método

Teste de unidade - Teste que verifica a correção de uma única "unidade" de código isolada do resto do aplicativo

Introdução a Testes em Java

Teste de unidade é sobre detalhes

Observações:

  • Teste de unidade trata de pequenos trechos de lógica, não do panorama geral

  • Outros tipos de teste focam no panorama geral (ex.: integração)

  • JUnit tem esse nome porque seu principal uso é teste de unidade

Um gráfico que ilustra intuitivamente a relação entre testes de unidade e código de produção

Introdução a Testes em Java

Tipos de teste - visão geral rápida

  • Neste curso vamos falar principalmente de testes de unidade e de integração
  • Mas há muitos tipos de teste!

Diagrama de testes de software incluindo testes funcionais, como teste de unidade, e não funcionais, como teste de usabilidade

Introdução a Testes em Java

Tipos de teste - visão geral rápida

  • Neste curso vamos falar principalmente de testes de unidade e de integração
  • Mas há muitos tipos de teste!

Diagrama de testes de software incluindo testes funcionais, como teste de unidade, e não funcionais, como teste de usabilidade. Esta versão tem testes de unidade e integração circulados

Introdução a Testes em Java

Sintaxe do JUnit: assertTrue() e assertFalse()

  • assertTrue() verifica se uma afirmação é verdadeira:
List<String> list = new ArrayList<>();

assertTrue(list.isEmpty()); // Sem erro
  • assertFalse() verifica o oposto:
List<String> list = new ArrayList<>();
list.add("A");

assertFalse(list.isEmpty()); // Sem erro
Introdução a Testes em Java

assertNull() e assertNotNull()

Variáveis null podem gerar NullPointerException!

  • Asserções que checam se uma variável é ou não null - assertNull() e assertNotNull()

  • Caso comum: verificar se um valor obtido de algum lugar não é null

Map<String, Integer> catalogue = new HashMap<>();

catalogue.put("item1", 10);

// Sem erros
assertNotNull(catalogue.get("item1"));
assertNull(catalogue.get("item2"));
Introdução a Testes em Java

Afirmando exceções

Suponha que queremos verificar se uma ArrayIndexOutOfBoundsException é lançada:

public String getIndex(String[] array, int index) {
    return array[index];
}

O JUnit oferece várias formas de fazer isso!

Introdução a Testes em Java

assertInstanceOf()

  • O JUnit oferece assertThrows(), mas ele usa sintaxe Java avançada (expressões lambda)

  • Dá para usar assertInstanceOf() assim:

try {
    getIndex(new String[]{}, 4);
} catch (Exception e) {
    // Passe a classe esperada da exceção e a própria exceção  
    assertInstanceOf(ArrayIndexOutOfBoundsException.class, e); 
}
1 https://www.baeldung.com/junit-assert-exception
Introdução a Testes em Java

Nomeando testes de unidade

  • Um projeto típico contém centenas de testes de unidade

  • Eles devem ser leves e fáceis de entender

  • Devem ter nomes informativos para identificarmos de imediato o que falhou se algum quebrar

Por exemplo: methodUnderTest_expectedBehavior_conditions()

1 https://dzone.com/articles/7-popular-unit-test-naming?fromrel=true
Introdução a Testes em Java

Vamos praticar!

Introdução a Testes em Java

Preparing Video For Download...