• Nenhum resultado encontrado

Teste estrutural de tratamento de exceções em programas OA: representação, critérios...

N/A
N/A
Protected

Academic year: 2017

Share "Teste estrutural de tratamento de exceções em programas OA: representação, critérios..."

Copied!
128
0
0

Texto

(1)

Teste estrutural de tratamento de exceções em

programas OA: representação, critérios e

avaliação

(2)
(3)

Teste estrutural de tratamento de exceções em

programas OA: representação, critérios e avaliação

Luciano Augusto Fernandes Carvalho

Orientador: Prof. Dr. Paulo Cesar Masiero

Dissertação apresentada ao Instituto de Ciências Matemáticas e de Computação - ICMC-USP, como parte dos requisitos para obtenção do título de Mestre em Ciências - Ciências de Computação e Matemática Computacional. VERSÃO REVISADA

USP – São Carlos

SERVIÇO DE PÓS-GRADUAÇÃO DO ICMC-USP

Data de Depósito:

(4)

CCC33l tt

Carvalho, Luciano Augusto Fernandes

Teste estrutural de tratamento de exceções em programas OA: representação, critérios e avaliação / Luciano Augusto Fernandes Carvalho; orientador Paulo Cesar Masiero. -- São Carlos, 2013.

112 p.

Tese (Doutorado - Programa de Pós-Graduação em Ciências de Computação e Matemática Computacional) Instituto de Ciências Matemáticas e de Computação, Universidade de São Paulo, 2013.

(5)

Primeiramente agrade¸co a Deus, que vem proporcionando e realizando tudo na vida com que Ele presenteou-me.

Agrade¸co a toda minha fam´ılia, amigos e namorada por toda a convivˆencia, amizade e confian¸ca ao longo da minha vida.

Agrade¸co ao Prof. Dr. Paulo Cesar Masiero pela dedica¸c˜ao e profissionalismo excep-cional.

Agrade¸co tamb´em a todos os seres do planeta terra, pois todos de maneira direta ou indireta foram importantes para conclus˜ao deste trabalho.

(6)
(7)
(8)
(9)
(10)
(11)

Abstract 9

1 Introdu¸c˜ao 1

1.1 Contextualiza¸c˜ao . . . 1

1.2 Motiva¸c˜ao . . . 2

1.3 Objetivos . . . 4

1.4 Organiza¸c˜ao . . . 4

2 Introdu¸c˜ao ao teste de software 5 2.1 Considera¸c˜oes Iniciais . . . 5

2.2 Teste de Software . . . 5

2.2.1 Teste funcional . . . 9

2.2.2 Teste estrutural . . . 9

2.2.2.1 Crit´erios baseados em complexidade . . . 11

2.2.2.2 Crit´erios baseados em fluxo de controle . . . 11

2.2.2.3 Crit´erios baseados em fluxo de dados . . . 12

2.2.3 Teste baseado em defeitos . . . 13

2.3 Tratamento de exce¸c˜oes . . . 14

2.3.1 Tratamento de exce¸c˜oes em C++ . . . 15

2.3.2 Tratamento de exce¸c˜oes em Java . . . 16

2.3.3 Teste Estrutural de Tratamento de Exce¸c˜oes . . . 19

2.4 Considera¸c˜oes Finais . . . 21

3 Teste e verifica¸c˜ao de tratamento de exce¸c˜oes em programas OO e OA: uma revis˜ao da literatura 23 3.1 Considera¸c˜oes Iniciais . . . 23

3.2 Revis˜ao da literatura . . . 24

3.2.1 Planejamento de Revis˜ao . . . 24

3.2.2 Recursos para Busca e Sele¸c˜ao de Estudos . . . 24

3.3 Teste Estrutural de tratamento de exce¸c˜oes . . . 26

3.4 Outras abordagens para teste e verifica¸c˜ao do fluxo de exce¸c˜ao . . . 35

3.5 Ferramentas . . . 39

(12)

4 Abordagem de teste para o tratamento de exce¸c˜oes 47

4.1 Considera¸c˜oes Iniciais . . . 47

4.2 Teste estrutural de unidade . . . 48

4.3 Teste estrutural de integra¸c˜ao . . . 49

4.4 Extens˜ao da JaBUTi/AJ para adequa¸c˜ao ao teste estrutural de tratamento de exce¸c˜oes . . . 53

4.5 Estrat´egia de teste . . . 63

4.6 Vers˜ao da JaBUTi/AJ integrada com a VITTAE . . . 65

4.7 Esfor¸co de implementa¸c˜ao . . . 68

4.8 Considera¸c˜oes finais . . . 68

5 Valida¸c˜ao 69 5.1 Considera¸c˜oes Iniciais . . . 69

5.2 Estudo de caso . . . 70

5.3 Experimento . . . 73

5.3.1 Hip´oteses . . . 75

5.3.2 Sujeitos e objetos experimentais . . . 76

5.3.3 Instrumenta¸c˜ao . . . 76

5.3.4 Opera¸c˜ao do experimento . . . 76

5.3.5 Amea¸cas `a validade . . . 77

5.3.6 Resultados . . . 78

5.3.7 An´alise de dados . . . 79

5.3.7.1 An´alise de dados: cobertura . . . 80

5.3.7.2 An´alise de dados: tempo . . . 82

5.3.7.3 An´alise de dados: viola¸c˜oes no contrato de exce¸c˜oes . . . 85

5.3.8 Teste de hip´oteses . . . 87

5.3.9 Pesquisa de opini˜ao com os sujeitos . . . 88

5.3.10 Considera¸c˜oes finais . . . 89

6 Conclus˜ao 91 6.1 Considera¸c˜oes finais . . . 91

6.2 Contribui¸c˜oes desta disserta¸c˜ao de mestrado . . . 92

6.3 Trabalhos futuros . . . 93

Referˆencias 99

A Formul´arios utilizados no experimento 101

B C´odigo fonte do programa Vending Machine 105

(13)

2.1 Defeito, erro e falha (Neto, 2008) . . . 7 2.2 C´odigo fonte para calcular o maior entre dois n´umeros . . . 7 2.3 Exemplo de grafo GFC,(a) GFC e (b) c´odigo fonte usado para gerar o GFC. 10 2.4 Hierarquia da biblioteca de exce¸c˜oes de C++ (Mao e Lu, 2005) . . . 15 2.5 Hierarquia de Exce¸c˜oes em Java (Azevedo, 2011) . . . 17 2.6 Exemplo de pseudoc´odigo com tratamento de exce¸c˜oes . . . 18 2.7 Exemplo de programa e GFC integrado constru´ıdo com a utiliza¸c˜ao da

abordagem de Sinha e Harrold (2000) . . . 21

3.1 GFCI constru´ıdo com utiliza¸c˜ao da abordagem de Mao e Lu (2005) . . . . 29 3.2 Exemplo de bytecode e grafo para o cod´ıgo da figura 2.7 . . . 33 3.3 Exemplo de c´odigo: classePoint e aspecto anAspectP . . . 33 3.4 Parte do bytecode do m´etodo affectedMethod sem a presen¸ca de aspectos 34 3.5 Grafo DUG do m´etodo affectedMethod . . . 34 3.6 Grafo AODU do m´etodoaffectedMethodentrecortado pelo aspecto

anAs-pect . . . 35 3.7 Codigo fonte das classes Employee, Paymentinfo, WorkInfo e do aspecto

AcessControl(Lemos e Masiero, 2011) . . . 36 3.8 Grafo AODU do m´etodoaffectedMethodentrecortado pelo aspecto

anAs-pect (Lemos e Masiero, 2011) . . . 36 3.9 Etapas da abordagem de an´alise est´atica proposta por Coelho et al. (2011) 37 3.10 Exemplo de contrato de exce¸c˜ao. . . 38 3.11 Ferramenta OConGraX (Xavier et al., 2008) . . . 40 3.12 Ferramenta Java PathFinder Exceptions . . . 40

4.1 Exemplo do c´odigo do m´etodo Vend() e do grafo de unidade gerado pela JaBUTi/AJ. . . 50 4.2 Exemplo do c´odigo e de seu bytecode e do grafo de unidade gerado pela

JaBUTi/AJ. . . 51 4.3 Exemplo de c´odigo OA e seu respectivo bytecode e de grafo gerado pela

(14)

4.8 Inform¸c˜oes do n´o throw do n´o (3).2.6 do grafo de integra¸c˜ao do programa

p5. . . 56

4.9 Grafo de integra¸c˜ao do programa p5 gerado pelo algoritmo modificado. . . 58

4.10 Grafo para o cod´ıgo mostrado na figura 2.7 . . . 60

4.11 Grafo visualizado com op¸c˜ao de exibir somente as arestas requeridas pelo crit´erio todas-arestas-integradas-throw. . . 62

4.12 Grafo visualizado com op¸c˜ao de n˜ao exibir as arestas de exce¸c˜ao n˜ao exe-cut´aveis. . . 63

4.13 Grafo de chamada do m´etodo Facade.vend() . . . 64

4.14 Grafo de integra¸c˜ao do m´etodo facade.vend(). . . 65

4.15 Exemplo de grafo de integra¸c˜ao da vers˜ao da JaBUTi/AJ integrada com a VITTAE. . . 67

5.1 Cobertura alcan¸cada para o crit´erio todos-n´os-integrados-de-exce¸c˜ao na pri-meira etapa do experimento. . . 80

5.2 Cobertura alcan¸cada no crit´erio todas-arestas-integradas-throw/todas-cl´ausulas-do-contrato-de-exce¸c˜oes na primeira etapa do experimento. . . 81

5.3 N´umero de casos de teste e de contratos de exce¸c˜ao criados pelos sujeito na primeira etapa do experimento. . . 82

5.4 Tempo gasto pelos sujeitos na primeira etapa do experimento. . . 83

5.5 Tempo gasto pelos sujeitos na segunda etapa do experimento. . . 84

5.6 Tempo total. . . 85

(15)

2.1 Requisitos de teste para os crit´erios propostos por Sinha e Harrold (1999) 21

3.1 Resultados da revis˜ao bibliogr´afica por fonte de pesquisa. . . 26 3.2 Requisitos de teste para os crit´erios propostos por Vincenzi et al. (2006) . . 32 3.3 Abordagens de teste e verifica¸c˜ao do fluxo de exce¸c˜ao. . . 44

4.1 Requisitos de teste para os crit´erios propostos nesta disserta¸c˜ao . . . 60

(16)
(17)

1

Introdu¸c˜

ao

1.1

Contextualiza¸c˜

ao

O desenvolvimento de software ´e uma atividade complexa e dif´ıcil, principalmente quando se deseja produzir software de alta qualidade e tolerante a falhas. Visando facilitar a produ¸c˜ao de software com qualidade, algumas linguagens de programa¸c˜ao de alto n´ıvel como o C++, Java e Ada fornecem mecanismos como os de tratamento de exce¸c˜oes que n˜ao existem em outras linguagens como C e Pascal. O tratamento de exce¸c˜oes ´e um mecanismo poderoso que permite formalizar e separar o c´odigo de tratamento de erros (fluxo de exce¸c˜ao) do c´odigo funcional (fluxo normal) e deixar um caminho limpo para a propaga¸c˜ao de erros de uma forma padronizada e estruturada.

(18)

tra-tar adequadamente os erros conhecidos. Segundo Antoniol (2009), projetra-tar o tratamento de exce¸c˜oes de maneira inadequada ´e um dos vinte e cinco erros de programa¸c˜ao mais propensos a gerar vulnerabilidades nos softwares.

O uso incorreto do mecanismo de tratamento de exce¸c˜oes pode introduzir mais defeitos no c´odigo, como inconsistˆencia entre estados de objetos e falhas de sistema. Alguns deles n˜ao podem causar evidente influˆencia sobre o sistema, mas alguns podem causar grande dano a todo o sistema ou resultar em acidentes catastr´oficos. Por exemplo, o foguete Ariane-V, cuja explos˜ao em 1996 teve como causa da cat´astrofe uma exce¸c˜ao n˜ao capturada (Lions, 1996). Sem os devidos cuidados, a introdu¸c˜ao de tratamento de exce¸c˜oes na maior parte dos programas pode diminuir a confiabilidade geral e p˜oe em risco o processo de desenvolvimento de software com alta qualidade. Assim, se torna necess´ario analisar as estruturas de exce¸c˜ao e testar as condi¸c˜oes de exce¸c˜ao no c´odigo. Com atividades de an´alise e testes ´e poss´ıvel tentar detectar as falhas introduzidas por mecanismos de tratamento de exce¸c˜oes.

O desenvolvimento de software est´a em constante evolu¸c˜ao e com isso surgem novos paradigmas, linguagens e t´ecnicas de programa¸c˜ao com o prop´osito de facilitar a sua evolu-¸c˜ao. Um desses paradigmas que surgiu foi o desenvolvimento Orientado a Aspectos (OA), que permite separar o c´odigo-base do programa do c´odigo dos interesses transversais por meio de um novo conceito denominado aspecto (Kiczales et al., 1997). Um dos interesses transversais que pode ser implementado com aspectos ´e o tratamento de exce¸c˜oes. Coelho et al. (2008) realizaram um estudo que investigou os padr˜oes de defeitos que podem ser introduzidos com a utiliza¸c˜ao inadequada dos mecanismos da OA para o tratamento do fluxo de exce¸c˜ao. Os resultados apresentaram ind´ıcios de que sistemas OA tendem a ficar mais propensos a conterem defeitos na implementa¸c˜ao do tratamento de exce¸c˜oes do que os programas OO.

Dessa forma, as atividades de Verifica¸c˜ao, Valida¸c˜ao e Teste s˜ao essenciais para me-lhorar a robustez e a confiabilidade do software. Com o aumento da complexidade dos softwares com a introdu¸c˜ao de novas tecnologias como o tratamento de exce¸c˜oes e OA surgem novos desafios para a busca por qualidade e confiabilidade em softwares (Mao e Lu, 2005).

1.2

Motiva¸c˜

ao

(19)

(2003) foi o primeiro pesquisador a estudar este assunto, estendendo-o para programas orientados a aspectos, e a publicar alguns resultados iniciais. Lemos et al. (2007) explora-ram o teste estrutural de unidades de software orientado a objetos e a aspectos - m´etodos e adendos - e de unidades aspectuais de programas AspectJ isoladamente (i.e. teste de unidade) a partir do bytecode, com o c´odigo base e os aspectos j´a combinados. Nesse trabalho, a ferramenta JaBUTi (Vincenzi et al., 2006) foi estendida para apoiar tamb´em o teste unit´ario de aspectos, criando-se uma nova vers˜ao da ferramenta, chamada de Ja-BUTi/AJ. Lemos et al. (2007) propuseram varia¸c˜oes dos crit´erios todos-n´os, todos-ramos e todos-def-uso para esse contexto, implementando-os na ferramenta JaBUTi/AJ.

Um problema n˜ao abordado no teste de unidade ´e a intera¸c˜ao entre unidades, com respeito `a corre¸c˜ao de suas interfaces. Nesse contexto, o teste de unidade n˜ao ´e suficiente para dar confian¸ca de que o programa est´a correto, sendo necess´ario prosseguir com o teste de integra¸c˜ao e o teste de sistema. Posteriormente, Lemos deu seguimento a seu trabalho inicial e definiu um conjunto de crit´erios de teste estruturais baseados em conjuntos de jun¸c˜ao (pointcuts), isto ´e, crit´erios que permitem avaliar a cobertura de execu¸c˜ao de todos os pontos de jun¸c˜ao associados a um pointcut (Lemos e Masiero, 2008, 2011). Em continuidade a esse trabalho, foi proposto por Franchin o teste de integra¸c˜ao de pares de unidades orientadas a objetos e aspectuais. Mesmo para pequenos sistemas pode haver um grande n´umero de intera¸c˜oes entre as unidades e para grandes sistemas o problema ´e agravado, com crescimento exponencial, o que torna o teste de integra¸c˜ao de unidades para um n´umero arbitr´ario de unidades imposs´ıvel na pr´atica.

No trabalho de Franchin foi tamb´em estendida a ferramenta JaBUTi/AJ para dar apoio ao teste estrutural de integra¸c˜ao par-a-par e `a an´alise de cobertura de testes rea-lizados segundo os trˆes crit´erios de teste par-a-par propostos (Lemos et al., 2009). Em seguida, o trabalho de mestrado de Neves definiu formalmente os crit´erios de fluxo de dados e de controle e estendendo a ferramenta JaBUTi/AJ para criar o grafo de fluxo de controle de todas as unidades envolvidas no n´ıvel 1 de profundidade, realizar e instrumen-tar o teste de integra¸c˜ao e calcular a cobertura obtida (Neves et al., 2009).

(20)

teste do tratamento de exce¸c˜oes, assim como para a intera¸c˜ao entre aspectos e tratamento de exce¸c˜oes. Este trabalho tem como principal motiva¸c˜ao dar continuidade aos traba-lhos do grupo e investigar uma alternativa para o teste estrutural de integra¸c˜ao no fluxo de exce¸c˜oes de programas OO e OA, principalmente voltado para as linguagens Java e AspectJ.

1.3

Objetivos

O objetivo desta disserta¸c˜ao de mestrado ´e investigar o teste de integra¸c˜ao estrutural de tratamento de exce¸c˜oes em programas OO e OA, em particular das linguagens Java e As-pectJ. Como parte desse objetivo, pretende-se definir como os fluxos de exce¸c˜ao podem ser representados em um grafo de fluxo de controle e definir novos crit´erios de teste estrutural de integra¸c˜ao de fluxos de exce¸c˜ao e implement´a-los na ferramenta JaBUTi/AJ. Adicio-nalmente pretende-se tamb´em avaliar os resultados dessa implementa¸c˜ao e comparar com outras abordagens e ferramentas.

1.4

Organiza¸c˜

ao

(21)

2

Introdu¸c˜

ao ao teste de software

2.1

Considera¸c˜

oes Iniciais

Neste cap´ıtulo s˜ao apresentados conceitos b´asicos relacionados ao teste de software que s˜ao necess´arios para a compreens˜ao dos cap´ıtulos seguintes. Uma introdu¸c˜ao ao teste de programas com tratamento de exce¸c˜oes tamb´em ´e apresentada neste cap´ıtulo para fundamentar as propostas discutidas nesta disserta¸c˜ao.

O restante deste cap´ıtulo est´a organizado como segue. Na Se¸c˜ao 2.2 s˜ao abordados os principais conceitos referentes `a atividade de teste de software, incluindo uma breve apresenta¸c˜ao sobre teste funcional, estrutural e baseado em defeitos. Na Se¸c˜ao 2.3 ´e abordado o tratamento de exce¸c˜oes e apresenta-se uma introdu¸c˜ao sobre o funcionamento deste mecanismo nas linguagens C++ e Java e seguida de uma discuss˜ao sobre teste de tratamento de exce¸c˜oes.

2.2

Teste de Software

(22)

a fase de testes, a ordem de execu¸c˜ao do usu´ario foi diferente das que foram testadas, o usu´ario aplicou uma combina¸c˜ao de entradas n˜ao testada ou ainda, no caso mais grave, o usu´ario poderia estar usando um programa que nunca foi testado.

Visando diminuir a ocorrˆencia de erros nos sistemas, e em busca do aumento de quali-dade do software a Engenharia de Software incorporou ativiquali-dades de Verifica¸c˜ao, Valida¸c˜ao e Teste (VV&T), no processo de desenvolvimento de software que, segundo Rocha e Weber (2001), tˆem papel fundamental na produ¸c˜ao de qualquer produto.

As atividades de VV&T podem ser classificadas como dinˆamicas ou est´aticas, as es-tat´ısticas s˜ao aquelas que n˜ao necessitam da execu¸c˜ao do programa nem necessariamente do c´odigo ou do programa, como a atividade de inspe¸c˜ao de software, j´a as dinˆamicas necessitam da execu¸c˜ao do programa, como ´e o caso do teste de software.

Consideerando a importˆancia das atividades de teste de software, esfor¸cos tˆem sido realizados para padronizar algumas terminologias. O IEEE (1990) definiu alguns termos e conceitos relacionados ao teste de software:

• engano (mistake): ´e uma a¸c˜ao humana capaz de produzir um resultado incorreto.

Um exemplo de engano pode ser uma a¸c˜ao incorreta tomada pelo programador.

• defeito (fault): ´e a causa de um erro em um programa que ocorre por um passo,

processo ou defini¸c˜ao de dados incorreta, como por exemplo, uma instru¸c˜ao ou comando incorreto.

• erro (error): caracteriza-se por um resultado incorreto, ou seja, quando ocorre

diferen¸ca entre o valor obtido e o valor esperado. Qualquer estado intermedi´ario incorreto ou resultado inesperado na execu¸c˜ao de um programa constitui um erro.

• falha (failure): caracteriza-se pela falta de capacidade de um sistema ou

compo-nente fornecer a funcionalidade esperada com desempenho adequado. Um ou mais erros podem causar a ocorrˆencia de uma falha assim como alguns erros podem nunca causar uma falha.

Software pode falhar eventualmente. Para que ocorra uma falha ´e necess´ario que um erro se propague at´e a sa´ıda do software. Erros s˜ao produzidos por defeitos que por sua vez podem ser introduzidos por enganos que s˜ao provenientes de uma a¸c˜ao humana incorreta. A figura 2.1 fornece uma vis˜ao da diferen¸ca entre os conceitos de falhas, erros, defeitos.

(23)

Figura 2.1: Defeito, erro e falha (Neto, 2008)

e o erro nesse exemplo ocorre quando houver uma entrada com dois valores iguais para as vari´aveis X e Y. No ponto em que a vari´avel Maior receber o valor de Y esta estar´a com um valor incorreto, gerando o erro. Este erro causa uma falha quando for enviada a mensagem informando o maior dos dois n´umeros ao inv´es de informar que os dois n´umeros s˜ao iguais.

FMaiorEntreDoisInteiros( int X, int Y) {

Int Maior=-9999;

if(X>Y){ Maior=X;} else if (Y >= X){

Maior=Y;}

if(Maior!= -9999){

print("O maior n´umero ´e ",Maior);} else{

print("os n´umeros s~ao iguais");}

}

Figura 2.2: C´odigo fonte para calcular o maior entre dois n´umeros

(24)

Na atividade de teste os programas s˜ao examinados para determinar o que eles fazem e o que supostamente deveriam fazer. Para saber o que o programa deve fazer ´e preciso dos requisitos do sistema, que s˜ao uma descri¸c˜ao ou especifica¸c˜ao que descreve o que o programa deve e o que ele n˜ao deve fazer. O teste examina o programa baseado em um conjunto limitado de casos de testes, porque de uma forma geral n˜ao ´e vi´avel executar um conjunto de casos de teste que contenha todas as entradas poss´ıveis. A atividade de teste deve ser planejada em diferentes n´ıveis e ser aplicada em paralelo ao processo de desenvolvimento do software. Os principais n´ıveis de teste s˜ao (Rocha e Weber, 2001):

Teste de Unidade: s˜ao testes unit´arios que tˆem como objetivo explorar a menor unidade do projeto, procurando provocar falhas em cada m´odulo, separadamente. Alguns autores consideram fun¸c˜oes e m´etodos as menores unidades e outros consideram as classes.

Teste de Integra¸c˜ao: visa provocar falhas associadas `as interfaces entre os m´odulos quando eles s˜ao integrados.

Teste de Sistema: avalia o software em busca de falhas por meio de sua utiliza¸c˜ao. Para isto, os testes s˜ao executados nos mesmos ambientes, com as mesmas condi-¸c˜oes e com os mesmos dados de entrada que um usu´ario utilizaria normalmente na utiliza¸c˜ao do software. Assim verifica se o produto satisfaz seus requisitos.

Teste de Aceita¸c˜ao: tem como objetivo verificar se o comportamento do software est´a de acordo com o solicitado. S˜ao realizados geralmente por um restrito grupo de usu´arios finais do sistema. ´E um tipo de teste de sistema.

Apesar da aplica¸c˜ao de atividades de testes e mesmo com sua aplica¸c˜ao correta n˜ao se pode afirmar que o software est´a completamente livre de defeitos, pois um dos desa-fios desta atividade ´e o fato de ser praticamente imposs´ıvel testar todas as combina¸c˜oes de entradas poss´ıveis (conhecido como teste exaustivo) para um software, mas se pode aumentar a confiabilidade do programa com a aplica¸c˜ao correta das atividades de teste.

Nas atividades de teste existem alguns conceitos adicionais importantes e alguns deles s˜ao os seguintes:

Caso de Teste: um caso de teste ´e composto por valores de entrada, restri¸c˜oes para a sua execu¸c˜ao e um resultado ou comportamento esperado, assim descrevendo uma condi¸c˜ao particular a ser testada (Craig e Jaskiel, 2002).

(25)

Crit´erio de Teste: s˜ao usados para selecionar e avaliar casos de teste com o objetivo de aumentar as possibilidades de provocar falhas ou, quando isso n˜ao ocorre, estabelecer um n´ıvel elevado de confian¸ca na corre¸c˜ao do produto (Rocha e Weber, 2001). Os crit´erios de teste podem ser utilizados como crit´erios para cobertura dos testes, adequa¸c˜ao de casos de teste e gera¸c˜ao de casos de teste.

Para a realiza¸c˜ao das atividades teste utilizam-se t´ecnicas e crit´erios que fornecem abordagens sistem´aticas, assim com base fundamentada na teoria e se constitui como um mecanismo que pode auxiliar na garantia de qualidade dos testes, contribuindo tamb´em para aumentar da probabilidade deles revelarem defeitos (Delamaro et al., 2007).

Diferentes t´ecnicas que podem ser utilizadas para a condu¸c˜ao da atividade de teste s˜ao as t´ecnicas de teste funcional, estrutural e baseada em defeitos. Os v´arios crit´erios de teste de cada t´ecnica apoiam a explora¸c˜ao de determinados tipos de defeitos, estabelecendo requisitos de teste para os quais valores espec´ıficos do dom´ınio de entrada do programa devem ser definidos com o intuito de exercit´a-los. O que diferencia cada uma dessas t´ecnicas ´e a fonte utilizada para definir os requisitos de teste.

2.2.1

Teste funcional

Os crit´erios da t´ecnica funcional s˜ao baseados na especifica¸c˜ao do software (Myers et al., 2004), uma vez que ela ´e indiferente `a estrutura e ao comportamento interno do programa. Assim, por se basear na especifica¸c˜ao do produto a ser testado, ´e f´acil perceber que a qualidade desses crit´erios depende da existˆencia de uma boa especifica¸c˜ao de requisitos. Em contrapartida, como n˜ao levam em conta detalhes de implementa¸c˜ao, esses crit´erios podem ser aplicados em qualquer fase de teste e em produtos desenvolvidos inclusive antes do inicio da implementa¸c˜ao (TestFirst, por exemplo) em qualquer paradigma de programa¸c˜ao. Alguns crit´erios de teste funcional s˜ao, por exemplo: particionamento em classes de equivalˆencia e an´alise do valor limite.

2.2.2

Teste estrutural

(26)

de teste estrutural utiliza um ”grafo de fluxo de controle”(GFC) ou ”Grafo de Programa”. Um exemplo de GFC pode ser visto na figura 2.3.

Figura 2.3: Exemplo de grafo GFC,(a) GFC e (b) c´odigo fonte usado para gerar o GFC.

Um programa P pode ser representado na forma de um grafo de fluxo de controle G = (N,E,s). No GFC N representa o conjunto de n´os, E representa o conjunto de arestas e s representa o n´o de entrada. Um n´o representa um bloco de comandos sequenciais que forma um bloco indivis´ıvel de comandos, de modo que, quando o primeiro comando ´e executado todos os outros comandos tamb´em s˜ao executados sequencialmente. As arestas representam o fluxo de controle de um programa, ou seja, um poss´ıvel desvio de um bloco de comandos para outro. Todo GFC possui n´os de entrada e de sa´ıda nos quais a computa¸c˜ao ´e iniciada e finalizada, respectivamente. Os n´os de entrada n˜ao possuem aresta de entrada, ao contr´ario dos nos de sa´ıda que n˜ao possuem arestas de sa´ıda. Os crit´erios de teste estrutural podem ser baseados em fluxo de controle, complexidade e fluxo de dados. Algumas defini¸c˜oes e conceitos importantes para entendimento desses crit´erios s˜ao apresentadas a seguir:

Defini¸c˜ao de vari´avel: atribui¸c˜ao de um valor a uma vari´avel.

Uso da vari´avel: trata da utiliza¸c˜ao de uma vari´avel. Pode ser classificado de duas maneiras:

• Uso computacional (c-uso): quando ocorre o uso de uma vari´avel em uma

compu-ta¸c˜ao;

• Uso predicativo (p-uso): quando ocorre o uso de uma vari´avel para determinar o

(27)

Caminho: ´e uma sequencia finita de n´os n1, n2, ..., nk, k > 1, tal que existe uma aresta

de ni para ni+1 parai= 1,2..., k−1

Caminho Completo: ´e um caminho no qual o primeiro n´o ´e o de entrada e o ultimo n´o ´e o de sa´ıda do grafo G.

Caminho Simples: ´e um caminho no qual todos os n´os, exceto possivelmente o primeiro e o ultimo, s˜ao distintos.

Caminho independente: ´e qualquer caminho ao longo do programa que introduz pelo menos uma nova aresta ou novo n´o.

Caminho livre-de-la¸co: ´e um caminho no qual nenhum dos n´os aparece mais de uma vez, ou seja, s˜ao distintos.

Caminho livre-de-itera¸c˜ao-de-la¸co: ´e um caminho no qual nenhum dos n´os aparece mais de uma vez.

Caminho n˜ao execut´avel: ´e um caminho do GFC imposs´ıvel de ser coberto para qual-quer elemento do dom´ınio de entrada.

A partir do GFC, os caminhos l´ogicos do software podem ser testados, para verificar condi¸c˜oes e/ou la¸cos e defini¸c˜oes e usos de vari´aveis.

2.2.2.1 Crit´erios baseados em complexidade

Os crit´erios baseados em complexidade utilizam informa¸c˜oes de complexidade dos progra-mas para derivar os requisitos de teste. Uma das m´etricas para complexidade de software bastante conhecida ´e a complexidade ciclom´atica. Ela pode ser calculada da seguinte forma:

V(G) =E−N + 2, em que E ´e o n´umero de arestas e N o n´umero de n´os do GFC G.

Entre os crit´erios desta categoria, um dos mais conhecidos ´e o crit´erio de McCabe. Esse crit´erio utiliza a complexidade ciclom´atica de um GFC para derivar os requisitos de teste. Al´em disso, com o uso da complexidade ciclom´atica, esse crit´erio fornece um limite superior para quantidade de dados de testes necess´arios para garantir que todos os comandos sejam executados pelo menos uma vez (Pressman, 2005).

2.2.2.2 Crit´erios baseados em fluxo de controle

(28)

todos-n´os: requer que cada v´ertice do grafo, isto ´e, cada comando do programa, seja exercitado ao menos uma vez .

todas-arestas: requer que cada aresta do grafo, isto ´e, cada desvio do fluxo de controle do programa, seja exercitado ao menos uma vez.

Todos-caminhos: requer que todos os caminhos poss´ıveis do programa sejam exercita-dos.

Segundo Delamaro et al. (2007), a cobertura do crit´erio todos-n´os e o m´ınimo esperado em uma atividade de teste. Al´em disso, ´e importante ressaltar que embora desej´avel, cobrir o crit´erio Todos-Caminhos na maioria dos casos ´e uma tarefa impratic´avel uma vez que o n´umero de caminhos pode ser muito grande ou at´e mesmo infinito.

2.2.2.3 Crit´erios baseados em fluxo de dados

Uma das motiva¸c˜oes para introdu¸c˜ao dos crit´erios baseados em fluxo de dados ´e o fato de que o crit´erio todos-caminhos ser impratic´avel na maioria dos casos.

Os requisitos de satisfa¸c˜ao dos crit´erios dessa categoria s˜ao baseados em informa¸c˜oes referentes ao fluxo de dados do programa, cujo foco ´e na intera¸c˜ao entre defini¸c˜oes e usos de vari´aveis. Para isso pode ser utilizado uma extens˜ao do GFC denominada Grafo Def-Uso proposta por Rapps e Weyuker (1985). Nesse grafo, al´em das arestas e n´os criados no GFC, s˜ao inseridas tamb´em informa¸c˜oes a respeito do fluxo de dados, como defini¸c˜oes, c-uso e p-uso de vari´aveis que foram definidos anteriormente. Outros conceitos importantes, al´em das de defini¸c˜oes e usos, que j´a foram definidos anteriormente, s˜ao o par def-uso e o de caminho livre de defini¸c˜ao. O par def-uso se refere a uma defini¸c˜ao subsequente de p-uso ou c-uso de uma vari´avel. Um caminho livre de defini¸c˜ao com rela¸c˜ao a uma vari´avel x ´e um caminho onde a vari´avel x n˜ao ´e redefinida (Barbosa et al., 2000). Alguns dos principais crit´erios dessa classe s˜ao:

todas-defini¸c˜oes: requer que toda defini¸c˜ao de vari´avel no programa seja exercita pelo menos uma vez, seja por um c-uso ou p-uso.

todos-usos: requer que todos os pares def-uso sejam exercitados pelos casos de teste por pelo menos um caminho livre de defini¸c˜ao.

todos-c-usos: requer que todos os pares def-uso em que o uso seja um c-uso sejam exercitados pelo casos de teste por pelo menos um caminho livre de defini¸c˜ao.

(29)

dodos-du-caminhos: requer que todos os pares def-uso sejam exercitados pelos casos de teste por todos os caminhos livre de defini¸c˜ao e livres de la¸co.

2.2.3

Teste baseado em defeitos

Baseiam-se na inclus˜ao de defeitos propositais (artificiais) como forma de revelar defeitos existentes previamente (naturais) (Pressman, 2005). Um dos principais crit´erios baseado em defeitos ´e o crit´erio an´alise de mutantes. Esse crit´erio gera programas mutantes e o objetivo do crit´erio ´e gerar casos de testes em que, a partir da mesma entrada, os resultados gerados pelo programa original sejam diferentes dos resultados gerados pelo programa mutante. Alguns conceitos b´asicos do teste de muta¸c˜ao s˜ao definidos a seguir (Delamaro et al., 2007):

Programas Mutantes: s˜ao programas com pequenas modifica¸c˜oes sint´aticas que

s˜ao realizadas sobre o c´odigo-fonte do programa original a partir da aplica¸c˜ao de operadores de muta¸c˜ao.

• Operadores de muta¸c˜ao: s˜ao operadores utilizados para modelar as modifica¸c˜oes

em um programa de forma a gerar programas mutantes. Um operador de muta¸c˜ao aplicado a um programa P transforma P em um programa similar, ou seja, um mutante.

Mutante morto: s˜ao programas mutantes que geram uma sa´ıda diferente do

pro-grama original para um determinado caso de teste.

• Mutante equivalente: s˜ao programas mutantes que apresentam sempre o mesmo

resultado que o programa original para qualquer valor de entrada contido no dom´ınio de entrada do programa testado.

• Escore de muta¸c˜ao: E a medida de cobertura utilizada no teste de mutantes. O´

escore de muta¸c˜ao varia entre 0 e 1 e ´e calculado como a raz˜ao entre o n´umero de mutantes mortos e o n´umero de mutantes n˜ao equivalentes. Fornece uma medida objetiva de quanto o conjunto de casos de teste analisado aproxima-se da adequa¸c˜ao.

(30)

devem ser constru´ıdos para evidenciar as diferen¸cas entre o mutante e o programa original (Wong, 2001).

2.3

Tratamento de exce¸c˜

oes

O tratamento de exce¸c˜oes ´e um mecanismo que permite gerenciar a manipula¸c˜ao de erros de programa de uma forma organizada; sem um mecanismo deste tipo os programadores teriam que verificar os c´odigos de retorno de erro depois de cada chamada de fun¸c˜ao. Assim, o c´odigo que implementa as fun¸c˜oes do programa se entrela¸ca com o c´odigo que trata os erros, o que torna a atividade de teste tediosa, repetitiva, complexa e dificulta o entendimento das funcionalidades essenciais do programa, facilitando com que os desen-volvedores ignorem o tratamento de exce¸c˜oes (deliberadamente ou acidentalmente) (Mao e Lu, 2005). Ent˜ao, para apoiar a manipula¸c˜ao de erros em programas, o mecanismo de tratamento de exce¸c˜oes permite separar o c´odigo de tratamento de exce¸c˜oes (fluxo de exce¸c˜ao ou fluxo excepcional) do c´odigo funcional (fluxo normal ou regular) e deixar um caminho limpo para a propaga¸c˜ao de erros de uma forma padronizada e estruturada.

Quando ocorrem erros, um programa bem projetado deve fornecer algumas maneiras de lidar com os erros esperados, com o objetivo de trat´a-los e permitir retorn´a-lo a um estado coerente. Portanto, o tratamento de exce¸c˜oes visa estruturar o fluxo excepcional de um programa, para que erros possam ser detectados, sinalizados e tratados.

Weimer e Necula (2004) citam estimavas de que entre 1% e 5% do c´odigo de sistemas de software modernos seja dedicado ao tratamento de exce¸c˜oes e que isso tende a crescer junto com o tamanho e a idade desses sistemas. Mecanismos de tratamento de exce¸c˜oes em diferentes linguagens de programa¸c˜ao possuem caracter´ısticas pr´oprias, mas basicamente seguem um mesmo processo. Sinha e Harrold (2000) realizaram dois estudos para avaliar a frequˆencia com que os programas Java utilizam o mecanismo de tratamento de exce¸c˜oes. O primeiro estudo revelou uma estimativa que cerca de 8,1% dos m´etodos cont´em parte c´odigo dedicado ao tratamento de exce¸c˜oes e o segundo estudo revelou uma estimativa que 23,3% e 24,5% das classes tˆem os comandos trye throw, respectivamente.

(31)

2.3.1

Tratamento de exce¸c˜

oes em C++

Uma regra simples e natural ´e a que recomenda que o melhor tratamento ´e a preven¸c˜ao. Assim o tratamento de exce¸c˜oes usa um bloco trypara preven¸c˜ao contra poss´ıveis erros, pois ele pode evitar alguns danos fatais, permitindo que o software fa¸ca todo o poss´ıvel para ser executado no estado normal. Al´em disso, o mecanismo de tratamento de exce¸c˜oes aumenta a legibilidade do c´odigo (Mao e Lu, 2005).

Uma exce¸c˜ao em C++ pode ser um objeto de qualquer tipo ou at´e mesmo de um tipo b´asico, mas ´e recomendado que as exce¸c˜oes sejam definidas hierarquicamente nas linguagens de programa¸c˜ao orientadas a objetos e inteiramente derivadas da biblioteca de exce¸c˜oes. A biblioteca de exce¸c˜oes ´e geralmente organizada como uma hierarquia de classes (Ellis e Stroustrup, 1993), como ´e mostrado na figura 2.4, na qual existe a classe abstrata exceptione todas as outras classes herdam direta ou indiretamente dela.

Figura 2.4: Hierarquia da biblioteca de exce¸c˜oes de C++ (Mao e Lu, 2005)

A organiza¸c˜ao das exce¸c˜oes em hierarquias pode ser ben´efica para a constru¸c˜ao de um c´odigo robusto. Durante o desenvolvimento de programas em C++ os programadores podem definir suas pr´oprias exce¸c˜oes ou a hierarquia e o tipo de exce¸c˜ao de acordo com suas necessidades. Notando que embora seja uma boa pr´atica, n˜ao ´e necess´ario que as exce¸c˜oes definidas pelo usu´ario herdem da classe exception e, portanto, para capturar qualquer exce¸c˜ao que possa ser encontrada no programa em execu¸c˜ao, a cl´ausula catch (...) deve ser usada (Mao e Lu, 2005).

O fluxo de controle do programa em C++ segue da seguinte forma: ap´os o tratamento de uma exce¸c˜ao, o controle n˜ao retorna para o ponto no qual a exce¸c˜ao foi levantada, mas continua na primeira declara¸c˜ao depois do manipulador de exce¸c˜ao. Para isso C++ registra as exce¸c˜oes em uma estrutura de pilha e se um m´etodo lan¸ca uma exce¸c˜ao, mas n˜ao faz o tratamento dela, ela ´e propagada para o seu chamador.

O tratamento de exce¸c˜oes ´e tamb´em uma estrutura de controle n˜ao local, composto por trˆes elementos b´asicos e um opcional:

(32)

• throw: lan¸camento de uma exce¸c˜ao;

catch: captura exce¸c˜oes;

• finally: Um bloco opcional, em que o c´odigo dentro de um bloco ´e executado independentemente do fato de uma exce¸c˜ao ser disparada ou n˜ao e se ela ´e capturada ou n˜ao.

Com a inclus˜ao de exce¸c˜oes, o fluxo de controle do programa pode ocorrer das seguintes maneiras:

• Se o bloco tryn˜ao lan¸car pelo menos uma exce¸c˜ao durante a execu¸c˜ao, o programa ignora as cl´ausulas catche continua a execu¸c˜ao normal;

• Se o blocotry lan¸ca uma exce¸c˜ao, o programa verifica os tratadores de exce¸c˜ao at´e encontrar um apropriado e, em seguida, caso seja encontrado um tratamento, ele ´e executado;

• Se n˜ao for capturada por nenhum tratador de exce¸c˜ao no n´ıvel da chamada a exce¸c˜ao

sobe para o pr´oximo n´ıvel;

Se todo o programa n˜ao prevˆe nenhum tratamento para a exce¸c˜ao lan¸cada, o

pro-grama chama a fun¸c˜ao terminate(), finalizando a sua execu¸c˜ao.

2.3.2

Tratamento de exce¸c˜

oes em Java

As exce¸c˜oes em Java s˜ao representadas por classes que herdam da classe

java.lang.Throwable (figura 2.5). Em Java, programadores podem criar suas pr´oprias classes de exce¸c˜ao, mas ´e importante que elas sejam criadas de acordo com a conven¸c˜ao existente. Isto implica que a classe java.lang.Exception deve ser a classe-base para tratamento de exce¸c˜oes verificadas (ao inv´es de subclasses diretas de Throwable), a di-feren¸ca entre exce¸c˜oes verificadas e n˜ao verificadas ´e explicada mais adiante nesta se¸c˜ao. As diversas subclasses da classe Exception s˜ao definidas na API para fazer o tratamento de exce¸c˜oes espec´ıficas (Azevedo, 2011).

As exce¸c˜oes em Java s˜ao classificadas nos seguintes tipos (Xavier et al., 2008):

• Ass´ıncronas: ocorrem em pontos n˜ao determin´ısticos do programa e s˜ao geradas

da Java Virtual Machine (JVM) ou por outras threads em processos concorrentes por um comando stop();

• S´ıncronas: ocorrem em pontos determinados do programa e s˜ao geradas por

(33)

Figura 2.5: Hierarquia de Exce¸c˜oes em Java (Azevedo, 2011)

• Impl´ıcitas: s˜ao lan¸cadas por uma chamada a uma sub-rotina ou pelo ambiente de

execu¸c˜ao;

• Expl´ıcitas: s˜ao lan¸cadas por um comandothrow;

• Verificadas/Checadas: s˜ao usadas para modelar falhas previstas no projeto de um

sistema e, em geral, s˜ao contorn´aveis. Devem ser sempre declaradas nas interfaces dos m´etodos que as lan¸cam e precisam ser tratadas. S˜ao verificadas pelo compilador com o objetivo de garantir que para cada exce¸c˜ao lan¸cada exista um tratamento de exce¸c˜oes definido (Ferreira, 2006);

• N˜ao Verificadas/Checadas : s˜ao usadas para modelar falhas que sejam

dif´ı-ceis de determinar os pontos exatos em que podem ser levantadas do programa e, em geral, n˜ao s˜ao facilmente contorn´aveis. Um exemplo de exce¸c˜oes n˜ao verifica-das s˜ao toverifica-das aquelas que s˜ao subclasses de java.lang.RuntimeException ou de

java.lang.Error. Exce¸c˜oes n˜ao verificadas n˜ao s˜ao verificadas pelo compilador e por isso podem ser lan¸cadas no c´odigo sem que seja obrigat´oria a defini¸c˜ao de um tratamento (Ferreira, 2006).

(34)

uma RunTimeException, em que a exce¸c˜ao continuaria sendo impl´ıcita mas agora seria n˜ao verificada. Por outro lado, se ao inv´es de fazer uma chamada a um m´etodo nativo fosse chamado um m´etodo de outra classe e em dois pontos distintos do c´odigo houvesse um comandothrowlan¸cando umaIOExceptione umaRunTimeException, ambas seriam expl´ıcitas, mas uma seria verificada e a outra n˜ao verificada.

Al´em disso, assim como na linguagem C++, Java ´e composta por quatro elementos para tratamento de exce¸c˜oes: trˆes b´asicos,try, catch ethrow, e um opcional,finally, o que ´e muito semelhante aos mecanismos de C++ descritos na se¸c˜ao anterior. Nesta se¸c˜ao ´e apresentado na figura 2.6 um exemplo de um pseudoc´odigo e uma breve descri¸c˜ao com o objetivo de exemplificar o tratamento de exce¸c˜oes.

public A Metodo() {

...

File m = File.open("FileX");

try {

VAR a = m.GetA();

if (a.AlgoErrado()) throw new VARException;

a.setInfo("Tudo ok com a Variavel"); }

catch (VARException e) {

// faz tratamento para Exce¸c~ao do tipo VARException }cath (Exception e) {

// faz tratamento para Exce¸c~ao do tipo Exception } finally {

m.close(); }

MetodoForaDoBlocoTry();

}

Figura 2.6: Exemplo de pseudoc´odigo com tratamento de exce¸c˜oes

(35)

lado, caso seja lan¸cada uma exce¸c˜ao de outro tipo como, por exemplo, uma exce¸c˜ao n˜ao verificada do tipo NullPointerException, ser´a executado o segundo bloco catch. Caso n˜ao seja levantada nenhuma exce¸c˜ao no bloco try, o fluxo de execu¸c˜ao n˜ao passar´a por nenhum dos blocoscatche ir´a diretamente para o blocofinally. ´E importante ressaltar que, independentemente do fluxo de execu¸c˜ao o bloco finally ser´a executado, exceto quando o programa for finalizado antes do bloco finally. Finalmente, se a execu¸c˜ao do bloco try-catch-finally terminar normalmente (sem que exce¸c˜oes sejam lan¸cadas a partir dos blocos catche finally), o c´odigo executado em seguida ser´a MetodoForaDo-BlocoTry().

2.3.3

Teste Estrutural de Tratamento de Exce¸c˜

oes

Existem v´arias t´ecnicas para teste e an´alise de programas baseadas em teste estrutural. A primeira abordagem de teste estrutural em programas com mecanismo de tratamento de exce¸c˜oes foi proposta por Sinha e Harrold (1999), e os seus principais conceitos s˜ao apresentados nesta se¸c˜ao.

Exce¸c˜oes s˜ao definidas nas seguintes condi¸c˜oes:

• Um valor ´e associado a uma vari´avel de exce¸c˜ao,

Ex: Exception e = new Exception();

Em um bloco catch no qual um valor ´e associado a uma vari´avel de exce¸c˜ao e a

vari´avel tempor´aria de exce¸c˜ao ´e associada a null,

Ex: catch(Exception e)

• Em um n´o throw que utiliza uma vari´avel tempor´aria de exce¸c˜ao,

Ex: throw new Exception();

• Em um n´o throw no qual ´e estabelecida uma associa¸c˜ao com a vari´avel tempor´aria de exce¸c˜ao.

Ex: throw e;

Exce¸c˜oes s˜ao utilizadas nas seguintes condi¸c˜oes:;

• O valor de uma vari´avel de exce¸c˜ao ´e acessada,

Ex: System.out.println(e);

Em um bloco catch, o valor da vari´avel tempor´aria de exce¸c˜ao ´e acessado,

(36)

• Em um n´o throw com uma vari´avel tempor´aria de exce¸c˜ao,

Ex: throw new Exception().

Um conjunto defini¸c˜ao-uso para uma exce¸c˜ao (e-du) ´e uma tripla ( v, i, j ), em que i ´e a linha onde a vari´avel v foi definida e j onde foi usada. Al´em das defini¸c˜oes e uso, exce¸c˜oes apresentam outro conceito associado `a ativa¸c˜ao e desativa¸c˜ao, ou seja, quando um objeto de exce¸c˜ao ´e associado ou desassociado de uma vari´avel tempor´aria de exce¸c˜ao. Uma cl´ausula throw ativa uma exce¸c˜ao e uma cl´ausula catch desativa uma exce¸c˜ao. Al´em disso, uma exce¸c˜ao pode ser desativada dentro de uma cl´ausula finally com o uso dos comandos return, break, continue ou outra cl´ausula throw. Um conjunto ativa¸c˜ao-desativa¸c˜ao para uma exce¸c˜ao ( e-ad ) ´e uma tripla ( v, i, j ), onde i ´e a linha na qual v foi ativada e j a linha em que foi desativada.

A abordagem apresentada define os seguintes crit´erios de teste:

• all-throw: deve-se executar todos os n´os throw,

• all-catch: deve-se executar todos os n´os catch,

all-e-defs: deve-se executar os caminhos do programa com o objetivo de cobrir

todas as defini¸c˜oes de exce¸c˜oes e pelo menos um uso de cada uma (´e semelhante ao crit´erio todas-def-use de testes baseados em fluxo de dados),

• all-e-use: deve-se executar todas as triplas defini¸c˜oes-uso das exce¸c˜oes.

• all-e-act: deve-se executar os caminhos do programa de forma a cobrir todas as

ativa¸c˜oes e pelo menos uma desativa¸c˜ao de cada exce¸c˜ao. Ou seja, ´e semelhante ao crit´erio all-e-defs, trocando as defini¸c˜oes e usos por ativa¸c˜oes e desativa¸c˜oes,

all-e-deact: deve-se exercitar todas as triplas ativa¸c˜ao-desativa¸c˜ao das exce¸c˜oes.

(37)

Figura 2.7: Exemplo de programa e GFC integrado constru´ıdo com a utiliza¸c˜ao da abor-dagem de Sinha e Harrold (2000)

Crit´erio Requisitos all-throw 30; 32; 33 all-catch 2; 10; 33; 38

all-e-defs 2,7; 10,10; 16,30; 16,32; 33,33; 38,38 all-e-use 2,7; 2,5; 10,10; 16,30; 16,32; 33,33; 38,38 all-e-act 30,33; 32,38; 33,2

all-e-deact 2,7; 10,10; 16,30; 16,32; 30,33; 32,38 33,33; ; 33,2; 38,38;

Tabela 2.1: Requisitos de teste para os crit´erios propostos por Sinha e Harrold (1999)

2.4

Considera¸c˜

oes Finais

(38)
(39)

3

Teste e verifica¸c˜

ao de tratamento de

exce¸c˜

oes em programas OO e OA: uma

revis˜

ao da literatura

3.1

Considera¸c˜

oes Iniciais

Este cap´ıtulo apresenta um resumo das informa¸c˜oes mais importante de uma revis˜ao bibliogr´afica sobre teste e verifica¸c˜ao de tratamento de exce¸c˜oes. O principal objetivo dessa revis˜ao foi a identifica¸c˜ao de trabalhos que apresentam abordagens para teste estrutural de tratamento de exce¸c˜oes. Al´em disso, tamb´em visou identificar ferramentas de apoio para as abordagens e modelos de defeitos, padr˜oes de defeitos e estudos emp´ıricos realizados para avaliar as abordagens identificadas.

(40)

3.2

Revis˜

ao da literatura

O planejamento da revis˜ao apresentado neste cap´ıtulo foi inspirado pela proposta de Kitchenham (2004). As atividades referentes ao planejamento e condu¸c˜ao da revis˜ao foram acompanhadas por um especialista (orientador de mestrado do revisor) que ofereceu o suporte te´orico e pr´atico necess´ario para a condu¸c˜ao da revis˜ao.

3.2.1

Planejamento de Revis˜

ao

A primeira fase da revis˜ao ´e o seu planejamento. Nessa fase devem ser definidos os objetivos da pesquisa e a forma como a revis˜ao ser´a conduzida. Algumas das informa¸c˜oes mais relevantes do planejamento da revis˜ao realizada s˜ao apresentadas a seguir.

Quatro quest˜oes de pesquisa foram elaboradas para satisfazer os objetivos desta revi-s˜ao:

Quais abordagens existem para teste de tratamento de exce¸c˜oes em programas OA

e OO ?

• Quais estudos tˆem sido realizados para avaliar as abordagens propostas para teste

estrutural de tratamento de exce¸c˜oes?

• Quais s˜ao as ferramentas existentes para teste de tratamento de exce¸c˜oes em

pro-gramas OA e OO?

Quais s˜ao os principais tipos de defeitos em rela¸c˜ao ao tratamento de exce¸c˜oes em

programas OA e OO?

3.2.2

Recursos para Busca e Sele¸c˜

ao de Estudos

Os recursos e estrat´egias para busca e sele¸c˜ao de estudos preliminares foram definidos com base em trˆes itens fundamentais para o sucesso da pesquisa: a identifica¸c˜ao de boas fontes de busca, defini¸c˜ao dos idiomas das obras e defini¸c˜ao dos termos relacionados ao tema de pesquisa:

Identifica¸c˜ao de fontes de busca: As fontes escolhidas foram algumas das

prin-cipais bases da ´area de computa¸c˜ao, tais como IEEE, ACM, Scopus, SciELO, Sci-ence Direct e tamb´em uma busca manual exaustiva nas ´ultimas dez edi¸c˜oes da

(41)

• Idiomas dos trabalhos: O inglˆes, por ser a l´ıngua internacionalmente usada para

escrever trabalhos cient´ıficos e o portuguˆes, pela ´area ter muitos pesquisadores no Brasil;

Termos Relacionados: Teste estrutural, tratamento de exce¸c˜oes, Programas

Ori-entados a Objetos, Programas OriOri-entados a Aspectos, Ferramentas.

Para busca optou-se pela op¸c˜ao de pesquisar nos textos completos ao inv´es de apenas no resumo. A string de busca n˜ao cont´em os termos referentes `a OO ou OA, pois os retornos em sua maioria s˜ao referentes a estes tipos de programas possivelmente porque o mecanismo de tratamento de exce¸c˜oes come¸cou com os programas OO, e tamb´em optou-se por restringir a busca somente trabalhos posteriores ao ano 2000 pois foi a partir desse ano que come¸caram os trabalhos com Aspectos. Para realizar a busca dos estudos, a string de busca foi adaptada para pesquisa em cada uma das fontes de busca, mas astring gen´erica ficou defina da seguinte forma: (”structural test”OR ”structural testing”) AND (”Exception Handling”OR ”exceptional behavior”).

Para sele¸c˜ao dos estudos foram definidos 7 crit´erios de inclus˜ao e exclus˜ao. Os cri-t´erios de inclus˜ao foram propostos em dois grupos o prim´ario e o secund´ario dentre eles o prim´ario ´e o grupo com os crit´erios mais relevantes. Assim os crit´erios de inclus˜ao e exclus˜ao foram definidos da seguinte forma:

Crit´erios de inclus˜ao prim´arios

1. Estudos emp´ıricos avaliando efic´acia/custo de abordagens de teste de trata-mento de exce¸c˜oes;

2. Abordagens de teste de tratamento de exce¸c˜oes;

3. Ferramentas que apoiam teste de tratamento de exce¸c˜oes;

• Crit´erios de inclus˜ao secund´arios

1. Modelo de falhas de tratamento de exce¸c˜oes em programas OO e OA;

2. Abordagens de VV&T de tratamento de exce¸c˜oes;

3. Abordagens de gera¸c˜ao de dados de teste de tratamento de exce¸c˜oes;

4. Estudo, modelo , abordagem ou ferramenta interessante e vi´avel de ser adap-tado para o teste de tratamento de exce¸c˜oes;

Crit´erios de Exclus˜ao

(42)

2. N˜ao se trata de teste estrutural;

3. N˜ao se trata de teste de software;

4. N˜ao se trata de Tratamento de exce¸c˜oes;

5. N˜ao se encontra redigido em inglˆes ou portuguˆes;

6. N˜ao corresponde a pesquisa ou publica¸c˜ao;

7. Vers˜ao completa n˜ao est´a dispon´ıvel.

O resultado da busca e sele¸c˜ao pode ser visualizado na tabela 3.1 que informa os trabalhos inclu´ıdos, exclu´ıdos e repetidos para cada uma das fontes de pesquisa. No total foram retornados quatrocentos e cinquenta e oito trabalhos que passaram pela sele¸c˜ao preliminar, em que foi realizada a leitura dos resumos, e depois da sele¸c˜ao final. Ap´os a sele¸c˜ao foram inclu´ıdos trinta e oito trabalhos e exclu´ıdos quatrocentos e vinte trabalhos, e ent˜ao foi realizada a leitura completa dos trabalhos. Dentre os trabalhos selecionados dezenove deles s˜ao mais relevantes no contexto deste trabalho. Sobre eles uma an´alise e uma s´ıntese das suas principais contribui¸c˜oes s˜ao apresentadas nas se¸c˜oes seguintes.

IEEE ACM Scopus Science SciELO LNCS AOSD Cons. Σ

Direct a Esp.

Trab. Inc.

13 10 5 5 0 0 4 1 38

Trab. Exc.

43 73 7 9 0 75 202 0 409

Trab. Rep.

0 1 5 0 0 0 0 5 11

Total/ Fonte

56 84 17 14 0 75 206 6 458

Tabela 3.1: Resultados da revis˜ao bibliogr´afica por fonte de pesquisa.

3.3

Teste Estrutural de tratamento de exce¸c˜

oes

(43)

assim como algoritmos para constru¸c˜ao desses grafos. A t´ecnica para a cria¸c˜ao do grafo denominado GFC interprocedural (GFCI) com fluxo de exce¸c˜oes pode ser descrita nos seguintes passos (Sinha e Harrold, 2000):

1. Numeram-se todas as linhas do programa;

2. Cada bloco indivis´ıvel do programa ´e representado por um n´o com seu respectivo n´umero;

3. Os n´os s˜ao interligados por arestas;

4. Para cada ponto onde ´e feita uma chamada a um m´etodo divide-se o n´o em um ponto de sa´ıda para o retorno do m´etodo. As arestas de fluxo entre m´etodos s˜ao representadas em linhas pontilhadas;

5. Cada m´etodo tem um n´o de entrada e um n´o de sa´ıda;

6. Cada lan¸camento de exce¸c˜ao (throw) gera uma aresta de sa´ıda com a identifica¸c˜ao da exce¸c˜ao que est´a sendo gerada;

7. Caso a exce¸c˜ao seja capturada por uma cl´ausula catch no mesmo m´etodo, esta aresta ser´a conectada ao n´o correspondente, caso contr´ario ser´a criado um n´o de sa´ıda excepcional para retorno ao m´etodo chamador. Este n´o de sa´ıda identifica o tipo de exce¸c˜ao que o gerou;

8. Cada n´o de blococatch´e representado por um n´o com um r´otulo referente ao tipo de exce¸c˜ao que trata, al´em do n´umero da linha;

9. Blocos finallys˜ao tratados como se fossem m´etodos, possuindo n´os de entrada e de sa´ıda.

Um exemplo de c´odigo e seu respectivo IGFC, de acordo com a proposta de Sinha e Harrold (2000) pode ser visualizado na figura 2.7.

(44)

• Conhecer os tipos b´asicos de exce¸c˜oes definidos na linguagem, e descobrir quais

co-mandos (mecanismos da linguagem) podem gerar exce¸c˜oes para os tipos de exce¸c˜ao definidos na linguagem;

• Programadores experientes podem definir o tipo de instru¸c˜ao que ´e prov´avel ser ter

PES;

• Identificar as categorias e causas de PES, com base em resultados de testes

anteri-ores.

A discuss˜ao sobre exce¸c˜oes impl´ıcitas aborda quais tipos s˜ao mais relevantes. Dessa forma, sugere-se que somente as exce¸c˜oes impl´ıcitas com alta chance de ocorrˆencia s˜ao relevantes para a atividade de teste na abordagem proposta. Eles tamb´em prop˜oem uma representa¸c˜ao na forma de um grafo para programas OO em C++ contendo o fluxo de exce¸c˜oes impl´ıcitas e exce¸c˜oes expl´ıcitas, assim como um algoritmo para cria¸c˜ao do grafo proposto. A figura 3.1 mostra um exemplo de um GFCI criado por essa abordagem.

A figura 2.7, representa o mesmo exemplo em Java e a abordagem de Sinha e Harrold (2000) permitindo comparar as duas abordagens. Na representa¸c˜ao proposta por Sinha e Harrold (2000) s´o ´e poss´ıvel identificar trˆes lan¸camentos de exce¸c˜ao nos n´os 30, 32 e 33 e que n˜ao existe uma aresta que leve at´e o n´o 10 que corresponde ao segundo catch

do m´etodo function2. Na representa¸c˜ao proposta por Mao e Lu (2005) identificam-se seis lan¸camentos de exce¸c˜ao nos n´os 14, 15 e 18 que correspondem aos n´os 30, 32 e 33 do outro grafo e mais trˆes poss´ıveis lan¸camentos de exce¸c˜ao nos n´os 8 e 9 que correspondem a lan¸camentos impl´ıcitos. A partir desses lan¸camentos passam a existir caminhos que podem exercitar o segundo catch do m´etodo function2 que corresponde ao n´o 27 e que na outra representa¸c˜ao correspondia ao n´o 10, para o qual n˜ao existiam caminhos no grafo que permitiam alcan¸c´a-lo.

Alguns crit´erios de teste para programas Java foram pospostos por Vincenzi et al. (2006) para o teste de unidade. Al´em disso, ao inv´es de testar o c´odigo fonte dos programas estes crit´erios testam o bytecode da linguagem Java. Para entendimento desses crit´erios s˜ao apresentados alguns conceitos:

Considere N o conjunto de n´os e E o conjunto de arestas de um grafo de programa com informa¸c˜oes de tratamento de exce¸c˜oes.

Aresta de exce¸c˜ao: s˜ao desvios no fluxo de controle de um programa, que fazem com que ele saia de algum ponto em um blocotrye v´a para o inicio de um blococatchou

finally. Normalmente esses desvios s˜ao gerados pelo lan¸camento de uma exce¸c˜ao.

(45)

Figura 3.1: GFCI constru´ıdo com utiliza¸c˜ao da abordagem de Mao e Lu (2005)

Caminho livre de exce¸c˜ao: ´e alcan¸c´avel por meio de um caminho que n˜ao contenha arestas de exce¸c˜ao.

N´os dependentes de exce¸c˜ao (Ned) : ´e um subconjunto completo de n´os que s´o

po-dem ser alcan¸cados em um caminho que contenha o lan¸camento de uma exce¸c˜ao.

N´os independentes de exce¸c˜ao (Nei) : ´e um subconjunto completo de n´os que podem ser alcan¸cados por um caminho livre de exce¸c˜ao. ´E importante ressaltar que esses subconjuntos s˜ao distintos, ou seja, Nei ∩ Ned = ∅, e que juntos representam o

conjunto completo de n´os de um grafo de programa, ou seja,Nei∪Ned =N.

Arestas dependentes de exce¸c˜ao (Eed) : ´e um subconjunto completo de arestas que s´o podem ser alcan¸cadas em um caminho que contenha o lan¸camento de uma exce-¸c˜ao. ´E importante ressaltar que arestas regulares podem fazer parte de Eed. Isso

ocorre quando uma aresta regular s´o puder ser alcan¸cada em um caminho onde ocorre o lan¸camento de uma exce¸c˜ao.

(46)

Com base nos conceitos apresentados, os crit´erios de teste propostos por Vincenzi et al. (2006) s˜ao:

• todos-n´os-independentes-de-exce¸c˜ao (Todos-N´osei): requer que cada n´o

al-can¸c´avel por meio de pelo menos um caminho livre de exce¸c˜ao seja exercitado ao menos uma vez;

• todos-n´os-dependentes-de-exce¸c˜ao (Todos-N´osed): requer que cada n´o n˜ao

alcan¸c´avel por meio de pelo menos um caminho livre de exce¸c˜ao seja exercitado ao menos uma vez;

• todas-arestas-independentes-de-exce¸c˜ao (Todos-Arestasei): requer que cada

aresta alcan¸c´avel por meio de pelo menos um caminho livre de exce¸c˜ao seja execu-tada ao menos uma vez;

• todas-arestas-dependentes-de-exce¸c˜ao (Todos-Arestased): requer que cada

aresta que n˜ao ´e alcan¸c´avel por meio de pelo menos um caminho livre de exce¸c˜ao seja exercitada ao menos uma vez;

• todos-usos-independentes-de-exce¸c˜ao (Todos-Usosei): requer que toda

as-socia¸c˜ao defini¸c˜ao-uso independente de exce¸c˜ao seja exercitada ao menos uma vez;

• todos-usos-dependentes-de-exce¸c˜ao (Todos-Usosed): requer que toda

asso-cia¸c˜ao defini¸c˜ao-uso dependente de exce¸c˜ao seja exercitada ao menos uma vez;

• todos-potenciais-usos-independentes-de-exce¸c˜ao (Todos-Usosei): requer

que toda potencial associa¸c˜ao defini¸c˜ao-uso independente de exce¸c˜ao seja exercitada ao menos uma vez;

• todos-potenciais-usos-dependentes-de-exce¸c˜ao (Todos-Usosed): requer que

toda potencial-associa¸c˜ao defini¸c˜ao-uso dependente de exce¸c˜ao seja exercitada ao menos uma vez.

(47)

dele. Por essa raz˜ao, a informa¸c˜ao de n´ıvel desse m´etodo n˜ao ´e mostrada. Os requisitos de teste apresentados na tabela 3.2 s˜ao derivados considerando que o grafo integrado seja uma unidade, pois esses crit´erios foram desenvolvidos pensando no teste de unidade.

Para analisar os crit´erios propostos pode-se comparar seus requisitos com os gerados pelos crit´erios da tabela 2.1. ´E poss´ıvel ver que o crit´erio todos-n´os-ed ´e semelhante ao crit´erioall-catch, mas com a diferen¸ca de que o crit´erio todos-n´os-ed inclui exercitar al´em dos n´os catch os n´os finally. O crit´erio todos-arestas-ed tamb´em tem o objetivo de exercitar os blocos catch, mas ao inv´es de requerer a execu¸c˜ao dos n´os ele gera como requisito todas as arestas que levam at´e um n´o catch. Aparentemente esse crit´erio n˜ao tem uma rela¸c˜ao clara com nenhum dos crit´erios propostos por Sinha e Harrold (2000), mas uma an´alise cuidadosa mostra que satisfazer esse crit´erio pode ser semelhante a satisfazer o crit´erioall-e-deact pois exercitar uma tripla ativa¸c˜ao-desativa¸c˜ao corresponde a exercitar uma aresta de exce¸c˜ao que sai da ativa¸c˜ao da exce¸c˜ao e termina em sua desativa¸c˜ao, seja em um n´o catch ou em um n´o finally. O crit´erio todos-usos-ed, mesmo que tenha sido projetado para o fluxo de exce¸c˜ao, n˜ao parece ser muito adequado para o objetivo de exercitar o fluxo de exce¸c˜ao. Tomando-se o exemplo da figura 3.2, se n˜ao fosse pelas impress˜oes na tela dentro dos bloco catch por meio do comando System.out.println

esse crit´erio n˜ao geraria nenhum requisito de teste pois, ao contr´ario, o requisito de teste all-e-use gera sete requisitos e aparentemente ´e um requisito forte quando o objetivo ´e exercitar o fluxo de exce¸c˜ao. Assim pode-se concluir que o crit´erio todos-usos-ed ´e ´util como um complemento do crit´erio todos-usos-ei para que juntos seja poss´ıvel exercitar todos os usos do programa, mas que n˜ao ´e relevante para o teste do fluxo de exce¸c˜ao.

Para apoiar a aplica¸c˜ao destes crit´erios, eles foram implementados na ferramenta Ja-BUTi, que faz a gera¸c˜ao do grafo denominado grafo Def-Uso (DUG)(figura 3.5) a partir do seu bytecode, gera os requisitos de teste e calcula a cobertura dos testes automatica-mente. Mais informa¸c˜ao sobre ela encontra-se na sess˜ao de ferramentas. Seguindo essa linha do trabalho, Lemos et al. (2007) prop˜oem uma abordagem de teste com suporte a programas OA com AspectJ. Para a representa¸c˜ao do programa OA Lemos et al. (2007) prop˜oem uma representa¸c˜ao por meio de um grafo Def-Uso orientado a aspecto (AODU). Esse grafo cont´em informa¸c˜oes sobre o fluxo de controle, de dados e de manipuladores de exce¸c˜ao de uma unidade de um programa OA e tamb´em ´e derivado do bytecode do pro-grama. Nessa representa¸c˜ao al´em dos n´os e arestas do m´etodo, tamb´em s˜ao representados os n´os e arestas transversais, que s˜ao os n´os e arestas em que ocorre a itera¸c˜ao de um ou mais adendos de determinados aspectos com o m´etodo. Essa abordagem representa os n´os transversais por meio de elipses tracejadas com informa¸c˜ao do tipo do adendo (before,

(48)

visualiza¸c˜ao deles ´e poss´ıvel ressaltar a diferen¸ca entre a representa¸c˜ao sem suporte OA de Vincenzi et al. (2006) e a representa¸c˜ao com suporte OA proposta por Lemos et al. (2007).

Crit´erio Requisitos no

de requisitos Todos-n´os-ei 0; 15; 22; 28; 44; 1.0; 1.22; 1.31; 1.33; 1.72; 1.79; 1.82; 12

Todos-n´os-ed 7; 35; 1.85; 1.98 4

Todos-arestas-ei 0,1.0; 7,15; 22,44; 28,44; 35,44; 0,1.0; 1.0,1.22; 1.22,1.31; 1.31,1.33;1.33,1.72; 1.72,1.79; 1.72,1.82;1.98,44;

14

Todos-arestas-ed 0,7; 0,35; 1.72,1.85; 1.72,1.98; 1.79,1.85; 1.79,1.98; 1.82,1.85; 1.82,1.98

8

Todos-usos-ei L@1, 0,(1.33, 1.33)>; L@1, 0,(1.33, 1.72); L@2, 0,(1.33, 1.33); L@2, 0,(1.33, 1.72); L@3, 1.33,(1.33, 1.33); L@3, 1.33,(1.33, 1.72); L@4, 0,(1.33, 1.33); L@4, 0,(1.33, 1.72); L@4, 0,(1.72, 1.79); L@4, 0,(1.72, 1.82); L@5, 0,(1.33, 1.33); L@5, 0,(1.33, 1.72); L@5[], 1.33,(1.33, 1.33); L@5[], 1.33,(1.33, 1.72); L@6, 0,1.79; L@7, 0,1.82; S@.pex.cin, 0,(1.33, 1.33); S@.pex.cin, 0,(1.33, 1.72); S@.pex.cin[], 0,(1.33, 1.33); S@.pex.cin[], 0,(1.33, 1.72)

20

Todos-usos-ed S@.System.out, 0,1.85; S@.System.out, 0,1.98 2

Tabela 3.2: Requisitos de teste para os crit´erios propostos por Vincenzi et al. (2006)

Esta abordagem utiliza os crit´erios propostos por Vincenzi et al. (2006) e adiciona no-vos crit´erios afim de abranger tamb´em a cobertura dos aspectos. Os crit´erios adicionados s˜ao:

todos-n´os-transversais (Todos-N´osc): requer que cada n´o transversal, e por

tanto cada execu¸c˜ao de adendo seja exercitado pelo menos uma vez;

todos-arestas-transversais (Todos-Arestasc): requer que cada aresta

trans-versal seja exercitada ao menos uma vez;

• todos-usos-transversais (Todos-Usosc): requer que toda associa¸c˜ao defini¸c˜ao-uso

que contenha um n´o transversal ou uma aresta que inicie em um n´o transversal seja exercitada ao menos uma vez.

(49)

Figura 3.2: Exemplo de bytecode e grafo para o cod´ıgo da figura 2.7

Figura 3.3: Exemplo de c´odigo: classe Point e aspectoanAspectP

(50)

Figura 3.4: Parte do bytecode do m´etodo affectedMethod sem a presen¸ca de aspectos

Figura 3.5: Grafo DUG do m´etodo affectedMethod

(51)

Figura 3.6: Grafo AODU do m´etodo affectedMethodentrecortado pelo aspecto anAs-pect

f´acil identificar onde ocorrem as itera¸c˜oes adicionadas pelos adendos. Para essa abordagem Lemos e Masiero (2011) tamb´em prop˜oem seis crit´erios dos quais trˆes deles para o fluxo de exce¸c˜ao. Os trabalhos de Lemos e Masiero (2011) e de Lemos et al. (2007) utilizam a ferramenta JaBTUi/AJ para dar suporte `as abordagens propostas. Mais informa¸c˜oes sobre a ferramenta JaBTUi/AJ ser˜ao apresentadas na se¸c˜ao de ferramentas.

3.4

Outras abordagens para teste e verifica¸c˜

ao do fluxo

de exce¸c˜

ao

O trabalho de Coelho et al. (2011) apresenta uma abordagem de verifica¸c˜ao com o ob-jetivo de verificar a confiabilidade do c´odigo de tratamento de exce¸c˜oes em programas AspectJ. Essa abordagem tenta ajudar o desenvolvedor a identificar como integrar efeti-vamente os aspectos no c´odigo base, reduzindo o risco de introdu¸c˜ao de falhas no c´odigo de tratamento de exce¸c˜oes. Para isso a abordagem apoia o desenvolvedor a compreen-der o fluxo excepcional dos sistemas OA, descrever contratos de tratamento de exce¸c˜oes e verificar automaticamente tais contratos. A abordagem ´e composta por cinco etapas principais, que podem ser visualizadas na figura 3.9; algumas s˜ao apoiadas por uma fer-ramenta denominada SAFE. Essa abordagem ´e complementar a algumas abordagens de teste OA.

(52)

Figura 3.7: Codigo fonte das classes Employee, Paymentinfo, WorkInfo e do aspecto

AcessControl(Lemos e Masiero, 2011)

Figura 3.8: Grafo AODU do m´etodo affectedMethodentrecortado pelo aspecto anAs-pect (Lemos e Masiero, 2011)

de dados do programa e a partir delas s˜ao definidos os requisitos de teste para o fluxo de exce¸c˜oes.

(53)

Figura 3.9: Etapas da abordagem de an´alise est´atica proposta por Coelho et al. (2011)

Di Bernardo et al. (2011), propuseram uma abordagem ´agil para testar fluxo de exce¸c˜ao baseada em testes funcionais. Esta abordagem pode ser usada para escrever os testes antes da implementa¸c˜ao do sistema (”testfirst”) e tamb´em pode ser aplicada nas etapas finais de desenvolvimento, para ajudar nas atividades e em sistemas existentes. Essa abordagem tem o objetivo de testar se os caminhos percorridos pelas exce¸c˜oes a partir dos pontos onde elas s˜ao lan¸cadas at´e os seu tratamento est˜ao implementadas da maneira correta. Assim, um teste verifica o fluxo de exce¸c˜ao com base em uma especifica¸c˜ao e compara com o fluxo de exce¸c˜oes que ocorre na execu¸c˜ao. A abordagem de teste funcional proposta para teste do fluxo de exce¸c˜ao pode ser dividida nas seguintes atividades: selecionar os principais fluxos de exce¸c˜ao, criar casos de testes para exercitar estes caminhos, testar o conjunto de casos de teste, verificar os resultados dos testes, corre¸c˜ao de erros, reaplica¸c˜ao dos testes.

Sales e Coelho (2011) propuseram uma abordagem que permite definir regras de design para o tratamento de exce¸c˜oes que podem ser checadas dinamicamente atrav´es de testes. Para a defini¸c˜ao das regras de tratamento de exce¸c˜oes ´e utilizado um arquivo de contratos de exce¸c˜oes (um exemplo desse arquivo pode ser visto na figura 3.10). O contrato de ex-ce¸c˜oes utiliza o formatoXMLe ´e formado por uma ou mais cl´ausulas, em que cada cl´ausula cont´em trˆes elementos principais, que s˜ao: o sinalizador, que indica um ou mais m´etodos que lan¸cam um tipo de exce¸c˜ao, a exce¸c˜ao, que indica o tipo da exce¸c˜ao e o tratador, que define um ou mais m´etodos respons´aveis pelo tratamento de exce¸c˜oes. O exemplo apresentado na 3.10 mostra trˆes cl´ausulas a primeira especifica que: as exce¸c˜oes do tipo

(54)

Figura 3.10: Exemplo de contrato de exce¸c˜ao.

Romano et al. (2011) prop˜oem uma abordagem para gera¸c˜ao de dados de testes com base em busca (search-based) com o objetivo de identificar automaticamente exce¸c˜oes do tipo NullPointerException em programas Java. A primeira etapa dessa abordagem consiste em um conjunto de dados interprocessual e de an´alise do fluxo de controle, que identifica os caminhos entre os parˆametros de entrada e potenciasNullPointerException. A segunda ´e um algoritmo gen´etico capaz de lidar com entradas complexas contendo estruturas de dados arbitr´arias, que s˜ao utilizadas para evoluir a popula¸c˜ao de dados de teste com o objetivo de abranger os caminhos identificados na etapa.

(55)

´e poss´ıvel, pois a abordagem s´o tem suporte para linguagens compiladas, mas os autores prop˜oe uma arquitetura para que seja poss´ıvel criar uma extens˜ao da ferramenta que possa testar programas na linguagem Java.

3.5

Ferramentas

Os trabalhos discutidos nas subse¸c˜oes anteriores apresentam algumas ferramentas para dar suporte aos crit´erios e abordagens de teste propostos. Elas s˜ao comentadas a seguir.

A ferramenta SAFE foi desenvolvida para apoiar a abordagem proposta por Coelho et al. (2011). Ela analisa o bytecode gerado de sistemas AspectJ a fim fornecer ao desen-volvedor informa¸c˜oes referentes ao fluxo de exce¸c˜ao da aplica¸c˜ao. A ferramenta apoia as etapas 1, 3 e 4 da abordagem, conforme a figura 3.9.

No trabalho de Sinha e Harrold (2000) ´e mencionada a ferramenta JABA, que quando o artigo foi publicado ainda estava na fase de prot´otipo. Os autores informam que a ferramenta foi utilizada nos estudos realizados, mas n˜ao detalham o seu desenvolvimento e uso. N˜ao foram encontradas referˆencias posteriores a essa ferramenta.

OconGraX (Object Control-Flow Graph with eXceptions) ´e uma ferramenta gr´afica de interface amig´avel desenvolvida em JAVA que tem por objetivo apoiar atividade de testes em sistemas JAVA (Nunes et al., 2009). Para isso, recebe como entrada um sistema e devolve um grafo de fluxo de controle dos objetos e das exce¸c˜oes desse sistema al´em de um arquivo XML que cont´em os objetos e as exce¸c˜oes do sistema. A interface da ferramenta pode ser visualizada na figura 3.11, na qual a ferramenta exibe um grafo de programa gerado nela.

Java PathFinderExceptions ´e uma extens˜ao da ferramenta Java PathFinder (que ´e um verificador de modelo desenvolvido pelo centro de pesquisa da NASA (Team, 2005)). Ele checa propriedades referentes ao tratamento de exce¸c˜oes em um sistema Java, al´em de gerar estat´ısticas de cobertura relativas aos estados varridos durante a verifica¸c˜ao. A figura 3.12 mostra a tela de sele¸c˜ao das propriedades que a ferramenta ´e capaz de verificar (Xavier et al., 2008).

(56)

Figura 3.11: Ferramenta OConGraX (Xavier et al., 2008)

Figura 3.12: Ferramenta Java PathFinder Exceptions

que da suporte ao teste estrutural para programas Java e AspectJ e tem implementados v´arios crit´erios de testes de software baseados em fluxo de controle e crit´erios baseados em fluxo de dados. A JaBUTi/AJ mantem as caracter´ısticas da JaBUTi original (Lemos e Masiero, 2008; Lemos et al., 2007). Esta ferramenta ´e usada neste trabalho e discutida no cap´ıtulo 4.

Imagem

Figura 2.2: C´odigo fonte para calcular o maior entre dois n´ umeros
Figura 2.3: Exemplo de grafo GFC,(a) GFC e (b) c´odigo fonte usado para gerar o GFC.
Figura 2.5: Hierarquia de Exce¸c˜oes em Java (Azevedo, 2011)
Figura 2.7: Exemplo de programa e GFC integrado constru´ıdo com a utiliza¸c˜ao da abor- abor-dagem de Sinha e Harrold (2000)
+7

Referências

Documentos relacionados

A finalidade do “Documento de Arquitetura de Software - DAS” é definir um modelo arquitetural para ser aplicado ao desenvolvimento dos jogos do Desafio SEBRAE, bem como

• A Revolução Industrial corresponde ao processo de industrialização que teve início na segunda metade do.. século XVIII no

Estes juízos não cabem para fenômenos tão diversos como as concepções de visões de mundo que estamos tratando aqui.. A velocidade deste mundo

lhante; linhas vasculares bem v1S1veis, cheias de conteúdo amarelo-pardo, em geral retas; pa- rênquima axial moderadamente abundante, pa- ratraqueal em faixas; raios

Use a auto hipnose para se libertar dos seus medos e fobias. A auto A auto sabotagem é sabotagem é uma constante uma constante em sua em sua vida? Sempre vida? Sempre que você

servidores, software, equipamento de rede, etc, clientes da IaaS essencialmente alugam estes recursos como um serviço terceirizado completo...

Algunos especialistas afirman que todo profesor es un tutor y que la tutoría incide en los aspectos del ambiente escolar que condicionan la actividad del estudiante y sus

qualquer outro modelo de currículo, mesmo contendo as informações requisitadas,.. desclassificará automaticamente o candidato, bem como será imediatamente retido pela