FUNDAMENTAÇÃO TEÓRICA
2.2 Atividades de VV&T
2.2.1 Técnicas e critérios de teste
As atividades de teste devem aumentar a chance de revelar defeitos em um SUT, selecio-nando dados do domínio de entrada que sejam mais eficazes para tal tarefa. As técnicas e critérios de teste fornecem ao desenvolvedor uma abordagem sistemática e teoricamente fundamentada para a modelagem de casos de teste eficazes, construindo um mecanismo que pode auxiliar a avaliar a qualidade e a adequação da atividade de teste.
Segundo Fabbri, Vicenzi e Maldonado (2016), as técnicas de teste de software podem ser classificadas em: técnica funcional, técnica estrutural e técnica baseada em defeitos. Cada técnica possui seus respectivos critérios que estabelecem requisitos de teste para os quais valores específicos do domínio de entrada do programa devem ser definidos, com o intuito de exercitá-los.
A seguir é apresentada cada técnica de teste de software e alguns dos seus critérios.
2.2.1.1 Técnica funcional
O teste funcional, também conhecido como técnica caixa-preta, considera o produto em teste como uma caixa da qual só se conhece a entrada e a saída (sem conhecimento da parte interna). Baseia-se na especificação do software para derivar os casos de teste, desconsiderando aspectos associados ao código da aplicação. Dessa forma, nessa técnica os detalhes de implemen-tação não são considerados e o software é avaliado segundo o ponto de vista do usuário (PEZZE;
ZHANG, 2014; AMMANN; OFFUTT, 2008).
De acordo com Fabbri, Vicenzi e Maldonado (2016), os principais critérios do teste funcional são: (i) particionamento em classes de equivalência; (ii) análise do valor limite; (iii) teste funcional sistemático; e (iv) grafo causa-efeito.
A técnica funcional pode ser utilizada em todas as fases de teste e não depende do paradigma ou linguagem de programação utilizados. A técnica funcional é eficaz em detectar determinados tipos de defeitos como, por exemplo, funcionalidades ausentes. Entretanto, o êxito na aplicação da técnica funcional está fortemente relacionado com a qualidade da especificação de requisitos.
2.2.1.2 Técnica estrutural
A técnica estrutural, também conhecida como branca (ao contrário do teste caixa-preta), baseia-se no conhecimento da estrutura interna (implementação) do programa. A maioria dos critérios dessa técnica utiliza uma representação do programa conhecida como grafo de fluxo de controle (GFC), que é uma representação que visa auxiliar a geração dos requisitos de teste. OsCritérios baseados em fluxo de controleutilizam características de controle de execução do programa para determinar os requisitos de teste com base em comandos e desvios de execução. Os critérios mais conhecidos dessa classe são: (i) Todos-Nós; (ii) Todas-Arestas; e (iii) Todos-Caminhos. O Código 1 apresenta a função main do programaIdentifier, enquanto a Figura 2 ilustra o GFC dessa função. No GFC, cada vértice representa um bloco indivisível de comandos do programa (BARBOSAet al., 2016; GLENFORD; SANDLER; BADGETT, 2004).
Código-fonte 1– Função main do programaIdentifier.
1: { /* 01 */
2: c h a r a c h a r ; /* 01 */
3: int length , v a l i d _ i d ; /* 01 */
2.2. Atividades de VV&T 37
4: l e n g t h = 0; /* 01 */
5: p r i n t f ( " I d e n t i f i c a d o r : " ) ; /* 01 */
6: a c h a r = f g e t c ( s t d i n ) ; /* 01 */
7: v a l i d _ i d = v a l i d _ s ( a c h a r ) ; /* 01 */
8: if ( v a l i d _ i d ) /* 01 */
9: l e n g t h = 1; /* 02 */
10: a c h a r = f g e t c ( s t d i n ) ; /* 03 */
11: w h i l e ( a c h a r != ’ \ n ’ ) /* 04 */
12: { /* 05 */
13: if (!( v a l i d _ f ( a c h a r ) ) ) /* 05 */
14: v a l i d _ i d = 0; /* 06 */
15: l e n g t h ++; /* 07 */
16: a c h a r = f g e t c ( s t d i n ) ; /* 07 */
17: } /* 07 */
18: if ( v a l i d _ i d && ( l e n g t h >= 1) /* 08 */
19: && ( l e n g t h < 6) ) /* 08 */
20: p r i n t f ( " V a l i d o \ n " ) ; /* 09 */
21: e l s e /* 10 */
22: p r i n t f ( " I n v a l i d o \ n " ) ; /* 10 */
23: } /* 11 */
Fonte: Elaborada pelo autor.
Figura 2 – Exemplo do GFC da função main do programaIdentifier.
Fonte: Elaborada pelo autor.
Adicionalmente aos critérios supra-citados, oCritério baseado na complexidade, tam-bém conhecido como teste do caminho básico ou critério de McCabe (MCCABE, 1976), baseia-se na complexidade ciclomática, calculada a partir do GFC. A complexidade ciclomática define o número de caminhos independentes de um programa, que é qualquer caminho no grafo em que pelo menos uma aresta ainda não tenha sido incluída em outro caminho (BARBOSAet al., 2016). Mccabe (1976) define a complexidade ciclomática (C) como: C = E - N + 2, tal que E é o número de arestas e N é o número de vértices do GFC G. Nesse cenário, com base no GFC ilustrado na Figura 2, C seria igual a 14 - 11 + 2, totalizando 5. Dessa forma, seguindo o que é estabelecido pelo critério, o testador deve escolher cinco caminhos independentes como requisito de teste a ser cumprido por um conjunto de teste.
Por fim, os Critérios baseados em fluxo de dados adicionam informação sobre a utilização de variáveis ao GFC. Uma família de critérios bastante conhecida é a de Rapps e Weyuker (RAPPS; WAYUKER, 1985), que utiliza um GFC estendido, chamado grafo Def-Uso (do inglês Def-Use Graph) . De acordo com Barbosa et al. (2016), os critérios mais conhecidos nessa classe são: (i) Todas-Definições; (ii) Todos-Usos; e (iii) Todos-DU-Caminhos.
Outra família de critérios dessa classe é os Potenciais-Uso. Nessa classe, os elementos são caracterizados independentemente da ocorrência explícita de uma referência (um uso) a uma definição de variável. Os critérios mais conhecidos dessa família são: (i) Todos-Potenciais-Usos;
(ii) Todos-Potenciais-Usos/DU; e (iii) Todos-Potenciais-DU-Caminhos.
Critérios de teste da técnica estrutural identificam caminhos que devem ser percorridos no código do programa. Dessa forma, o GFC é a base a partir do qual os requisitos de testes são derivados. No entanto, a aplicação da técnica estrutural não pode garantir que o programa em teste comporta-se como esperado, devido ao problema dos caminhos ausentes. Caminhos ausentes ocorrem se o programa não implementa algumas funções, não havendo um caminho que corresponda àquela função; logo, nenhum dado de teste será requerido para exercitá-la.
2.2.1.3 Teste baseado em defeitos
Na técnica baseada em defeitos, os requisitos de teste são derivados a partir dos erros mais frequentes cometidos durante o processo de desenvolvimento do software. O teste de mutação, também chamado de análise de mutantes, é o critério mais conhecido da técnica baseada em defeitos (DELAMAROet al., 2016; DEMILLO; LIPTON; SAYWARD, 1978).
No teste de mutação, programas alternativos, denominados mutantes, são criados a partir de sutis modificações do programa original. Tais modificações são efetuadas por meio da inserção de pequenos desvios sintáticos produzidos por regras conhecidas como operadores de mutação.
A ideia é gerar várias versões modificadas do programa original, com o objetivo de reproduzir os defeitos mais comuns introduzidos nos programas pelos programadores (DEMILLO, 1989; JIA;
HARMAN, 2011).
A tarefa do testador é modelar um conjunto de casos de teste que seja capaz de distinguir