Unidade 5 / 12

Produção de testes e garantia de qualidade

Ganhos:

  • Capacidade de produzir testes unitários, casos extremos e análise de lacunas de cobertura com IA
  • Capacidade de imprimir expectativas de teste com base na especificação, não no comportamento atual do código
  • Capacidade de testar se um teste realmente protege injetando erros

Escrever testes é uma das tarefas que mais geram valor e que a maioria dos desenvolvedores adia. Um bom conjunto de testes é a prova de que o código funciona conforme o esperado e uma tábua de salvação para mudanças futuras. O problema é que escrever testes é repetitivo e demorado – exatamente o tipo de trabalho em que a IA brilha. Mas há um problema: a IA frequentemente testa o comportamento existente do código, não o comportamento que deveria ser. Gerenciar essa diferença é a essência desta unidade.

Nesta unidade, você aprenderá testes unitários (testes que testam uma função sozinha, isoladamente), testes de casos extremos e geração de dados de teste com IA; colmatar lacunas na cobertura dos testes; e por que confiar cegamente nos testes de IA é perigoso.

Os dois lados do teste: corrigir comportamento versus verificar

Um teste pode servir a dois propósitos diferentes. A primeira é a verificação: testa se o código está correto, se está de acordo com a especificação. A segunda é a proteção contra regressão: ela congela o comportamento do código hoje, portanto, se alguém o alterar acidentalmente amanhã, o teste será interrompido e notificado.

A IA é muito boa neste último; Ele analisa o código e gera casos que testam “o que está fazendo agora”. Mas se o código estiver errado desde o início, a IA pode definir esse comportamento errado como “correto”. Portanto você deve revisar a afirmação de cada teste que a IA produz: “O código retorna 42 e o teste espera 42” não significa que 42 seja a resposta correta.

Cuidado: Se a IA passar no teste, isso não significa que o código está “funcionando”; significa apenas "ele se comporta conforme a IA espera". Você decide se a expectativa está correta ou não observando as especificações.

Passo a passo: escrevendo testes robustos com IA

  1. Forneça a especificação, não apenas o código. Se você adicionar a informação “Esta função deve fazer isso”, a IA poderá escrever a expectativa correta; Ele testará o comportamento atual se você apenas fornecer o código.
  2. Peça casos extremos. Vazio, nulo, zero, negativo, muito grande, formato incorreto, simultaneidade - reivindique explicitamente fora do caminho feliz.
  3. Especifique a estrutura e o estilo de teste. "use pytest", "padrão Arrange-Act-Assert", "deixe cada teste testar uma coisa" etc.
  4. Verifique as expectativas (afirmação). Compare com a especificação que cada afirmação verifica o valor correto.
  5. Fechar lacunas no escopo. Forneça os testes existentes e pergunte "quais ramos e casos não foram testados?" fazer você perguntar; em seguida, verifique os testes adicionais produzidos.

Três Mini Estojos

Caso 1 — Cobertura de 52% a 85%. A cobertura de teste de um módulo de serviço foi de 52%. A equipe alimentou a IA com os testes existentes, fez com que ela listasse as ramificações não testadas e gerasse testes para elas. Com a revisão humana, a cobertura aumentou para 85%; No processo, a IA descobriu um bug real (um caminho que retornava o código de erro errado) em um branch de bug que nunca havia sido testado antes.

Caso 2 — A armadilha da fixação de falsas expectativas. Uma função de arredondamento monetário estava realmente errada; Em vez de arredondar 2,675 para 2,67, estava arredondando 2,67 em vez de 2,68. A IA olhou para o código e escreveu assert round_money(2.675) == 2.67 — congelando o erro como “true”. Quando o desenvolvedor leu a especificação, ele corrigiu a expectativa e detectou o bug real. Testar a regra, e não o código, fez a diferença.

Caso 3 — Explosão de estado limite. Ao solicitar à IA apenas “casos extremos” para uma função de intervalo de datas; Produziu 8 casos como início = fim, intervalo reverso, ano bissexto 29 de fevereiro, fusos horários diferentes e intervalo nulo. Dois deles (espaçamento reverso e ano bissexto) estavam realmente causando o erro. A consideração manual desses casos costuma ser ignorada; A IA tornou-se um parceiro de “brainstorming de casos extremos” aqui.

Quatro modelos copiáveis

Geração de teste baseada em especificações:

Função: Um desenvolvedor que escreve testes. Estrutura: {{pytest/JUnit/Jest...}}.O que a função DEVE FAZER (especificação): {{rule}}Escreva testes para a seguinte função. Escreva as expectativas de acordo com a especificação, NÃO a saída atual do código. Caminho feliz + adicione pelo menos 4 casos extremos. Deixe cada teste testar uma coisa, use um nome descritivo. {{função}}

Brainstorming de casos extremos:

Liste os casos de borda/falha que devem ser tentados no teste para esta função (nulo, nulo, pontos de interrupção, formato incorreto, simultaneidade, erro externo). Para cada caso: entrada, comportamento esperado. NÃO escreva código ainda, apenas liste.{{function}}

Análise de lacunas de cobertura:

Abaixo estão as funções e testes disponíveis. Quais ramos, condições e casos não foram testados? Liste as deficiências e escreva novos testes apenas para as deficiências. Não repita os existentes. Função:{{function}}Testes:{{current_tests}}

Dados de teste/geração de objeto simulado:

Gere dados de teste realistas para testes de {{função/serviço}}: amostras válidas, amostras de borda e amostras inválidas separadamente. Sugira um comportamento simulado simples para a dependência externa {{X}}. Usando dados/PII verdadeiramente confidenciais; Gere dados falsos.

Alerta fraco / Alerta forte

Fraco: "Escreva um teste para esta função."
Forte: "com pytest. Função apply_discount (total, porcentagem) - regra: o desconto deve ser de 0% a 30%, fora dos limites deve gerar ValueError, o resultado deve ser arredondado para 2 casas decimais. Escreva as expectativas por esta REGRA (não por código). Caminho feliz + estes casos extremos: 0%, 30%, 31% (erro), negativo, total = 0. [código]"

Ele fornece a regra de liberação forte e diz "escreva a expectativa de acordo com a regra, não o código"; Esta única frase fecha a armadilha da IA ​​para corrigir o mau comportamento.

Tipo de teste

Contribuição de IA

controle humano

Feliz teste de unidade rodoviária

esqueleto rápido

A expectativa está correta?

Casos extremos

Brainstorming extenso

Elimine o irrelevante

Preenchimento de lacuna de escopo

Encontra ramificações ignoradas

Confirme a importância

Dados de teste/simulação

Produz amostra realista

Sem PII, controle de realismo

Os testes gerenciam a qualidade, não a garantem

A alta cobertura dos testes transmite confiança, mas também pode ser enganosa: 100% de cobertura significa que “todas as linhas foram executadas”, e não “todas as linhas estão corretas”. É fácil aumentar a cobertura com IA; O valor real está em escrever expectativas significativas. O valor de um teste é sua capacidade de quebrar e alertá-lo quando o código for quebrado. É por isso que os testes gerados por IA são baseados na pergunta “o código realmente quebra quando muda?” Teste com a pergunta; Quebrar uma linha deliberadamente e ver o teste quebrar (ideia de mutação) é prova de que o teste funcionou.

Dica: para ver se um teste que a IA escreve funciona, crie um pequeno bug no código (por exemplo, altere um + para um -) e veja se o teste falha. Se não quebrar, esse teste não protege você.

Erros comuns

  • Pedir um teste sem dar a regra. O modelo congela o comportamento atual; corrige o erro como "true".
  • Aceitar expectativas sem lê-las. O teste é enganoso se você não verificar se as afirmações estão verificando o valor correto.
  • Apenas testando o caminho feliz. Os erros reais vivem nas margens; Peça casos extremos explicitamente.
  • Confundindo o escopo com o propósito. Uma percentagem elevada não é garantia de comportamento correto.
  • Tornando dados reais/ocultos como dados de teste. Os dados ou segredos do cliente não devem entrar em testes e armazenamento; Gere dados sintéticos.

Em resumo

A IA elimina grande parte da carga repetitiva de escrever testes: ela produz esqueletos rápidos, grandes listas de casos extremos e análises de lacunas de cobertura. Mas o ponto mais crítico são as expectativas: a IA tende a testar o comportamento atual do código, enquanto os testes devem ser escritos de acordo com a especificação. Dê a regra, verifique as expectativas, aplique casos extremos e teste se os testes realmente protegem injetando um bug. A cobertura de testes é uma ferramenta, não um objetivo.

Tarefa de aplicativo

Selecione uma função e primeiro imprima um teste para a IA simplesmente fornecendo seu código; Observe as expectativas. Em seguida, imprima o teste novamente, fornecendo a especificação (comportamento necessário) para a mesma função. Compare as expectativas dos dois conjuntos de testes: há algum diferente, qual deles revela um bug real? Por fim, verifique se um dos testes gerados funcionou adicionando um bug intencional ao código e vendo o teste ser interrompido.

lista de verificação

  • [] Eu distingo se o teste é para corrigir ou verificar o comportamento.
  • [] Quando solicito um teste, forneço a regra (especificação) que deve estar em vigor, não o código.
  • [] Comparo cada afirmação gerada com a especificação.
  • [] Solicito explicitamente casos extremos e de falha.
  • [ ] Vejo a cobertura percentual como uma ferramenta, não como uma meta.
  • [] Eu testo se um teste realmente protege injetando erros.