Gerência - Qualidade e Testes

Os 7 hábitos dos Testadores Altamente Eficazes

O teste de software é uma mistura de arte, engenharia aplicada, intuição e criatividade.

por Cristiano Caetano



O teste de software é uma mistura de arte, engenharia aplicada, intuição e criatividade. Segundo Aristótoles, "Nós somos o que fazemos repetidamente. Excelência, não é uma ação isolada, mas um hábito". Stephen Covey, no seu livro "Os 7 Hábitos das Pessoas Altamente Eficazes" [1], afirma que os nossos hábitos estão intrínsicamente ligados ao nosso conhecimento, nossa habilidade e nosso desejo. A partir dessa perspectiva, para se tornar um mestre no seu ofício, é necessário ampliar os seus conhecimentos, aprimorar as suas habilidades e manter sempre inflamado o desejo de tornar-se um profissional melhor dia após dia (Figura 1).


Figura 1. "Nós somos o que fazemos repetidamente. Excelência, não é uma ação isolada, mas um hábito" - Artistóteles.

Em termos práticos, nas seções a seguir você descobrirá os sete hábitos que destacam os testadores altamente eficazes dos testadores comuns. Aproveite!

O teste de software é uma das atividades mais importantes realizadas no ciclo de vida de desenvolvimento de um software, senão a mais importante. Dito em outros termos, de que adianta projetar e implementar um software perfeito, sob o ponto de vista acadêmico; utilizando a tecnologia de ponta que estiver em evidência no mercado se o produto final não satisfazer as necessidades do usuário, não estiver apto para rodar nas plataformas alvo ou até mesmo não ser capaz de executar suas funcionalidades básicas. Neste cenário, destaca-se o testador, cujo principal papel é ajudar os usuários e o grupo de IT a convergir os pontos de vista sobre o que é qualidade [2]. Sob o ponto de vista de IT, qualidade significa satisfazer os requerimentos. Em contrapartida, a qualidade sob a perspectiva dos usuários significa que o produto final deve estar adequado ao uso, independente de satisfazer os requerimentos. Compete ao testador, dessa forma, reduzir a lacuna entre ambas visões, garantido que o produto final seja construído com consistência, satisfazendo tanto os requerimentos quanto às necessidades dos usuários, como pode ser visto na Figura 2.


Figura 2. As duas lacunas da Qualidade de Software.

Tendo em vista a evolução dos processos de desenvolvimento de software do modelo em cascata para modelos iterativos e ágeis, podemos notar que a abordagem tradicional utilizada para planejar e executar as atividades de teste de software não está seguindo a mesma tendência. Nos processos ágeis, o software é desenvolvido incrementalmente na tentativa e erro; quase sempre sem requerimentos concretos. Em termos práticos, quando não há requerimentos bem definidos, o planejamento e a execução dos testes são tarefas quase impossíveis.

Nessa condição, um aspecto fundamental para o sucesso do testador neste novo cenário é, sem dúvida, uma postura pragmática. O testador pragmático é realista e objetivo, as suas decisões são baseadas no seu conhecimento teórico e prático das técnicas de teste e nas ferramentas disponíveis no mercado. Por outro lado, o testador pragmático não se limita somente aos aspectos tecnológico; em contrapartida, o testador pragmático é um contador estórias, abordando os problemas por meio de metáforas e analogias compensando assim a falta de requerimentos formais.

Parafraseando Andrew Hunt e David Thomas, autores do livro "The Pragmatic Programmers from Journeyman to Master", todo testador pragmático apresenta as características destacadas abaixo:

Flexível - Forte inclinação para entender os pontos de vista dos outros e adaptar-se a uma nova realidade;

Incansável - Sempre interroga e investiga a causa raiz dos problemas e a razão das coisas;

Realista - Toma decisões baseadas em fatos;

Assertivo - Nunca pressupõe ou se baseia em informações contidas nas entrelinhas, todas as suas suposições são aferidas a fim de garantir a sua veracidade;

Metafórico - Acredita que uma boa estória vale mais do que mil requisitos ambíguos;

Diplomata - Foca o seu esforços nos problemas ao invés de focar nas pessoas que os causaram;

Perfeccionista - Cada detalhe conta na execução do seu trabalho, no entanto, não troca um ótimo resultado por um resultado perfeito (e provavelmente impossível);

O teste de software é a única atividade do ciclo de vida de desenvolvimento de um software, cujo sucesso depende da falha, do erro, do fracasso. Um ciclo de teste só é bem sucedido quando encontra defeitos; se não forem encontrados defeitos, provavelmente os casos de testes não foram bem projetados ou não está sendo realizada uma boa cobertura dos possíveis cenários de testes. Afinal, é pouco provável que o software seja perfeito e não tenha defeitos (excluindo, claro, os casos onde o software já está numa fase de maior estabilidade e maturidade). Os programadores, como já se sabe, são péssimos testadores; não porque eles não têm condições de testar adequadamente um software, mas, no entanto, porque normalmente eles testam a parte do software que eles mesmos desenvolveram. Inconscientemente o programador realiza os testes de maneira que eles passem, sem testar cenários extremos ou cenários onde vários componentes do software interajam entre si.

Neste cenário o testador deve ser imune a esse tipo de comportamento. O testador altamente eficaz precisa ter uma atitude negativa em relação ao software sob teste. Precisa confiar desconfiando e tentar prever situações imprevisíveis para garantir a consistência do software. Em geral, as vulnerabilidades, fraquezas e falhas existem em função da complexidade, extensibilidade e conectividade de um software. Essas três características são conhecidas como "The Trinity of Trouble" [3], como pode ser visto na Figura 3.


Figura 3. The Trinity of Trouble.

Sob a ótica da "The Trinity of Trouble" descrita anteriormente, o testador deve sempre questionar decisões e suposições, garantindo que os defeitos sejam descobertos "agora" ao invés de "depois". O mantra do testador altamente eficaz é: "Encontre os defeitos agora, senão os usuários do software encontrarão".

O teste exploratório é, na sua definição mais básica, a criação e a execução ao mesmo tempo de um teste [4]. O teste exploratório é normalmente executado sem um planejamento prévio muito detalhado, diferente do testes convencionais, onde todos os casos de teste são todos predefinidos e cada caso de teste desdobra-se em um conjunto também predefinido de passos que por sua vez descrevem cada estímulo ou interação com o software que o testador deverá executar. Na verdade, o teste exploratório, apesar de ter sido reconhecido e amplamente discutido nos últimos anos, não é necessariamente uma técnica nova. Todos nós, de uma forma ou de outra, realizamos testes exploratórios; seja para aprender determinada nova funcionalidade para depois escrever um caso de teste formal ou para tentar reproduzir um determinado defeito que parece ser aleatório. Infelizmente, o teste exploratório é comumente mal interpretado e executado de maneira adhoc, onde o testador testa o software como se fosse um turista; sem estratégia, prazo ou objetivos bem definidos.

Como mencionamos anteriormente, os testes exploratórios são realizados sem um planejamento prévio muito detalhado, no entanto, não significa que não deva existir planejamento. Antes de iniciar os ciclos de testes exploratórios, são criadas tabelas descrevendo as áreas chaves ou funcionalidades do sistema e para cada funcionalidade qual será a estratégia de teste adotada. Além disso, são descritos o tempo previsto para cada ciclo de teste e quais são os objetivos da exploração, ou seja, durante a exploração o testador deverá assegurar que o software está de acordo de determinado padrão, ou se certa funcionalidade se comporta como o esperado e assim por diante. Adicionalmente, devemos destacar que ao fim de um ciclo de teste exploratório, determina-se quais são as áreas onde foram encontrados mais defeitos e com base nessa informação, a estratégia é ajustada para focar um esforço maior nas áreas mais críticas do software. Dessa forma, garante-se que melhor distribuição dos esforços de testes nas áreas onde a probabilidade de encontrar defeitos críticos é maior.

Por meio do teste exploratório os cenários de testes são descobertos incrementalmente. Os testes são iniciados conforme o que foi definido na estratégia do teste exploratório para certa área do sistema e, com base na criatividade, atenção e capacidade de inferência do testador, novos cenários de testes são descobertos. Posteriormente, os cenários de testes que foram descobertos durante os ciclos de exploração são transformados em casos de teste convencionais com passos que descrevem cada estímulo ou interação com o software, que o testador deverá executar nos ciclos de testes normais.

Em resumo, os testes exploratórios devem ser introduzidos pelos testadores altamente eficazes como uma técnica suplementar para auxiliar a descobrir novos defeitos ou novos cenários de testes que os testes convencionais não são capazes de descobrir.

Para se tornar um testador altamente eficaz, é necessário ter coragem para quebrar os paradigmas existentes. É preciso ser precursor e estar sempre disposto a aprender e introduzir novas tecnologias, técnicas e ferramentas nos projetos em você estiver envolvido e na empresa em que você trabalha. Geoffrey Moore, no seu livro "Crossing the Chasm", exemplifica o ciclo de vida da adoção de novas tecnologias numa curva dividida em 5 grupos, como pode ser visto na Figura 4.


Figura 4. Ciclo de vida da adoção de novas tecnologias segundo Geoffrey Moore.

Em termos práticos, para tornar-se mestre na arte de testar software, você deve ser inovador e reinventar o seu trabalho todos os dias. Você deve sempre estar atento às oportunidades de melhoria e lutar para garantir que as soluções sugeridas por você sejam implementadas, afinal, faz parte da natureza humana se opor às mudanças dos paradigmas já estabelecidos.

O teste de software é uma atividade freqüentemente mal compreendida; muitas vezes limitado ao processo autômato de comparar o resultado de uma determinada ação com um resultado pré-definido. No entanto, esse tipo de atividade pode ser executado incansavelmente com muito mais velocidade e eficiência por meio da automação de testes. Segundo Cem Kaner, autor do livro "Lessons Learned in Software Testing", o propósito da automação de testes pode ser resumidamente descrito como a aplicação de estratégias e ferramentas tendo em vista a redução do envolvimento humano em atividades manuais repetitivas. Estudos indicam que o número de defeitos encontrados durante a execução de testes de regressão automatizados são 40% superiores em relação aos testes manuais. Segundo declarações da Charles Schwab & Co, grande corretora americana, os ciclos de testes manuais do seu software que requeriam cerca de 52 horas, se resumiram a meras 3 horas após a automação dos testes. Via de regra, existe uma boa propaganda em relação aos benefícios advindos do emprego da automação dos testes, principalmente das empresas produtoras de ferramentas de automação.

Em termos práticos, no entanto, a automação de testes não é a salvação da lavoura e não deve ser empregada indiscriminadamente. O testador altamente eficaz reconhece que a automação de testes não deve ser empregada como um substituto do teste convencional; por outro lado ela deve ser introduzida como uma técnica adicional cujo principal objetivo é agregar valor, sem no entanto, invalidar o teste convencional existente.

Convém lembrar, aliás, que a criação de um teste automatizado leva aproximadamente dez vezes mais tempo do que o tempo que se leva para executar manualmente o mesmo teste e que o custo da automação de testes normalmente é medido pela quantidade de testes manuais que não precisarão ser mais executados. Em razão disso, os testadores altamente eficazes devem ter um enfoque sistemático e objetivo durante a definição de quais casos de testes serão automatizados. Em geral, cenários de testes repetitivos em áreas estáveis do software, normalmente são os primeiros testes a serem automatizados. Uma boa estratégia de automação de testes também inclui áreas de maior risco do software, assim como cenários de utilização comumente executados pelos usuários finais.

É importante ressaltar que, a despeito das vantagens, a introdução de automação de testes exige um planejamento detalhado, assim como, atividades de arquitetura, desenvolvimento, e depuração tal qual o desenvolvimento de um software. Via de regra, a criação de testes automatizados é realizada por testadores especializados em desenvolvimento, também conhecidos como Testador-Desenvolvedor [6]. Entre outras tarefas, o Testador-Desenvolvedor também tem a responsabilidade de fomentar o mínino denominador comum entre testadores e desenvolvedors, criando um canal de comunicacao entre ambos os lados e sobretudo, garantido que as estratégias de automação tenham sucesso.

Coloque um rádio transistorizado próximo ao processador do computador em que o teste estiver rodando, sintonize aproximadamente na estação 975 AM e você poderá literalmente escutar o zumbido do processador funcionando. Essa técnica é bastante interessante para você descobrir se o processador está realmente realizando algum processamento durante algum teste ou se nada está acontecendo [7]. O cenário descrito no parágrafo anterior, apesar de representar um caso extremo, é um ótimo exemplo de um testador altamente eficaz em ação. À medida que se queira executar os testes com maior eficiência, torna-se necessário estar familiarizado com a maior gama de ferramentas que possam vir a ajudar a execução dos testes, simular um componente de hardware ou software que não está disponível, observar o conteúdo do tráfego da rede, entre outros cenários; as situações são ilimitadas, tudo depende do tipo de software que está sendo testado.

Perceba que não estamos falando de ferramentas para a automação de testes, apesar de que muitas delas podem automatizar a execução de algumas tarefas, mas a idéia principal é utilizar essas ferramentas para maximizar a eficiência dos testes manuais. Você pode se valer de ferramentas comerciais ou open source para atingir esse objetivo; inclusive, dependendo da situação, você poderá criar um bash script ou um pequeno script em Python ou qualquer outra linguagem semelhante para executar determinada tarefa com maior eficiência.

Considerando o que foi exposto, o testador altamente eficaz deve otimizar a execução dos testes ao máximo por meio do emprego ferramentas ou se for necessário, utilizar as suas habilidades de programação e escrever a sua própria ferramenta. Finalmente, devemos lembrar que existe uma enorme quantidade de utilitários e ferramentas open source disponível na Internet. Existem algum sites dedicados exclusivamente a esse tema, mantendo uma lista atualizada e organizada por funcionalidade das ferramentas disponíveis, como pode ser visto na listagem abaixo:

Open Source Software Testing Tools, News and Discussion
http://opensourcetesting.org/

Open Source Web Testing Tools in Java
http://java-source.net/open-source/web-testing-tools

Software QA Testing and Test Tool Resources
http://www.aptest.com/resources.html

Software QA & Test Resource Center
http://www.softwareqatest.com/qatweb1.html

Testingfaqs.org - an information resource for software testers
http://www.testingfaqs.org/

É importante ressaltar que, a despeito do conjunto de habilidades necessárias para tornar-se um testador altamente eficaz, você deve estar sempre atento às novidades do mercado e nas tendências da indústria de TI. Nessa estratégia, você deve sempre estar procurando uma forma de ampliar as suas perspectivas tanto no ponto de vista do aperfeiçoamento das suas habilidades quanto no aprendizado de novas técnicas. Em tais circunstâncias, sugere-se participar de grupos de discussões a fim de discutir e compartilhar experiências com outras pessoas. Na listagem abaixo, você encontrará alguns grupos de discussões de bastante destaque sobre qualidade e teste de software:

QA Forums - The most popular Software Testing and QA discussions
http://qaforums.com/

Google Software Testing Group
http://groups.google.com/group/SoftwareTesting

Yahoo Software Testing and Quality Assurance Group
http://groups.yahoo.com/group/Software_QA/

Yahoo SQA Career Group
http://groups.yahoo.com/group/SQACareer/

Yahoo SQA Tester Group
http://groups.yahoo.com/group/SQAtester/

Por outro lado, aproveitando a mudança de paradigma na área de comunicação e entretenimento, você também poderá manter-se atualizado por meio de diversos sites que disponibilizam Podcasts para download gratuito sobre qualidade de software e as tendências da indústria de TI. Os Podcasts são basicamente shows, entrevistas ou reportagens gravadas no formato mp3 e distribuídos pela Internet. Você poderá escuta-los no seu mp3 player ou no seu computador. Na listagem abaixo, você poderá visitar os sites mais importantes sobre esse tema na atualidade:

QA Podcast: Conversations About Software Quality Assurance
www.qapodcast.com

ITConversations: New Ideas Through Your Headphones
http://www.itconversations.com

Dr. Dobb"s: Software Tools for the Professional Programmer
http://www.ddj.com/podcast/dobbscast/

Software Engineering Radio
http://se-radio.net/

This WEEK in TECH
http://thisweekintech.com/

Agile Toolkit Podcast
http://agiletoolkit.libsyn.com/

Adicionalmente, os sites de notícias também são sempre uma boa opção. Segue abaixo a listagem de alguns ótimos sites de notícias para você manter-se atualizado:

reddit.com: what"s new online
http://reddit.com/

Technology focused news site where the stories are chosen by community members rather than editors.
http://digg.com/

Newsvine - Get Smarter Here
http://www.newsvine.com/

IT WEB - o Ponto de encontro da comunidade de tecnologia da informação
http://www.itweb.com.br/

Slashdot: News for nerds, stuff that matters
http://slashdot.org

Para saber mais...

[1] The 7 Habits of Highly Effective People by Stephen R. Covey
http://www.amazon.com/gp/product/0743269519/qid=1150545730/sr=2-1/ref=pd_bbs_b_2_1/002-6190471-2139216?s=books&v=glance&n=283155

[2] Guide to the CSTE Common Body of Knowledge (2006)

[3] Exploiting Software How to Break Code by Greg Hoglund, Gary McGraw
http://www.amazon.com/exec/obidos/tg/detail/-/0201786958/qid=1150545865/sr=2-1/ref=pd_bbs_b_2_1/002-6190471-2139216?v=glance&s=books

[4] What Is Exploratory Testing? And How It Differs from Scripted Testing By James Bach
http://www.satisfice.com/articles/what_is_et.shtml

[5] Why I"m More Positive About Exploratory Testing By Randall W. Rice
http://www.riceconsulting.com/articles/exploratory_testing.htm

[6] Test Infected: Tá tudo dominado
http://www.linhadecodigo.com.br/artigos.asp?id_ac=991

[7] Boost Your Testing Super Powers
http://www.satisfice.com/articles/boost.shtml

[8] Always Assume Your Assumptions Are Wrong By Naomi Karten
http://www.stickyminds.com/sitewide.asp?Function=edetail&ObjectType=COL&ObjectId=6593

[9] Soft Skills that Make a Tester
http://www.stickyminds.com/sitewide.asp?Function=edetail&ObjectType=ART&ObjectId=6752

[10] Hallmarks of a Great Tester
http://blogs.msdn.com/micahel/archive/2004/06/09/151778.aspx

[11] Surviving the Top Ten Challenges of Software Test Automation By Randall W. Rice
http://www.sstc-online.org/proceedings/2002/SpkrPDFS/ThrTracs/p699.pdf

Cristiano Caetano

Cristiano Caetano - É certificado CBTS pela ALATS. Consultor de teste de software sênior com mais de 10 anos de experiência, já trabalhou na área de qualidade e teste de software para grandes empresas como Zero G, DELL e HP Invent. É colunista na área de Teste e Qualidade de software do site linhadecodigo.com.br e da revista Engenharia de Software Magazine. Autor dos livros "CVS: Controle de Versões e Desenvolvimento Colaborativo de Software" e "Automação e Gerenciamento de Testes: Aumentando a Produtividade com as Principais Soluções Open Source e Gratuitas". O autor também é criador e mantenedor do portal TestExpert, maior comunidade brasileira sobre teste e qualidade de software, confira no seguinte endereço: http://www.testexpert.com.br.