Como saber se o teste do código feito com IA mede de verdade?
Quebrando o código de propósito e conferindo que o teste reprova pelo motivo certo. Em Myths' Valley, cada teste automatizado se chama portão, e cada fatia do jogo entra num commit com portão e falsificação: uma ferramenta troca um trecho do código, roda o portão, confere a mensagem de erro esperada e restaura o arquivo. Em uma frase: portão que passa não é portão que mede.
A pergunta que importa
Num projeto feito com inteligência artificial, a pergunta útil não é "a IA escreve código bom?". É "como saber se o código continua bom depois que alguém, humano ou não, mexeu ao lado?". Myths' Valley respondeu com um vocabulário próprio. Teste automatizado é portão: roda sem janela, mede uma coisa só e sai com código 1 quando reprova. O nome de cada um diz o defeito que ele existe para não deixar voltar. Ao fim da primeira semana, o jogo 2D tinha 47.
A regra de ouro, escrita no primeiro dia e repetida em todo documento desde então, é que cada fatia do jogo entra num commit com portão e falsificação. O README do jogo 2D resume o porquê: "Comportamento novo sem portão novo é comportamento que vai voltar a quebrar."
Dois jeitos de um verde não valer nada
O documento de instruções para agentes do jogo 2D descreve duas falhas que aconteceram de verdade.
A primeira: a rede de segurança fecha o teste. Na cena em que Pedro vai buscar os machados, há um teto de vinte segundos, depois do qual ele simplesmente aparece na porta, para o tutorial nunca travar. Mas, com a caixa de fala aberta, Pedro não anda. O teste media um Pedro congelado e passava, resgatado pelo teto. Verde, e sem valor.
A segunda: a expectativa de quebra não casa por causa de um acento. O falsificador procura um trecho literal da mensagem de erro. "esta pedindo" não casa com "está pedindo", e a ferramenta acusa o portão quando quem errou foi a expectativa. A lição ficou escrita: escolha um pedaço da frase sem acento nenhum.
Um acento me fez acreditar num portão que não testava nada. Desde então, desconfio de verde fácil.
Código de saída zero não prova nada
No motor do jogo, o Godot, um erro de compilação não derruba o jogo: deixa o nó sem script, e a cena segue. "Já aconteceu: um IdiomaMenu.sufixo() sem o preload passou por onze testes e só reprovou no décimo segundo." Por isso a bateria passou a contar também os erros de análise na saída, e não só o código de saída. Pelo mesmo motivo, "travou" é um resultado tão ruim quanto "reprovou": todo portão tem teto de tempo, e o runner encerra só o processo que ele mesmo abriu, pelo número do processo.
O falsificador
A ferramenta de falsificação nasceu de dois acidentes numa tarde: um comando sed com âncora frouxa apagou seis instruções continue de uma vez, e uma rodada interrompida no meio deixou um arquivo sem uma linha. "Dano silencioso faz a rodada seguinte culpar o portão errado." Por isso ela troca texto literal em vez de expressão regular, diz quantas trocas fez, separa "reprovou" de "nem compilou" e restaura o arquivo ao fim, aconteça o que acontecer. As quebras ficam numa tabela, uma por linha: o arquivo, o trecho a trocar, o trecho novo e a mensagem esperada. E há duas regras de convivência: não editar o repositório enquanto ele roda, e não pará-lo à força, porque isso deixa o arquivo quebrado.
Comando para a sua IA
Faça uma falsificação do teste [nome do teste]: 1. Escolha um trecho do código que esse teste deveria proteger. 2. Troque o trecho por texto literal, sem expressão regular, e me diga quantas trocas fez. 3. Rode só esse teste, com teto de tempo, e diga se ele reprovou, travou ou nem compilou. 4. Confira se a saída contém a mensagem esperada; escolha um pedaço da mensagem sem acentos. 5. Restaure o arquivo e mostre que o diff ficou vazio. Se o teste passar com o código quebrado, não conserte nada: explique o que ele está medindo de fato.
O que fica para qualquer equipe
Toda mudança feita com IA entra com um teste, e o teste é furado de propósito. E as lições ficam escritas onde a IA as relê: no 3D, o assistente anotou na própria memória dezenas de armadilhas dos portões, cada uma paga com uma bateria de 55 minutos. O livro vê nesse acúmulo talvez a parte menos visível e mais valiosa do uso de IA no projeto: não a velocidade com que o assistente escreve, mas o fato de ele parar de repetir os erros que já cometeu.
No glossário Portão Falsificação Runner Bateria
Perguntas frequentes
O que é falsificar um teste?
É quebrar o código de propósito, por uma tabela de quebras, e conferir que o teste correspondente reprova pelo motivo esperado. Ao fim, a ferramenta restaura o arquivo. Teste que passa com o código quebrado não está medindo o que diz medir.
Por que um teste verde pode não valer nada?
Em Myths' Valley aconteceu de dois jeitos: uma rede de segurança de vinte segundos resgatava um personagem congelado e o teste passava; e a mensagem esperada não casava por causa de um acento, o que acusava falha num teste que estava certo.
Como aplicar isso fora do desenvolvimento de jogos?
Num pipeline de dados, renomeie uma coluna de propósito e confira que a validação de esquema barra a carga antes de o relatório sair. Num robô, compare as contagens de entrada e de saída a cada execução, porque terminar com sucesso pode significar zero linhas processadas.
