• Nenhum resultado encontrado

3.4 Processo de Síntese dos Objetivos de Teste

Sobre os exemplos e (possivelmente) contra-exemplos obtidos por meio da busca sobre o modelo, devemos prover mecanismo para a geração do objetivo de teste correspondente. O objetivo de teste deve, neste caso, reunir toda a informação contida nos caminhos. No entanto, esta informação deve ser tão compacta e abstrata quanto possível, contida em apenas um grafo.

3.4.1 Abstração sobre Exemplos e Contra-exemplos

O mecanismo proposto para a geração de um grafo abstrato baseia-se na realização de uma segunda triagem, porém, sobre as transições contidas nos exemplos e contra-exemplos. As transições são analisadas, sendo classificadas segundo sua relevância no alcance da proprie- dade definida. Para tornar possível esta análise sobre transições, optamos por fazer represen- tações mais abstratas dos caminhos extraídos do modelo. Estas representações baseiam-se na simplificação da representação dos estados. O modelo utilizado para tal representação baseia-se em máquina de estados finitos, formalmente definido pela tupla (Q, Σ, δ, q0, F ),

onde Q é um conjunto finito e não vazio de estados, Σ um conjunto finito de símbolos que compõem o alfabeto aceito pela máquina, q0 ∈ Q o estado inicial, e F ⊆ Q o conjunto de

estados finais, denominados estados de aceitação. Caminhos que definem exemplos e contra- exemplos compõem seqüências bem definidas de estados, caracterizando seu determinismo. Por serem deterministas, suas transições devem ser definidas por meio de uma função, aqui denominada δ. Assim, a função de transição δ é definida como δ : Q × Σ −→ Q.

O rótulo sobre os estados baseia-se na relação de satisfação entre o estado e a fórmula. Cada estado de um caminho extraído deve receber como rótulo, o rótulo da proposição atô- mica (integrante da fórmula) à qual satisfaz. O último estado da cadeia que compõe um caminho deve ser rotulado apenas como estado final, não recebendo o rótulo da proposição que satisfaz (ou que viola, no caso de ser um contra-exemplo). A Figura 3.2 mostra um exemplo extraído, com sua representação de estados simplificada. Os estados não finais do exemplo são rotulados como p e q, relativos às proposições às quais satisfazem, e o estado final, rotulado como aceitação, com o rótulo accept.

p p p t q q accept

Figura 3.2: Representação simplificada de um exemplo

rotulados por p e q, relativos às proprosições que satisfazem, e o estado final, com rótulo

refuse.

p x p t q r q v refuse

Figura 3.3: Representação simplificada de um contra-exemplo

Sobre estas representações, o algorítmo de síntese deve realizar alguns procedimentos de análise e abstrações, resumidos a seguir. Estes procedimentos são explicados com maiores detalhes, com o auxílio de um exemplo, na Subseção 3.4.2:

Classificação das transições que compõem o caminho Esta classificação baseia-se na mudança de estados da representação. As transições que causam mudança entre estados, ou seja, que relacionam estados de rótulos diferentes, são classificadas como relevantes. As transições que relacionam estados com rótulos iguais são classificadas como irrelevantes. As transições irrelevantes podem ser abstraídas na construção do objetivo de teste. Tais abstra- ções são representadas por auto-laços rotulados com "*" (asterisco). Estes auto-laços são denominados transições asterisco, transições estrela ou *-transições. As transições asterisco representam qualquer transição, excetuando as transições que conectam o estado que a con- tém e outro estado de rótulo diferente. Por simplicidade, durante a construção do objetivo de teste, as transições asterisco podem ser acrescentadas a cada estado do LTS resultante. Para tanto, supõe-se uma representação completa do modelo sob análise no processo de geração, para que não haja falhas na abstração representada por estas transições.

Detecção de transições interdependentes Há situações em que a mudança de estados está relacionada a uma seqüência de transições interdependentes. Esta interdependência é caracterizada pela presença de um conjunto de transições que causam mudança de estado de maneira alternada, nos caminhos extraídos. Desta forma, as transições interdependentes devem ser detectadas através da interseção entre os dois conjuntos criados.

3.4 Processo de Síntese dos Objetivos de Teste 34 A Figura 3.4 mostra um exemplo de interdependência de transições. Durante a realiza- ção do processo de análise descrito acima, para triagem das transições, as transições ’f ’ e ’g’ devem ser classificadas como relevantes e também como irrelevantes, pertencendo aos dois conjuntos de transições. Os conjuntos definidos para as classificações de relevantes e irrelevantes são L = {f, g} e N = {b, c, d, f, g}, respectivamente.

b f g p p p p p p p g f c d accept accept

Figura 3.4: Exemplo de interdependência entre transições

Síntese do Objetivo de Teste A construção do objetivo de teste deve considerar a infor- mação das situações previstas por exemplos e contra-exemplos. Assim, as transições clas- sificadas como relevantes de ambos os conjuntos de caminhos devem compor o objetivo de teste correspondente. Transições provenientes de exemplos devem compor seqüências que levem ao estado de aceitação do objetivo de teste, devendo ser selecionadas como casos de teste em procedimento de geração de casos de teste posterior. As transições coletadas a partir de contra-exemplos devem compor seqüências que levem ao estado de rejeição do objetivo de teste. As transições interdependentes devem ser representadas adequadamente, devendo prover caminhos que descrevem corretamente as seqüências das transições no objetivo de teste.

3.4.2 Procedimento de Síntese de Objetivos de Teste

Como dito anteriormente, a idéia do algoritmo baseia-se na mudança de estados. Assim, deve-se classificar as transições encontradas nos exemplos em 2 conjuntos: O conjunto L formado pelas transições que causam mudança de estado e o conjunto N pelas transições que não causam mudança de estado. A Figura 3.5(a) mostra um conjunto de exemplos que representam uma dada fórmula e a Figura 3.5(b) apresenta contra-exemplos. A partir destes caminhos criaremos os conjuntos L e N.

Diante da análise feita sobre a mudança de estados, o conjunto L das transições que cau- sam mudança de estado é L = {z, f, g, i, j, k} e o conjunto N das transições que não causam

b f g y a z p p p p p p p p p p p p p g f c d accept accept accept accept (a) Exemplos a b k a i j a c j i p p p p p p p p p p p p p p p h h refuse refuse refuse refuse (b) Contra-exemplos

Figura 3.5: Caminhos relativos à fórmula

mudança de estado é N = {x, y, a, b, c, d, f, g, i, j, h}. O conjunto L é dividido em subcon- juntos para cada par de conexão entre dois estados quaisquer. Ou seja, cada subconjunto contém as transições que interconectam dois estados diferentes. A fórmula analisada origina subconjuntos de transições que interconectam os estados "p" e "accept" e "p" e "refuse". Os respectivos subconjuntos são Lp_accept= {z, f, g}e Lp_ref use= {i, j, k}.

Podemos perceber que há transições comuns aos dois conjuntos (L e N), causando a mudança de estado em alguns exemplos e não causando em outros. Concluímos a partir de tal fato que tais transições não causam mudança de estado de maneira independente, mas em conjunto. A partir da interseção entre os dois conjuntos podemos agrupar tais transições, que denominamos transições interdependentes. Para o exemplo acima, as transições ’f’ e ’g’ ocorreram de forma conjunta e em ordens alternadas, sendo complementares para a mudança de estado. De maneira idêntica acontece com as transições ’i’ e ’j’. Já as transições ’z’ e ’k’ são suficientes para causar de forma isolada as mudanças de estado, sendo chamadas de independentes.

Para agrupar as transições interdependentes, um conjunto de interseção entre cada sub- conjunto de L é criado. Assim, os conjuntos Lp_accept ∩ N = Ip_accept = {f, g} e

Lp_ref use ∩ N = Ip_ref use = {i, j} são definidos. As transições que ocorrem em con-

junto são então, agrupadas. A combinação de ordem entre elas, presente nos exemplos e contra-exemplos, deve ser analisada para a construção do grafo do objetivo de teste. Desta forma, tuplas são criadas para computar as combinações entre as transições interdependen- tes. As tuplas SUBIfp_accept = [g, f ], SUBIgp_accept = [f, g], SUBIip_ref use = [j, i] e

SU BIjp_ref use = [i, j] são criadas. Cada uma destas tuplas deverá originar um caminho

3.5 Objetivo de Teste e os Tipos de Fórmulas 36

Documentos relacionados