• Nenhum resultado encontrado

3.2 Defini¸c˜ao

3.4.2 Procedimentos para Coleta de M´etricas de LOC

Ap´os a tarefa de cria¸c˜ao dos casos de teste de cada grupo de aplica¸c˜oes, os testes tive- ram que ser adaptados para o seu paradigma oposto com as implementa¸c˜oes equivalentes. Para a adapta¸c˜ao desses testes, algumas aplica¸c˜oes necessitaram de modifica¸c˜oes no c´o- digo em teste devido a diferentes recursos de linguagem. Por exemplo, para recuperar um objeto dentro de um aspecto em uma aplica¸c˜ao OA, pode-se utilizar o m´etodo est´atico aspectOf(), mas tal recurso n˜ao existe na linguagem Java. Com isso, ´e necess´aria a adap- ta¸c˜ao para o c´odigo OO com os recursos dispon´ıveis da linguagem para que os conjuntos de testes sejam adequados, mantendo a equivalˆencia funcional. Isto foi feito para todas aplica¸c˜oes, tanto para o Grupo-A (OO → OA) quanto para o Grupo-B (OA → OO).

Aplica¸c˜ao das m´etricas nas classes de testes

Em geral, para a convers˜ao dos casos de teste entre aplica¸c˜oes OO e OA, houve uma maior semelhan¸ca sint´atica entre os casos de teste. Quando a convers˜ao dos casos de teste n˜ao puderam seguir a semelhan¸ca est´atica devido aos recursos de linguagem dispon´ıveis em cada paradigma, a semelhan¸ca semˆantica do caso de teste foi preservada. Os valores das entradas deveriam ser iguais sempre que poss´ıvel. Caso n˜ao fossem, elas deveriam ser minimamente correspondentes, ou seja, deveriam ser suficientes para que executassem o mesmo comportamento esperado da opera¸c˜ao.

Para a coleta de m´etricas de LOC foi utilizado o Plugin Metrics14

e a ferramenta Meld Diff Viewer15. O Plugin Metrics trata-se de um plugin da IDE Eclipse para contar linhas de c´odigo em diferentes n´ıveis (m´etodo, classe, aplica¸c˜ao, etc.) e a Meld Diff Viewer trata-se de uma ferramenta para compara¸c˜ao de caracteres entre arquivos, com o objetivo de comparar e destacar as diferen¸cas entre eles.

Na Figura 3.7 ´e apresentado um exemplo de como um caso de teste da aplica¸c˜ao Chess foi adaptado da implementa¸c˜ao OO para OA, e na Figura 3.8 ´e mostrado um exemplo de como um caso de teste da aplica¸c˜ao ObjectRequest foi migrado da implementa¸c˜ao OA para OO. As linhas modificadas est˜ao destacadas em negrito.

Exemplo de um caso de teste - Aplica¸c˜ao Chess OO:

1 p u b l i c v o i d t e s t B i s h o p M o v e m e n t n S q u a r e s D i a g o n a l I 1 ( ) {

2 startRow = 7 ; startColumn = 5 ;

3 desRow = 5 ; desColumn = 3 ;

4

5 a s s e r t F a l s e ( b i s h o p . l e g a l M o v e ( startRow , startColumn , desRow , 6 desColumn , c e l l M a t r i x . g e t P l a y e r M a t r i x ( ) ) ) ;

7 assertEquals(”Bishop can only move along diagonal lines”, bishop.strErrorMsg);

8 }

Exemplo de um caso de teste - Aplica¸c˜ao Chess OA:

1 p u b l i c v o i d t e s t B i s h o p M o v e m e n t n S q u a r e s D i a g o n a l I 1 ( ) {

2 startRow = 7 ; startColumn = 5 ;

3 desRow = 5 ; desColumn = 3 ;

4

5 a s s e r t F a l s e ( b i s h o p . l e g a l M o v e ( startRow , startColumn , desRow , 6 desColumn , c e l l M a t r i x . g e t P l a y e r M a t r i x ( ) ) ) ;

7 ErrorMsg em = ErrorMsg.aspectOf();

8 String output = em.getErrorMsg();

9 assertEquals(”Bishop can only move along diagonal lines”, output);

10 }

Figura 3.7: Exemplo de um caso de teste para a aplica¸c˜ao Chess.

O caso de teste da aplica¸c˜ao Chess apresentado na Figura 3.7 faz a verifica¸c˜ao se um

14

http://www.metrics.sourceforge.net/ – ´ultimo acesso 24/10/2014 15

movimento de uma pe¸ca de xadrez (de um bispo, no caso), ´e legal ou n˜ao conforme as regras b´asicas de um jogo de xadrez. Na assertiva s˜ao preenchidos os dados de teste e o resultado esperado, ou seja, o objeto passado pelo testador como parˆametro (a mensagem de erro, no caso) com base na especifica¸c˜ao e comparado com a respectiva mensagem esperada a ser exibida com a recupera¸c˜ao do objeto corrente no software. Se o movimento da pe¸ca for ilegal, as mensagens de erro devem ser equivalentes e ent˜ao o teste ´e executado com sucesso.

Para a migra¸c˜ao de OO para OA, considerando o caso de teste nomeado testBishop- Movement nSquaresDiagonal I1 da Figura 3.7, as linhas 7 e 8 foram adicionadas na ordem para extrair a informa¸c˜ao que ´e encapsulada no aspecto ErrorMsg. Al´em disso, a linha 9 foi modificada quando comparada ao mesmo caso de teste do Chess OO. Nesse exemplo, a contagem da m´etrica ADD seria 2 e a contagem da m´etrica MOD seria 1, respectiva- mente. Essa an´alise foi seguida tamb´em para a m´etrica REM e outras m´etricas coletadas no estudo.

Na Figura 3.8 apresenta-se um exemplo de caso de teste da aplica¸c˜ao ObjectRequest de como foi adaptado da vers˜ao OA para OO. O caso de teste de nome testShiftMask C1 faz a verifica¸c˜ao se uma interface ´e exibida corretamente com as devidas teclas do teclado pressionadas. O presente exemplo mostra a interface quando a tecla shift ´e pressionada.

Para a adapta¸c˜ao de OA para OO, as linhas 7 e 8 do caso de teste implementado em OA foram removidas para se adaptarem `a implementa¸c˜ao OO e as linhas 4, 5, 16 e 21 do caso de teste implementado em OO foram modificadas. O m´etodo est´atico aspectOf() n˜ao foi utilizado no caso de teste da implementa¸c˜ao OO devido `a inexistˆencia desse recurso na linguagem Java. Nesse exemplo, a contagem da m´etrica REM seria 2 e a contagem da m´etrica MOD seria 4. Novamente, essa an´alise foi seguida tamb´em para a m´etrica ADD e outras m´etricas coletadas no estudo.

A coleta das m´etricas foi realizada para o Grupo-A como base nas aplica¸c˜oes OO para OA e para o Grupo-B como base nas aplica¸c˜oes OA para OO de forma a seguir:

1. Elabora¸c˜ao de um conjunto de teste com base nas aplica¸c˜oes de seu respectivo grupo (Grupo-A com base nas aplica¸c˜oes OO e Grupo-B com base nas aplica¸c˜oes OA);

2. Adapta¸c˜ao do conjunto de teste elaborado na etapa anterior para a implementa¸c˜ao oposta;

3. Compara¸c˜ao entre os caracteres dos casos de testes em especifica¸c˜oes OO e OA da mesma aplica¸c˜ao utilizando a ferramenta Meld Diff Viewer;

Exemplo de um caso de teste - Aplica¸c˜ao ObjectRequest OA: 1 p u b l i c v o i d t e s t S h i f t M a s k C 1 ( ) {

2

3 Frame frame = new Frame ( ”Chain o f R e s p o n s i b i l i t y p a t t e r n example ”) ;

4 Panel panel = new Panel();

5 Button button = new Button(”Click here”);

6

7 ClickChain.aspectOf().setSuccessor(button, panel); 8 ClickChain.aspectOf().setSuccessor(panel, frame); 9

10 frame . getContentPane ( ) . add ( p a n e l ) ; 11 p a n e l . add ( but ton ) ;

12

13 P r i n t S t r e a m o r i g O u t = System . out ;

14 ByteArrayOutputStream a l l O u t p u t = new ByteArrayOutputStream ( ) ; 15 P r i n t S t r e a m out = new P r i n t S t r e a m ( a l l O u t p u t ) ;

16 System . setOut ( out ) ; 17

18 ActionEvent ae = new ActionEvent ( button , 1 0 0 1 , butt on . getActionCommand ( ) , 1 ) ;

19 button.doClick(new Click(ae));

20

21 S t r i n g s a i d a = a l l O u t p u t . t o S t r i n g ( ) . t r i m ( ) ; 22 System . setOut ( o r i g O u t ) ;

23

24 assertEquals(”Button is asked to accept the request. Button is handling the event.”, saida);

25 }

Exemplo de um caso de teste - Aplica¸c˜ao ObjectRequest OO: 1 p u b l i c v o i d t e s t S h i f t M a s k C 1 ( ) {

2

3 Frame frame = new Frame ( ”Chain o f R e s p o n s i b i l i t y p a t t e r n example ”) ;

4 Panel panel = new Panel(frame);

5 Button button = new Button(”Click here”, panel); 6

7 frame . getContentPane ( ) . add ( p a n e l ) ; 8 p a n e l . add ( but ton ) ;

9

10 P r i n t S t r e a m o r i g O u t = System . out ;

11 ByteArrayOutputStream a l l O u t p u t = new ByteArrayOutputStream ( ) ; 12 P r i n t S t r e a m out = new P r i n t S t r e a m ( a l l O u t p u t ) ;

13 System . setOut ( out ) ; 14

15 ActionEvent ae = new ActionEvent ( button , 1 0 0 1 , butt on . getActionCommand ( ) , 1 ) ;

16 button.handleClick(new Click(ae));

17

18 S t r i n g s a i d a = a l l O u t p u t . t o S t r i n g ( ) . t r i m ( ) ; 19 System . setOut ( o r i g O u t ) ;

20

21 assertEquals(”Button is asked to handle the request. Button handles the request.”, saida);

22 }

Figura 3.8: Exemplo de um caso de teste para a aplica¸c˜ao ObjectRequest. 4. Compara¸c˜ao entre a quantidade de linhas dos testes em ambas as especifica¸c˜oes

utilizando o Plugin Metrics;

5. Anota¸c˜ao das linhas de c´odigo de casos de teste adicionadas, removidas e modificadas tendo como base as aplica¸c˜oes de ambos os paradigmas.