quinta-feira, 27 de outubro de 2011

Construção de relatórios de defeitos eficientes

 

Um conjunto sucedido de testes, geralmente apanham um pequeno conjunto de defeitos. Contudo se estes defeitos ou outras observações não forem devidamente endereçadas, o esforço do teste acaba por ser desperdiçado. A atividade de gestão destes casos que vão surgindo é normalmente chamada de gestão de incidentes. É um processo que segue todos os defeitos desde o seu aparecimento até à sua resolução e respectiva verificação. Todos os incidentes devem ser registados. A elaboração de um relatório de incidente eficiente proporciona que os defeitos sejam mais rapidamente resolvidos e que a gestão de projeto consiga tomar decisões corretas com base nessa informação.

Um bom relatório deve ser específico de modo a refletir exatamente o que consiste o problema. Para fazer isto o defeito deve possuir informação acerca de como o mesmo pode ser reproduzido, informando o leitor de que passos exatamente são necessários para reproduzir o problema.

Um relatório de um defeito deve ser único. O que quer dizer que não se deve criar vários defeitos para as várias manifestações do mesmo problema. Ou porque diferentes exemplos de entrada resultaram num mesmo erro. Claro que vão existir situações em que um tester que não tenha conhecimento interno sobre o modo como a estrutura da aplicação está definida pode facilmente interpretar duas manifestações de um problema em pontos distintos da aplicação como casos diferentes. Para este tipo de problemas provavelmente só a experiência e uma boa comunicação como a equipa de desenvolvimento ajuda a perceber a distinguir estes casos. Caso contrário o segundo defeito a ser analisado pela equipa de desenvolvimento vai acabar muito provavelmente com um “Rejeitado, Porque não consegui reproduzir”. Não quer dizer com isto que o erro não existiu, mas a correção da primeira incidência inviabilizou a reprodutibilidade da segunda. A ocorrência frequência deste tipo de situações ajudam a “minar” a credibilidade da equipa de testes.

Outra boa prática é evitar de abrir defeitos em duplicado. Uma equipa de Quality Assurance (QA) pode ser composta por vários elementos, e é perfeitamente natural que duas pessoas diferentes reparam num mesmo erro da aplicação. Estas pessoas por sua vez vão registá-lo no sistema de controlo de defeitos. Mas se o elemento que irá efetuar o segundo registo não tiver o cuidado de verificar no sistema que o defeito não existe vamos novamente ficar com um duplicado, e invariavelmente um deles vai acabar com o estado rejeitado.

Quando uma equipa de QA (esta dica pode e deve ser estendida a toda a equipa de trabalho, QA, desenvolvimento, gestão) é composta por vários elementos é fundamental que todos os elementos falem uma língua em comum para evitar descrições de um mesmo problemas de um modo completamente diferente. Caso uma situação destas possa acontecer, no exemplo descrito acima mesmo uma procura no sistema de rastreio de defeitos pelo problema que estamos a registar vai ser infrutífera porque os dois elementos usam terminologias diferentes. Esta situação pode ser  ainda mais grave se existirem divergências deste género entre a equipa de testes e a equipa de desenvolvimento. Defeitos podem ser rejeitados apenas porque a equipa de desenvolvimento não os percebeu.

São apenas algumas dicas sobre como abrir e gerir defeitos. Espero que ajude.

Bom, Até à Próxima.

terça-feira, 25 de outubro de 2011

Continuous Integration (Benefícios para os Testes)

 

Introdução ao Continuous Integration


Parafraseando Martin Fowler, Continuous Integration (CI) é uma prática, onde os todos os elementos de uma equipa tornam os seus desenvolvimentos parte de um conjunto de forma a combinar estes desenvolvimentos com o trabalho do resto da equipa. Tradicionalmente este tipo de integrações são feitas tendo como base um sistema de controle de versões. São exemplos disso o svn e o cvs.


Benefícios


Quando usado de forma eficiente permite colocar as falhas num curto período de tempo. Isto porque por tradição um sistema de CI além de efetuar a build do software também lhe aplica um conjunto de testes. E aqui ficamos a saber por exemplo se a build da hora transacta passou sem problemas e a atual revela erros (ou porque falhou ou porque um dos testes falhou), existiu um  lapso cometido na última hora. Daqui até se descobrir que contribuições foram feitas para o repositório e por que é um “saltinho de pardal”. Como o processo é tão rápido o problema ainda está fresco na cabeça do elemento que cometeu o erro.


Com este tipo de práticas, tornarmos o código independente de um IDE, como evitamos a necessidade de configurar ficheiros antes de efetuar uma build. Basicamente passamos do ponto onde temos o software num repositório para o ponto onde temos a aplicação completamente a funcionar com a utilização apenas de um comando, ou de um clique, caso se use alguns exemplos de implementações de CI como as referidas abaixo.


Principais Práticas


A grande maioria do software é construída por vários módulos, algumas das vezes construídos em cima de tecnologias completamente distintas que são posteriormente agregados para formarem um produto sólido.


Um dos princípios advogados pelo CI é a agregação num único repositório das fontes necessárias à construção do produto. A gestão de vários pontes onde guardar software acaba por trazer vários problemas com a gestão correta dos mesmos.


Outro ponto fundamental do CI é que o mecanismo responsável pela compilação e preparação do software seja também responsável pela realização de um primeiro conjunto de testes de modo a detectar logo à partida qualquer erro grave. Testes estes que devem sempre quanto possível correr em ambientes que são réplicas exatas dos ambientes de produção, ou não caso de não ser possível do mais próximo possível.


As builds criadas devem ser o mais frequentes possíveis para restringir ao máximo no tempo o erros detetados. Estas builds devem estar num local acessível a toda a comunidade de desenvolvimento e a toda a equipa de controlo de qualidade (testes). Esta situação permite que cada elemento da equipa de desenvolvimento tenha rapidamente o código produzido por diferentes colegas. Do mesmo modo a equipa de testes pode começar a trabalhar rapidamente sobre o código produzido o que permite a existência de feedback mais rápido.


Principais Implementações


Existem vários aplicativos que permitem ou facilitam a automação dos processos de compilação. Cada um deles com as suas vantagens e desvantagens, ou mais virados para uma determinada área desenvolvimento especifica. Podem consultar o seguinte artigo na wikipedia que ajuda a perceber quais as funcionalidades de cada um.


http://en.wikipedia.org/wiki/Comparison_of_continuous_integration_software


Os baseados em Ant geralmente são boas opções, pois permitem descrever o que se quer construir numa forma bastante simples, e possui já suporte nativo para a grande maioria dos casos mais comuns na construção de software. Um exemplo bastante interessante de uma aplicação deste género é o caso do CruiseControl.


Principais Referências


Qualquer pesquisa no Google apresenta inúmeros resultados sobre o tema Continuous Integration mas gostava de destacar aqui duas referências que me parece, no meu ponto de vista, que se sobrepõe às restantes. Elas são:



A ligação entre os Testes e o CI


Como foi referido acima é boa prática possuir uma construção automatizada do software que se desenvolve. Esta boa prática permite manter uma unicidade entre as versões que são instaladas em ambientes de produção, desenvolvimento e testes. Esta unicidade ajuda a evitar erros de builds com lapsos quando feitas para ambientes de produção que não existem quando estas são construídas para testes ou mesmo nas atualizações do próprio ambiente de desenvolvimento.


Por outro lado permite que sejam usados testes unitários no processo da própria build. Esta situação permite, quando usando um conjunto de testes unitários adequado, que erros em pontos crucias da aplicação sejam detectados muito rapidamente. O que facilita a sua correção pois a sua codificação ainda está relativamente fresca na cabeça da equipa de desenvolvimento.


Existem inúmeros aplicativos que permitem a criação de testes unitários como são o caso do nUnit, jUnit entre outros ferramentas do género.


Muito mais poderia ser dito à volta de tema, mas acho que já serve para começar a perceber as vantagens do uso de CI no desenvolvimento diário de software.


Bom, até à Próxima.