QA · Leitura de 9 min

Como projetar casos de teste que realmente encontram bugs

Classes de equivalência, valores limite, tabelas de decisão: técnicas que transformam 'o que eu testo?' em um método reproduzível em vez de intuição que se esgota.

A resposta curta é esta: você projeta casos de teste que realmente encontram bugs quando para de improvisar entradas e passa a aplicar técnicas que cobrem o risco com poucos casos bem escolhidos. As três que mais rendem são classes de equivalência, análise de valores limite e tabelas de decisão. Elas não testam tudo, porque testar tudo é impossível; testam o que importa, e fazem isso de um jeito que qualquer pessoa consegue repetir.

Todo testador cedo ou tarde esbarra no mesmo muro: as combinações possíveis de um formulário simples já são mais do que você conseguiria executar em toda a sua vida. Um campo de idade que aceita números de 0 a 120, outro de país com 200 opções, um desconto que depende de três condições. Multiplique e o resultado é um número absurdo. Testar caso a caso não é meticulosidade, é render-se à força bruta. E a força bruta se esgota antes dos bugs.

01 · o problemaInfinitos testes possíveis, tempo finito

O ponto de partida do projeto de testes é aceitar uma verdade incômoda que o ISTQB coloca entre seus princípios fundamentais: o teste exaustivo é impossível, salvo em casos triviais. Você não consegue exercitar todas as entradas nem todas as combinações. Então a pergunta útil nunca é "como testo tudo?", e sim "qual pequeno subconjunto de testes me dá a maior confiança pelo menor esforço?".

É aqui que a intuição falha. Um testador experiente "sente o cheiro" de onde está o risco, mas essa intuição não se documenta nem se ensina. As técnicas de projeto fazem o contrário: transformam esse faro em um procedimento. Você dá as mesmas regras a duas pessoas e obtém quase os mesmos casos. É isso que significa reproduzível, e é o que separa uma suíte profissional de uma lista de palpites.

Testar tudo é impossível. Escolher bem o que testar é a habilidade inteira.

As técnicas a seguir são de caixa preta: você projeta os casos olhando para o que o sistema deve fazer, não para como está escrito por dentro. Você não precisa ler o código. Precisa entender a especificação e saber onde os erros costumam se esconder.

02 · classes e limitesParticione o problema e ataque as bordas

A primeira técnica é o particionamento em classes de equivalência. A ideia é simples e poderosa: você agrupa as entradas possíveis em classes onde o sistema deveria se comportar da mesma forma, e testa um único representante de cada classe. Se um campo de idade aceita 0 a 120, você tem três classes evidentes: os valores abaixo (inválidos), os válidos, e os acima (inválidos). Não é preciso testar 43 e 44 e 45; se o sistema trata bem o 44, tratará bem todos os seus vizinhos de classe. Um caso por classe, não cem.

A segunda técnica corrige o ponto cego da primeira. Os bugs não se distribuem de modo uniforme: concentram-se nas bordas. Um programador escreve < onde deveria escrever <=, e o erro só aparece bem no limite. Por isso a análise de valores limite testa os extremos de cada classe e seus vizinhos imediatos. Para o intervalo 0 a 120, você não testa um número qualquer do meio: testa -1, 0 e 1 na borda inferior, e 119, 120 e 121 na superior. É ali que o software quebra.

Figura 1 · classes de equivalência e seus valores limite
inválida válida (0 a 120) inválida -1 0 120 121 Um representante por classe; as bordas, com lupa.
As classes dizem onde não repetir esforço. Os valores limite dizem onde concentrá-lo: bem na fronteira, que é onde o código costuma errar por um.
Por que essas duas andam sempre juntas

As classes de equivalência sem valores limite deixam escapar o bug mais comum da programação: o erro de fronteira. Os valores limite sem classes fazem você testar bordas de tudo, sem critério. Juntas se equilibram: as classes reduzem a quantidade de casos, os limites aumentam a probabilidade de que cada caso cace algo. O ISTQB as ensina emparelhadas por essa razão.

03 · a lógicaTabelas de decisão para regras de negócio

Classes e limites funcionam às mil maravilhas quando cada entrada é testada por conta própria. Mas muito software não é assim: a saída depende de combinações de condições. "Se o cliente é premium e o carrinho passa de 50 euros e é a sua primeira compra, aplica desconto dobrado." Aí não basta testar cada condição isolada, porque o bug mora na interação entre elas.

A técnica correta é a tabela de decisão. Você lista as condições de entrada em cima, as ações ou resultados embaixo, e cada coluna é uma combinação possível com seu resultado esperado. Com três condições binárias você tem oito combinações; a tabela obriga você a olhar todas e a decidir, com a especificação na mão, o que deveria acontecer em cada uma. O revelador é o que ocorre quase sempre: ao preencher a tabela você descobre combinações que ninguém havia pensado e para as quais a especificação nada diz. Essa lacuna é um bug antes de escrever um único teste.

Figura 2 · tabela de decisão para um desconto com duas regras
Condição C1 C2 C3 C4 Cliente premium Sim Sim Não Não Carrinho maior que 50 Sim Não Sim Não Resultado Dobrado Simples Simples Nenhum
Cada coluna é um caso de teste com seu resultado esperado já definido. Se ao construí-la você não sabe o que colocar em alguma célula, encontrou um vazio nas regras antes de tocar no código.

Quando a explosão de combinações é enorme, você não testa todas. Aí entram variantes como o teste por pares, que reduz centenas de combinações a algumas dezenas sem perder quase nada de cobertura de defeitos. O princípio é o mesmo de todo o artigo: não cobrir cada combinação, mas cobrir o risco com o mínimo de casos.

A tabela não só gera casos: mostra as regras que ninguém escreveu.

04 · o critérioQuando usar cada técnica e como documentá-la

Nenhuma técnica é a boa em abstrato; cada uma responde a uma forma de risco. O guia prático é este: se o campo tem intervalos ou conjuntos de valores, use classes de equivalência com valores limite. Se o resultado depende da combinação de várias condições, use tabela de decisão. Se o comportamento depende da ordem das coisas ou do estado do sistema, falta uma quarta técnica, a transição de estados, que merece o seu próprio artigo.

E há uma regra que envolve todas elas: um caso de teste sem resultado esperado definido de antemão não é um caso de teste, é uma exploração. A potência dessas técnicas é que o resultado esperado sai da especificação, não de olhar o que o sistema fez e dar por bom. Sem esse oráculo prévio, você não está testando: está confirmando o seu próprio viés.

Tudo isso se conecta a algo maior do que a caça aos bugs. A norma ISO/IEC 25010 define a qualidade do software em atributos como a correção funcional, e as técnicas de projeto de casos são, literalmente, a maneira de evidenciar que esse atributo se cumpre. Não é burocracia: é a diferença entre afirmar "isto funciona" e poder mostrar com quais casos, escolhidos com qual critério, você comprovou. O ISTQB coloca essas técnicas no centro da formação de um testador precisamente por isso: são a ponte entre a intuição e o método.

Então, da próxima vez que sentir a vertigem dos infinitos testes possíveis, não comece a digitar entradas ao acaso. Pergunte primeiro: isto são intervalos, combinações ou estados? A resposta diz qual técnica tirar da caixa, e de repente o problema deixa de ser infinito e passa a ser uma lista curta, ordenada e, acima de tudo, repetível.

Fontes

  1. ISTQB (International Software Testing Qualifications Board). Certified Tester Foundation Level (CTFL) Syllabus. Capítulo sobre técnicas de prueba de caja negra: partición de equivalencia, análisis de valores límite y tablas de decisión; principio de imposibilidad de la prueba exhaustiva. istqb.org.
  2. Myers, G. J., Sandler, C. & Badgett, T. (2011). The Art of Software Testing (3.ª ed.). John Wiley & Sons. (Obra clásica que formaliza el análisis de valores límite y la partición en clases de equivalencia.)
  3. ISO/IEC 25010:2011. Systems and software engineering. Systems and software Quality Requirements and Evaluation (SQuaRE). System and software quality models. International Organization for Standardization. (Modelo de calidad; atributo de idoneidad/corrección funcional.)
  4. ISO/IEC/IEEE 29119-4. Software and systems engineering. Software testing. Part 4: Test techniques. (Estándar internacional que cataloga las técnicas de diseño de pruebas basadas en especificación.)

Aprenda mais sobre IA

Ver tudo Aprenda IA