Particionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos

  1. Início
  2. Blog
  3. Teste de Software

Teste de software

Particionamento de equivalência: Técnica de design de teste explicada com exemplos resolvidos

Você não pode testar todas as entradas possíveis, então quais valores você deve escolher? O particionamento de equivalência fornece uma resposta clara. Aprenda o método passo a passo, trabalhe com exemplos reais e veja onde ele precisa de ajuda.

8 min de leitura
Técnica de design de teste de particionamento de equivalência explicada com exemplos resolvidos

Principais pontos

  • O particionamento de equivalência divide as entradas em grupos que devem se comportar da mesma maneira.
  • Você testa um valor representativo de cada grupo em vez de todos os valores.
  • Sempre inclua partições inválidas, já que o tratamento de erros é onde muitos bugs se escondem.
  • Funciona melhor junto com a análise de valor limite, porque os bugs geralmente ficam nas bordas de um grupo.

Um campo de idade que aceita de 18 a 60 anos possui um número enorme de entradas possíveis, uma vez que você conta negativos, números enormes, texto e espaços em branco. Ninguém pode experimentar todos eles. O particionamento de equivalência resolve isso agrupando entradas que o software deve tratar da mesma maneira e testando um valor de cada grupo.

É uma das primeiras técnicas de design de teste que todo testador deve aprender. Neste guia, trabalhamos passo a passo e testamos um exemplo em Python. Executamos esse código no Python 3.13 e sua saída está incluída. As regras de senha e cupom abaixo são exemplos ilustrativos, não retirados de um sistema real.

O que é particionamento de equivalência?

O particionamento de equivalência, também chamado de particionamento de classe de equivalência (ECP), é uma técnica de design de teste de caixa preta. Ele divide as entradas possíveis de um recurso em partições, ou classes. Espera-se que cada valor dentro de uma partição produza o mesmo tipo de comportamento.

Como não é necessário ver o código, você pode aplicá-lo diretamente de um requisito. Para saber mais sobre esse estilo de teste, leia teste de caixa preta versus caixa branca.

Por que funciona

A técnica baseia-se em uma suposição: se um valor em uma partição encontrar um bug, os outros naquela partição provavelmente também o encontrarão. E se um valor for aprovado, os outros provavelmente também serão aprovados. Testar 25, 26 e 27 em um campo de idade adulta provavelmente não dirá nada que o teste 25 sozinho não diga.

Abordagem Testes para um campo de idade Resultado
Exaustivo Todo valor possível Impossível na prática
Adivinhação aleatória O que quer que venha à mente Duplicatas e lacunas
Particionamento de equivalência Um por partição Pequeno, com cobertura deliberada

É uma suposição, porém, e não uma garantia. O software pode ter casos especiais ocultos dentro de uma partição, uma limitação à qual voltaremos mais tarde.

Como fazer isso em cinco etapas

  1. Leia o requisito e identifique a entrada e suas regras.
  2. Encontre as partições válidas, que são os grupos de valores que devem ser aceitos e observe se intervalos diferentes se comportam de maneira diferente.
  3. Encontre as partições inválidas, incluindo valores muito baixos, muito altos, do tipo errado e em branco.
  4. Escolha um valor representativo de cada partição, geralmente em algum lugar no meio.
  5. Anote o resultado esperado para cada um, como em qualquer bom caso de teste.

Exemplo resolvido: um campo de idade

Requisito: Podem se cadastrar usuários de 18 a 60 anos.

Partição Tipo Valor de teste Resultado esperado
Abaixo de 18 Inválido 10 Rejeitado
18 a 60 Válido 35 Aceito
Acima de 60 Inválido 75 Rejeitado
Não é um número Inválido “abc” Erro
Em branco Inválido (empty) Mensagem “Obrigatório”

Cinco testes fornecem cobertura de todos os comportamentos do requisito. Muitos tutoriais param nas três primeiras linhas, mas as duas últimas são aquelas que usuários reais acionam por acidente. Você também pode adicionar linhas para números negativos ou decimais, se eles puderem ser tratados de maneira diferente.

Testando em código

Aqui está essa regra como uma função, com um teste de unidade por partição, usando o recurso interno do Python unittest:

import unittest

def can_register(age):
    if not isinstance(age, int) or isinstance(age, bool):
        raise TypeError("age must be a whole number")
    return 18 <= age <= 60

class EquivalenceTests(unittest.TestCase):
    def test_valid_partition(self):
        self.assertTrue(can_register(35))

    def test_too_young_partition(self):
        self.assertFalse(can_register(10))

    def test_too_old_partition(self):
        self.assertFalse(can_register(75))

    def test_wrong_type_partition(self):
        with self.assertRaises(TypeError):
            can_register("abc")

Nossa corrida passou:

test_too_old_partition ... ok
test_too_young_partition ... ok
test_valid_partition ... ok
test_wrong_type_partition ... ok

Em um projeto real, o recurso de parametrização do pytest é uma maneira interessante de executar uma tabela de valores de partição por meio de um único teste.

Exemplo resolvido: uma senha

Requisito: Uma senha deve ter de 8 a 20 caracteres e conter pelo menos um dígito.

Este tem duas regras, comprimento e conteúdo, por isso consideramos partições para ambos:

Partição Tipo Valor de teste Resultado esperado
Comprimento válido, tem um dígito Válido nascer do sol42 Aceito
Muito curto Inválido abc1 Erro: muito curto
Muito longo Inválido Um valor de 30 caracteres com um dígito Erro: muito longo
Comprimento válido, sem dígito Inválido nascer do sol Erro: dígito necessário
Em branco Inválido (empty) Erro: obrigatório

Observe que cada teste inválido quebra apenas uma regra. Se um valor fosse muito curto e faltasse um dígito, um teste aprovado não poderia dizer qual verificação funcionou. Uma verificação pode ser quebrada, enquanto a outra esconde o fato.

Exemplo resolvido: entradas não numéricas

A técnica não se limita a intervalos numéricos. Opções, categorias e estados discretos também formam partições. Suponha que uma loja tenha esta regra:

Requisito: A entrega é gratuita para membros Gold, 50 para Silver e 100 para todos os demais. Valores de camada desconhecidos são erros.

Partição Valor de teste Taxa esperada
Ouro ouro 0
Prata prata 50
Sem assinatura (none) 100
Camada desconhecida platina Erro

Aqui, cada opção é sua própria partição, pois cada uma deve se comportar de maneira diferente. Outras partições comuns incluem tipos de arquivos, como uploads válidos e inválidos, e grupos baseados em resultados, como um empréstimo sendo aprovado ou recusado.

Dica: Pense tanto nas saídas quanto nas entradas. Se um cálculo puder produzir um desconto, nenhum desconto ou um aviso, certifique-se de que pelo menos um teste atinja cada um desses resultados.

Várias entradas ao mesmo tempo

Com vários campos, o número de combinações cresce rapidamente. Três campos com quatro partições cada fornecem 64 combinações. Duas estratégias ajudam:

  • Cobertura fraca: certifique-se de que cada partição apareça em pelo menos um teste, combinando vários valores válidos por teste. Para valores inválidos, teste um de cada vez para que os erros não se mascarem.
  • Cobertura baseada em regras: quando as combinações realmente alteram o resultado, como o status do membro com o valor do pedido, use o teste da tabela de decisão para listá-las corretamente.

Emparelhamento com análise de valor limite

O particionamento informa quais grupos testar. Diz pouco sobre onde em um grupo os bugs gostam de se esconder, e muitos se escondem bem nas bordas. Para mostrar isso, escrevemos uma versão com bugs com o clássico erro off-by-one:

def buggy(age):
    return 18 < age <= 60     # should be 18 <= age

[buggy(a) for a in (35, 10, 75)]   # [True, False, False]
buggy(18)                          # False

Nossos valores de partição, 35, 10 e 75, deram as respostas corretas, então esses testes seriam aprovados. No entanto, um jovem de 18 anos é rejeitado injustamente. É por isso que as duas técnicas estão juntas:

Técnica Escolhe Valores para idades de 18 a 60 anos
Particionamento de equivalência Um valor dentro de cada grupo 10, 35, 75
Análise de valor limite Valores nas bordas de cada grupo 17, 18, 60, 61

Use o particionamento para encontrar os grupos e, em seguida, os limites para testar onde os grupos se encontram. Em nosso código, um teste separado para 17, 18, 60 e 61 passou na função correta e detectaria esse bug. Nosso guia de análise de valor limite cobre isso na íntegra.

Vantagens e limitações

Vantagens Limitações
Reduz bastante o número de testes Depende de as partições estarem corretas
Oferece uma cobertura clara e explicável Pode perder bugs nos limites
Não precisa de acesso ao código Pode perder casos especiais ocultos
Aplica-se antecipadamente, mesmo a partir de requisitos Não modela bem sequências ou combinações

O maior risco é uma suposição incorreta. Se o código tiver uma regra oculta para um valor específico, o teste escolhido pode simplesmente não alcançá-la. Testes exploratórios e cobertura de código ajudam você a encontrar o que as partições perderam.

Erros comuns

  • Esquecimento de partições inválidas. Testar apenas caminhos felizes deixa o tratamento de erros desmarcado.
  • Testando vários valores de uma partição. Isso adiciona custos sem novas informações.
  • Combinar vários valores inválidos em um teste. Um erro pode ocultar outro.
  • Ignorando limites. Os testes de partição por si só muitas vezes deixam passar bugs isolados.
  • Adivinhar as regras. Se um requisito não estiver claro, pergunte. 60 deveriam incluir pessoas com 60 anos e meio?

Considerações finais

O particionamento de equivalência substitui “quantos testes devo escrever?” com uma pergunta muito melhor: “quais comportamentos existem e eu abordei cada um deles?” Para experimentar, pegue o formulário que você está testando hoje e liste suas partições no papel, inclusive as inválidas. Adicione limites a seguir. Freqüentemente, você acabará com menos testes que encontrarão mais bugs.

Perguntas frequentes

O que é particionamento de equivalência em testes?

É uma técnica de caixa preta que divide as entradas em grupos que se espera que se comportem da mesma forma. Em seguida, você testa um valor representativo de cada grupo, não todos os valores.

Qual é a diferença entre particionamento de equivalência e análise de valor limite?

O particionamento escolhe um valor dentro de cada grupo. A análise de valor limite testa os valores nas bordas desses grupos. Eles geralmente são usados ​​juntos.

Quantos casos de teste o particionamento de equivalência precisa?

Geralmente pelo menos um por partição, válido e inválido. Um campo de faixa etária geralmente precisa de cerca de três a cinco testes.

O particionamento de equivalência é caixa preta ou caixa branca?

É uma técnica de caixa preta, pois as partições vêm de requisitos e não precisam de código. No entanto, os desenvolvedores também podem aplicá-lo a testes de unidade.

O que são partições válidas e inválidas?

As partições válidas contêm valores que o sistema deve aceitar. As partições inválidas contêm valores que devem ser rejeitados, como números fora do intervalo, tipos errados e espaços em branco.

Continue aprendendo

Trabalhe com Stack Quora

Precisa de ajuda com testes, WordPress ou SEO?

Ajudamos as equipes a fornecer software melhor e a expandir seus sites. Conte-nos no que você está trabalhando e sugeriremos um próximo passo claro.

Continue lendo

Mais guias sobre testes, IA e desenvolvimento moderno

Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.

Inteligência artificial

Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las

Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…

Leia o artigo →
DevOps

Variáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos

Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…

Leia o artigo →
Desenvolvimento de software

Explicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429

Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…

Leia o artigo →
Automação de testes

Zombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem

Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…

Leia o artigo →
Teste de software

Cobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa

Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…

Leia o artigo →
Bancos de dados e SQL

DELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um

DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…

Leia o artigo →
Bancos de dados e SQL

Exibições SQL explicadas: crie, use e evite as armadilhas, com exemplos

Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…

Leia o artigo →
Desenvolvimento de software

Interface TypeScript vs tipo: diferenças reais, testadas com o compilador

Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…

Leia o artigo →
Desenvolvimento de software

Python *args e **kwargs explicados: funções flexíveis com exemplos claros

Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…

Leia o artigo →
Desenvolvimento de software

Funções Python Lambda: sintaxe, usos reais e quando não usá-los

Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …

Leia o artigo →
Inteligência artificial

O que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar

O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …

Leia o artigo →
DevOps

Monitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos

Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…

Leia o artigo →
DevOps

Docker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa

Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…

Leia o artigo →
Automação de testes

TDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um

TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…

Leia o artigo →
Teste de software

Teste de aceitação do usuário (UAT): processo, lista de verificação e exemplos reais

Explicação do teste de aceitação do usuário: quem o executa, como ele difere do controle de qualidade, um processo de sete etapas, um modelo de caso…

Leia o artigo →
Bancos de dados e SQL

Valores SQL NULL explicados: IS NULL, COALESCE, NULLIF e as armadilhas a serem evitadas

Valores SQL NULL explicados com consultas que executamos: lógica de três valores, IS NULL, COALESCE, NULLIF, como agregações, junções e classificaçã…

Leia o artigo →
Bancos de dados e SQL

Instrução SQL CASE WHEN: sintaxe, exemplos reais e erros comuns

SQL CASE WHEN explicado com consultas que executamos: formulários simples e pesquisados, ordem de condição, pivôs com SUM, truques COUNT, classifica…

Leia o artigo →
Desenvolvimento de software

O que é JWT? JSON Web Tokens explicados com um exemplo prático

O que é JWT? JSON Web Tokens explicados: as três partes, um token construído e adulterado no código que executamos, JWT vs sessões, armazenamento, t…

Leia o artigo →
Desenvolvimento de software

Loop de eventos JavaScript explicado: pilha de chamadas, microtarefas e temporizadores com exemplos

O loop de eventos JavaScript explicado com o código que executamos: pilha de chamadas, filas de tarefas e microtarefas, por que setTimeout 0 não é i…

Leia o artigo →
Desenvolvimento de software

Geradores Python e rendimento explicado: economize memória com exemplos reais

Geradores Python e rendimento explicados com o código que executamos: como eles pausam e reiniciam, medem economia de memória, pipelines, sequências…

Leia o artigo →
Inteligência artificial

O que são incorporações? Similaridade de vetores e cossenos explicada de forma simples

O que são incorporações? Um guia em linguagem simples para vetores, similaridade de cossenos e pesquisa semântica, com um pequeno exemplo que execut…

Leia o artigo →
DevOps

Implantação azul-verde vs canário: diferenças, compensações e como escolher

Explicação da implantação azul-verde versus canário: como cada um funciona, custo, risco e reversão, agrupamento estável de usuários que testamos, m…

Leia o artigo →
Automação de testes

Testes instáveis: o que os causa e como corrigi-los para sempre

Testes instáveis explicados com demonstrações que executamos: as principais causas, como confirmar e diagnosticar uma, soluções adequadas para tempo…

Leia o artigo →
Teste de software

Teste de carga versus teste de estresse: diferenças, métricas e exemplos k6

Teste de carga versus teste de estresse explicado: o que cada um prova, testes de pico e absorção, as métricas que importam, por que as médias engan…

Leia o artigo →
Teste de software

Caso de teste versus cenário de teste: principais diferenças, exemplos e quando usar cada um

Caso de teste vs cenário de teste explicado: definições claras, uma tabela lado a lado, um recurso de redefinição de senha retirado de cenários para…

Leia o artigo →
Bancos de dados e SQL

Otimização de consultas SQL: leia planos de execução e corrija consultas lentas, com intervalos

Otimização de consulta SQL testada em um milhão de linhas: leia planos de execução, adicione os índices corretos, corrija filtros não sargáveis, use…

Leia o artigo →
Bancos de dados e SQL

SQL UNION vs UNION ALL: diferenças, exemplos e desempenho testado

SQL UNION vs UNION ALL explicado com consultas que executamos: duplicatas, as regras que ambos seguem, um bug de dados real, desempenho medido, INTE…

Leia o artigo →
Desenvolvimento de software

Tutorial da API JavaScript Fetch: GET, POST, tratamento de erros e tempos limite

Um tutorial da API JavaScript Fetch testado em um servidor local: GET e POST, por que 404 não lança, um auxiliar reutilizável, strings de consulta, …

Leia o artigo →
Desenvolvimento de software

Manipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos

Manipulação de arquivos Python explicada com código que executamos: modos abertos, com, leitura de arquivos grandes, CSV, JSON, pathlib, arquivos bi…

Leia o artigo →
Desenvolvimento de software

Classes e objetos Python: tutorial OOP com exemplos reais

Classes e objetos Python explicados com código que executamos: __init__, métodos, atributos de classe vs instância, herança, propriedades, métodos d…

Leia o artigo →
Inteligência artificial

O que é um modelo de linguagem grande? Como funcionam os LLMs, explicado sem exageros

O que é um modelo de linguagem grande? LLMs explicados em linguagem simples: tokens, incorporações, atenção, treinamento, temperatura e janelas de c…

Leia o artigo →
DevOps

Comandos Linux para iniciantes: o guia essencial do terminal com exemplos

Comandos Linux para iniciantes, agrupados por tarefa: navegação, arquivos, visualização de logs, grep, pipes, permissões, processos e arquivos, com …

Leia o artigo →
Automação de testes

Selenium vs Playwright: principais diferenças, código comparado e qual escolher

Selenium vs Playwright comparado: arquitetura, espera, suporte a navegador e linguagem, depuração, o mesmo teste em ambas as ferramentas, conselhos …

Leia o artigo →
Teste de software

Particionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos

Explicação do particionamento de equivalência: como encontrar partições válidas e inválidas, exemplos resolvidos para idades, senhas e cupons, teste…

Leia o artigo →
Teste de software

Gravidade vs Prioridade em Testes de Software: Diferenças, Matriz e Exemplos Reais

Explicação da gravidade versus prioridade em testes de software: definições claras, uma matriz de quatro vias com exemplos, escalas de nível, quem d…

Leia o artigo →
Bancos de dados e SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas e EXISTS com exemplos

Um tutorial de subconsultas SQL com consultas que executamos: subconsultas escalares, IN, FROM e SELECT, subconsultas correlacionadas, EXISTS, a arm…

Leia o artigo →
Bancos de dados e SQL

Transações SQL e ACID explicados: COMMIT, ROLLBACK e níveis de isolamento

Transações SQL e ACID explicadas com uma transferência bancária que executamos: COMMIT, ROLLBACK, savepoints, locks, níveis de isolamento, leituras …

Leia o artigo →
Desenvolvimento de software

Git merge vs rebase: diferenças, exemplos e quando usar cada um

Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.

Leia o artigo →
Desenvolvimento de software

List comprehension em Python: sintaxe, exemplos e quando evitar

List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.

Leia o artigo →
Bancos de dados e SQL

SQL JOIN explicado com exemplos (Inner, Left, Right, Full)

Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…

Leia o artigo →