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.