• Nenhum resultado encontrado

Grafo de Fluxo para Teste Estrutural de Integração Par-a-Par

Par-a-Par

Para efetuar o teste estrutural de integração par-a-par entre os pares de unidades de programas OO (m-m) ou OA (m-m, m-a, a-m ou a-a) deve-se considerar todo o fluxo de execução (fluxo de controle e de dados) que ocorre entre a unidade chamadora e a unidade chamada. Por exemplo, no fluxo de execução de um programa OO um método pode chamar um outro método. Quando é feita a chamada, o fluxo de execução é passado para o método chamado. Após a execução do método chamado, o fluxo retorna ao método que chamou e este continua sua execução. Já em programas OA a execução pode envolver, além dos métodos, os adendos. Assim, no fluxo de execução de um programa OA um método ou um adendo pode chamar um outro método ou ser interceptado por um adendo que é disparado quando um determinado ponto de junção é alcançado. Deste modo, quando é feita uma chamada a um método ou quando um ponto de junção é alcançado, o fluxo de execução é passado para o método chamado ou para o adendo que afeta o ponto de junção. Após a execução do método chamado ou do adendo que foi disparado, o fluxo retorna ao método que chamou ou ao ponto de junção onde o adendo foi disparado e a execução continua.

Para representar todo o fluxo de execução que ocorre entre um par de unidades, torna-se ne- cessária a definição de um grafo que seja a integração dos grafos das unidades que se relacionam. Para isso é proposto um grafo de integração par-a-par. Este grafo foi baseado no Grafo Def-Uso Método-Adendo (MADU) (Lemos, 2005) (discutido na Seção 3.5.2) e tem a finalidade de integrar os Grafos Def-Uso Orientado a Aspectos (AODU) (Lemos, 2005) das unidades que se relacionam. Porém, antes de definir o grafo de integração par-a-par é necessário adaptar o grafo AODU. O grafo AODU de uma determinada unidade u é da forma AODU(u) = (N, E, s, T, C) (discutido na Seção 3.5.1). Conforme definido por Lemos (2005), o componente C é o conjunto de nós

OO E OA 89 transversais que representam um nó do grafo em que ocorre uma interação com um adendo de um dado aspecto. Entretanto, o teste estrutural de integração par-a-par aqui proposto não trata apenas interações com adendos, mas também interações com métodos, estas representadas pelos nós de chamada (Vincenzi, 2004). Assim, a definição formal do grafo AODU de uma determinada unidade u foi revista e alterada para a seguinte forma: AODU(u) = (N, E, s, T, I), em que o componente C foi substituído pelo componente I, este último definido como um conjunto de nós de interação, isto é, um conjunto que contém tanto os nós transversais — que representam um nó no qual ocorre uma interação com um adendo de um dado aspecto — quanto os nós de chamada — que representam um nó no qual ocorre uma interação com um método de uma dada classe ou aspecto.

A partir daí, pode-se definir o Grafo Def-Uso Par-a-Par (PairWise Def-Use — PWDU). Ele é um grafo dirigido cuja utilização tem como objetivo apoiar o teste estrutural de integração par- a-par das unidades de um programa OO ou OA. O grafo PWDU é uma abstração formada pela integração do grafo AODU da unidade chamadora (ou que chama) e do grafo AODU da unidade chamada. Essa integração é feita de modo que o grafo AODU da unidade chamada seja integrado ao grafo AODU da unidade chamadora. Para diferenciar os nós e as arestas das unidades integra- das, são definidos um novo tipo de nó — nó integrado (integrated node) que representa os nós da unidade chamada — e dois novos tipos de aresta — aresta integrada (integrated edge) que é a aresta entre dois nós integrados e a aresta de integração (integration edge) que representa a aresta entre um nó da unidade chamadora e um nó da unidade chamada, ou vice-versa.

Para construir o grafo PWDU de um par de unidades deve-se aplicar o algoritmo a seguir. Suponha o par de unidades u1 e u2, sendo que u1 chama u2, ou seja, u1 representa a unidade

chamadora e u2representa a unidade chamada.

1. Construir o grafo AODU da unidade u1.

(a) Durante a construção, identificar o nó onde ocorre a chamada da unidade u2(nó de interação);

(b) Após identificado o nó de interação, deve-se identificar o nó adjacente ao nó de interação (nó de re- torno)1;

2. Construir o grafo AODU da unidade u2.

(a) Durante a construção definir todos os nós de u2como nós integrados; 3. Remover as arestas entre o nó de interação e os nós de retorno;

4. Criar uma aresta de integração entre o nó de interação e o nó de entrada do grafo AODU da unidade u2. 5. Criar arestas de integração entre os nós de saída do grafo AODU da unidade u2e os nós de retorno.

6. Redefinir os conjunto de definição e uso de cada nó do grafo PWDU e fazer o mapeamento das variáveis que se comunicam entre as unidades.

1Neste trabalho considera-se apenas um nó de retorno pois, por meio da análise do bytecode e de como os grafos são construídos na ferramenta JaBUTi/AJ, constatou-se que sempre haverá um único nó de retorno

O grafo PWDU do par de unidades u1e u2terá como nó de entrada o mesmo nó de entrada do

grafo AODU da unidade u1 (chamadora). O mesmo vale para os nós de saída, ou seja, os nós de

saída do grafo PWDU de u1 e u2serão os mesmos nós de saída do grafo AODU da unidade u1.

A definição formal do grafo PWDU de u1e u2 é apresentada a seguir. Considere o grafo AODU

das unidades u1e u2da forma:

• AODU(u1) = (N1, E1, s1, T1, I1)

• AODU(u2) = (N2, E2, s2, T2, I2)

O grafo PWDU do par u1e u2é definido como um grafo dirigido PWDU(u1, u2) = (N, E, s,

T, I, i, r), tal que:

• N = N1∪ N2representa o conjunto completo de nós do grafo PWDU, tal que:

N1é o conjunto de nós de u1;

N2é o conjunto de nós de u2, também denominado conjunto de nós integrados — Ni;

• E = E1∪ E2∪ Elé o conjunto completo de arestas do grafo PWDU, tal que:

E1 ⊆ N1XN1 é o conjunto de arestas de u1 definido como E1 = {(x, y) ∈ E|(x ∈

N1)∧ (y ∈ N1)}. E1r e E1e são subconjuntos disjuntos de E1 de arestas regulares e de exceção, respectivamente.

E2 ⊆ N2XN2 é o conjunto de arestas de u2, também denominado conjunto de arestas

integradas — Ei, definido como E2 = {(x, y) ∈ E|(x ∈ N2)∧ (y ∈ N2)}. E2r e E2e são subconjuntos disjuntos de E2de arestas regulares e de exceção, respectivamente.

Elé o conjunto de arestas de integração, criadas para integrar os dois grafos AODU,

definido como El = {(x, y) ∈ E|((x ∈ N1)∧ (y ∈ N2))∨ ((x ∈ N2)∧ (y ∈ N1))}

sendo que:

∗ se x ∈ N1 e y ∈ N2, então x = c (o componente i é definido abaixo) e y = s2 (o

componente s2é definido abaixo);

∗ se x ∈ N2e y ∈ N1, então x ∈ T2(o componente T2é definido abaixo) e y = r (o

componente r é definido abaixo);

• s ∈ N e s = s1 é o nó de entrada do grafo PWDU, tal que:

s1 ∈ N1é o nó de entrada de u1;

s2 ∈ N2é o nó de entrada de u2;

• T ⊆ N e T = T1 é o conjunto de nós de saída do grafo PWDU, tal que:

OO E OA 91

T2 é o conjunto de nós de saída de u2;

• I = I1 ∪ I2 é o conjunto completo de nós de interação (ou seja, nós transversais e nós de

chamada) do grafo PWDU, tal que:

I1 ⊆ N1é o conjunto de nós de interação de u1;

I2 ⊆ N2é o conjunto de nós de interação de u2;

• i ∈ I1é o nó onde ocorre a chamada a u2;

• r ∈ N1é o nó de retorno da chamada a u2.

A representação gráfica do grafo PWDU é definida da seguinte forma:

• Um nó regular é representado por um círculo desenhado com linha simples e seu rótulo contém a primeira instrução de bytecode do bloco;

• Um nó de chamada é representado por um círculo desenhado com linhas duplas e seu rótulo contém a primeira instrução de bytecode do bloco;

• Um nó transversal é representado por uma elipse desenhada com linha tracejada. Seu rótulo informa, além da primeira instrução de bytecode do bloco, qual o tipo de adendo afeta aquele ponto (before, after ou around) e a qual aspecto o adendo pertence;

• Um nó de saída é representado por um circulo desenhado com uma linha simples negritada e seu o rótulo contém a primeira instrução de bytecode do bloco;

• Um nó integrado é representado como um nó regular, um nó de chamada, um nó transversal ou um nó de saída2. Como diferencial, seu rótulo é iniciado com o símbolo “i.”;

• Uma aresta regular é representada por uma linha contínua, representando o fluxo de controle normal;

• Uma aresta de exceção é representada por uma linha tracejada, representando o fluxo de controle do nó no qual uma exceção é gerada até o primeiro nó correspondente ao tratador daquela exceção;

• Uma aresta integrada é representada como uma aresta regular ou uma aresta de exceção; • Uma aresta de integração é representada como uma aresta regular;

92 ESTRUTURAL DE INTEGRAÇÃO PAR-A-PAR Os conjuntos de definições e usos dos nós do grafo PWDU são derivados a partir das instru- ções presentes no bloco de instruções de cada nó. Com o grafo PWDU criado da integração dos dois grafos AODU das unidades já é possível derivar os requisitos de teste para os critérios de fluxo de controle e fluxo de dados, conforme é discutido na Seção 4.5.

Como exemplo, é construído o grafo PWDU do par de unidades (Principal)efetuar- Calculos(DD)V - (Calculo)calcular(DD)Va partir do grafo AODU da unidade cha- madora (Figura 4.4(a)) e do grafo AODU da unidade chamada (Figura 4.4(b)). O nó 11 do grafo AODU do método efetuarCalculos é o nó onde ocorre a chamada ao método calcular. O grafo PWDU contruído é apresentado na Figura 4.5. Nessa figura também são mostrados os conjuntos de definições (d), usos computacionais (cu) e usos predicativos (pu) das variáveis de interface entre as unidades (também consideradas variáveis de comunicação, discutidas na Seção 4.5.2). Além disso, é mostrada uma tabela de mapeamento entre as variáveis de comunicação.

0

11

20

(a) Grafo AODU

do método efetuarCalculos 0 14 26 36 43 8 <<before-src.AspectLog>>

(b) Grafo AODU do método calcular

Figura 4.4:Grafos AODU da unidade chamadora e da unidade chamada.