Exceto para os aplicativos de software mais comuns, geralmente considera-se impossível testar todas as combinações de
entrada logicamente praticáveis para um sistema de software. Portanto, a seleção de um bom subconjunto que tenha a
maior probabilidade de localizar o maior número de erros é uma tarefa importante e à qual vale a pena os testadores se
dedicarem.
O teste com base na análise de classe de equivalência (sinônimos: particionamento de equivalência, análise de
domínio) é uma forma de análise de teste de caixa preta que tenta reduzir o número total de testes possíveis para
um conjunto mínimo de testes que revelarão o número máximo de erros possível [MYE79]. Isso
consiste em um método que particiona o conjunto de entradas e saídas em um número finito de classes de equivalência que permitem a seleção de um valor de teste
representativo para cada classe. O teste que resulta do valor representativo para uma classe é chamado de "equivalente"
aos outros valores na mesma classe. Se nenhum erro foi localizado no teste do valor representativo, conclui-se que
todos os outros valores "equivalentes" também não identificariam quaisquer erros.
O poder das Classes de Equivalência está em sua capacidade de orientar o testador utilizando uma estratégia de
amostragem para reduzir a explosão combinatória de testes possivelmente necessários. A técnica fornece uma base lógica
por meio da qual pode-se selecionar um subconjunto do número total concebível de testes. Aqui estão algumas categorias
de áreas de problemas para um grande número de testes que podem beneficiar-se da consideração de classes de
equivalência:
-
Combinações de variáveis independentes
-
Variáveis dependentes baseadas no relacionamento hierárquico
-
Variáveis dependentes baseadas no relacionamento temporal
-
Relacionamentos em cluster com base em exemplos de mercado
-
Relacionamentos complexos que podem ser modelados
Há diferentes estratégias e técnicas que podem ser utilizadas no teste de partição de equivalência. A seguir são
apresentados alguns exemplos:
Teoria de partição de equivalência proposta por Glenford Myers [MYE79]. Tenta
reduzir o número total de casos de teste necessários, particionando as condições de entrada em um número finito de
classes de equivalência. As classes de equivalência são classificadas em dois tipos: o conjunto de entradas válidas
para o programa é considerado como a classe de equivalência válida e todas as outras entradas são incluídas na
classe de equivalência inválida.
Aqui está um conjunto de diretrizes para identificar as classes de equivalência:
-
Se uma condição de entrada especificar um intervalo de valores (por exemplo, o programa "aceita valores de 10 a
100"), uma classe de equivalência válida (de 10 a 100) e duas classes de equivalência inválidas serão identificadas
(menor que 10 e maior que 100).
-
Se uma condição de entrada especificar um conjunto de valores (por exemplo, "o tecido pode ter várias cores:
VERMELHO, BRANCO, PRETO, VERDE, MARROM"), uma classe de equivalência válida (os valores válidos) e uma classe de
equivalência inválida (todos os outros valores inválidos) serão identificadas. Cada valor da classe de equivalência
válida deverá ser manipulado distintamente.
-
Se a condição de entrada for especificada como uma situação "deve ser" (por exemplo, "a cadeia de entrada deve ser
em letras maiúsculas"), uma classe de equivalência válida (caracteres maiúsculos) e uma classe de equivalência
inválida (todas as outras entradas, exceto caracteres maiúsculos) serão identificadas.
-
Tudo concluído "por longo tempo" antes da tarefa estar pronta é uma classe de equivalência. Tudo pronto dentro de
um intervalo curto de tempo antes do programa ser concluído é uma outra classe. Tudo pronto exatamente antes do
programa iniciar uma outra operação é uma outra classe.
-
Se um programa for especificado para trabalhar com tamanho de memória de 64 M a 256 M. Então este tamanho é uma
classe de equivalência. Qualquer outro tamanho de memória, que seja maior que 256 M ou menor que 64 M, pode ser
aceito.
-
A partição do evento de saída fica nas entradas do programa. Mesmo que classes diferentes de equivalência de
entrada pudessem ter o mesmo tipo de evento de saída, ainda assim você trataria as classes de entrada
distintamente.
Em cada classe de equivalência, as condições de limite são consideradas como tendo uma taxa maior de sucesso ao
identificar defeitos resultantes do que as condições sem limite. As condições de limite são os valores de acordo com,
imediatamente acima de ou abaixo de, o limite ou "bordas" de cada classe de equivalência.
Os testes que resultam das condições de limite utilizam valores no mínimo (mín), logo acima do mínimo (mín+), logo
abaixo do máximo (máx-) e no máximo (máx) do intervalo precisa ser testado. Ao testarem valores de limite, os
testadores escolhem alguns casos de teste para cada classe de equivalência. Para a amostra relativamente pequena de
testes, a probabilidade de descoberta de defeito é alta. Isso livra o Testador da sobrecarga de testar um grande número
de casos em uma classe equivalente de valores que são improváveis de produzir grandes diferenças nos resultados do
teste.
Algumas recomendações ao escolher os valores de limite:
-
Para uma variável flutuante, se a condição válida for de
-1.0 a 1.0 , teste
-1.0 , 1.0 , -1.001 e 1.001 .
-
Para um inteiro, se o intervalo válido de entrada for de
10 a 100 , teste 9 ,
10 , 100 , 101 .
-
Se um programa esperar uma letra maiúscula, teste o limite A e Z. Teste também
@ e [ ,
porque no código ASCII, @ está apenas abaixo de A e [ está apenas acima de Z.
-
Se a entrada ou saída de um programa for um conjunto ordenado, preste atenção ao primeiro e ao último elemento do
conjunto.
-
Se a soma das entradas precisar ser um número específico (
n ), teste o programa em que a soma seja
n-1 , n ou n+1 .
-
Se o programa aceitar uma lista, teste os valores na lista. Todos os outros valores são inválidos.
-
Ao ler ou gravar em um arquivo, verifique o primeiro e último caracteres no arquivo.
-
A menor denominação de valor monetário é um centavo ou equivalente. Se o programa aceitar um intervalo específico,
de a até b, teste um
-0,01 e b +0,01 .
-
Para uma variável com vários intervalos, cada intervalo é uma classe de equivalência. Se os subintervalos não
estiverem sobrepostos, teste os valores nos limites, acima do limite superior e abaixo do limite inferior.
Depois de tentar as duas estratégias de análise de limite anteriores, um testador experiente observará as entradas do
programa para descobrir quaisquer casos de "valores especiais", que, mais uma vez, são origens muito valiosas para
revelar defeitos de software. A seguir são apresentados alguns exemplos:
-
Para um tipo inteiro, zero sempre deverá ser testado se estiver na classe de equivalência válida.
-
Ao testar a hora (hora, minuto e segundo), 59 e 0 sempre deverão ser testados como os limites superior e inferior
de cada campo, não importa a restrição da variável de entrada. Portanto, exceto os valores de limite da entrada,
-1, 0, 59 e 60 sempre deverão ser casos de teste.
-
Ao testar a data (ano, mês e dia), vários casos de teste deverão estar envolvidos, como o número de dias em um mês
específico, o número de dias em fevereiro no ano bissexto, o número de dias no ano não-bissexto.
Ostrand e Balcer [16] desenvolveram um método de partição que ajuda os testadores a
analisar a especificação do sistema, gravar scripts de teste e gerenciá-los. Diferente das estratégias comuns que
geralmente têm como foco o código, seu método também baseia-se na especificação e nas informações de design.
A principal vantagem desse método é sua capacidade de expor os erros antes do código ter sido gravado porque a origem
de entrada é a especificação e os testes resultam da análise dessa especificação. As falhas nas especificações serão
descobertas antecipadamente, geralmente bem antes de serem implementadas no código.
A estratégia para o método de "partição por categoria" é a seguinte:
-
Analise a especificação: decomponha a funcionalidade do sistema em unidades funcionais, que podem ser testadas
independentemente por especificação e implementação.
A partir desse ponto:
-
Identifique os parâmetros e as condições do ambiente que influenciarão a execução da função. Os parâmetros
são as entradas da unidade funcional. As condições do ambiente são os estados do sistema, que afetarão a
execução da unidade funcional.
-
Identifique as características dos parâmetros e as condições do ambiente.
-
Classifique as características em categorias, que afetam o comportamento do sistema.
Descrições ambíguas, contraditórias e ausentes do comportamento serão descobertas neste estágio.
-
Particione as categorias em opções: as opções são as diferentes situações possíveis que podem ocorrer e não são
esperadas. Elas representam o mesmo tipo de informação em uma categoria.
-
Determine as relações e as restrições entre as opções. As opções em diferentes categorias influenciam umas às
outras, que também influenciam a construção do conjunto de testes. As restrições são incluídas para eliminar a
contradição entre as opções de diferentes parâmetros e ambientes.
-
Projete os casos de teste de acordo com as categorias, opções e informações de restrição. Se uma opção causar um
erro, não combine-a com outras opções para criar o caso de teste. Se uma opção puder ser testada "adequadamente" em
um único teste, ela será representante da opção ou um valor especial.
-
Glenford J. Myers, The Art of Software Testing, John Wiley & Sons, Inc., New York, 1979.
-
White L. J. e Cohen E. I., A domain strategy for computer program testing, IEEE Transaction on Software
Engineering, Vol. SE-6, No. 3, 1980.
-
Lori A. Clarke, Johnhette Hassell e Debra J Richardson, A Close Look at Domain Testing, IEEE Transaction on
Software Engineering, 8-4, 1992.
-
Steven J. Zeil, Faten H. Afifi e Lee J. White, Detection of Linear Detection via Domain Testing, ACM Transaction on
Software Engineering and Methodology, 1-4, 1992.
-
BingHiang Jeng, Elaine J. Weyuker, A Simplified Domain-Testing Strategy, ACM Transaction on Software Engineering
and Methodology, 3-3, 1994.
-
Paul C. Jorgensen, Software Testing - A Craftsman's Approach, CRC Press LLC, 1995.
-
Martin R. Woodward e Zuhoor A. Al-khanjari, Testability, fault, and the domain-to-range ratio: An eternal triangle,
ACM Press New York, NY, 2000.
-
Dick Hamlet, On subdomains: Testing, profiles, and components, SIGSOFT: ACM Special Interest Group on Software
Engineering, 71-16, 2000.
-
Cem Kaner, James Bach e Bret Pettichord, Lessons learned in Software Testing, John Wiley & Sons, Inc., New
York, 2002.
-
Andy Podgurski e Charles Yang, Partition Testing, Stratified Sampling, and Cluster Analysis, SIGSOFT: ACM Special
Interest Group on Software Engineering, 18-5, 1993.
-
Debra J. Richardson e Lori A. Clarke, A partition analysis method to increase program reliability, SIGSOFT: ACM
Special Interest Group on Software Engineering, 1981.
-
Lori A. Clarke, Johnette Hassell e Debra J Richardson, A system to generate test data and symbolically execute
programs, IEEE Transaction on Software Engineering, SE-2, 1976.
-
Boris Beizer, Black-Box Testing - Techniques for Functional testing of Software and System, John Wiley & Sons,
Inc., 1995.
-
Steven J. Zeil, Faten H. Afifi e Lee J. White, Testing for Liner Errors in Nonlinear computer programs, ACM
Transaction on Software Engineering and Methodology, 1-4, 1992.
-
William E. Howden, Functional Program Testing, IEEE Transactions on Software Engineering, Vol. SE-6, No. 2, 1980.
-
Thomas J. Ostrand and Marc J. Balcer, The Category-Partition method
for specifying and generating functional tests, Communications of ACM 31, 1988.
-
Cem Kaner, Jack Falk e Hung Quoc Nguyen, Testing Computer Software, John Wiley & Sons, Inc., 1999.
|