• Nenhum resultado encontrado

4.5 Critérios de Fluxo de Controle e Fluxo de Dados para Teste Estrutural de Integra-

4.5.2 Critério de Fluxo de Dados

Em relação aos critérios de fluxo de dados, decidiu-se por utilizar o critério de teste todos- usos (all-uses). Tal critério foi revisado no contexto do teste estrutural de integração par-a-par de programas OO e OA levando em consideração a interface entre as unidades. Para definir o fluxo de dados entre duas unidades, tomou-se como base a abordagem de teste de interfaces proposta por Linnenkugel e Müllerburg (1990) para programas procedurais (discutida na Seção 3.3).

Durante o teste de integração deve-se testar a interface entre as unidades que se relacionam em um programa, ou seja, testar as variáveis que influenciam diretamente a comunicação entre as unidades. Essas variáveis são denominadas variáveis de comunicação (Linnenkugel e Müllerburg, 1990). Elas podem ser de qualquer tipo da linguagem Java, isto é, do tipo primitivo ou de referência (discutidos na Seção 2.2.1). Em um programa OO ou OA pode-se identificar as seguintes variáveis de comunicação:

• Parâmetros formais (F P — Formal Parameter); • Parâmetros reais (AP — Actual Parameter);

• Atributos estáticos do(s) módulo(s) do par de unidades ou de outras classes do programa (SF — Static Field);

Os atributos de instância (IF — Instance Field) declarados em um determinado módulo tam- bém podem ser considerados variáveis de comunicação nos casos em que a unidade chamada é um método de instância. Entretanto, eles são tratados como parâmetros reais (AP ) e parâmetros for- mais (F P ). Um atributo de instância é um atributo cujo valor é específico ao objeto e não à classe.

OO E OA 95 Em Java, para chamar um método de instância de uma classe é necessário criar um objeto dessa classe e, a partir desse objeto, chamar o método. Todo método de instância tem um parâmetro im- plícito chamado this que é usado para passar a referência do objeto que o está chamando. Deste modo, nos casos em que a unidade chamada é um método de instância, a referência ao objeto, a partir da qual os atributos de instância podem ser acessados3, é passada como parâmetro.

O teste estrutural de integração par-a-par deve considerar somente os caminhos (ou relações definição-uso) que influenciam diretamente a comunicação entre as unidades, ou seja:

• para as variáveis de comunicação x que são usadas como entrada, consideram-se os cami- nhos compostos dos sub-caminhos a partir da última definição de x precedente à chamada até a chamada na unidade chamadora e dos sub-caminhos a partir da entrada na unidade chamada até o uso de x na unidade chamada.

• para as variáveis de comunicação x que são usadas como saída, consideram-se os caminhos compostos dos sub-caminhos a partir da última definição de x na unidade chamada até a saída da unidade chamada e dos sub-caminhos a partir do retorno da chamada na unidade chamadora até o uso de x na unidade chamadora.

Um programa OO ou OA consiste de unidades Un. Para cada unidade Un são definidos os

seguintes conjuntos:

• F P -IN(Un) é o conjunto de parâmetros formais de Unusados como entrada.

• F P -OUT (Un) é o conjunto de parâmetros formais de Unusados como saída.

• SF -IN(Un) é o conjunto de atributos estáticos usados em Un.

• SF -OUT (Un) é o conjunto de atributos estáticos definidos em Un.

Seja Uaa unidade chamadora e Uba unidade chamada. A chamada de Ub em Uaé representada

por Uba. Para essa chamada são definidos os seguintes conjuntos:

• AP -IN(Uba) é o conjunto de parâmetros reais usados como entrada na chamada Uba.

• AP -OUT (Uba) é o conjunto de parâmetros reais usados como saída da chamada Uba.

Para descrever as relações entre parâmetros reais e seus correspondentes parâmetros formais e entre os atributos estáticos usados pelas unidades são definidos dois mapeamentos Ibae Oba. Antes

da definição dos mapeamentos é importante ressaltar que ao fazer o mapeamento dos parâmetros e dos atributos estáticos que são do tipo de referência, ocorre tanto o mapeamento deles com seus correspondentes quanto o mapeamento dos seus atributos de instância (caso sejam uma referência 3Nesta seção não está considerando os especificadores de acesso da linguagem Java (public, private e protected)

96 ESTRUTURAL DE INTEGRAÇÃO PAR-A-PAR a um objeto), ou o mapeamento das suas variáveis agregadas (caso sejam uma referência a um array). Outra observação diz respeito aos atributos estáticos. Eles possuem a mesma identificação tanto na unidade chamadora quanto na unidade chamada.

O mapeamento Iba relaciona cada parâmetro real de entrada da chamada Uba com o correspon-

dente parâmetro formal de entrada da unidade chamada Ub e cada atributo estático usado como

entrada, com ele mesmo.

• Iba: AP -IN(Uba)∪ SF -IN(Ub)→ F P -IN(Ub)∪ SF -IN(Ub), com

AP -IN (Uba)→ F P -IN(Ub) e SF -IN (Ub)→ SF -IN(Ub)

O mapeamento Oba relaciona cada parâmetro real de saída da chamada Uba com o correspon-

dente parâmetro formal de saída da unidade chamada Ube cada atributo estático usado como saída,

com ele mesmo.

• Oba : AP -OUT (Uba)∪ SF -OUT (Ub)→ F P -OUT (Ub)∪ SF -OUT (Ub), com

AP -OU T (Uba)→ F P -OUT (Ub) e SF -OU T (Ub)→ SF -OUT (Ub)

Com base nessas definições e no grafo PWDU das unidades, alguns conjuntos são definidos. Para isso considere: def(i) é o conjunto de variáveis definidas no nó i; c-uso(i) é o conjunto de variáveis para as quais existem c-usos em i; e p-uso(j, k) é o conjunto de variáveis para as quais existem p-usos na aresta (j, k) (Rapps e Weyuker, 1982). Assim, para cada unidade chamada Ub

foram definidos os seguintes conjuntos:

• C-USE-CALLED(Ub, x) é o conjunto de nós i de Ub tal que x ∈ c-uso(i) e existe um

caminho livre de definição com relação a x a partir do nó de entrada de Ub até o nó i, sendo

que x ∈ F P -IN(Ub) ou x∈ SF -IN(Ub).

• P -USE-CALLED(Ub, x) é o conjunto de arestas (j, k) de Ub tal que x ∈ p-uso(j, k) e

existe um caminho livre de definição com relação a x a partir do nó de entrada de Ub até a

aresta (j, k), sendo que x ∈ F P -IN(Ub) ou x∈ SF -IN(Ub).

• DEF -CALLED(Ub, x) é o conjunto de nós i de Ub tal que x pertence def(x) e existe um

caminho livre de definição com relação a x a partir do nó i até o nó de saída de Ub, sendo

que x ∈ F P -OUT (Ub) ou x∈ SF -OUT (Ub).

Para a chamada Ubaforam definidos os seguintes conjuntos:

• DEF -CALLER(Uba, x) é um conjunto de nós i de Ua tal que x ∈ def(i) e existe um

caminho livre de definição com relação a x a partir de i até o nó de interação, sendo que x∈ AP -IN(Uba) ou x∈ SF -IN(Ub).

OO E OA 97 • C-USE-CALLER(Uba, x) é um conjunto de nós i de Ua tal que x ∈ c-uso(i) e existe

um caminho livre de definição com relação a x a partir dos nós de retorno até i, sendo que x∈ AP -OUT (Uba) ou x∈ SF -OUT (Ub).

• P -USE-CALLER(Uba, x) é um conjunto de arestas (j, k) de Ua tal que x ∈ p-use(i) e

existe um caminho livre de definição com relação a x a partir dos nós de retorno até (j, k), sendo que x ∈ AP -OUT (Uba) ou x∈ SF -OUT (Ub).

A partir das definições anteriores é definido o critério todos-usos-integrados (all-integrated-

uses) utilizado para derivar requisitos de teste estrutural de integração par-a-par baseados nas in-

terfaces entre as unidades.

• todos-usos-integrados (Todos-Usosi): Π satisfaz o critério todos-usos-integrados se:

1. para cada x ∈ AP -IN(Uba) e cada x ∈ SF -IN(Ub), Π inclui um caminho livre

de definição com relação a x a partir de cada nó i ∈ DEF -CALLER(Uba, x) até

cada nó j ∈ C-USE-CALLED(Ub, Iba(x)) e até cada aresta (j, k) ∈ P -USE-

CALLED(Ub, Iba(x)). Em outras palavras, esse critério requer a execução de um

caminho livre de definição com relação a cada variável de comunicação a partir de cada definição relevante na unidade chamadora até todo uso computacional e todo uso predicativo na unidade chamada.

2. para cada x ∈ AP -OUT (Uba) e cada x ∈ SF -OUT (Ub), Π inclui um caminho livre

de definição com relação a x a partir de cada nó i ∈ DEF -CALLED(Ub, Oba(x))

até cada nó j ∈ C-USE-CALLER(Uba, x) e até cada aresta (j, k) ∈ P -USE-

CALLER(Uba, x). Em outras palavras, esse critério requer a execução de um caminho

livre de definição com relação a cada variável de comunicação a partir de cada defini- ção relevante na unidade chamada até todo uso computacional e todo uso predicativo na unidade chamadora.

Há uma exceção na clausula (2) da definição do critério todos-usos-integrados, com relação a definições dos parâmetros formais dentro da unidade chamada e seus posteriores usos, após o retorno da chamada, na unidade chamadora. Em Java, conforme discutido na Seção 2.2.1, a passagem de parâmetros é feita por valor, ou seja, se o parâmetro real for do tipo primitivo, o parâmetro formal correspondente recebe e armazena o dado do parâmetro real. Caso o parâmetro real seja do tipo de referência, o parâmetro formal correspondente recebe e armazena o endereço do objeto em memória referenciado pelo parâmetro real. Pode-se dizer que o parâmetro formal é uma cópia do parâmetro real. Assim, qualquer alteração no valor da cópia de um parâmetro real não vai afetá-lo, seja o parâmetro real do tipo primitivo ou de referência. Deste modo, caso haja um uso posterior do parâmetro real depois da chamada, não será caracterizado um par definição-uso.

O mesmo não ocorre se um parâmetro real for do tipo de referência e sua cópia definir/alterar, por meio do endereço de referência, os dados do objeto referenciado pelo parâmetro real. Nesta

98 ESTRUTURAL DE INTEGRAÇÃO PAR-A-PAR situação, a definição terá efeito no parâmetro real, pois o objeto que ele referencia foi modificado. Deste modo, caso haja um eventual uso do parâmetro real depois da chamada, um par definição-uso será caracterizado.