Pular para conteúdo

Testes e Benchmarks

Testes buscam defeitos e documentam exemplos de comportamento esperado. Provas de correção estabelecem afirmações sobre um modelo. Nenhuma abordagem substitui a outra.

Dimensões de teste

  • exemplos representativos;
  • casos de fronteira: vazio, singleton, duplicatas, extremos;
  • entradas inválidas e contratos de exceção;
  • propriedades que valem ao longo de entradas geradas;
  • casos de regressão para defeitos previamente descobertos;
  • comportamento de integração em fronteiras reais.

Para ordenação, propriedades úteis incluem saída não-decrescente, preservação de comprimento e multiconjunto, idempotência e concordância com um oráculo confiável.

@ParameterizedTest
@MethodSource("arrays")
void insertionSortMatchesTheJdk(int[] input) {
    int[] expected = input.clone();
    Arrays.sort(expected);
    int[] actual = input.clone();
    insertionSort(actual);
    assertArrayEquals(expected, actual);
}

Escopo unitário, integração e sistema

Um teste unitário isola um pequeno contrato e executa rapidamente. Um teste de integração verifica colaboração com uma fronteira real como banco de dados ou servidor HTTP. Um teste de sistema observa a aplicação implantada externamente. Substitutos de teste são úteis em limites selecionados, mas não podem estabelecer que uma integração real funciona. Consulte substitutos de teste, testes de contrato e testes baseados em propriedades para suas garantias distintas e modos de falha.

Benchmarking Java

Use JMH ou um framework equivalente. Um relatório sólido declara as entradas, o aquecimento, as iterações de medição, os forks, a JVM, o hardware, o resultado estatístico e a incerteza. Evite a eliminação de código morto e não combine o trabalho de preparação com a operação sob medição.

System.nanoTime() é uma primitiva de relógio, não uma metodologia de benchmarking. Compilação JIT, coleta de lixo, otimização adaptativa, caches de CPU e ruído do sistema operacional distorcem medições únicas e ingênuas.

Para investigações fora de um microbenchmark controlado, siga o fluxo de depuração, análise de desempenho e análise de memória.