Testes unitários são uma realidade cada vez mais próxima das nossas fábricas de software, porem, é uma das coisas que tanto os profissionais de teste quando os profissionais de desenvolvimento desconhecem em sua maioria. Melhor dizendo, conhecer todos conhecem, mas ver funcionando, saber fazer e principalmente acreditar no benefício, não.
É um pouco difícil achar exemplos em blogs, sites ou comunidades de desenvolvimento e/ou testes, principalmente em português, mas um ótimo exemplo da aplicação de testes unitários usando a ferramenta Visual Studio, para a plataforma .Net, está no excelente post “VSTS – Visual Studio Team System para Testadores – Unit Test” do Gustavo Quezada. No post ele descreve muito bem um resumo sobre o momento dos testes unitários e também como aplicá-los tecnicamente.
Vou tentar elaborar aqui uma visão baseada em TDD (Test-driven development) usando a solução mais usada para Java, o Framework de testes de unidade JUnit, Desenvolvido por Kent Beck (XP) e Erich Gamma (GoF).
Primeiramente vamos pensar em como deve ser o micro processo para a implementação de TDD em alto nível:
1 – Escrever os Testes
2 – Executar os testes e verificar as falhas
3 – Escrever o código
4 – Rodar os testes para identificar sucesso
5 – Refatorar o código para corrigir defeitos e efetuar melhorias
Agora vamos ver isso funcionando:
1 – Escrever os Testes:
É premissa para a escrita dos testes termos todos os requisitos especificados e detalhados de forma a podemos avaliar os dados de entrada e os resultados esperados. Se você é um analista de teste já deve ter notado uma semelhança. A composição básica do nosso teste unitário é a mesma dos nossos casos de teste, porem, ao escrever testes unitários não nos preocupamos com as pré condições, procedimentos de teste e outros detalhes. Nosso objetivo aqui é claro: Fornecer o que a classe que será escrita precisará e receber o que ela nos fornecerá.
Vamos supor que a lista de requisitos da nossa classe é a seguinte:
“O programa deve ler 3 números inteiros. Os três valores serão interpretados como os comprimentos dos lados de um triângulo. O programa imprime uma mensagem sobre o tipo do triângulo”
Vamos pensar em algumas opções de respostas que podemos ter:
a – Se for isósceles
b – Se for equilátero
c – Se for Escaleno
d – Se a soma de dois lados for igual a do terceiro
e – Se a soma de dois lados for menor a do terceiro
Podemos listar também algumas opções de exceções:
a – Se algum lado for negativo ;
b – Se todos os comprimentos do triânngulo forem zero;
c – Se algum comprimento do triângulo for zero;
Enfim, para isso podemos criar inúmeros casos de teste, mas para esse exercício vamos escrever apenas 14 (quatorze) considerando que o usuário sempre vá entrar com valores numéricos.
Abaixo os “casos de teste” ainda em formato texto:
1 – Triângulo Escaleno
2 – Triângulo Equilátero
3 – Triângulo Isósceles
4 – Triângulo Isósceles
5 – Triângulo Isósceles
6 – Triângulo com Lado Nulo
7 – Triângulo com Lado Negativo
8 – Triângulo cuja soma dos lados A e B é igual a C
9 – Triângulo cuja soma dos lados A e C igual a B
10 – Triângulo cuja soma dos lados C e B igual a A
11 – Triângulo cuja soma dos dois lados menor que a terceiro”}
12 – Triângulo onde todos os lados são Nulos
13 – Triângulo cuja soma dos lados A e B é menor que C
14 – Triângulo cuja soma dos lados B e C é menor que B
Abaixo vamos escrever os dados de entrada o que esperamos com eles usando a seguinte sintax
(entradaA, entradaB, entradaC, resultadoEsperado), sendo que as entradas devem ser inteiros e o resultado uma String
1 – {2, 9, 10,”Escaleno”}
2 – {20, 20, 20, “Equilátero”}
3 – {20, 20, 30, “Isósceles”}
4 – {20, 30, 20, “Isósceles”}
5 – {30, 20, 20, “Isósceles”},
6 – {0, 2, 9, “Lado Nulo”}
7 – {3, -2, 9, “Lado Negativo”}
8 – {5, 6, 11, “Soma dos dois lados igual a terceiro”}
9 – {5, 11, 6, “Soma dos dois lados igual a terceiro”}
10 – {11, 6, 5, “Soma dos dois lados igual a terceiro”}
11 – {5, 6, 12, “Soma dos dois lados menor que a terceiro”}
12 – {0, 0, 0, “Todos os lados Nulos”}
13 – {5, 12, 6, “Soma dos dois lados menor que a terceiro”}
14 – {12, 5, 6, “Soma dos dois lados menor que a terceiro”}
É muito importante entender que o teste unitário tem menos valor se aplicado após a classe estar escrita, principalmente porque a sua principal finalidade, economizar tempo na implementação da classe deixa de ser aproveitada, ficando somente os testes “unitários de regressão” para modificações da classe. Portanto, é fundamental escrever os casos de teste antes mesmo que a classe que será testada, para essa atividade, é muito recomendável que o analista de teste e programador trabalhem juntos, pensando em caminhos e entradas que poderão ser usados na futura implementação.
Para escrever o teste vamos precisar do Eclipse e do JUnit.
O JUnit pode ser baixado no link: http://sourceforge.net/projects/junit/files/junit/ e incluído nas libraries do Java Build Path do projeto do eclipse.
Agora vamos entender o básico dos métodos (notation ) do JUnit:
@RunWith: Quando uma classe tem a notation @RunWith ou estende uma classe com o predecessor com @RunWith, JUnit irá chamar a classe que faz referência para executar os testes em que a classe em vez de o corredor construído em JUnit. Podemos implementar uma Suite de Testes com o parâmetro Suite.class ou uma lista de parâmetros com o parâmetro Parameterized.class (que será usada no nosso exemplo).
@Parameters: A notation de um método que cria uma coleção, array, lista ou outra estrutura de dados, de forma a garantir que não precisemos de vários métodos para executar uma sequencia ordenada de testes, através de uma sequencia de parâmetros que serão enviados, um a um, para o construtor da classe ao instânciar um objeto (teste).
@Test: A notation do método que realiza o teste. Normalmente esse método instância o objeto da classe que será testado e realiza comparações.
org.junit.Assert.*: Os métodos de comparação. realizam várias comparações como mostrado abaixo:
assertTrue : Verifica se o valor de retorno é true
assertFalse : Verifica se o valor de retorno é false
assertEquals : Compara dois valores de retorno
assertNotNull : Verifica se o valor de retorno não é null
assertNull : Verifica se o valor de retorno é null
assertSame : Confere se dois objetos referenciam o mesmo objeto
assertNotSame : Confere se dois objetos referenciam objetos diferentes
fail : usado para criar falha no teste via programação do teste
Para a lista completa dos métodos assert: http://www.junit.org/apidocs/org/junit/Assert.html
API completa do JUnit: http://www.junit.org/apidocs/
Agora vamos ver a classe de teste desenvolvida com base nos nossos dados de entrada e devidamente comentada para facilitar o entendimento:
// Importamos as classes que precisamos para usar os métodos citados
// Importante importar essa como static, pois usamos os métodos estáticos para realizar as comparações.
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/* Usar o RunWith informando que vamos usar uma classe parametrizada.
* Isso fará com que ao ser instanciada como JUnit Test, a classe crie um objeto usando os parâmetros informados
* no método Parameters para realizar cada teste, economizando dezenas de linhas de código.
*/
@RunWith(Parameterized.class)
//Declaramos uma classe normal
public class TesteExemplo {
// Declaramos os inteiros que representarão os lados do triângulo
private int a;
private int b;
private int c;
// Declaramos a string que representará o resultado esperado
private String tipo;
// Criamos o construtor que receberá os parâmetros para execução do teste
public TesteExemplo(int a, int b, int c, String trianguloEsperado) {
super();
// Cada lado do triângulo recebe um valor que vem dos parâmetros da classe
this.a = a;
this.b = b;
this.c = c;
// O resultado esperado recebe o ultimo parâmetro
this.tipo = trianguloEsperado;
}
// Método que retorna uma coleção com os parâmetros que serão usados no construtor instânciado para os testes
@Parameters
public static Collection carregaTriangulosDeTeste(){
return Arrays.asList(
new Object [][]{
// Como array em Java começa no 0, vamos incluir o teste 1 na posição 0 do array e assim por diante
//Test0
{2, 9, 10,"Escaleno"},
//Test1
{20, 20, 20, "Equilátero"},
//Test2
{20, 20, 30, "Isósceles"},
//Test3
{20, 30, 20, "Isósceles"},
//Test4
{30, 20, 20, "Isósceles"},
//Test5
{0, 2, 9, "Lado Nulo"},
//Test6
{3, -2, 9, "Lado Negatívo"},
//Test7
{5, 6, 11, "Soma dos dois lados igual a terceiro"},
//Test8
{5, 11, 6, "Soma dos dois lados igual a terceiro"},
//Test9
{11, 6, 5, "Soma dos dois lados igual a terceiro"},
//Test10
{5, 6, 12, "Soma dos dois lados menor que a terceiro"},
//Test11
{0, 0, 0, "Todos os lados Nulos"},
//Test12
{5, 12, 6, "Soma dos dois lados menor que a terceiro"},
//Test13
{12, 5, 6, "Soma dos dois lados menor que a terceiro"},
}
);
}
// Método que executa o teste a cada instanciação do objeto da classe teste
@Test
public void validaTriangulo() {
// Vamos criar um objeto do tipo Trianglulo (nossa futura classe que ainda vai existir) e passar os parâmetros do seu construtor
Triangulo escalenoValido = new Triangulo(a, b, c);
// Realizamos a comparação entre o valor que foi retornado e o valor que é esperado
assertEquals(escalenoValido.retornarTipo(), tipo);
}
}
2 – Executar os testes e verificar as falhas
Agora vamos executar a primeira vez e verificar o que o JUnit nos retorna:

É importante que todos os testes falhem, para termos certeza que estão corretos (irônico não?). Isso porque os resultados esperados não podem existir, já que nem a classe do objeto que vamos testar existe.
3 – Escrever o código
Agora vou escrever uma classe com alguns erros de lógica e outros no conteúdo da resposta:
public class Triangulo {
private int a, b, c;
public Triangulo(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
public String retornarTipo() {
// erro de lógica
if((this.a == 0) || (this.b == 0) || (this.c == 0))
return "Todos os lados Nulos";
if((this.a == 0) || (this.b == 0) || (this.c == 0))
// Erro no retorno
return "Lado Núlo";
if((this.a < 0) || (this.b < 0) || (this.c < 0))
return "Lado Negatívo";
if((this.a == this.b) &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; (this.b == this.c))
return "Equilátero";
if(
((this.a != this.b) &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; (this.b == this.c))||
((this.a == this.b) &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; (this.b != this.c))||
((this.a == this.c) &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; (this.b != this.c))
)
// Erro no retorno
return "Isóceles";
if( (this.a + this.b == this.c)||
(this.b + this.c == this.a)||
(this.c + this.a == this.b)
)
return "Soma dos dois lados igual a terceiro";
if( (this.a + this.b < this.c)||
(this.b + this.c < this.a)||
(this.c + this.a < this.b)
)
return "Soma dos dois lados menor que a terceiro";
if((this.a != this.b) &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; (this.a != this.c))
return "Escaleno";
return null;
}
}
4 – Rodar os testes para identificar sucesso
Agora vamos verificar a nova execução do teste unitário:

Na imágem acima podemos ver que o teste nos retorna três informações muito importantes:
1 – Quantos casos de teste unitários passaram;
2 – Quais casos de teste unitário passaram;
3 – Qual a diferença entre o resultado esperado e o resultado recebido
Essa ultima informação em especial é que dá o “caminho das pedras” para o desenvolvedor corrigir com maior facilidade.
5 – Refatorar o código para corrigir defeitos e efetuar melhorias
Efetuamos as melhorias:
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class TesteExemplo {
private int a;
private int b;
private int c;
private String tipo;
public TesteExemplo(int a, int b, int c, String trianguloEsperado) {
super();
this.a = a;
this.b = b;
this.c = c;
this.tipo = trianguloEsperado;
}
@Parameters
public static Collection carregaTriangulosDeTeste(){
return Arrays.asList(
new Object [][]{
//Test0
{2, 9, 10,"Escaleno"},
//Test1
{20, 20, 20, "Equilátero"},
//Test2
{20, 20, 30, "Isósceles"},
//Test3
{20, 30, 20, "Isósceles"},
//Test4
{30, 20, 20, "Isósceles"},
//Test5
{0, 2, 9, "Lado Nulo"},
//Test6
{3, -2, 9, "Lado Negatívo"},
//Test7
{5, 6, 11, "Soma dos dois lados igual a terceiro"},
//Test8
{5, 11, 6, "Soma dos dois lados igual a terceiro"},
//Test9
{11, 6, 5, "Soma dos dois lados igual a terceiro"},
//Test10
{5, 6, 12, "Soma dos dois lados menor que a terceiro"},
//Test11
{0, 0, 0, "Todos os lados Nulos"},
//Test12
{5, 12, 6, "Soma dos dois lados menor que a terceiro"},
//Test13
{12, 5, 6, "Soma dos dois lados menor que a terceiro"},
}
);
}
@Test
public void validaTriangulo() {
Triangulo escalenoValido = new Triangulo(a, b, c);
assertEquals(escalenoValido.retornarTipo(), tipo);
}
}
Agora efetuamos as melhorias necessárias e re-executamos os casos de teste até que todos passem:

Esse foi um exemplo de implementação de teste unitário ou teste de unidade inspirados em TDD, prática ágil muito eficaz na identificação de defeitos. Nem todas as implementações são tão fáceis, ou gastam pouco tempo, mas, com o tempo e alguma prática, esse tipo de atividade pode se tornar menos custosa e mais eficiente.
Peço desculpas se algum conceito apresentado acima está divergente das melhores práticas ou de algum padrão ou conceito, e me prontifico a efetuar quaisquer correções. O exemplo citado aqui é ilustrativo.
TDD, testes unitários, automação de testes funcionais e de performance, entre outras áreas das disciplinas de Teste de Software e Arquitetura de Software ainda são muito misteriosas e discutidas, mas pouco implementadas, principalmente aqui no Brasil. Porem, é muito importante que nossos analistas de teste busquem essa capacitação técnica para melhorar a nossa posição no mercado, melhorar a qualidade do software e da mão de obra brasileira e acabar com mitos como “o desenvolvedor é um profissional mais estudioso ou mais técnico do que o teste” ou “teste é uma atividade simples de clicar e executar alguns fluxos”.
Mantenho-me disponível para quaisquer esclarecimentos
Essa atividade é baseada em um exercício em sala no curso de Especialização em Ciência da Computação com Ênfase em Engenharia de Software da Universidade Federal de Minas Gerais (UFMG) .
Bons Testes
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
A especificação de cenários e casos de teste é uma das atividades mais abrangentes entre os analistas de teste.
Existem dezenas de técnicas de especificar casos de teste e cenários de teste, algumas baseadas em casos de uso (como essa), outras baseadas em engenharia reversa, outras em componentes visuais (tela) e assim por diante.
A pedido de um leitor do meu blog, o Heiber, da cidade de Bogota na Colombia, que faz um esforço para entender meus textos “mediamente” elaborados em português e um esforço possivelmente maior para conversar comigo em espanhol, vou disponibilizar um rascunho de uma das técnicas que uso para modelar cenários e casos de teste (ou casos de pueblas em espanhol).
Para isso vamos imaginar um típico caso de uso, bem simples. Digamos que ele possui algumas regras, um fluxo principal, alguns alternativos, outros de exceção e pontos de extensão. A primeira coisa a fazer, supondo que o caso de uso já tenha sido aprovado em revisões e outros procedimentos para garantir que esteja preparado para ser implementado, é ler atenciosamente o caso de uso, tentando entender bem o contexto e seus objetivos. Em seguida, criar um desenho dos fluxos que esse caso de uso possui, bem abrangente, se possível com todos os fluxos desenhados no mesmo lugar, como um mapa mundi do caso de uso. Para isso é recomendável usar um diagrama de atividades disponível em qualquer ferramenta case open source na internet, mas em qualquer situação, pode ser feito no “papel de pão mesmo”.
Nesse momento temos algo mais ou menos como a figura abaixo:
Esse “esqueleto” nos da uma idéia um pouco próxima do que precisamos para mapear os casos de teste, mas ainda é insuficiente para dizer o que temos de cobertura com as regras de negócio vinculadas ao caso de uso.
Existe uma prática muito comum que é criar um caso de teste para cada regra do caso de uso, que inclusive é a mais recomendada em casos de sistemas críticos onde temos muitas horas para especificar e testar, mas, muitas vezes temos de usar uma técnicas chamada “pair wise” para especificar nossos casos de teste. Nesse exemplo, os cenários de teste permitem que os dois modelos sejam aplicados, comum caso de teste por regra ou tendo em um único fluxo, várias regras:
*Supondo que a regra R06 foi cancelada
O diagrama acima nos mostra os vários caminhos possíveis para o mesmo caso de uso. É importante que nenhuma regra possa modificar o fluxo do caso de uso. Regras com condições como “Se . . . então . . . senão. . .” podem ser muito prejudiciais aos casos de uso, escondendo a complexidade e induzindo a modelagens incorretas.
Agora vamos dar um nome para cada um dos cenários, baseando em seu significado no caso de uso:
Com o desenho acima podemos entender melhor cada cenário e seu fluxo. Ainda podemos ver que cenários podem ser combinados resultando em novos cenários, como por exemplo, o FA02 que pode continuar no FA03 ou pode voltar para o FP.
Por ultimo, consolidamos as duas visões e “voilà“, temos boa parte do que precisamos para escrever bons casos de teste.
A partir do desenho acima já podemos especificar vários casos de teste, com entradas diferentes e saídas diferentes, com validações para cada uma das regras ou para multiplas regras. A configuração daqui para frende, depende muito do nível de detalhamento que será usado, mas a rastreabilidade continua sendo a mesma:
{N Procedimentos**, Entradas e Saídas} ∈ {1 Caso de Teste}
{N Casos de Teste} ∈ {1 Cenário de Teste}
{N Cenários de Teste} ∈ {1 Caso de Uso}
*∈ = Pertence
**O conceito de procedimentos de teste é um dos mais confusos. No dia a dia eu uso ele para chamar o passo a passo dos casos de teste.
O desenho acima foi feito com caráter ilustrativo e para isso foi usado o MS Power Point, mas eu recomendo a utilização de ferramentas apropriadas como o IBM – Rational Software Architect ou o Enterprise Architecture.
Desenhar os cenários e casos de teste é uma coisa que fazemos mesmo que mentalmente quando especificamos, mas é muito importante ter um esboso físico dessa atividade, para perceber falhas, minimizar riscos e compreender melhor o que será testado.
Espero que esse post possa ajudar pessoas com a mesma dúvida do nosso amigo da Colombia. O modelo acima é um dos mais usados e é muito eficiente, mas é um modelo de muitos disponíveis no maravilhoso mundo da engenharia de software.
Fico aberto a comentários, críticas e sugestões.
Bons testes
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
A maioria dos analistas de teste e testadores não sabe onde estão o defeito que eles encontram, ou em outras palavras, não analisam nem acompanham o defeito após encontrá-lo, ou quando fazem, podem fazer de maneira incorreta, o que de certa forma é mais prejudicial do que se não fizessem.
Na verdade, é quase impossível, até mesmo para um analista de teste experiente dizer com certeza que o defeito que ele encontrou é de software, requisitos, análise, desenho, configuração etc. Os defeitos mentem, e isso é um fato que vamos ter que conviver cada vez mais, já que a cada dia a complexidade dos projetos de software aumenta e com ela a complexidade dos defeitos e da arquitetura do software em desenvolvimento.
A atividade de gerência de defeitos é uma das atividades mais importantes para o projeto e principalmente para a organização. Com uma boa gerência de defeitos, vários indicadores podem ser utilizados para conhecer e melhorar os processos e a capacitação dos profissionais.
Alguns dos indicadores* são:
•TD (Total de Defeitos)
•DD (Detecção de Defeitos)
•DDG (Detecção de Defeitos Graves)
•TDG (Total de Defeitos Graves)
•ETS (Eficiência de Teste de Software)
•ERR (Eficiência de Revisão de Requisitos)
*Em um próximo post vou falar sobre métricas e indicadores.
Apesar de ser uma ferramenta muito importante, a gerência de defeitos muitas vezes é usada de forma incorreta ou não é aproveitado o seu potencial, ficando limitada a um workflow do Bugzilla ou do Mantis.
Como os defeitos não são analisados, as pessoas não se importam com onde eles foram encontrados, nem com quando eles foram encontrados, até o dia que um determinado projeto está com problemas e alguém pede uma métrica de “bugs” por desenvolvedor, normalmente solicitado por uma pessoa que não tem experiência como analista de testes ou está iniciando na carreira de coordenador/gerente de projetos.
Esse é o grande perigo. Como citado no post Bug is Dead!, a idéia de “bug” da uma impressão muito ruim dos desenvolvedores, pois bugs são de software, e software quem faz são os desenvolvedores e programadores. O ideal para evitar esse tipo de mal entendido, é catalogar os defeitos de forma a saber de onde eles vieram e não quem causou o defeito.
Nenhum defeito pode ser atribuído somente a uma pessoa no projeto, mas sempre a um conjunto de eventos, que, de não conseguiram evitar que esse problema fosse inserido em determinado momento do processo.
Agora vou dizer uma coisa que pode te assustar prezado leitor:
A identificação da origem do defeito não é de responsabilidade do profissional que encontrou o defeito.
Muito simples, o profissional de testes ou quem encontrou o defeito, não pode saber claramente a sua origem, não pode dizer com certeza absoluta onde o defeito estava. Se estava no código, se era no ambiente, uma configuração do servidor, um problema de compatibilidade etc.
A única pessoa que tem essa informação é quem corrige o defeito. Ele é o único que sabe com 100% de certeza onde o defeito estava.
A responsabilidade de acompanhar essa informação e de garantir sua integridade sim, é de responsabilidade do gerente de defeitos, que normalmente é uma pessoa da qualidade ou teste de software. Por isso é importante acompanhar o andamento dos defeitos, preferencialmente todos os dias, de forma a manter o controle e rastreabilidade entre o defeito e sua origem.
Outra situação que acontece com frequência com novos testadores, é que assim como a nossa querida Tia Cida que sem querer escreveu “Café com defeito” quando na verdade o defeito estava no repositório de colheres da máquina de café. É um exemplo bobo e divertido, mas muito próximo do que acontece com algumas pessoas. Por vezes, os defeitos são descritos de forma pouco detalhada, com informações insuficientes para sua reprodução, com falta de atenção ou as vezes detalhado demais, dificultando sua interpretação.
Não existe uma forma de garantir que a descrição do defeito esteja perfeita, mas uma técnica que venho usando com sucesso é a substituição do passo a passo pelos procedimentos (passo a passo) do caso de teste que detectou o defeito.
Dessa maneira, a pessoa que corrigiu o defeito executa um teste de regressão e não um teste de confirmação. O mesmo acontece quando o testador recebe o defeito para verificar/validar, ao invés de executar um teste de confirmação, limitado as condições únicas daquele defeito, ele executa um teste de regressão, garantindo que aquela funcionalidade continua funcionando mesmo após a correção daquele defeito.
Caso o teste tenha sido detectado por um teste exploratório, o testador pode criar um Caso de Teste numa suíte especial, para aquele defeito (considerando o resultado esperado), e somente em seguida deve cadastrar o defeito na ferramenta de gestão de defeitos. Essa é uma pratica do XP que também da muito certo.
*O detalhamento dessa e outras práticas pode ser lido no post “Práticas XP ajudando na efetividade do teste de software“.
Bons Testes
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
Hoje eu resolvi escrever uma historinha que pode nos ajudar a refletir sobre a nossa carreira, nossa empresa, nossos objetivos e principalmente sobre nossos próximos passos.
A história é totalmente fictícia, não faz referência a nenhum profissional, certificação ou empresa em particular, mas aproveitei um pouco do que ando vendo nos fóruns e lendo em alguns livros sobre carreira e liderança para criar uma história que pode ser a história de muita gente aí fora.
Espero que gostem
Hoje é o primeiro dia da Sophie Kowalsky, nova testadora na BugSoft Corporation. Ela foi selecionada entre os mais de 150 candidatos a vaga de estágio no departamento de qualidade da BugSoft. Nessa seleção, a BugSof se preocupa não no conhecimento que o profissional já tem, mas sim nas características pessoais dos candidatos. Ser criterioso, detalhista, crítico e comunicativo é mais importante do que dominar linguagens, ferramentas ou ter certificações.
Hoje ela está começando a sua carreira de estagiaria como testadora, mas nunca viu nada sobre teste na vida, afinal de contas, na faculdade que ela estuda não existe nenhuma matéria exclusiva de teste de sioftware.
Ela está entusiasmada com as novidades, aos poucos começa a pegar o ritmo sobre como fazer testes exploratórios, em algumas semanas já consegue executar testes de casos de teste e reportar ótimos defeitos.
A BugSoft é uma empresa responsável e visionária, seis meses depois contratou a Sophie mesmo sem ter terminado a graduação, agora ela é uma testadora e já conhece muito sobre a malícia de encontrar defeitos.
Um ano e meio depois, a Sophie terminou a sua graduação, agora com dois anos de experiência já começa a ajudar Julien, analista de teste certificado, com a especificação de alguns casos de teste menos complexos e já está estudando para ser uma profissional certificada.
A BugSoft é uma empresa responável e visionária, acredita em pessoas como Sophie e resolveu ajudá-la na conquista da sua primeira certificação com os custos, materiais e algumas horas de estudo durante o expediente. O resultado não podia ser diferente, a Sophie passou com 90% de aproveitamento na prova da certificação, e agora é uma profissional certificada. A empresa reconheceu o valor da certificação, mas informou que existe mais um tempo de aprendizado até que ela possa se tornar uma analista de teste de software.
Com a certificação, a Sophie que acompanha diversas listas de discussão sofre por várias vezes a tentação de mudar da BugSoft para uma outra empresa que esteja pagando um alto salário para um profissional certificado, mas ela resiste pois confia na posição dos seus líderes que tem uma carreira pronta para ela na organização, seu amigo Julien, analista de teste, resolveu abandonar a BugSoft para ir para a CertifiedSoft.
Seis meses depois, Sophie é promovida a Analista de Teste. Ela fica muito contente, tem um aumento considerável e está novamente recarregada e motivada. Ficou aliviada em não tentar ir para a nova oportunidade, pois Julien, acabou descepsionado. Ele confessou que apesar do salário, os projetos não eram tão interessantes, os líderes não tinham as habilidades necessária e o clima de competição enfraquecia o companheirismo, já que as certificações valiam ouro e ele executava na maioria do tempo atividades de testador, quando na verdade gostaria de trabalhar como analista de teste.
Passado um ano, o envolvimento da Sophie cresceu muito em alguns projetos, e no principal seguimento da BugSoft, o que fez com que os líderes da empresa começassem a vê-la de uma forma diferente. Sua líder direta, Christelle, ressaltou a capacidade de organização e a facilidade ao lidar com pessoas de Sophie e em um acordo com os diretores da empresa, mesmo sem o conhecimento da Sophie, começou a direcioná-la para uma carreira de liderança.
Em conversas informais sobre livros, sobre, MBAs e etc., começou a influenciar Sophie de uma maneira a orientá-la a um crescimento dentro da empresa.
Sophie decidiu se matricular em uma pós graduação de Gerência de Projetos e a BugSoft colabora com 50% das despesas com educação da Sophie. Depois de um ano ela já está na metade da pós graduação e a empresa está crescendo em um ritmo muito estável, consequentemente, com projetos maiores. A empresa decide então promover Sophie para Coordenadora de Teste.
Agora ela coordena os novos testadores e analistas de teste, os orienta quanto as mesmas dúvidas que ela teve nos últimos quase quatro anos e organiza os projetos em que participa para otimizar os recursos de teste. Toma decisões importantes, mas sempre consultando sua líder, Christelle.
Claro que Sophie almeja um dia ser líder de teste, mas ela é demasiadamente leal a Christelle, que retribui com a mesma lealdade e atenção, e durante todos esses anos a ajudou em sua carreira. As duas comemoram vitórias umas das outras como se fossem suas próprias.
Ao mesmo tempo, Julien já é líder de testes. Claro que ele teve que enganar um pouco daqui, enganar um pouco dali, puxar o tapete de algumas pessoas, inclusive do seu líder que de tanta pressão acabou pedindo demissão. Julien hoje suporta uma pressão maior ainda do que seu antigo líder. A CertifiedSoft despenca em faturamento pelo terceiro ano consecutivo, além dos altos salários que paga para os profissionais certificados que não param de sair para outras oportunidades, ela enfrenta uma crise, pois sua principal certificação não foi aprovada na reavaliação RightProcess, o que custou o título de qualidade que foi conquistado por anos e anos de consultorias e horas gastas, naquela época em que a CertifiedSoft contava mais com pessoas motivadas sem certificação.
Mais dois anos se passaram e a BugSoft cresceu e conquistou um novo mercado em outro país. Uma mudança no organograma foi feita e agora a Christelle foi promovida para Gerente de Teste do mercado atual, enquanto o seu superior foi promovido como diretor do novo pólo. Obviamente Christelle se lembrou imediatamente que Sophie havia terminado a sua pos graduação e agora já estava com mais de 12 pessoas no seu comando. Sophie tinha conseguido elevar a produtividade dos colaboradores sem modificar o clima harmonioso da fábrica de testes e agora estava prestes a começar o seu MBA em Planejamento Estratégico de Pessoas, MBA em que Christelle tinha concluído a um ano atrás. Com o cenário atual, Sophie foi promovida para Líder de teste, não só no departamento em que Christelle liderava, mas também em outras duas filiais.
Cinco anos mais tarde, após um longo período de complicações, a CertifiedSoft não resistiu e perdeu muitos de seus clientes para a BugSoft, que reformulou seus objetivos estratégicos e conquistou o nível máximo de excelência nos últimos cinco anos durante as auditorias do RightProcess. A CertifiedSoft teve que realizar cortes e Julien foi demitido.
Julien era uma pessoa que se esforçava pela empresa, mas como a CertifiedSoft tinha uma alta taxa de rotatividade, muitas pessoas conheceram Julien, que por ter sido lapidado por uma empresa com uma cultura voltada a comparações e competições, acabou tornando muitas dessas pessoas “inimigas”, o que dificultou seu retorno para o mercado como líder de teste.
Hoje, cinco anos depois, a BugSoft é uma das maiores empresas do seguimento de software no continente e possui várias filiais e diretorias. A diretoria de Planejamento Estratégico de Qualidade é liderada Pela Dr.ª Kowalsky, que insiste em ser chamada de Sophie. Ela ajuda a organização a tomar decisões importantes, a encontrar talentos e a conquistar novos mercados. Nessa mesma empresa, está entrando um novo analista de teste chamado Julien. Na verdade, ele já trabalhou aqui a alguns anos, mas isso quando a BugSoft ainda era uma “empresinha” na pequena cidade SmallCity.
A história acima é totalmente hipotética, mas reflete a influência que a empresa tem sobre os colaboradores e o como a pressa por altos salários pode atrapalhar uma carreira promissora. Os personagens também são fictícios e os nomes vieram de um filme francês chamado “Jeux d’enfants” que na verdade é uma história romântica.
Quando pensamos em carreira, não devemos pensar em salários, certificações e títulos, mas sim em experiências, network e conquistas. Essas conquistas podem ser nossas, da nossa empresa, dos nossos lideres, dos nossos colegas de trabalho, dos nossos colegas de blog e mercado ou do nosso seguimento. Quando uma pessoa tem sucesso, todo mundo é afetado de uma forma positiva.
Conhecer o mercado, dominar o ego, trabalhar em equipe, esperar e aproveitar oportunidades, não são habilidades fáceis de aprimorar e na maioria das vezes são mais decisivas na nossa carreira do que certificações, pós graduações ou títulos conquistados.
Uma vez um dos meus lideres me disse: “O segredo para o sucesso é ser lembrado sempre que tocarem em assuntos da sua área de atuação“.
Bons testes
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
Imagine um grupo de onze viciados em PlayStation lutando pela oportunidade de passar o dia todo com jogos que ainda não foram lançados, consoles para o futuro, periféricos novos e tudo dos videogames da Sony, e ainda ganhar 5000 dólares para viver como testador da Sony.
A Sony lança no próximo dia 18 a inovadora série “The Tester“, com oito episódios, onde onze testadores em potencial vão disputar provas de mentais, físicas e claro, jogar muito PS3 para ganhar esse trabalho. Depois de realizar as provas, os candidatos serão eliminados um a um por uma bancada composta por três juízes.
Pelo preview o seriado parece muito divertido, com provas de resistência e competições em jogos. Funciona mais ou menos como um “britains got talent” para viciados em videogame e será exibido na PlayStation®Network.
Vale muito a pena assistir o vídeo. Para assitir e ler mais sobre o desafio acesse a url abaixo:
http://www.thetester.com/
Bons testes
Deadlock Immunity, também conhecido como Dimmunix, faz com que sistemas uma vez atingidos por um padrão de defeito, desenvolvam a capacidade de evitar ocorrências futuras desse padrão de defeito através do registro de sua assinatura. Ao longo do tempo, programas com um sistema tão “imune” podem aumentar progressivamente a sua resistência aos bloqueios.
“O Dimmunix pode ser comparado ao sistema imunológico humano. Uma vez que o corpo é infectado, seu sistema imunológico desenvolve anticorpos. Posteriormente, ao deparar com o mesmo patógeno, o corpo o reconhece e sabe como combater eficientemente o problema”, explicou George Candea, diretor do Laboratório de Sistemas Confiáveis, onde a ferramenta foi criada.
O Dimmunix fornece a capacidade de um software evitar recorrência de defeitos através de um padrão identificado em cada falha, que é armazenado numa base de dados e comparada durante as novas execuções. Quando um padrão semelhante é identificado, o sistema trabalha de forma a evitar que o defeito ocorra novamente. Com o passar do tempo, o sistema consegue determinar com facilidade o momento em que o defeito pode ocorrer e evitar os problemas resultantes dessa falha.
Ao que parece, o Dimmunix consegue evitar somente deadlocks ou “congelamentos”, o famoso “software travando”, mas já é um bom começo para criar sistemas inteligente que conseguem recuperar-se de falhas com menos interferência humana.
Segundo os autores do artigo, com o Dimmunix um Browser, “aprende” a evitar o congelamento verificado na primeira vez que ocorreu um bug associado a um plug-in . Além de browsers, o estudo está avançando para SGDBs como o SQLite e o MySQL.
Imagine em um futuro não muito distante, sistemas com a capacidade de diagnosticar suas falhas para outros sistemas que tem a capacidade de corrigi-las. Parece um pouco de loucura, mas IA (Inteligência artificial) é uma das áreas da computação que mais avança e com ótimas perspectivas para o futuro.
Bem utópica essa novidade né? De qualquer forma, esse projeto suíço me chamou muito a atenção, e vou acompanhar as pesquisas. Qualquer novidade comento aqui no blog, afinal de contas, tratando-se de testadores, sendo eles humanos ou não, temos que estar por dentro
O código fonte está disponível em C/C++ e Java, e pode ser baixado assim como toda a documentação e pesquisa realizadas. Para downloads e outras informações:
http://dslab.epfl.ch/proj/dimmunix
Bons testes
Alguma coisa diferente no Bug Bang?
O novo theme instalado Inanis é compatível com o despadronizado Internet Explorer, tem um melhor aproveitamento do espaço para texto e possui recursos mais simples para navegação.
Como a maioria dos analistas de teste sabem, quando testamos um sistema que ficará disponível para o publico, a preocupação com o browser deve ser levada em consideração. O antigo tema que eu estava usando apresentava muitos problemas de incompatibilidade com as versões 6 e 7 do navegador Internet Explorer. Tentei resolver de diversas maneiras, mas tive que recorrer a um novo theme.
Esse novo theme possui alguns recursos que facilitam a navegação:
•About this Post:
Sempre que entramos em um post, o blog apresenta um resumo a direita, informando nome do post, data de criação, Autor, Número de comentários, categorias e opções de respoder ao post, ler os comentários e seguir o RSS.
•Rodapé do Post:
Existem as informações sobre criação, autor, tags e categorias a que o . Também tem as ações de enviar por e-mail e ver o link. Ainda no rodapé, podemos ir para o próximo ou para o anterior com um click. Mais abaixo vem o campo para comentários e com ele um icone do RSS para esse post.
•Menu de tarefas
O menu no canto inferior esquerdo, semelhante ao menu iniciar do Windows 7, carrega quatro opções para melhorar e facilitar a vida dos usuários do blog.
->Guia de categorias, com todas as categorias em um menu;
->Nuvem de tags, semelhante a principal, mas aqui somente as tags aparecem;
->RSS do Blog, para assinar o nosso Feed;
->RSS dos comentários do blog, para saber o que os nossos visitantes comentam;
->Menu dos últimos 50 posts;
->Pesquisa rápida;
Além disso, existe um recurso para o mudar de tema, onde podemos mudar o fundo do blog para ficar mais a vontade.
•Mais espaço para o conteúdo
O espaço reservado ao texto do post também aumentou muito, cerca de 30%, o que permite maior facilidade para ler e publicar imagens maiores . Se usar a opção de tela cheia (normalmente ativada pelo F11) o blog fica ainda mais confortavel
Também foram adicionados novos widgets que vão ajudar os leitores a interagir comigo enquanto lêem algum dos artigos.
->O chat onde os leitores podem tirar dúvidas sobre algum post;
->A pesquisa de opinião onde os leitores podem me ajudar a definir o que pesquisar;
Além disso, o novo visual do blog é mais moderno, futurista e sofisticado, mais rápido e mais intuitivo. Funciona da mesma forma em todos os principais browsers do mercado, em todos os que apareceram no meu analytics e combina mais com o nome do blog.
Aceito sugestões e críticas sobre o novo layout e possíveis mudanças.
Bons testes
Ok, ok, sou péssimo para trocadilhos, mas o “teste é ouro” faz sentido sim.
Para quem acha que testador ganha pouco, imagine ganhar mais de dois mil e duzentos reais por bug. Nesse contexto, encontrar 10 bugs em um dia pode equivaler a um carro zero Km.
É isso que foi divulgado pelo Google no blog oficial do Google Chrome na última semana. O navegador oficial do Google está pagando entre 500 e 1337 dólares por bug.
Não precisa mencionar, mas o Google é conhecido no mundo inteiro como uma referencia de qualidade pelos seus softwares instantâneos, intuitivos, inteligentes, confortáveis, “sem bugs” e sempre com um visual sofisticado e inovador. Não é por menos que a maioria dos profissionais de software explicitam sua vontade de trabalhar para o Google.
Numa tentativa de criar um sistema cada vez mais próximos do “zarro bogs”, o Google Chrome abriu desafio para a comunidade de desenvolvedores e testadores. Para cada bug encontrado, será pago, em qualquer lugar do mundo, uma quantia que pode variar de 500,00 dólares a 1337,00 dólares. A variação será baseada no nível do bug. Quanto mais crítico, maior a recompensa.
Claro que estou empolgado com essa novidade. Para quem acompanha meu blog, sabe que eu já encontrei um problema no Google Chrome e publiquei no post “Defeito no GMail causa falha no FireFox e no Chrome“, e se depender de mim, vamos achar muitos novos bugs no meu navegador preferido.
Claro que nem todo bug faz parte dessa investida por qualidade. Ela é restrita a defeitos do Chromium ou Google Chrome, especialmente de segurança e excluindo defeitos de sistemas operacionais e de add-ons de terceiros.
Para saber mais sobre essa novidade tentadora basta acessar o blog oficial no link abaixo, onde podem ser conferidas as regras e detalhes dessa oportunidade:
http://google-chrome-browser.com/find-bug-google-chrome-earn-500-1337
Porquê 1337 dólares? Conheça o 1337 ou l33t (Leet Speak):
http://en.wikipedia.org/wiki/Leet
Bons testes
A alguns dias recebi um e-mail de uma amiga da comunidade de testes DFTestes (Fabiana Maronez), perguntando como usar o TestLink para gerenciar o QA (Garantia de Qualidade).
A maioria de nós certamente pensaria que é uma idéia um pouco distorcida. Usar uma ferramenta de gerência de testes para realizar QA? Mas com um pouco de criatividade e vontade de eliminar as planilhas, pensei em uma solução que pode atender o que a nossa colega solicita.
Para quem ainda não está habituado, podemos dizer que Quality Assurance (ou simplesmente QA) são atividades de auditoria que os processos baseados em modelos de melhoria como o CMMi e as ISO possuem para garantir que o processo está sendo seguido adequadamente. Para isso, normalmente são usadas planilhas e mais planilhas, com vários critérios. Essas planilhas são usadas de várias formas diferentes, desde uma para cada artefato até uma para cada projeto, mas a dificuldade de gerar relatórios e coletar indicadores quase sempre é surreal.
Obs: Para perfeita compreensão desse post, é necessário conhecimento básico em QA e na ferramenta TestLink. Recomendável também um conhecimento básico sobre CMMi.
Termos usados entre parênteses na cor verde ” (exemplo) “ simbolizam o que seria feito no TestLink em um projeto de teste.
Abaixo vou demonstrar uma forma de gerenciamento das auditorias com redução significativa do esforço:
1 – Criar um produto do TestLink para o QA.
(Criar um produto do TestLink)
É importante usar a opção “Gerenciar Requisitos”, para futuramente usarmos rastreabilidade das práticas para os Casos de Auditoria*.
*Casos de auditoria é um nome improvisado que eu arrumei para classificar casos de teste voltados para o processo, substituindo os tradicionais critérios.
2 – Cadastrar as práticas.
(Cadastrar especificações de requisitos e requisitos)
O cadastro das práticas é opcional, mas agrega muito valor, pois facilita a compreensão do fundamento da existência de cada”caso de auditoria” . Não existe uma forma definitiva de inserir as praticas, mas no caso do CMMi, uma forma que eu achei muito interessante é criar Especificações de requisitos para cada PA (Process Area) e um requisitos para cada SG (Specific Goal) e SP (Specific Practice), como ilustrado acima.
3 – Criar os casos de auditoria
(Especificar casos de teste)
Ao criar os casos de auditoria, é importante usar o nosso conhecimento em casos de teste para definir pré-condições, procedimentos e resultados esperados, muito próximo do que fazemos com os casos de teste para nossos softwares.
Normalmente, os QAs são realizados somente com critérios, o que torna o processo de auditoria muito custoso, pois qualquer pessoa que precise realizar o QA deve antes ser muito treinada no processo e no modelo de melhoria de processos adotado. A ultilização de casos de auditoria, além de gerenciar e simplificar métricas do QA, torna o processo menos dependente de treinamento, e possivelmente adaptável para testadores ou analistas de teste, porque uma pessoa com muito conhecimento do processo e do modelo pode definir um conjunto de casos de auditoria e pessoas com menos conhecimento podem executá-los, assim como analistas de teste e testadores.
4 – Atribuindo práticas ao caso de auditoria
(Vincular requisitos aos casos de teste)
Nesse momento vinculamos as práticas que devem ser cobertas pelo caso de auditoria, de forma a criar uma rastreabilidade por prática. Isso será importante para verificar quando cada prática é coberta e quais os casos de auditoria são mais críticos.
Quando cadastramos podemos ver o caso de auditoria como a imagem abaixo:
Acima podemos ver como cada caso de auditoria fica no final de sua especificação. Com pré-condição, passos descrevendo a sequencia de ações para executá-lo, resultado esperado e práticas vinculadas.
Assim devem ser feitos todos os “critérios” usados para a auditoria. Uma vez cadastrados, podem ser editados e modificados livremente, da mesma forma que os casos de teste de projetos de software.
5 – Definindo projetos
(Criar um Plano de Teste e adicionar Casos de Teste a esse plano)
Todo o trabalho até aqui, é realizado somente uma vez, e modificado sempre que um critério ou caso de auditoria precisa fica desatualizado. De agora em diante, apenas criamos “projetos” (planos de teste do TestLink) e releases para suas auditorias. O trabalho de armazenar as informações e controlar os artefatos e evidências, fica totalmente a cargo da ferramenta.
Criamos para cada projeto que será auditado, um novo “plano de teste”, que podemos chamar de “plano de auditoria”.
Aqui “começa a mágica”. Podemos definir para cada plano de auditoria um conjunto de casos de auditoria, de forma a permitir a customização do processo.
Para isso, basta selecionar os casos de auditoria no momento de vinculá-los a cada um dos projetos, de acordo com a demonstração abaixo. No exemplo acima podemos selecionar apenas os casos de auditoria que o “Projeto para auditoria 02″ irá usar.
6 – Preparando para executar uma auditoria.
(Criar uma nova release para o plano)
Na demostração acima, ao criar uma release do TestLink estamos criando uma instancia do QA planejado para aquele projeto, ou seja, estamos permitindo a execução dos casos de auditoria para o “Projeto para auditoria 02″.
7 – Executando a auditoria.
(Executar a release)
Agora executamos cada um dos casos de auditoria. A execução é semelhante a tradicional (caso de teste). O resultado pode ser positivo (aprovado), negativo (não-conformidade) ou bloqueado (indisponível), em qualquer caso podemos tomar ações para evidenciar ou complementar a nossa execução.
Evidência de auditoria: Uma evidência como um print do documento, do registro ou qualquer tipo de arquivo que possa comprovar a auditoria pode ser vinculado ao resultado “Passou” da execução.
(Salvar um anexo a execução do caso de teste)
Não conformidade encontrada: Para as não-conformidades encontradas, normalmente é cadastrado um “bug” no bugzilla ou no mantis, de forma a não conformidade adotar o mesmo workflow dos defeitos. Se esse for o caso, podemos usar a integração Defect Tracking System/TestLink para gerenciar as não conformidades.
(Cadastrar um bug no Bugzilla, Mantis, Eventum ou qualquer outra ferramenta integrada ao TestLink)
Caso o resultado do caso de auditoria tenha sido Bloqueado, o Analista de QA deve informar o motivo do bloqueio nas notas.
8 – Visualizando sumário de auditorias.
(Resultados)
Agora temos todos os relatórios do TestLink, usados para gerenciar nossos casos de teste, aplicáveis aos casos de auditoria usados anteriormente.
Alguns relatórios interessantes:
a – Relatório baseado em requisitos:
Nesse contexto ele nos permite avaliar cada uma das práticas que devem ser atendidas pelo CMMi ou outro modelo de melhoria como ISO ou MPS.BR, do ponto de vista de cobertura por auditoria.
b – Métricas gerais do plano de auditoria:
Aqui podemos acompanhar a evolução das execuções de várias “auditorias” (releases) de uma forma simples.
Esse post foi motivado por uma não existência de uma ferramenta própria para a execução de auditorias para processos baseados em modelos de qualidade (pelo menos ao meu conhecimento), como a ISO e CMMi, em fábricas de software, onde, normalmente são usados critério difíceis de compreender, em planilhas controladas manualmente, o que causa um desperdício de produtividade e perda da qualidade.
Importante ressaltar que o TestLink não é uma ferramenta própria para essa finalidade, mas podemos aproveitar o conhecimento do TestLink para adaptar um pouco alguns conceitos, desde que seja para melhor.
Em breve devo disponibilizar os pacotes para importação com todas as PAs do CMMi Dev1.2 em CSV e outro com uma tradução especial em português usando os termos citados acima.
Estou disponível para questionamentos, críticas e sugestões.
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.
Muita gente que me conhece sabe como sou um evangelista dos processos tradicionais como RUP, EUP, UP e MBASE e de modelos de qualidade e otimização dos processos organizacionais como CMM, CMMi, das ISOs entre vários outros modelos, metodologias e normas, que às vezes são conhecidas como pesadas, burocráticas, com pouco valor e pouca aplicabilidade, mas, como sou evangelista sempre digo que ir contra RUP/MBASE é ir contra Engenharia de Software.
Não existe verdade absoluta, falar que RUP é burocrático é imaturidade, assim como falar que SCRUM ou XP é desorganizado também é.
Mas hoje vou falar um pouco sobre como vejo o potencial dos princípios ágeis e como podemos usar algumas das técnicas inspiradas no XP para nosso dia a dia, aumentando a efetividade dos nossos testes sem perder tempo ou sair dos processos das nossas fábricas.

Eu vejo o XP (assim como o SCRUM) como um conjunto de práticas, princípios e orientações que seguem uma quase “doutrina” chamada de Manifesto Ágil (Manifesto for Agile Software Development) ou Manifesto para desenvolvimento Ágil de Software.
Prezado leitor apaixonado pelo Agile, não me crucifique pelo que vou dizer, mas eu, no meu “maravilhoso mundo da Engenharia de Software”, considero o XP uma biblioteca de boas práticas para engenharia e o SCRUM uma biblioteca de boas práticas para gestão e acompanhamento de projetos, sendo que o próprio RUP também agrega essa mesma titulação no meu ponto de vista. Isso porque, um projeto é uma entidade vida, e precisa de um sistema (processo), com caracteristicas únicas para atender as suas necessidades.
Como toda biblioteca, podemos livremente usar e deixar de usar essas práticas em qualquer projeto, mas qualquer projeto deve ter um processo definido, caso não tenha, a chance de fracasso é muito alta.
Abaixo, um resumo de alguns princípios e regras que são aplicáveis para melhorar o teste de software. Abaixo, algumas práticas interessantes baseadas nas práticas e regras do XP:
•When a bug is found, tests are created to guard against it coming back
Para todo defeito que não for encontrado por um caso de teste, deve ser criado um caso de teste em uma suíte especial para evitar que esse defeito volte a acontecer futuramente. Essa prática ajuda a aumentar a cobertura e efetividade dos testes, além de criar um conjunto de casos de teste orientados a defeito de forma preventiva. Não gasta mais tempo do que é normalmente gasto, pois essa prática substitui a descrição do defeito pelos procedimentos de teste (passo a passo) do caso de teste, substituindo o teste de confirmação e aumentando a quantidade de testes de regressão.
•All code must have unit tests.
Sim. Se o compilador já faz a cobertura de testes sintáticos de todo o código fonte, por que não deve existir uma cobertura de todos os testes semânticos (unitários)? Os testes unitários são o primeiro filtro no teste do software, mas não é por isso que não são importantes. Para cada classe é interessante ter um conjunto de testes que pode ser escrito antes da própria classe e se possível pela mesma pessoa que vai implementá-la. Quando isso acontece, o desenvolvedor consegue ver detalhes semânticos que antes ele não podia ver, consegue ver possíveis erros e existe uma probabilidade maior de atender a todos os requisitos da funcionalidade. Para ajudar nessa tarefa, é interessante o analista de teste participar com o desenvolvedor da criação desses testes unitários.
•Acceptance tests are run often and the score
Toda release que passe por todos os casos de teste Alpha devem ser encaminhadas para os testes de aceite. Diferente do XP, os testes de aceite que eu proponho nesse post não são baseados em Histórias de Usuários, são baseados em requisitos funcionais do usuário (os mesmos que dão origem aos casos de uso). São escritos testes baseados em cenários de negócio do sistema, de forma a validar os fluxos de trabalho que o sistema deve prover. Sugiro que sejam poucos testes, na linguagem do usuário, cada teste cobrindo o máximo dos requisitos do usuário, sem focar nos detalhes. Após a execução desses testes, é importante coletar o ponto de vista do usuário para futuras melhorias e examinar os defeitos registrados pelos testes, pois eles refletem as principais preocupações dos usuários, e a partir de cada uma dessas iterações dos testes de aceite, temos que repensar na forma como estamos desenvolvendo nossos casos de teste, para que fiquem mais próximos dos detalhes que causam os defeitos que os clientes reportaram. Recomendação: A regra de um caso de teste para cada defeito continua valendo aqui.
•Testing Cicle Velocity (Project Velocity)
Registrar o tempo gasto para executar cada ciclo de teste. Isso é importante para que a gerência sempre deixe um tempo inflacionado dessa base histórica, de forma a prover testes de regressão de todos os casos de teste do sistema e não somente aos casos de teste das novas funcionalidades e das funcionalidades com defeitos corrigidos. Recomendação: Aplicar também aos testes de aceite do usuário.
•All code must pass all unit tests before be released
Existe uma “cascatinha” importante relacionada a esse princípio. Para que um código seja integrado ao repositório, ele jamais pode estar com algum problema sintático, deve estar completo (totalmente implementado) e deve ter passado por todos os seus testes unitários. Dessa forma garantimos que todos os testes unitários tenham sido executados e que defeitos em módulos sejam minimizados. Após todos os códigos da release serem integrados, é recomendado que ao gerar a release seja executado um teste de fumaça para validar se o sistema está realmente funcionando sem problemas grosseiros nos seus fluxos principais. Somente após essas duas validações (teste unitário e teste de fumaça do desenvolvedor) a release alpha deve ser gerada e enviada para que o analista de teste execute um ciclo de teste com todos os casos de teste. Executado esse ciclo com todos os casos de teste, são executados os testes dos cenários de negócios que serão enviados para o cliente e vários testes exploratórios. Se todos os testes até aqui passarem sem problemas ou defeitos, o cliente recebe uma release beta para avaliação.
•Integrate testing often (Integrate Often)
Não adianta testar sempre os casos de teste se os cenários de negócio do sistema não forem testados também, principalmente em sistemas orientados a processos como pregão eletrônico, loja virtual, logística etc. Para o cliente um sistema que funcione sem defeitos mas não atenda às suas necessidades de negócios não é melhor que um sistema cheio de defeitos funcionais. Os casos de teste, após executados individualmente, devem ser dispostos em sequências a atender um cenário de negócio ou os requisitos do usuário. Essa prática permite que sejam testados detalhes de cada funcionalidade do sistema em paralelo aos cenários de negócio do cliente (objetivo estratégico do sistema para a organização).
•Refactor whenever and wherever possible.
Assim como os requisitos, os casos de uso e as histórias de usuário mudam constantemente, os casos de teste também mudam, e esses são os artefatos que devem aceitar a mudança com mais facilidade. Vários eventos contribuem para mudança dos casos de teste, ou testing refactoring. Mudanças nos requisitos, mudanças nos casos de uso, melhoria identificada durante a execução etc. Qualquer evento que contribua para uma melhoria do caso de teste ou de qualquer artefato de teste deve ser aceito sem questionar. Os casos de teste devem refletir o “estado da arte” do sistema sob avaliação e devem ser sempre completos, objetivos, claros e o mais simples possível, permitindo a execução correta daquele teste. Refatoração não é um indicador de imaturidade, muito pelo contrário, para o teste de software, aceitar mudanças de braços abertos é uma demonstração de preocupação com o resultado que será recebido pelo cliente e se esse resultado está exatamente como ele espera. Outro indicador importante para mudar o caso de teste é a quantidade de defeitos que ele detecta. Quando o caso de teste não detecta defeitos a muito tempo, é interessante investigar se ele está com um nível de detalhe muito superficial ou mesmo incompleto.
•Dedicated Integration Computer
Dedicar um ambiente de testes para a implantação contínua do produto, sempre validando esse ambiente com o cliente, que deve sempre fornecer informações sobre o que acha do ambiente, sobre os recursos, características especiais etc., para que além do produto, o ambiente de teste esteja em melhoria contínua e mais próximo do ambiente real do cliente. Caso o sistema seja web e para usuários da internet, é importante que o ambiente cliente mude constantemente, exatamente ao contrário do ambiente de teste do servidor. Nesse caso a regra deve ser chamada de “undedicated Integration Computers”. Se for um portal até vale a pena pedir a várias pessoas na fábrica, com seus preferidos browsers para dar uma “navegada crítica” e enviar um feedback por um formulário no próprio portal, com as críticas e defeitos encontrados. Esse formulário deve conter um mecanismo coletando as informações de browser, sistema operacional, resolução etc., de modo transparente para o usuário. Com base nesses defeitos devem ser feitos casos de teste.
•The business analyst is always available.
Sem dúvida isso é fundamental. Penso que a pessoa mais importante para o analista de teste em um projeto é o analista de negócios / requisitos. Ele sim, pode estar no lugar do cliente e deve estar sempre disponível. Acredito que todo mundo, com exceção do Kent Beck e sua turma, sabe que cliente sempre disponível é um sonho distante na maioria absoluta dos casos, mas para suprir essa ausência, o analista de negócios deve estar sempre disponível para o analista de teste e suas dúvidas, assim como o arquiteto também deve estar disponível para testes de requisitos não-funcionais e o analista de teste para o desenvolvedor durante a correção de defeitos e testes unitários.
Essas são práticas inspiradas no XP para melhorar nossas atividades de teste de software, sem gastar muito tempo com processos, análise de processos etc.
Outros princípios interessantes semelhantes, inspirados no agile:
Testar mais que o necessário sobre deixar dúvida na cobertura dos testes;
Cadastrar um defeito inválido sobre deixar de cadastrar um possível defeito;
Testes de regressão sobre testes de confirmação;
Ciclo de teste completo sobre testar novas funcionalidades;
Perseguir o zero erro sobre aceitar que o projeto terá defeitos.
Outras boas práticas:
•Automatizar o controle da execução dos testes e da cobertura dos requisitos pelos testes.
•Manter rastreabilidade dos defeitos para os casos de teste.
•Priorizar os fluxos com maior número de defeitos para testes de regressão.
•Modificar constantemente os casos de teste que não apresentem defeitos.
O mais mágico dessa onda chamada Agile é que qualquer uma das práticas e princípios acima pode ser aplicados em qualquer projeto, em qualquer fase do projeto, com qualquer equipe, individualmente ou acompanhadas de outras práticas, em qualquer metodologia de desenvolvimento de software, e com certeza vão mostrar resultados interessantes se usadas adequadamente.
São baratas, simples, fáceis de implementar e com um retorno muito alto na relação custo/benefício.
Fico aberto para críticas, sugestões e comentários de todas as naturezas. Obrigado
Inspiração e fontes:
Manifesto ágil: http://agilemanifesto.org/
Os doze princípios: http://agilemanifesto.org/principles.html

This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License.

Categories
Tag Cloud
Blog RSS
Comments RSS
Last 50 Posts
Back
Void « Default
Life
Earth
Wind
Water
Fire
Light 