A atividade de teste de software é um dos meios utilizados para garantir a qualidade do sistema, evitando assim surpresas desagradáveis em relação ao resultado final da aplicação. O teste parece ser uma coisa simples e empírica, mas na verdade não é. E as falhas, muitas vezes, acontecem por não darmos a devida importância a esse fato. Neste contexto, abordamos neste artigo a definição e utilização de testes exploratórios, mostrando suas vantagens e desvantagens.

Testes exploratórios são extremamente úteis para encontrar bugs rapidamente, e quando o projeto não tem uma documentação bem definida ou a mesma encontra-se desatualizada. O que precisamos, hoje, é mostrar a importância desses testes, para garantia de qualidade dos sistemas. E isso só é possível introduzindo-se métodos para auxiliar no planejamento e especificação dos mesmos, pois o teste é um item fundamental para o desenvolvimento de sistemas.

A atividade de teste muitas vezes é vista como uma fase de crítica aos analistas e programadores, fazendo com que estes se sintam constrangidos. Mas, se os erros existem, o fato de não se fazer os devidos testes não quer dizer que eles irão desaparecer e, muitas vezes, se esses erros são detectados tardiamente podem causar prejuízo e danos incontroláveis aos sistemas. Dentre os vários tipos de testes existentes, neste artigo vamos definir, contextualizar, citar as vantagens e desvantagens e mostrar a aplicabilidade dos testes exploratórios.

Teste de software é uma disciplina reconhecidamente importante da engenharia de software. Mesmo cientes da importância desta disciplina, alguns desenvolvedores acabam ignorando propositalmente as atividades de testes, ou relegando-as para o final do projeto. Isto pode acontecer simplesmente por estes desenvolvedores não compreenderem bem os procedimentos relacionados à disciplina de testes. Em organizações maduras as atividades de testes são realizadas com muito cuidado, pois a qualidade do produto final está diretamente associada a como os testes serão executados. O processo de testes deve ser a base para as atividades de garantia da qualidade do produto em uma organização, coordenando assim a forma como todas as atividades de testes serão executadas.

Existem várias definições para este conceito de teste de software. Segundo Patton (2005), por exemplo, teste de software é a ação de encontrar bugs, encontrá-los o mais rápido possível e garantir que os mesmos sejam corrigidos. Naturalmente, devemos entender que um bug é um defeito, falha ou algo que não está se comportando como esperado. Em outras palavras, testar é um processo que engloba todas as atividades do ciclo de vida voltadas para o planejamento, preparação e avaliação dos produtos de software e produtos de trabalhos relacionados, a fim de determinar se eles satisfazem os requisitos especificados.

A partir destes conceitos, é possível perceber a importância dos testes no ciclo de vida de um software. É ele quem avalia se requisitos relacionados a escopo e qualidade do projeto foram satisfeitos e, consequentemente, se o produto está apto para ser utilizado. Dentre os tipos de testes mais conhecidos, destacam-se os testes de usabilidade, testes unitários e os testes de carga e de desempenho.

O objetivo deste artigo é aprofundar-se no uso dos testes exploratórios. Embora não definidos nos planos de testes, é importante deixar claro que os testes exploratórios também seguem um processo, e representam uma estratégia útil para encontrar rapidamente os defeitos quando se sabe pouco sobre o produto, existe pouca documentação ou esta está desatualizada. Seus riscos, desvantagens e deficiências também serão tratados ao longo deste artigo.

Serão apresentados os principais conceitos, técnicas e dificuldades encontradas nos testes exploratórios. Para isso, inicialmente teremos uma discussão sobre o estado da arte de testes exploratórios. Em seguida é apresentado um estudo comparativo entre testes exploratórios e testes ad-hoc. Dando prosseguimento à discussão, abordaremos a importância de testes exploratórios em metodologias ágeis e, por fim, algumas conclusões gerais são apresentadas.

Testes exploratórios

Um teste exploratório de software é uma poderosa e abrangente abordagem, mas por vezes, confundido com o teste ad-hoc. Testes são executados naturalmente e involuntariamente por qualquer usuário de um determinado software. Porém, para estes testes serem considerados exploratórios, deve-se existir um propósito para tal execução. Tipos de teste como este requerem bastante prática dos envolvidos no projeto. Como citaram (Braga e Pretz) “o teste exploratório se baseia na intuição e depende do conhecimento, habilidade e experiência do testador.

Criatividade também é uma característica necessária para a execução de testes exploratórios, pois este não segue uma padronização, roteiro, ou passo-a-passo pré-definido em documentações. Uma vez que iniciado o teste, o testador precisa ter originalidade para executá-los simultaneamente no momento em que explora o produto.

Percebe-se geralmente que o uso de testes exploratórios é presente em projetos sem documentação bem definida, ou projetos ágeis, onde não existem documentos formais de requisitos e quando não existe um conhecimento prévio sobre o aplicativo que será testado. Dentre as razões existentes para a realização de testes exploratórios, destacam-se as seguintes:

  • Realização de testes quando não existem requisitos;
  • Realização de testes quando existe pouco tempo disponível;
  • Realização de testes quando não se conhece o aplicativo a ser testado;
  • Realização de testes em ambientes pouco testados pelos testes convencionais;
  • Identificação dos passos para tentar reproduzir um defeito aleatório;
  • Diagnóstico de comportamentos inesperados;
  • Investigação de efeitos colaterais;
  • Investigação de defeitos semelhantes;
  • Medição de riscos;
  • Determinação de defeitos críticos rapidamente.

Os elementos de testes exploratórios são:

  • Exploração do produto: Descobrir e registrar os objetivos e funções do produto, tipos de dados processados e as áreas de instabilidade. Sua capacidade de realizar exploração depende de sua compreensão geral da tecnologia, a informação que você tem sobre o produto e seus usuários pretendidos e a quantidade de tempo que você tem que fazer o trabalho.
  • Design de Teste: Determinar estratégias de funcionamento, observando e avaliando o produto.
  • Execução de um teste: Operar o produto, observar seu comportamento, e usar essa informação para formular hipóteses sobre como o produto funciona.
  • Heurística: Heurísticas são diretrizes ou regras que o ajudam a decidir o que fazer. Este procedimento emprega um número de heurísticas que ajudam a decidir o que deve ser testado e como testá-lo.
  • Resultados de revisão: Teste exploratório é um processo orientado para resultados. Tudo está consumado uma vez que você tem produzido resultados que atendam os requisitos especificados.
  • Como testador, você deve estar preparado para explicar qualquer aspecto do seu trabalho para o Gerente de teste, mostrando como eles atendem aos requisitos documentados no procedimento.

O resultado de uma sessão de teste exploratório é um conjunto de notas sobre o produto, falhas encontradas, e o registro de como o produto foi testado.

Testes Ad-hoc versus Testes exploratórios

Considere as situações descritas na Tabela 1. Em alto nível, os exemplos retratam bem a diferença entre esses dois tipos de teste. A Situação A representa uma metáfora para os testes ad-hoc, enquanto a Situação B representa uma metáfora para os testes exploratórios. Muitos testadores realizam testes ad-hoc acreditando se tratarem de testes exploratórios, e vice-versa. Graças a limitações de tempo para o estudo do sistema e dos planejamentos, eles acabam utilizando uma forma desorganizada de teste exploratório. Por isso, é comum observar algumas críticas ao teste exploratório.

Tabela 1. Situações de exemplo
Situação A Situação B

Um turista resolve visitar uma cidade qualquer, escolhida arbitrariamente, sem qualquer planejamento prévio.

Ao chegar nela, começa a explorá-la superficialmente.

Passado certo tempo, o turista acabaria descobrindo acidentalmente os seus locais preferidos.

Outro turista decide visitar a mesma cidade, mas este planejou detalhadamente a sua visita, contando com dados prévios sobre a cidade, e a explorando por partes, uma de cada vez.

Este turista também determinou um tempo limitado para conhecer cada um dos pontos, para evitar o cansaço, e ao mesmo tempo estimular a atenção em cada detalhe.

Passado certo tempo, o turista pode eleger os seus locais preferidos entre todos os pontos da cidade.

Em outras palavras, o teste ad-hoc trata-se de um processo improvisado, onde não existe nenhuma diretriz ou missão, e o papel do testador é interagir arbitrariamente com o software, produto, ou o que quer que seja. A sua maior ferramenta é a liberdade do testador para conhecer e explorar o software. Desta forma, os bugs vão sendo encontrados acidentalmente, por acaso, de acordo com o entendimento do usuário sobre a aplicação.

Já no teste exploratório, o processo deve ser fundamentado em dados e planejamento. O testador deve realizar um estudo antecipado do software, recolhendo os requisitos e/ou consultando outras fontes sobre o mesmo domínio da aplicação. Desta forma, o testador poderá predizer as áreas de concentração que serão estabelecidas no planejamento, assim como o tempo para a realização dos testes. De forma estruturada e metódica, as falhas caçadas serão descobertas rapidamente. Porém, mesmo que seja um teste exploratório, a arbitrariedade e a criatividade do testador não devem ser inibidas.

Teste exploratório em metodologias ágeis

Em razão do rápido crescimento da indústria de software, juntamente com o aumento da demanda por soluções cada vez mais robustas e, ainda, com requisitos mutáveis, a busca pela excelência e melhoria contínua da qualidade de software tem sido aprimorada ao longo do tempo (Sommerville, 2007). Por isso, diversos métodos, técnicas e ferramentas têm sido propostos e utilizados, buscando o aumento da produtividade no desenvolvimento de software (Teixeira e Delamaro, 2008).

Desse modo, a busca por melhores processos, visando o aumento da qualidade de software e a satisfação do cliente, fez surgir as Metodologias Ágeis, com a dinâmica de processos flexíveis e adaptativos, abraçando as mudanças como parte inseparável do seu processo de desenvolvimento. O conceito de metodologias ágeis é relativamente recente na engenharia de software. A partir do Manifesto Ágil diversas metodologias e processos estão sendo criados e utilizados na indústria seguindo os princípios e práticas ágeis. Segundo Ferreira e Cohen (2008), as metodologias ágeis têm um grande suporte na literatura, que defende que essas diminuem a taxa de insucesso no desenvolvimento de software. Mesmo assim, nenhuma metodologia ágil deve ser utilizada sem que a equipe saiba o que está fazendo e acredite nesse propósito. Caso contrário, usar metodologia ágil será apenas uma desculpa para não utilizar metodologia alguma.

Na maioria das metodologias ágeis a documentação possui foco mínimo. Por isso, teste de software é sempre uma questão a ser discutida. A cobertura dos testes em relação à aplicação dependerá diretamente das técnicas que serão usadas para encontrar os bugs; existem várias técnicas de encontrar bugs, mas nenhuma técnica consegue garantir que todos os bugs sejam encontrados. Teste de software é apenas mais uma das possíveis técnicas que podem ser aplicadas. Nenhuma técnica consegue encontrar mais de 85% dos bugs (Patton, 2005). O ideal é combinar diferentes técnicas para garantir que a maioria dos bugs sejam encontrados o mais cedo possível (Patton, 2005).

A escolha de qual técnica utilizar depende de diversos fatores, tais como: o modelo utilizado nas especificações do sistema, a experiência dos engenheiros de teste, tipos de defeitos normalmente encontrados no sistema, objetivo do teste, documentação disponível, tipos de risco, exigências do cliente, tipo do sistema, requisitos obrigatórios, tempo e custo do projeto.

Não existe uma técnica melhor ou pior que a outra. Existem técnicas mais adequadas a determinadas situações. Então, perguntar qual a melhor técnica não é a pergunta certa. Cada técnica é boa para um conjunto de objetivos, e não se aplicam para tudo em um projeto de desenvolvimento de um software. Num mesmo sistema, varias técnicas podem ser aplicadas.

Dentro do contexto de metodologias ágeis, onde as principais caraterísticas são: pouca especificação e curto prazo de tempo para o projeto, a técnica que mais se adequa, para uma maior cobertura da aplicação são os Testes Exploratórios.

Alguns testadores podem não concordar, a partir do teste exploratório o testador poderá executar e criar testes ao mesmo tempo em que explora a aplicação. Com isso, economizará tempo, e mesmo que a documentação seja mínima, ele terá algo que possa ser usado. Dessa forma, por mais que os testes não possam ser realizados da maneira devida, a quantidade de bugs críticos será praticamente a mesma, pois como já dito, testes exploratórios acabam por criar outras baterias de testes e assim por diante. Assim, podemos concluir que é possível conciliar testes a metodologias ágeis, sem que a metodologia deixe de ser tão ágil assim.

Conclusão

Teste exploratório é uma alternativa simples para auxiliar no processo de garantia da qualidade de um projeto de software. Eles abrangem pensamentos do testador, fazendo com que ele não pense de uma forma limitada sobre determinada funcionalidade do sistema. Entretanto, é necessário um bom planejamento e um acompanhamento para que o teste encontre suas finalidades de uma forma aleatória, porém, organizada para que não seja confundida com testes ad-hoc.

Para metodologias ágeis o tipo de teste que foi explicado nesse artigo possui alta adequação, pois combina com o contexto de como métodos ágeis tratam os processos de software: com pouca documentação formal e muito conhecimento sobre a aplicação, que resumem bem os motivos para o uso de testes exploratórios.

Confira também

Referências

  1. BECK, K. et al. 2001. “Manifesto for Agile Software Development”.
  2. BRAGA, Karen; PRETZ, Eduardo. “Conhecimento e Teste Exploratório: um modelo de captação e Execução”.
  3. TEIXEIRA, V. S. and DELAMARO, M. E. 2008. “Geração de Metadados para o Apoio ao Teste Estrutural de Componentes”. VII Simpósio Brasileiro de Qualidade de Software,SBQS’08, Florianópolis, SC, Brasil, 2008, 406-419.
  4. FERREIRA, C. and COHEN, J. 2008. “Agile systems development and stakeholder satisfaction: a South African empirical study”. Annual Research Conference of the South African institute of Computer Scientists and information Technologists on IT Research in Developing Countries: Riding the Wave of Technology, SAICSIT '08, vol. 338. ACM, New York, NY, 48-55.
  5. PATTON, Ron. 2005. Software Testing. ISBN: 0-672-32798-8
  6. SOMMERVILLE, I. 2007. “Engenharia de Software”. 8ª. Ed. PEARSON. ISBN 8588639289.