Teste de Software: Um Breve Estudo do Importante Processo no Desenvolvimento de Softwares

Tamanho: px
Começar a partir da página:

Download "Teste de Software: Um Breve Estudo do Importante Processo no Desenvolvimento de Softwares"

Transcrição

1 Teste de Software: Um Breve Estudo do Importante Processo no Desenvolvimento de Softwares André Assis Lôbo de Oliveira Francisco Guerra Fernandes Júnior Faculdades Alves Faria, , Brasil PALAVRAS-CHAVE: Teste de Software, Qualidade, Engenharia de Software. 1 INTRODUÇÃO Em desenvolvimento de softwares existe um ponto chave na forma como os problemas do mundo real são interpretados, modelados e implementados para linguagem computacional. A evolução de técnicas, metodologias e ferramentas acerca dessa forma de como o real é abstraído para soluções em tecnológias é uma busca constante do homem. Após a evolução do hardware foi possível a implementação de grandes sistemas computacionais, resoluções de grandes problemas e, o conceito de evolução tecnológica e a utilização de softwares, tornaram-se objetos cada vez mais comum e normal no dia-a-dia das pessoas. Porém, evolução tecnológica ainda não inventou uma vacina que imuniza os softwares dos erros, principalmente porque os mesmos não existem isoladamente por causa hardware em si, ou do software, mas sim porque eles são provocados, em sua maioria e essência, pela ação humana. Dessa forma, os bugs também estão cada vez mais presentes na vida das pessoas, provocando prejuízos e transtornos catastróficos e, eles são cada vez mais percebidos a medida que a complexidade e funcionalidades aumentam na especificação de um software. Nesse contexto e ao encontro destas problemáticas, surge a proposta da presente pesquisa que consiste realizar um breve estudo dos principais conceitos existentes na literatura acerca um tema que está dentro da Engenharia de Software: o Teste de Software.

2 2 MATERIAIS E MÉTODOS A pesquisa realizada no presente artigo é essencialmente qualitativa utilizando-se de um metodologia fundamentalmente bibliográfica com o objetivo de expor e divulgar os principais conceitos que a área de teste de software propõe de forma que os mesmos sejam compreendidos por estudantes da área e comunidade acadêmica em geral. Para efetivar essa pesquisa foram escolhidas obras que tratam do assunto de forma relevante a fim de levantarmos informações íntegras e podermos formar conceitos consistentes. Tais obras são constituídas por livros, teses, dissertações e artigos científicos de revistas conceituadas acerca do tema em específico. 2.1 Terminologias Básicas do Teste de Software Os softwares são construídos para resolver ou melhorar problemas e atividades necessárias dentro da sociedade. Neste sentido, envolve ampla interação humana em todas as fases do seu desenvolvimento. Dessa forma, a maioria dos defeitos inseridos nos softwares são originados da ação e interpretação humana. É justamente com a intenção de descobrí-los antes da utilização do software pelo usuário final, que existem inúmeras atividades de validação, verificação e teste. A construção de software é uma tarefa extremamente complexa e para melhor compreensão deste processo de desenvolvimento soluções faz-se necessário ter uma visão de alguns conceitos chaves que subsidiam o entendimento de outros conceitos e, considerando que a realização do ato de testar software, tem como objetivo o levantamento das falhas inerentes ao produto tecnológico, para que as mesmas possam ser corrigidas, é necessário compreender a diferença entre defeitos, erros e falhas. O defeito consiste na ação humana cometida de forma incorreta. O erro é a consequencia de um defeito, ou seja, é um resultado diferente do que se esperava. Já a falha é o resultado de um ou mais defeitos, que geraram erros e cosequentemente um comportamento inesperado do software em termos

3 operacionais. Na Figura 1, Neto (2007) evidencia conceitos que podem ser melhor visualizados e exemplificados aos considerar três universos diferentes: Universo Físico, Universo da Informação e Universo do Usuário. Figura 1. Diferença entre defeito, erro e falha (NETO, 2007, p. 55). É importante ressaltar que o primeiro momento da correção de defeitos não é iniciado no processo de teste de software, mas sim desde a análise da especificação dos requisitos. Isso pode ser afirmardo porque revisões nos requisitos podem ser realizadas com a finalidade de encontrar defeitos antes mesmo de serem desenvolvidos. Aproveitando uma revisão na literatura realizada por Neto (2007), acerca dos principais conceitos e terminologias dentro da área de teste de software, foi construída a Tabela 1 que expressam outros conceitos importantes de forma objetiva. Tabela 1 Conceitos importantes em teste de software (NETO, 2007) Caso de Teste Procedimento de Teste Critério de Teste Critéro de cobertura dos testes Critério de adequação de casos de teste Expressa uma condição a ser testada, sendo constituído por valores de entrada com restrições para sua execução. Apresenta também um valor esperado. É constituído de passos que descrevem exatamente a execução de um caso. Tem o objetivo de provocar falhas para avaliação e seleção das mesmas. Possibilita a identificação de partes do programa que necessariamente precisam ser executados como um indicativo do teste realizado. Permite avaliar se os casos de teste existentes dão subsídios para análise de uma função ou produto.

4 Critério de geração de casos de teste Norteia a geração de casos de teste para que os mesmos sejam gerados em conformidade com os critérios de adequação construídos. A diferenciação entre defeito, erro e falha, e a compreensão dos conceitos expressos na Tabela 1, são conceitos que subsidiam atividades essenciais dentro das atividades de validação e verificação no grande processo de testar de software. 2.2 Fases da Atividade de Teste de Software São diversos os fatores que podem tornar a atividade de teste de software extremamente complexa, pois a sua realização e os seus resultados, dependem, necessáriamente, do que está sendo testado: por componentes, subsistema ou por todo o sistema (PFLEEGER, 2004). Além disso, erros podem ser provocados por implementações lógicas incorretas e até mesmo pela equivocada utilzação de uma função que foi implementada de maneira correta (DELAMARO; MALDONADO; JINO, 2007). Considerando estas variáveis e, com a finalidade de minimizar a complexidade da realização dos testes, as atividades de teste de software foram divididas em três fases principais: teste de unidade, teste de integração e teste de sistemas. Existem também outras fases que definem mais níveis ao teste de software, porém não serão abordados neste artigo por motivos de corte e delimitação Teste de Unidade O alvo e o foco central desta fase de teste são as menores unidades que constituem um programa do projeto de software. Tais unidades podem ser: funções, procedimentos, métodos e classes. Considerando as unidades pontuadas, as mesmas serão identificadas de acordo com o paradigma da linguagem considerada. Tal proposição pode ser concluída, conforme Prado (2009, p. 8) retratando o paradigma da orientação à objetos: A interpretação justificada pelos autores que adotam a classe como menor unidade é de que na orientação à objetos a menos unidade funcional, ou seja, que

5 não depende necessariamente de outras para executar sozinha, é a classe. Outra característica do teste de unidade é que o mesmo pode ser realizado a medida em que a implementação vai ocorrendo porque cada unidade pode ser testada separadamente, sem necessariamente dispor de todo o sistema Teste de Integração Após as unidades terem sido implementadas e testadas, pode ocorrer então, outra fasse de teste: o teste de integração. Neste teste, à enfase e a essência está na estrutura do sistema a medida que diversas partes do sofware são colocadas em execução de forma conjunta (DELAMARO; MALDONADO; JINO, 2007), ou seja, as partes unitárias do software já desempenham funcionalidades e resultados lógicos em união. Neste contexto é que o teste de integração se faz pertinente, porque apenas o teste unitário para avaliação do conjunto não é suficiente, pois resultados dependem da interação das unidades. Diante destes fatores, o teste de integração é muito importante e pode elevar o custo projeto, porque erros identificados nesta fase, impacta nas unidades de software e, consequentemente, na nova realização de testes unitários Teste de Sistema A integração das unidades, conjuntos e partes do programa gera o sistema como um todo. Este é o cenário para aplicação dos teste de sistema. O objetivo desta fase consite na idenficação e avaliação do sistema sob a ótica pelo qual o mesmo foi corretamente especificado. Neste fase, características de correção, coerência e completude devem ser intensamente explorados, considerando também requisitos como robustez e segurança que constituem os requisitos não funcionais (DELAMARO; MALDONADO; JINO, 2007) para melhor avaliação do sistema como um todo. 2.3 Critérios de Teste

6 Considerando que defeitos, erros e falhas podem ser inseridos no software por diferentes fatores e os mesmos podem impactar em diferentes níveis e lugares em sistemas, que por sua vez podem ser construídos com diferentes paradigmas e padrões, é que existem diferentes critérios para teste de software. Apesar destes fatores, os critérios, de maneira geral, apresentam um mesmo ponto de intersecção: a detecção de falhas existentes. A seguir são apresentadas breves definições dos principais critérios, de forma a conceituá-los no contexto de teste de software. Porém, cientes de que os mesmos não se opõe e sim complementam-se, uma vez que um software, como já referido, é algo complexo e que trata de muitas variáveis, tais critérios podem ser considerados como regras de seleção de subdomínios, que agrupam casos de testes dentro de um mesmo domínio. Este agrupamento tem a finalidade aumentar a eficiência dos teste: diminuir os casos de testes, e simultaneamente manter elementos que representam todo um grupo. Neste artigo, serão apresentados os critérios de teste caixa preta e caixa branca (teste funcional e teste estrutural, respectivamente) para ilustrar os conceitos de critérios de teste Teste Funcional O teste funcional ou caixa preta possui este nome por tratar o componente de software como uma caixa em que o conteúdo não é conhecido (VICENZI, 1998), ou seja, é possível visualizar as dimensões da caixa, o seu lado externo, e conhencer o seu propósito, a sua função. De forma análoga, para realização de testes deve-se saber a especificação funcional do que se está testando, no caso o software, sem a preocupação com os detalhes de linha de código (implementação) que o gerou. Do ponto de vista funcional, o teste funcional é ideal para indentificar o funcionamento idealizado do software, porém apresenta alguns problemas, como por exemplo, a quantificação das atividades de teste e as inconsistências decorrentes da especificação, identificados por Vicenzi (1998). Segue alguns exemplos de critérios de teste apontados por Presman apud Vicenzi (1998, p. 10):

7 particionamento de equivalência: divide o domínio de entrada em classes de dados válidas e inválidas que provavelmente exercitarão uma função de software específica; análise do valor limite: verifica a capacidade de um programa manipular dados nos limites das condições de entrada; grafo de causa e efeito: oferece uma representação concisa das condições lógicas e das ações correspondentes possibilitando que o testador valide conjuntos de ações e condições. Diante disso, os critérios de teste da técnica funcional visam a delimitação de entradas possíveis, facilitando a derivação dos testes para encontrar os defeitos existentes (PRADO, 2009) Teste Estrutural O teste estrutural (caixa branca) toma por base a estrutura interna do programa (Figura 2). Ao contrário do teste funcional que limita-se a parte externa do software, os critérios de teste estrutural considera o código fonte dos componentes de software.

8 Figura 2 O grafo de fluxo de controle e o grafo de fluxo de dados (HAUSEN, 2005). A estrutura interna do programa no teste estrutural é representada por um grafo de fluxo de controle (GFC), mas também pode ser representada por um grafo de fluxo de dados, comumente definido como grafo de definição-uso. Estes conceitos podem ser melhor entendidos ao observar a Figura 2, em que o grafo de fluxo de controle diferencia-se do grafo de fluxo de dados por não possuir informações sobre os nós que representam a utilização das variáveis do programa 3 RESULTADOS E DISCUSSÃO Com base nos conceitos apresentados nesse artigo, fundamentado em conceituado referencial teórico do assunto, pode-se visualizar que diversas são as variáveis que compõem o desevolvimento de software e, por este motivo a atividade de teste é muito importante para conferir, em todos os níveis, se o desenvolvido atende àquilo que foi especificado. Nesse contexto, para que seja projetado e construído conhecimentos acerca do tema teste de software é de suma importância que se realize um estudo aprofundado a respeito dos principais conceitos de termilogias que envolve os processos de validação, verificação e teste. Além disso, no estudo destes conceitos pode-se perceber que o teste de software não é o primeiro processo que identifica possíveis defeitos, pois estes podem ser obtidos através de revisões nas fases de especificação de requisitos. Outro resultado importante, consiste na identificação de três fases principais da atividade de teste: teste de unidade, teste de integração e teste de sistema. Ficou perceptível que tais tarefas são divididas para realizar diferentes testes com níveis de abstração de software.

9 Sobre a ótica de diferentes níveis de teste de software, também é necessário que sejam desenvolvidos tipos de critérios para selecionar diferentes subdomínios de casos de teste dentro de um mesmo domínio. Diante disso, o resultado principal que diferencia o teste funcional do teste estrutural, é que o teste funcional considera a parte externa do software enquanto o teste estrutural considera a estrutura interna do software, porém ambos com o mesmo objetivo: encontrar defeitos para diminuí-los (através de correções). 4 CONCLUSÕES Nesse artigo procurou-se apresentar os principais conceitos existentes na literatura acerca do tema teste de software. Pode-se concluir, que o ato de testar constitui-se em uma diferente forma de se obter qualidade: através da identificação dos defeitos existentes. Algo importante alcançado com o estudo elaborado nesse artigo é a visualização que diferentes tipos de aplicações de software exigem diferentes técnicas para testes: testar uma aplicação web envolve passos diferenciados em comparação aos testes de um sistema embarcado (NETO, 2007, p. 59). O desenvolvimento de técnicas, ferramentas e métodos de forma geral, que contribuam para o melhoramento das técnicas existentes, ou até mesmo, a criação de novas técnicas de teste de software, pode muito contribuir para toda a sociedade. Isso pode ser afirmado porque em todos os lugares existem equipamentos tecnológicos com softwares os gerenciando, para que os mesmos realizem suas funções com o propósito que foram construídos. A última proposição nos sugere o conceito de qualidade, sendo este um dos conceitos centrais que fundamentam a área de testes e, em um nível de abstração maior, a Engenharia de Software que se utiliza dos conhecimentos das Ciências da Computação para desenvolver técnicas e metodologias que vão ao encontro dos problemas existentes apresentando soluções. Porém, a constatação de tais soluções, seria algo impossível se não existissem fundamentos como os apresentados nesse artigo que constituem e caracterizam a base conceitual de um tema tão importante, o teste de software.

10 REFERÊNCIAS BIBLIOGRÁFICAS DELAMARO, E.; MALDONADO, J. C.; JINO, M. Introdução ao teste de software. Rio de Janeiro: Elsevier, HAUSEN, A. C. ValiMPI: Uma ferramenta de teste estrutural para programas paralelos em ambiente de passagem de mensagem f. Dissertação (Mestrado em Informática) Setor de Ciências Exatas, Universidade Federal do Paraná, Curitiba, NETO, A. C. D. Introdução a teste de software. Engenharia de Software Magazine, [Rio de Janeiro], 1. ed., ano 1, p , PFLEEGER, S. L. Engenharia de Software: teoria e prática. Tradução de Dino Franklin. 2. ed. São Paulo: Prentice Hall, PRADO, M. P. Um estudo de caracterização e avaliação de critérios de teste estruturais entre os paradigmas procedimental e OO f. Dissertação (Mestrado em Ciência da Computação e Matemática Computacional) Instituto de Ciências Matemáticas e de Computação, Universidade de São Paulo, São Paulo, VICENZI, A. M. R. Subsídios para o estabelecimento de estratégias de teste baseada na técnica de mutação f. Dissertação (Mestrado em Ciência da Computação e Matemática Computacional) Instituto de Ciências Matemáticas e de Computação, Universidade de São Paulo, São Paulo,1998.