Test Invariants by Using Assertions

O uso de assertions em Java permite verificar se certos invariantes (condições que devem ser sempre verdadeiras durante a execução do programa) são mantidos em tempo de execução. Elas são usadas principalmente para garantir que o código está se comportando conforme esperado, durante o desenvolvimento e testes.

🧠 1. O que são Invariantes?

Invariantes são condições que devem ser verdadeiras em pontos específicos do programa. Exemplos incluem:

  • Garantir que uma variável nunca tenha um valor nulo.
  • Garantir que a soma de dois valores seja sempre maior que zero.
  • Garantir que uma lista de objetos nunca esteja vazia após ser carregada.

Em Java, você pode usar assertions para validar essas condições.


🧠 2. Como Usar Assertions em Java

O assert é uma palavra-chave em Java usada para fazer verificações em tempo de execução. A sintaxe básica é:

assert condição : mensagemDeErro;
  • condição: A condição a ser testada. Se for falsa, o erro será lançado.
  • mensagemDeErro: (Opcional) A mensagem que será exibida se a condição for falsa.

Exemplo Simples de Assertion

public class TesteAssertion {
public static void main(String[] args) {
int idade = 20;

// Verifica se a idade é maior que 18 (invariante)
assert idade > 18 : "Idade deve ser maior que 18!";

System.out.println("Idade é válida");
}
}

Se a condição idade > 18 for falsa, a mensagem "Idade deve ser maior que 18!" será exibida.


🧠 3. Habilitando Assertions

Por padrão, as assertions estão desativadas em Java. Para ativá-las, você deve executá-las com a opção -ea (enable assertions) no comando java. Exemplo:

java -ea TesteAssertion

Se você tentar executar sem habilitar, o código que contém assert não será executado e não causará impacto.


🧠 4. Utilizando Assertions para Testar Invariantes

As assertions são úteis para garantir que invariantes sejam mantidos em pontos específicos do código. Vamos ver um exemplo de como usá-las para testar invariantes em um método:

Exemplo de Invariante: Soma de Dois Valores

Imagine que você tenha um método que deve retornar a soma de dois valores positivos. Você pode garantir que isso sempre aconteça usando assertions.

public class TesteInvariantes {
public static int somarValores(int a, int b) {
// Invariante: A soma nunca pode ser negativa
assert a >= 0 : "Valor 'a' não pode ser negativo";
assert b >= 0 : "Valor 'b' não pode ser negativo";

return a + b;
}

public static void main(String[] args) {
int resultado = somarValores(10, 20);
System.out.println("Resultado da soma: " + resultado);

// Testando com valores inválidos (desabilite assertions para testar)
// int erro = somarValores(-10, 20);
}
}

Neste exemplo, as assertions garantem que os valores de entrada nunca sejam negativos. Se alguém passar um valor negativo, a execução será interrompida com a mensagem de erro correspondente.


🧠 5. Assertions com Objetos e Métodos

Além de números e valores simples, você também pode usar assertions com objetos para garantir que os objetos estejam no estado correto.

Exemplo de Verificação de Objeto

public class TesteObjeto {
public static void main(String[] args) {
String nome = "João";

// Invariante: O nome não pode ser nulo ou vazio
assert nome != null && !nome.isEmpty() : "Nome não pode ser nulo ou vazio";

System.out.println("Nome: " + nome);
}
}

Neste caso, garantimos que o nome nunca seja nulo ou vazio.


🧠 6. Usando Assertions para Verificar Contratos de Métodos

As assertions também são úteis para testar contratos de métodos. Por exemplo, você pode usar assertions para garantir que os argumentos passados para um método atendem a requisitos específicos.

Exemplo de Contrato de Método

public class TesteContrato {
public static int dividir(int a, int b) {
// Invariante: Não podemos dividir por zero
assert b != 0 : "O divisor não pode ser zero";

return a / b;
}

public static void main(String[] args) {
int resultado = dividir(10, 2);
System.out.println("Resultado da divisão: " + resultado);

// Testando com divisor inválido (desabilite assertions para testar)
// int erro = dividir(10, 0);
}
}

Aqui, usamos uma assertion para garantir que o divisor não seja zero antes de realizar a divisão.


Vantagens e Desvantagens do Uso de Assertions

Vantagens:

  • Validação de Invariantes: As assertions são úteis para testar pré-condições, pós-condições e invariantes de classe durante o desenvolvimento.
  • Detecção de Erros: Permitem detectar falhas e erros rapidamente durante o desenvolvimento.
  • Facilidade de Uso: A sintaxe é simples e direta.

Desvantagens:

  • Desativadas em Produção: Assertions são desativadas por padrão em ambientes de produção, o que significa que não podem ser usadas para validação em tempo de execução fora de um contexto de desenvolvimento.
  • Não Substituem Exceções: Assertions não devem ser usadas para lógica de erro ou exceções que você queira capturar e tratar, já que elas podem ser desativadas.

🧪 Quiz – 5 questões rápidas

1. O que acontece se uma assertion falhar em Java?
A) O programa continua normalmente
B) O programa termina e uma mensagem de erro é exibida
C) O programa ignora a falha e continua
D) O programa tenta corrigir a falha automaticamente


2. Como você habilita assertions em Java?
A) java -enable assertions
B) java -ea
C) java -assert true
D) java -assert


3. Em que parte do ciclo de vida do programa as assertions são normalmente usadas?
A) Durante a produção
B) Durante o desenvolvimento e testes
C) Em ambas as fases (desenvolvimento e produção)
D) Nenhuma das anteriores


4. O que ocorre se você não habilitar assertions ao executar um programa em Java?
A) O código com assert não será executado
B) O código com assert gerará um erro de compilação
C) O código com assert funcionará normalmente
D) O código com assert será ignorado sem impacto no programa


5. Qual é o principal propósito de usar assertions em Java?
A) Garantir que os erros sejam capturados em tempo de execução
B) Validar invariantes e verificar condições durante o desenvolvimento
C) Substituir exceções para tratamento de erros
D) Melhorar o desempenho do programa


✅ Gabarito Comentado

  1. B – Quando uma assertion falha, o programa é interrompido e uma mensagem de erro é exibida.
  2. B – Para habilitar assertions, usamos a opção -ea (enable assertions).
  3. B – Assertions são usadas durante o desenvolvimento e testes para validar condições e invariantes.
  4. A – Se as assertions não forem habilitadas, o código com assert não será executado.
  5. B – O propósito principal das assertions é validar invariantes e verificar condições durante o desenvolvimento.

Deixe um comentário