quarta-feira, 29 de abril de 2009

Testes de unidade, Azure e confiabilidade

Eu sou um grande fã dos testes de unidade, e mesmo não sendo um profundo estudioso do assunto testes, minha vida como desenvolvedor passou por uma transformação depois que eu comecei a trabalhar com eles, hoje eu não vivo sem.

Para ilustrar como os testes me ajudam, vou descrever um pouco do que eu fiz recentemente e, quem sabe, você também vai se sentir compelido a adotar essa boa prática de programação.

Primeiro eu codifiquei um wrapper para uma classe do projeto StorageClient que vem junto com o SDK do Azure e depois, para garantir que tudo irá funcionar corretamente, eu escrevi um teste que tentava criar uma série de containers passando com parâmetros os nomes mais esdrúxulos, conforme vocês podem ver abaixo:

Assert.IsTrue(ger.CriaContainer(@"ML:K()*_%^%$#@!@$#%^GBDF HGDSFKhf hdf kjh"));
Assert.IsTrue(ger.CriaContainer(@"~!#anjnd_)(* 8923849790>""?><>MarshalByRefObjectAssert.IsTrue(ger.CriaContainer(@"|{})_(*()*&h12h8934njkhf1"));
Assert.IsTrue(ger.CriaContainer(@"~!#anjnd_)(* 8923849790>"<>MarshalByRefObjectAssert.IsTrue(ger.CriaContainer(@"[]@#$|\\\skj382oflkuy"));
Assert.IsTrue(ger.CriaContainer(@"~s 092k3 jk3098 \\[hshsh"));

O método CriaContainer tenta limpar os nomes informados, deixando somente caracteres válidos. Porém eu somente comecei a escrever o método de limpeza do nome depois que meu teste estava pronto. O que eu fazia então...

while (ExecutaTeste() != tudoOk){
Luti_EscreveDireitoFuncaoLimpeza();
}

Enquanto o meu teste não passava todinho (o local storage do Azure gerava uma Exceção), eu continuava melhorando o método de limpeza. Depois de algumas iterações desse loop, o teste mostrou aquele check verdinho, tudo 100%.

Feito esse e mais outros testes, todos executando com sucesso, resolvi testar meu código diretamente contra a nuvem. Alterei o App.Config do meu projeto de testes para usar minha conta do Azure e executei a bateria com 10 testes: Verde, Verde, Verde, Verde, VERMELHO!

Uai, estava tudo certo?! Olha daqui, olha dali, vejo o problema. O armazenamento local permite que eu crie um container com o nome parecido com "empresa---xxx". O problema é que se olharmos a documentação, veremos "Every dash (-) character must be immediately preceded and followed by a letter or number".Ugh.

Resultado: o ambiente de desenvolvimento local não checa essa regra.
Sabe quando eu acho que iria encontrar um erro desse tipo se não fossem pelos testes, provavelmente em produção!!!

Depois disso alterei meu código para refletir os requisitos do Azure, re-executei os testes de unidade e tudo verde. Lindo.

Mas a coisa não termina por aí não. Depois de concluído os testes, resolvi baixar e instalar o CTP de Março (ainda estava com o de Janeiro). Instalei tudinho e adivinha qual foi a primeira coisa que eu fiz? Executei novamente minha bateria de testes... Tudo certo, então até que me provem o contrário, a instalação foi um sucesso.

Qual o meu sentimento no fim das contas? Eu estou confiando bastante no meu código e, toda vez que houver alguma alteração eu não vou precisar ficar 45 minutos para testar se houve alguma mudança que me prejudica, basta eu executar meus testes novamente que em alguns segundos eu saberei a resposta.

Gostou?

[]s
Luciano Caixeta Moreira
luciano.moreira@srnimbus.com.br
luticm79@hotmail.com

Um comentário:

  1. Eu também não vivo sem. O maior benefício é esse mesmo: posso mudar tudo na aplicação e ter GARANTIA de que tudo continua funcionando, e se não continua, onde está o problema.
    Além de ajudar na definição dos métodos e da arquitetura.
    []!

    ResponderExcluir