Pular para o conteúdo
SDETRole
SDETRole

Glossário · Fundamentos de testes

Teste unitário

Em inglês: Unit test

Também chamado de: testes unitários, teste de unidade, testes de unidade, unit testing

Definição

Teste automatizado que verifica uma pequena parte do código, como uma função ou uma classe, isolada de bancos de dados, rede e outros serviços.

Um teste unitário (unit test) exercita uma pequena unidade de código, normalmente uma função, um método ou uma classe, e verifica a saída ou o comportamento dela para determinadas entradas. Ele roda em memória, sem bancos de dados reais, chamadas HTTP ou sistema de arquivos, então leva milissegundos e falha por exatamente um motivo. Os testes unitários formam a base da pirâmide de testes e normalmente são escritos pelos desenvolvedores junto com o código.

Exemplo (JUnit 5, Java 21)

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

class DiscountCalculatorTest {

    private final DiscountCalculator calculator = new DiscountCalculator();

    @ParameterizedTest
    @CsvSource({ "99.99, 0.00", "100.00, 10.00", "250.00, 25.00" })
    void appliesTenPercentFromOneHundred(double total, double expected) {
        assertEquals(expected, calculator.discountFor(total), 0.001);
    }

    @Test
    void rejectsNegativeTotals() {
        assertThrows(IllegalArgumentException.class, () -> calculator.discountFor(-1));
    }
}

Testes parametrizados precisam do artefato junit-jupiter-params, que já vem incluído na dependência agregadora junit-jupiter. (Código que lida com dinheiro de verdade deveria usar BigDecimal em vez de double; aqui ele foi mantido simples.)

O que faz um bom teste unitário

  • Rápido e determinístico. Sem sleeps, relógios, aleatoriedade ou rede. Injete um Clock fixo em vez de chamar LocalDate.now().
  • Isolado. As dependências são substituídas por test doubles quando deixariam o teste lento ou imprevisível.
  • Um comportamento por teste, com um nome que o descreva, para que a falha se explique sozinha.
  • Testa comportamento, não implementação. Faça assertions sobre saídas e efeitos observáveis, e não sobre métodos privados, para que uma refatoração não quebre os testes.

Teste unitário vs teste de integração

Um teste unitário verifica a sua lógica com todo o resto substituído. Um teste de integração verifica se componentes reais funcionam juntos: o seu repositório contra um banco de dados real, o seu cliente contra um serviço real (ou em container). Testes unitários pegam erros de lógica a baixo custo; testes de integração pegam erros de ligação, configuração, serialização e queries que os testes unitários escondem com mocks. Uma suíte só de testes unitários pode estar toda verde enquanto a aplicação nem consegue subir.

Como a “unidade” é definida

Não existe uma resposta universal. Alguns times tratam uma única classe como a unidade e mockam todos os colaboradores. Outros tratam um pequeno grupo de classes que implementa um comportamento como a unidade e só substituem o que cruza uma fronteira de processo. O segundo estilo tende a produzir testes menos frágeis diante de refatorações.

Digite para buscar em todo o SDETRole.

Busca de texto completo com Pagefind · roda no seu navegador Abrir página de busca →