• Nenhum resultado encontrado

Defeitos e Falhas de Manipulação

Defeitos e Falhas em Manipulação de Dados Persistentes

3.2 Defeitos e Falhas de Manipulação

Enumerar tipos de defeitos é a base para a compreensão do porquê existem defeitos em uma dada linguagem de programação. Tal atividade requer conhecimento das construções básicas disponíveis na linguagem de programação correspondente. Esta seção é focada na enumeração de tipos de defeitos em comandos de manipulação baseando-se nos itens estruturais mostrados na Seção 3.1.

A terminologia normalmente usada em teste de programas é estendida para comandos individuais de manipulação de dados. Um defeito (fault) é definido como um item incorreto presente em um comando SQL de manipulação. Um comando defeituoso é um comando SQL que possui, no mínimo, um defeito. Um erro é um estado de execução inconsistente causado pela execução de um comando SQL defeituoso. Uma falha ocorre quando um defeito é propagado para a saída do comando SQL defeituoso, resultando em uma saída distinta da esperada1.

Categorias de falha abstraem os modos como falhas são manifestadas na execução de comandos

SQL defeituosos.

Os possíveis tipos de defeito em comandos de manipulação são introduzidos e identificados seguindo o termo [xm]-n, onde: xm refere-se ao item estrutural tal como mostrado nas Tabelas 3.1 e 3.2; e n é um número seqüencial para os tipos de defeito que estão relacionados ao mesmo item estrutural. Esta seção apresenta, para cada tipo de defeito, um identificador, uma descrição e um exemplo. Na descrição, o termo tabela denota uma relação da base de dados. O exemplo ilustra a versão correta e uma versão incorreta de um comando de manipulação. É possível entender a semântica de um tipo de defeito pela observação da sua descrição e pela comparação entre as duas versões do comando exemplo. O esquema de banco de dados usado nos exemplos é intuitivo e, por isso, foi omitido dessa discussão.

1

A noção de funcionalidade esperada na especificação de software é estendida à saída esperada da execução de comandos de manipulação.

Defeitos e Falhas em Manipulação de Dados Persistentes 49

O comando select possui uma estrutura mais complexa do que os comandos insert, delete e update, conforme apresentado nas Tabelas 3.1 e 3.2, resultando em uma numerosa lista de tipos de defeito para este comando: mais da metade dos tipos de defeito são atribuídos ao comando

select em relação aos demais comandos de manipulação. A Tabela 3.3 enumera os tipos de

defeito para o comando select; apesar de sua extensão, o conteúdo desta tabela é auto-explicativo, devido à simplicidade dos exemplos existentes. A descrição apresentada na segunda coluna utiliza um qualificador e um local relativo ao item estrutural do comando; por exemplo, os tipos de defeito [s1]-1 e [s1]-4 referem-se aos qualificadores ausente e incorreto, respectivamente, no item estrutural lista ordenada de expressões para computar os valores dos atributos retornados.

Tabela 3.3: Lista de tipos de defeito para o comando select.

Ident. Descrição Comando correto Comando incorreto

[s1]-1 Uma expressão está ausente da lista

ordenada de expressões para computar os valores dos atributos retornados

select emplno, name, salary from empl

select emplno, salary from empl

[s1]-2 Uma expressão está indevidamente

presente na lista ordenada de expressões para computar os valores dos atributos retornados

select emplno, name, salary from empl

select emplno, name, salary, salary + bonus

from empl

[s1]-3 A ordem de expressões na lista ordenada

de expressões para computar os valores dos atributos retornados está incorreta

select emplno, name, salary, salary + bonus

from empl

select emplno, name, salary + bonus, salary

from empl

[s1]-4 Uma expressão incorreta está na lista

ordenada de expressões para computar os valores dos atributos retornados

select emplno, name, salary from empl

select emplno, name, bonus * 0.5

from empl

[s2]-1 Um nome de tabela está ausente da lista

de nomes de tabelas usadas como fonte de dados

select e.name, e.salary from empl e, dept d

select e.name, e.salary from empl e

[s2]-2 Um nome de tabela está indevidamente

presente na lista de nomes de tabelas usadas como fonte de dados

select e.name, e.salary from empl e

select e.name, e.salary from empl e, dept d

[s2]-3 Um nome de tabela incorreto está na lista

de nomes de tabelas usadas como fonte de dados

select e.name, d.salary from empl e, dept d

select e.name, d.salary from empl e, depn d

[s3]-1 O predicado para a seleção de tuplas está

ausente

select emplno, salary from empl

where salary > 1050

select emplno, salary from empl

[s3]-2 O predicado para a seleção de tuplas está

indevidamente presente

select emplno, salary from empl

select emplno, salary from empl

where salary > 1050

[s3]-3 O predicado para a seleção de tuplas está

incorreto

select emplno, salary from empl

where salary > 1050

select emplno, salary from empl

where salary < 1200

[s4]-1 A lista de expressões para agrupamento

de dados está ausente

select salary from empl group by salary

select salary from empl

[s4]-2 A lista de expressões para agrupamento

de dados está indevidamente presente

select salary from empl

select salary from empl group by salary

expressões para agrupamento de dados from empl

group by salary, bonus

from empl group by salary

[s4]-4 Uma expressão está indevidamente

presente na lista de expressões para agrupamento de dados

select salary, count(*) from empl

group by salary

select salary, count(*) from empl

group by salary, bonus

[s4]-5 Uma expressão incorreta está presente na

lista de expressões para agrupamento de dados

select salary, count(*) from empl

group by salary, bonus

select salary, count(*) from empl

group by salary, salary - bonus

[s5]-1 O predicado para a seleção de grupos de

dados está ausente

select salary, count(*) from empl

group by salary having count(bonus) > 1

select salary, count(*) from empl

group by salary

[s5]-2 O predicado para a seleção de grupos de

dados está indevidamente presente

select salary, count(*) from empl

group by salary

select salary, count(*) from empl

group by salary having count(bonus) > 1

[s5]-3 O predicado para a seleção de grupos de

dados está incorreto

select salary, count(*) from empl

group by salary having count(bonus) > 1

select salary, count(*) from empl

group by salary having count(salary) > 1

[s6]-1 A lista ordenada de argumentos para

ordenação de dados está ausente

select emplno, name, salary from empl

order by salary

select emplno, name, salary from empl

[s6]-2 A lista ordenada de argumentos para

ordenação de dados está indevidamente presente

select emplno, name, salary from empl

select emplno, name, salary from empl

order by salary

[s6]-3 A ordem de argumentos na lista

ordenada de argumentos para ordenação de dados está incorreta

select emplno, name, salary from empl

order by salary, name

select emplno, name, salary from empl

order by name, salary

[s6]-4 Um argumento incorreto está na lista

ordenada de argumentos para ordenação de dados

select emplno, name, salary from empl

order by salary, name

select emplno, name, salary from empl

order by salary desc, name

As Tabelas 3.4, 3.5 e 3.6 introduzem as listas de tipos de defeito para os comandos insert,

delete e update, respectivamente.

A propagação do efeito do defeito para a saída de comando, denominada falha, está relacionada a problemas bem conhecidos, instanciados por Chays et al. [2000] para o teste de aplicações de banco de dados: controlabilidade, que busca colocar o sistema em um estado desejado antes da execução de um caso de teste; e observabilidade, que trata da observação do estado de sistema após a execução de casos de teste.

Dois conjuntos de dados são introduzidos a seguir, conjunto de dados retornados e

conjunto de dados definidos, visando a capturar a noção de saída da execução de comandos de

manipulação2; ambos são denominados conjuntos de saída. Eles são conjuntos tabulares (bi- dimensionais), mas não constituem relações de acordo com os conceitos do modelo relacional

2

A noção da saída de execução de comandos individuais denota os dados obtidos pela execução de comandos de manipulação, com precisão suficiente para decidir se uma falha foi produzida.

Defeitos e Falhas em Manipulação de Dados Persistentes 51

(Codd, 1970), visto que um desses conjuntos pode possuir linhas duplicadas. Apesar disso, tais conjuntos são descritos abaixo usando terminologia do modelo relacional, tal como tupla e

atributo.

O conjunto de dados retornados está relacionado com a execução de comandos de consulta, enquanto o conjunto de dados definidos está relacionado com a execução de comandos de mudança de estado. Cada execução de comando de manipulação está associada a duas versões dos comandos de saída: a esperada e a obtida. Se o conjunto de saída obtido for distinto do esperado, então um defeito foi propagado para a saída de execução do comando e ocorreu a manifestação de falha. As formas nas quais a versão obtida pode diferir da versão esperada são denominadas categorias de falha de manipulação.

Tabela 3.4: Lista de tipos de defeito para o comando insert.

Ident. Descrição Comando correto Comando incorreto

[i1]-1 O nome de tabela está

incorreto.

insert into empl (emplno, name, salary)

values (8888, 'mary smith', 1050)

insert into depn (emplno, name, salary)

values (8888, 'mary smith', 1050)

[i2]-1 Um atributo está ausente da

lista ordenada de atributos

insert into empl

(emplno, name, salary, bonus) values (8888, 'mary smith', 1050, 12)

insert into empl (emplno, name, salary)

values (8888, 'mary smith', 1050)

[i2]-2 Um atributo está indevidamente

presente na lista ordenada de atributos

insert into empl (emplno, name, salary)

values (8888, 'mary smith', 1050)

insert into empl

(emplno, name, salary, bonus) values (8888, 'mary smith', 1050, 12)

[i3]-1 Um valor incorreto está

presente na lista ordenada de valores de atributos

insert into empl

(emplno, name, salary, bonus) values (8888, 'mary smith', 1050, null)

insert into empl

(emplno, name, salary, bonus) values (8888, 'mary smith', 1050, 22)

[i3]-2 A ordem dos valores na lista

ordenada de atributos está incorreta

insert into empl

(emplno, name, salary, bonus) values (8888, 'mary smith', 1050, 22)

insert into empl

(emplno, name, salary, bonus) values (8888, 'mary smith', 22, 1050)

[i4]-1 Existe um defeito na

subconsulta

insert into empl (emplno, name, salary) select 9999, name, salary from depn

where emplno = 1111

insert into empl (emplno, name, salary) select 9998, name, salary from depn

Tabela 3.5: Lista de tipos de defeito para o comando delete.

Ident. Descrição Comando correto Comando incorreto

[d1]-1 O nome de tabela está incorreto delete from empl where name like 'ann%'

delete from depn where name like 'ann%'

[d2]-1 O predicado para a seleção de tuplas está

ausente

delete from empl where name like 'ann%'

delete from empl

[d2]-2 O predicado para a seleção de tuplas está

indevidamente presente

delete from empl delete from empl

where name like 'ann%'

[d2]-3 O predicado para a seleção de tuplas está

incorreto

delete from empl where name like 'ann%'

delete from empl

where salary between 800 and 1060

Tabela 3.6: Lista de tipos de defeito para o comando update.

Ident. Descrição Comando correto Comando incorreto

[u1]-1 O nome de tabela está incorreto update empl

set salary = salary * 1.1 where salary < 550

update depn

set salary = salary * 1.1 where salary < 550

[u2]-1 Uma atribuição de valor está ausente da

lista de atribuições de valores a atributos.

update empl

set salary = salary * 1.1, bonus = bonus * 1.1

where salary < 550

update empl

set salary = salary * 1.1 where salary < 550

[u2]-2 Uma atribuição de valor está

indevidamente presente na lista de atribuições de valores a atributos

update empl

set salary = salary * 1.1 where salary < 550

update empl

set salary = salary * 1.1, bonus = bonus * 1.1

where salary < 550

[u2]-3 Uma expressão incorreta está presente no

lado direito de uma atribuição de valor da lista de atribuições de valores a atributos

update empl

set salary = salary * 1.1 where salary < 550

update empl set salary = 1.1 where salary < 550

[u2]-4 Um nome incorreto de atributo está

presente do lado esquerdo de uma atribuição de valor da lista de atribuições de valores a atributos

update empl

set salary = salary * 1.1 where salary < 550

update empl

set bonus = salary * 1.1 where salary < 550

[u3]-1 O predicado para a seleção de tuplas está

ausente

update empl

set bonus = bonus * 1.1 where salary < 550

update empl

set bonus = bonus * 1.1

[u3]-2 O predicado para a seleção de tuplas está

indevidamente presente

update empl

set salary = salary * 1.1

update empl

set salary = salary * 1.1 where salary < 550

[u3]-3 O predicado para a seleção de tuplas está

incorreto

update empl

set salary = salary * 1.1 where salary < 550

update empl

set salary = salary * 1.1 where salary > 1200

Um comando de manipulação está defeituoso quando o conjunto de saída obtido por sua execução diferir do conjunto esperado em pelo menos uma categoria de falha de manipulação. As categorias de falha de manipulação são: lista de atributos, ordem de atributos, número de tuplas,

lista de valores de atributos e ordem de tuplas. A categoria lista de atributos descreve os

atributos do conjunto esperado; esta categoria está relacionada ao domínio de atributo e à semântica de atributo. A categoria ordem de atributos é significante quando a ordem dos

Defeitos e Falhas em Manipulação de Dados Persistentes 53

atributos caracteriza as tuplas do conjunto de saída. A categoria número de tuplas define a cardinalidade de tuplas do conjunto esperado. A categoria lista de valores de atributos estabelece, para todas as tuplas, o valor esperado para cada atributo, sem considerar a ordem de tais atributos. A categoria ordem de tuplas define de forma não ambígua a ordem esperada das

tuplas do conjunto de saída, quando esta ordem for relevante.

Definição: Conjunto de dados retornados

Cada execução de um comando select resulta em um conjunto de tuplas, nomeado neste estudo de conjunto de dados retornados. Este conjunto é descrito por uma lista ordenada de atributos, (Ar1, Ar2, ..., Arp), onde Ari, 1 i p, é mencionado como atributo retornado.

As expressões usadas para computar os valores de atributos retornados são tipicamente compostas por operadores aritméticos e lógicos, funções pré-definidas para acessar e para formatar dados de tipos especiais, funções de sumarização, subconsultas, etc., dificultando portanto sua formalização. Se várias execuções são realizadas para um dado comando

select, então são obtidos vários conjuntos de dados retornados, um para cada execução

realizada. A presença de um defeito é descoberta em um comando select quando pelo menos um de seus conjuntos de dados retornados obtidos diferir do conjunto esperado, em relação a quaisquer das categorias de falha; nesse sentido, todas as categorias de falha são aplicáveis a comandos de consulta.

Considere o comando select apresentado na Seção 3.1. A lista de atributos é composta por 3 elementos, os quais são computados pelas expressões salary, count(*) e sum(bonus), e os valores obtidos para cada tupla são retornados de acordo com essa seqüência de atributos. O número de tuplas e a ordem de valores em cada tupla dependem do comando propriamente dito e do estado da base de dados anterior à execução do comando. A ordem de tuplas é relevante neste comando, baseando-se nos valores do atributo salary de forma descendente.

Definição: Conjunto de dados definidos

A execução dos comandos insert, delete e update pode modificar o estado da base de dados e conjunto de dados definidos é a denominação para o conjunto de tuplas relacionadas aos dados efetivamente inseridos, excluídos e modificados pela execução desses comandos. Este conjunto é descrito por uma lista de atributos, (Ad1, Ad2, ..., Ads),

onde Adi, 1 i s, é mencionado como atributo definido. Considere um comando C de

mudança de estado, tal que sua execução pode modificar o estado da relação r. Se C é um comando insert, a lista dos atributos definidos pela execução de C é composta por todos os atributos do esquema da relação r. Se C é um comando delete, a lista dos atributos definidos pela execução de C é composta pelos atributos da chave primária da relação r. Se C é um comando update, onde o conjunto de saída é referente à imagem de banco de dados após a execução de comando, a lista de atributos definidos pela execução de C é determinada pelos atributos com valores explicitamente atribuídos na estrutura de comando (conforme item estrutural [u2] na Tabela 3.2), em adição aos atributos da chave

primária da relação r. É importante notar que os atributos da chave primária da relação estão sempre incluídos na lista de atributos definidos, visto que são necessários para checar se a operação de mudança de estado foi aplicada nas tuplas “certas”.

Por exemplo, considere o seguinte comando:

update empl

set salary = salary * 1.1, bonus = 12 where bonus is null

Se a chave primária de empl é representada unicamente pelo atributo emplno, a lista de atributos definidos é composta pelos atributos emplno, salary e bonus.

Similarmente ao conjunto de dados retornados, se várias execuções são realizadas para um mesmo comando de mudança de estado, então são obtidos vários conjuntos de dados definidos, um para cada execução realizada. Entretanto, a presença de um defeito é descoberta em um comando de mudança de estado quando pelo menos um de seus conjuntos de dados definidos obtidos diferir do conjunto esperado em relação às seguintes categorias de falha: lista de

atributos, número de tuplas e lista de valores de atributos; as categorias de falha ordem de atributos e ordem de tuplas não são consideradas neste caso, pois são irrelevantes para

caracterizar o estado da base de dados após a execução do comando.

Em síntese, comandos de consulta e comandos de mudança de estado diferem na noção de falha de execução de comando. Nos primeiros, uma falha é manifestada quando o conjunto de dados retornados é distinto do esperado; nos últimos, uma falha é manifestada quando o conjunto de dados definidos é distinto do esperado (o estado da base de dados após a execução do

Defeitos e Falhas em Manipulação de Dados Persistentes 55

comando difere do esperado). Adicionalmente, as categorias de falha ordem de atributos e ordem

de tuplas são exclusivas para a consulta de dados, visto que a ordem de colunas e de linhas do

conjunto resultante de uma consulta pode ser relevante dentro da aplicação de banco de dados em que o comando está inserido.