• Nenhum resultado encontrado

Cardinalidade, Diversidade e Nulidade

Defeitos e Falhas em Manipulação de Dados Persistentes

3.4 Cardinalidade, Diversidade e Nulidade

A seleção de bases de dados reveladoras de defeito de manipulação requer conhecimento sobre os tipos de defeitos e as categorias de falha em comandos de manipulação. Na evolução do mapeamento entre defeitos e falhas houve a construção de bancos de dados, visando a maximizar a lista de categorias de falha exercitáveis para cada tipo de defeito. Nesse sentido, foi observado que as bases de dados construídas para a execução de comandos defeituosos possuíam propriedades comuns para cada tipo de defeito, e que estas, quando presentes, aumentavam a

possibilidade de que falhas fossem manifestadas. Esta seção introduz tais propriedades, apresentando exemplos para ilustrar sua utilização.

Dentro do contexto de abstração de propriedades para bases de teste, Zhang et al. (2001) estudaram a geração de instâncias de banco de dados, a partir da semântica de comandos SQL embutidos em programas de aplicação; os autores reconhecem que poucos estudos têm sido dedicados à geração de dados para o teste de programas de aplicação de banco de dados que usam a SQL. O artigo descreve uma ferramenta de suporte que gera um conjunto de restrições, que representam, coletivamente, uma propriedade contra a qual o programa deve ser testado. Exemplos de propriedades para um determinado comando SQL de consulta a base de dados são: o comando retorna nenhuma linha e o comando produz valores numéricos negativos. A entrada da ferramenta é composta por um comando SQL, pela definição de esquema de banco de dados e por uma propriedade que representa o requisito para o testador. Se a propriedade puder ser satisfeita, obtêm-se instâncias de banco de dados, as quais devem estar consistentes com as restrições do esquema da base de dados. O trabalho é limitado a comandos de consulta e a restrições focadas no resultado da consulta: restrições simples de domínio para atributos de certos tipos de dados e restrições de cardinalidade de tuplas. Os autores reconhecem a impossibilidade da completa geração automática de bases de dados para teste, mas realçam a importância de iniciativas de suporte automatizado à geração de dados para o teste de aplicações de banco de dados.

Em nosso estudo, três propriedades foram identificadas como reveladoras da presença de defeitos de manipulação: cardinalidade, diversidade e nulidade. A primeira refere-se ao número de tuplas (linhas) das relações (tabelas) de entrada usadas na execução de um comando de manipulação; a segunda denota a heterogeneidade de valores para os atributos das relações de entrada; e a última atenta para a existência de valores nulos nos atributos das relações de entrada. Sobre tais propriedades, é importante ressaltar que, diferentemente da abordagem de Zhang et al. (2001), a referência de observação situa-se nos dados de entrada para a execução de comandos, que são aplicadas a comandos de consulta e de mudança de estado.

Para ilustrar as propriedades, considere o fragmento de código correto, sem defeitos, da ação de uma regra ativa da Figura 3.1. Nessa figura, o nó i denota uma consulta ao salário e ao departamento de alocação do empregado identificado pelo conteúdo da variável v_emplno; o nó j representa uma consulta ao salário atribuído ao gerente do departamento identificado pelo

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

conteúdo da variável v_deptno; um comando de mudança de estado é representado no nó k, onde ao salário do gerente do departamento identificado pelo conteúdo da variável v_deptno atribui-se o conteúdo da variável v_salary; e o nó l indica uma consulta aos empregados cujo salário é superior a 2000, restringindo o nome e o salário acrescido de 10%, ordenando os dados de modo ascendente por nome do empregado.

nó l nó k nó j nó i ....

select salary, deptno into v_salary, v_deptno from empl

where emplno = v_emplno ....

....

select salary into v_salary_manager from dept

where deptno = v_deptno ....

....

if v_salary > v_salary_manager update dept

set salary = v_salary where deptno = v_depto ....

....

... select name, salary * 1.1 from empl

where salary > 2000 order by name ....

Figura 3.1: Fragmento de código da ação de uma regra ativa.

Seja uma versão incorreta do comando atribuído ao nó i do grafo da Figura 3.1:

select salary, deptno into v_salary, v_deptno from empl, proj

where emplno = v_emplno

Um defeito do tipo [s2]-2 localiza-se na cláusula from, onde um nome de tabela está

indevidamente presente na lista de nomes de tabelas usadas como fonte de dados. Para que uma falha seja manifestada devido à execução da versão incorreta do comando, é requerida que a relação proj possua a propriedade cardinalidade com valor “zero tuplas” ou “várias tuplas” (pelo menos duas tuplas), pois o número de tuplas do conjunto de saída do comando é proporcional à cardinalidade da relação proj. Seja uma outra versão incorreta do comando atribuído ao nó i da Figura 3.1:

select salary, deptno into v_salary, v_deptno from empl

where emplno = v_emplno and bonus is not null

Neste caso, é caracterizada a existência de um defeito do tipo [s3]-3: o predicado para a seleção

de tuplas está incorreto. A manifestação da falha requer a presença de tuplas na relação empl com diversidade de valores para o atributo bonus, incluindo valor nulo; em adição, se a propriedade

cardinalidade para a relação empl possui o valor “várias tuplas”, as chances para testador

perceber a presença do defeito são aumentadas. Seja uma versão defeituosa do comando atribuído ao nó l:

select name, salary * 1.1 from empl

where salary > 1000 order by salary desc

Neste comando, é constatada a presença de defeitos do tipo [s3]-3 e [s6]-4: o predicado para a

seleção de tuplas está incorreto e um argumento incorreto está na lista ordenada de argumentos para ordenação de dados, respectivamente. A heterogeneidade de valores para os atributos name e

salary eleva a chance da manifestação da falha e possivelmente aumenta a percepção do testador

para a presença do defeito do tipo [s3]-3. Em adição, A heterogeneidade de valores para o

atributo salary e a propriedade cardinalidade com valor “várias tuplas” para a relação empl favorece a manifestação da falha atribuída ao defeito do tipo [s6]-4. O comando abaixo representa

uma versão defeituosa do comando referente ao nó k:

update dept

set salary = v_salary * 1.1 where deptno <> v_deptno

Defeitos do tipo [u2]-3 e [u3]-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 da relação e o predicado para a seleção de tuplas está incorreto, respectivamente, estão presentes no comando acima. A cardinalidade “alguma tupla” (pelo menos uma tupla) e a diversidade de valores para os atributos

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

para seleção de dados da relação empl que elevam a chance de manifestação de falhas na execução deste comando.

Valores nulos representam situações especiais para os atributos de um banco de dados. Segundo Elmasri e Navathe (2003), valores nulos possuem três diferentes interpretações: valor desconhecido, o valor existe, mas não é conhecido; valor não disponível, o valor existe, mas não pode ser obtido – valor retido; ou atributo não aplicável, valor indefinido para a tupla. Exemplos para tais interpretações são: a data de nascimento de um empregado é desconhecida, o telefone residencial de um empregado não foi divulgado e a data de egresso de um empregado ainda trabalhando na empresa é não aplicável, respectivamente. Em termos computacionais, valores nulos podem ser vistos como valores desconhecidos, onde em geral qualquer computação com valores desconhecidos produzirá um valor também desconhecido. Por exemplo, a expressão

(salary * 1.1 + bonus) resultará em valor nulo se pelo menos um dos atributos envolvidos, salary

ou bonus, possuir valor nulo; o predicado (salary > 2000) será avaliado como falso para todas as

tuplas cujo valor do atributo salary é nulo.

A propriedade nulidade é aplicável aos atributos da(s) relação(ões) de entrada usados, diretamente ou indiretamente, na computação dos valores dos atributos da relação de saída; tais atributos, também denominados de atributos manipulados, são os atributos da relação de entrada referenciados explicitamente ou implicitamente no comando de manipulação ou listados diretamente como atributos do conjunto de saída. Por denotar situações especiais e com aspectos computacionais próprios, a ocorrência de valores nulos representa uma oportunidade para a introdução de defeitos. Algumas dessas oportunidades envolvendo os atributos manipulados são: expressões aritméticas e lógicas localizadas em qualquer item estrutural de comando de manipulação; predicados para a seleção de dados; e funções de sumarização. Tipicamente, sistemas gerenciadores de banco de dados disponibilizam recursos para tratar valores nulos em comandos de manipulação, possibilitando que a presença de tais valores seja prevista pelo programador; como exemplo, são citados: funções embutidas que substituem valores nulos, cláusulas dedicadas a predicados que indagam a existência de valores nulos e mecanismos de sumarização que ignoram tuplas que possuem valores nulos em certos atributos.

Durante a construção do mapeamento entre tipos de defeitos e categorias de falha, foi observado que defeitos ligados à presença de valores nulos podem estar situados na maioria (10 de 15) dos itens estruturais dos comandos de manipulação. Para o comando select, identificou-se

essa possibilidade para os itens estruturais [s1], [s3], [s4], [s5] e [s6] e para os comandos de

mudança de estado foram relacionados os itens [i3], [i4], [d2], [u2] e [u3]. Excetuando-se a

categoria de falha ordem de atributos, as demais categorias de falha são exercitáveis por defeitos atribuídos à existência de valores nulos. Dessa forma, requerer valores nulos para os atributos manipulados pela execução de comandos constitui uma diretriz pertinente para revelar a presença de defeitos de muitos dos tipos listados para os comandos de manipulação.

A diversidade de valores para os dados de teste foi tratada por Chays et al. (2000), em sua abordagem para a geração de bases de dados visando ao teste de aplicações de banco de dados que usam a SQL. Relações da base de dados são povoadas com dados que respeitam as restrições de integridade e que são interessantes, segundo julgamento do testador. Tais dados são obtidos a partir de indicações do próprio testador, pelo fornecimento de amostras de dados organizadas em categorias. Casos de teste são então construídos a partir da combinação dos valores das várias categorias. É enfatizada a importância de dados que cubram uma variedade de diferentes características das entidades da base de dados, mas não existe uma sistemática para medir a diversidade de dados, nem uma política para garantir um grau mínimo de diversidade.

Similarmente à propriedade nulidade, a propriedade diversidade é aplicável aos atributos manipulados. A heterogeneidade de valores para os atributos manipulados, em adição à observância das cardinalidades “zero tuplas”, “alguma tupla” e “várias tuplas” para a(s) relação(ões) de entrada, possibilitam que diversos cenários de execução sejam aplicados a um dado comando de manipulação, elevando a possibilidade de manifestação da falha e da percepção do testador para essa manifestação. Na construção do mapeamento entre defeitos e falhas, pode- se afirmar que a propriedade diversidade pode apoiar a ocorrência de falhas ocasionadas por defeitos ligados a todos os tipos listados na Seção 3.2 para os comandos de manipulação. Em adição, foi percebida a necessidade de uma medida para apreciar o nível de adequação da diversidade aplicada às execuções de cada comando defeituoso; tal medida seria computada para cada base de dados (caso de teste) e para o conjunto de bases de dados utilizadas na execução de um dado comando (conjunto de casos de teste).

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

3.5 Considerações Finais

Este capítulo discutiu aspectos ligados a defeitos e falhas de manipulação, e apresentou o resultado de uma investigação sobre o relacionamento entre tipos de defeito e categorias de falha. As construções básicas de comandos SQL de manipulação foram examinadas e organizadas em itens estruturais, com a intenção de agrupar tipos de defeito. O conceito de falha de manipulação foi estudado, introduzindo-se dois conjuntos de dados que capturam a noção de saída da execução de comandos: conjunto de dados retornados, o qual está relacionado a comandos de consulta (comando select) e conjunto de dados definidos, que se refere a comandos de mudança de estado (comandos insert, delete e update). Categorias de falha foram caracterizadas em nível de comandos individuais, permitindo o entendimento de como defeitos de manipulação são propagados para a saída de execução de comandos. Uma lista de tipos de defeitos de manipulação foi apresentada para cada item estrutural, incluindo exemplos de comandos corretos e defeituosos.

Um mapeamento entre tipos de defeitos e categorias de falha de manipulação foi construído a partir da execução de um conjunto de comandos defeituosos, visando a exercitar todos tipos de categorias de falha para cada tipo de defeito. Para a execução de tais comandos, foi necessário construir bases de dados de entrada. Foram abstraídas algumas propriedades atribuídas a essas bases de dados: cardinalidade, diversidade e nulidade; observou-se que a presença dessas propriedades contribui para a descoberta de defeitos.

A análise do mapeamento entre defeitos e falhas de manipulação aponta que: i) existe um relacionamento muitos-para-muitos entre defeitos e falhas de manipulação, o que dificulta a identificação do tipo de defeito a partir do conhecimento da categoria de falha ocorrida; ii) a manifestação das categorias de falha é dependente do tipo de defeito, do comando defeituoso e da base de dados de entrada; iii) as propriedades cardinalidade, diversidade e nulidade representam requisitos reveladores de defeito na geração de bases de dados de entrada; e iv) o conhecimento de defeitos e falhas de manipulação é crucial para a programação SQL e para o teste de aplicações de banco de dados.

Algumas contribuições deste capítulo são: introdução de uma lista de tipos de defeito de manipulação, representando o primeiro elemento de uma investigação na direção de se propor uma abordagem sistemática de teste para aplicações de banco de dados; apresentação do conceito

de saída da execução de comandos de manipulação, buscando capturar dados suficientes para o projeto de casos de teste de comandos SQL; proposição de um elenco de categorias de falha de manipulação, constituindo um recurso para a determinação se a saída produzida pela execução de casos de teste está correta; construção e validação preliminar de um mapeamento entre tipos de defeito e categorias de falha, aumentando o conhecimento entre defeitos e falha de manipulação para as atividades de teste e de depuração de aplicações de banco de dados; e abstração de propriedades potencialmente reveladores de defeito, no que diz respeito às bases de dados de entrada.

Capítulo 4