Unidade 6 / 11

Geração de Testes com Inteligência Artificial: Testes Unitários, de Interface e Automação

Ganhos:

  • Capacidade de produzir testes unitários, de integração e de UI com inteligência artificial de acordo com a pirâmide de testes e cobrir situações de limite e erro, bem como cenários felizes
  • Capacidade de eliminar testes vazios/inúteis e cobertura inchada, verificando se cada teste gerado realmente valida um comportamento
  • Garantir que o teste detecte o bug e evite que ele seja corrigido, informando à IA o que o código deve fazer

Escrever código é metade do trabalho; Provar que o código funciona corretamente é a outra metade. Os aplicativos móveis encontram centenas de dispositivos, tamanhos de tela, versões de sistemas operacionais e comportamentos de usuários diferentes. É impossível testar tudo isso manualmente; É por isso que os testes automatizados (teste de código — testes executados sem um clique humano) são a espinha dorsal da qualidade móvel. A IA é incrivelmente eficiente na escrita de testes porque escrever testes é exatamente o tipo de trabalho de padrão que ela gosta: validar um comportamento específico para entradas específicas. Nesta unidade, aprenderemos como acelerar testes unitários, testes de interface e automação com IA, mas garantir a qualidade do teste através do olhar humano.

Pirâmide de testes: o que testar e quanto

Uma estratégia de testes saudável se assemelha a uma pirâmide. A base inclui um grande número de testes unitários (testes rápidos que testam uma única função ou classe isoladamente); eles são rápidos e baratos. No meio, há menos testes de integração (testando como várias partes funcionam juntas). Na parte superior há testes mínimos de UI/ponta a ponta (testes feitos clicando na tela conforme o usuário faz); eles são realistas, mas lentos e frágeis. A IA ajuda em todas as camadas, mas o maior valor está na base: produzir rapidamente testes unitários de lógica de negócios.

Tipo de teste

Escopo

velocidade

Eficiência de IA

teste unitário

Função/classe única

muito rápido

muito alto

integração

camada intermediária

médio

alto

UI / ponta a ponta

Todo o fluxo de tela

lento

Médio (frágil)

Dica: ao dizer à IA para "gerar testes para esta função", peça explicitamente casos extremos: entrada vazia, nulo, número negativo, valor muito grande, erro de rede. A IA produz um caminho feliz facilmente; Os verdadeiros erros se escondem nas fronteiras e saltam à tona se você não os quiser lá.

Etapas para escrever testes com IA

  1. Defina o comportamento a ser testado. "Esta função deve fornecer esta saída para esta entrada."
  2. Especifique a estrutura. JUnit + MockK no Android, XCTest no iOS, Espresso (Android) ou XCUITest (iOS) para UI.
  3. Peça estados limites. Cenário feliz + erro + pontos de interrupção.
  4. Gerenciar objetos simulados. Dependências externas, como rede e banco de dados, são emuladas para teste (simulação – simulação controlada em vez do serviço real).
  5. Execute o teste e verifique. O teste passa, confirma algo verdadeiramente significativo?

O quinto passo é crítico. A IA às vezes produz testes inúteis que “sempre passam”; por exemplo, um teste que não verifica nada ou verifica seus próprios dados falsos. Um teste de aprovação e um teste valioso são coisas diferentes.

Cuidado: Só porque a IA pode produzir não significa que o teste esteja correto. Às vezes, a IA aceita o comportamento atual (talvez defeituoso) do código como "correto" e escreve os testes de acordo. Esses testes corrigem o bug em vez de detectá-lo. Você determina o que o teste espera; Diga à IA o que ela deve fazer, não o que o código faz.

Medida de cobertura de teste e falácia

A cobertura de teste (qual porcentagem de código é executada por testes) é uma métrica útil, mas enganosa. 90% de cobertura indica que 90% do código foi executado; mas não foi verificado se essas linhas estão funcionando corretamente. Um teste que executa uma linha e não verifica o resultado aumenta o escopo, mas não fornece segurança. O objetivo não são números elevados, mas uma validação significativa. Você pode expandir rapidamente com IA, mas certifique-se de que cada teste realmente teste um comportamento.

três mini cases

Caso 1 — Situação fronteiriça detectada. Foram solicitados à IA testes para uma função de transferência de dinheiro em um aplicativo bancário e, especificamente, foram adicionados cenários de “valor negativo” e “mais que saldo”. O teste revelou que a transferência não foi bloqueada com valor negativo; isso seria uma grande vulnerabilidade de segurança na produção. Fechado adicionando um controle de uma linha. Lição: os testes de limite são os testes mais valiosos.

Caso 2 — Teste falso. Uma equipe ficou aliviada ao aumentar a cobertura para 85% com 40 testes unitários produzidos por IA. Durante a inspeção, constatou-se que a maioria dos testes não verificaram realmente nenhuma saída, apenas chamaram a função e escreveram assertTrue(true). A cobertura era alta, mas a proteção era zero. Os testes foram revisados ​​e reescritos com validações reais. Lição: os números de cobertura podem mentir.

Caso 3 — Testes de IU acelerados. Uma equipe de comércio eletrônico escreveu um script XCUITest do fluxo adicionar ao carrinho com IA em 20 minutos; Se fosse escrito à mão, demoraria meio dia. Identificadores de elementos de tela adivinhados pela IA; A equipe combinou-os com o código real e os corrigiu. A velocidade do rascunho é real, mas a verificação do identificador é um trabalho humano.

Alerta fraco / Alerta forte

Prompt fraco: "Escreva um teste para esta função."

Prompt poderoso: "Produza testes de unidade para esta função Kotlin com JUnit5 + MockK. Função: transferência de dinheiro (valor, origem, destino). Comportamentos a serem testados (o que o código deve FAZER): - A transferência válida deve ser bem-sucedida - Valor negativo ou zero deve ser rejeitado - Valor maior que o saldo deve ser rejeitado - Erro de rede deve gerar a exceção apropriada Cada teste deve verificar apenas uma coisa, seus nomes devem ser descritivos, zombar do serviço externo. Não escreva uma afirmação vazia."

Modelos copiáveis

Modelo de teste de unidade: "Gerar testes de unidade [JUnit/XCTest] para esta função para [idioma]. Comportamento esperado: [o que fazer]. Incluir: cenário feliz, entrada nula, pontos de interrupção, caso de erro. Deixe cada teste verificar o comportamento único; use asserção significativa; simulação. [código]"

Modelo de teste de UI: "Escreva um teste de UI do seguinte fluxo com [Espresso/XCUITest]: [fluxo do usuário passo a passo]. Selecione os elementos da tela com o ID de acessibilidade, use o ID em vez do texto. Adicione a estratégia de espera. Lembre-me de combinar os IDs dos elementos com o código real."

Modelo de auditoria de teste:"Examine estes testes:1) Eles realmente verificam uma saída/comportamento ou são nulos?2) Eles cobrem casos limites?3) Eles corrigem bugs no código ou esperam comportamento correto?Sinalizam e fortalecem testes fracos. [testes]"

Modelo de otimização de cobertura: "Identifique partes não testadas desta classe e sugira testes significativos. Priorize caminhos com risco real, não apenas o número de coberturas. [código]"

Erros comuns

  • Apenas testando o cenário feliz. Os erros são armazenados em estados limites; Peça-os abertamente.
  • Aceitando um teste vazio/inútil. Testes do tipo assertTrue(true) aumentam o escopo e não fornecem proteção.
  • Fazer com que a IA verifique o que o código está fazendo. O teste deve esperar o que o código deve fazer; caso contrário, corrige o bug.
  • Confundindo o número do escopo com a finalidade. 90% de cobertura não significa 90% de precisão.
  • Link para texto em testes de UI. O teste é interrompido quando o texto muda; Use identificador estável (id).
  • Configurando simulações incorretamente. O “teste unitário” que chama o serviço real será lento e frágil.

Resumindo

Os testes são a espinha dorsal da qualidade móvel e a IA é muito eficiente nessa área, especialmente em testes unitários. Siga a pirâmide de testes: muitas unidades, integração média, poucos testes de UI. Peça explicitamente à IA o cenário feliz, bem como casos limites e caminhos de erro. Certifique-se de que cada teste gerado realmente valida um comportamento; Testes vazios e cobertura inflacionada são enganosos. Mais importante ainda, diga à IA o que o código deve fazer, e não o que faz, para que o teste detecte o bug e não o corrija.

Tarefa de aplicativo

Solicite testes da IA usando o “modelo de teste unitário” para uma função lógica de negócios (por exemplo, cálculo de desconto ou validação de formulário) e especifique explicitamente casos limites (nulo, negativo, muito grande). Execute os testes gerados e audite os mesmos testes com o "Modelo de auditoria de teste". Encontre pelo menos um teste fraco, fortaleça-o e teste se os testes detectam um erro real da função (adicionando um pequeno bug).

lista de verificação

  • [] Selecionei a camada apropriada para a pirâmide de teste (unidade de prioridade)
  • [] Eu queria casos de limite e erro além do cenário feliz
  • [] Verifiquei que cada teste contém uma afirmação significativa
  • [] Eu disse à IA o que o código deveria fazer, não o que ele faz
  • [ ] Concentrei-me nos caminhos de risco reais, não no número de coberturas
  • [] Usei identificador estável em testes de UI, não vinculei ao texto