domingo, 20 de maio de 2007

Test Patterns: Mock, Fake, Stub e Dummy Objects parte 1 de 4

Esta é o primeiro de uma série de posts sobre padrões de teste (test patterns) que sempre encontramos em testes unitários. É muito importante conhecer estes padrões, da mesma maneira que os design patterns, eles contém soluções já empregadas com sucesso em um número imenso de problemas e permitem que todos se comuniquem de forma consistente.

O primeiro passo é entender o que são cada um destes tipos de objeto e quando devemos usar cada um deles. Todos estes tipos de objetos vêm solucionar dois grandes problemas ao se trabalhar com unit tests:

Testes não confiáveis devido a dependências que não podem ser utilizadas

Muitas vezes é díficil criar unit tests para um sistema porque ele contém dependências que não podem ser utilizadas no ambiente de testes.

Estas dependências podem causar diversos problemas, por exemplo, utilizar bancos de dados ou arquivos pode impedir que os testes retornem sempre valores consistentes (a não ser que seja criada lógica para restaurar as fontes de dados a um estado conhecido). Outro problema é simular exceções, é relativamente complexo por exemplo simular uma exceção de concorrência entre dois usuários tentando acessar um recurso, quando o único usuário é o desenvolvedor executando os testes!

Outra problema é quando temos códigos não testados*, como um Web Service de uma outra equipe ou ainda não construídos, nos quais é necessário esperar um certo tipo de comportamento consistente com as entradas informadas pelo sistema. Neste caso também se encaixa código que simplesmente não roda na máquina do desenvolvedor, como um código de acesso ao Active Directory (que necessitaria um infraestrutura imensa somente para executar um teste que deve ser reproduzível desde que mantidos os parâmetros de entrada).

*Não é recomendado criar testes para todo e qualquer tipo de código. Por exemplo, é insano querer criar qualquer teste para o .NET Framework. Código não testado aqui significa código cuja qualidade não foi verificada.

Testes muito lentos

Testes demorados significam que os desenvolvedovedores não os executarão cada vez que uma mudança é realizada no sistema, ponto.

Este único fator já deveria ser suficiente para rever os seus testes unitários já que uma das maiores vantagens de se desenvolverem tais testes é que qualquer bug inserido no código é rapidamente identificado quando os testes falham. Além disso, existe o custo óbvio de produtividade do desenvolvedor que precisa esperar que os testes terminem de executar antes de realizar qualquer alteração no código.

Nestas situações, quando escrevemos testes para um sistema e não podemos (ou não queremos) utilizar um objeto real, nós simplesmente escrevemos um substituto para ele. De modo que o sistema testado acredite que este objeto falso é real.

É claro que este objeto falso não precisa ser a cópia do original (implementar todos os membros de uma interface ou sobrescrever todos os métodos de uma classe base) ele somente precisa conter a implementação necessária para executar o conjunto de testes. Muitas vezes até um valor hard-coded é suficiente, em outras, teremos que implementar algum tipo de funcionalidade rudimentar para o teste ter algum valor.

A mensagem importante é que não importa o tipo de objeto falso que você deseje criar, ele não pode executar um caminho diferente do objeto real no código! Por isso o objeto falso deve ser "instalado" no sistema a ser testado no lugar do objeto real, abaixo temos um exemplo.

class ServicoCadastroCliente
{
void CadastrarCliente(string nome, string rg) {
CadastroCliente cad = new CadastroCliente();
cad.Adicionar(nome, rg);
}
}
class CadastroCliente
{
public void Adicionar(string nome, string rg)
{
//Lógica omitida para simplificar exemplo
}
}



Como eu criaria um objeto falso sem interferir no código de produção? O código abaixo contém um exemplo:


class ServicoCadastroCliente
{
ICadastroCliente _cadastroCliente;
// Esse é o construtor utilizado pelo código de produção, instancia a classe real CadastroCliente
void ServicoCadastroCliente() {
_cadastroCliente = new CadastroCliente();
}

// Esse é o construtor utilizado pelo código de teste, o código de teste apenas precisa passar uma
// instancia de CadastroClienteMock para trocar a classe real pela falsa
void ServicoCadastroCliente(ICadastroCliente cadastroCliente)
{
_cadastroCliente = cadastroCliente;
}
void CadastrarCliente(string nome, string rg) {
_cadastroCliente.Adicionar(nome, rg);
}
}



class CadastroCliente : ICadastroCliente
{
public void Adicionar(string nome, string rg)
{
//Lógica omitida para simplificar exemplo
}
}

interface ICadastroCliente
{
void Adicionar(string nome, string rg);
}

class CadastroClienteMock : ICadastroCliente
{
public void Adicionar(string nome, string rg)
{
//Pronto, aqui posso realizar qualquer tipo de checagem que garanta que
// tanto nome como rg foram passados corretamente pelo sistema testado
}
}


No próximo post entrarei em detalhes de cada tipo destes objetos falsos.

Microsoft Popfly (formally named Springfield)

Sexta feira foi anunciado o lançamento do primeiro preview do serviço Popfly da Microsoft, concorrente direto do Yahoo Pipes. O objetivo deste serviço é permitir a combinação de feeds RSS e APIs abertas para criar novos feeds e sites que combinem estas funcionalidades e informações, os chamados mashups.

A experiência de uso do Popfly parece muito amigável, você só precisa arrastar blocos de uma barra de ferramentas e conectados uns aos outros em um designer. Automaticamente o site diz os parametros que precisam ser informados para cada bloco e sugere as associações com os dados dos blocos conectados. Por exemplo, eu posso selecionar um bloco Flickr, um bloco Live Earth e um bloco GeoTags para exibir, em um mapa do Live Earth, thumbnails das fotos do Flickr.

Diferente do Yahoo Pipes pelos vídeos e screenshots que eu vi é muito mais simples e amigável, com uma bela interface desenvolvida em Silverlight e vários pontos de extensibilidade como a capacidade de criar os seus próprios blocos no Visual Studio .NET e outras funcionalidades interessantes como criar a sua própria página HTML para conter os seus mashups de APIs públicas (Flickr, Live Earth, GeoTags, Live Contacts, Tweeter, etc em programmableweb.com você pode ter uma idéia do número de APIs que poderão ser utilizadas).

Este ainda é um serviço em alpha privado, ou seja, somente algumas centenas de pessoas possuem acesso, no entanto aqui você pode fornecer o seu nome para receber um convite quando o serviço estiver disponível em beta. Se você tiver curiosidade assista esta entrevista com a equipe do Popfly no Channel9.

"A Fair(y) Use Tale" curta hilário sobre a lei do copyright, com legendas

Eric Faden criou este incrível montagem sobre a lei do copyright ironicamente somente com trechos de desenhos da Disney. A minha noiva Pri já havia me explicado um pouco sobre a lei Mickey Mouse criada praticamente sob medida para extender os direitos para toda a eternidade sobre a propriedade intelectual. Claramente um absurdo que visa somente atrapalhar o desenvolvimento de novas idéias, exatamente como grandes empresas como a Disney fizeram com quase todos os seus desenhos animados (consegue lembrar de algum trabalho da Disney que não seja baseada em um conto ou história já existente?).

Chapter 1: Copygright Definition

What the heck is copyright? It's the law, that's the problem. You know the law? That stupid law... What the heck is copyright? I will tell you: Copyright is determinate fix a original work in some form that it can be revived, seen or heard. Now listen, this is important, only the copyright owner has the right to use their work. It's mine!

-How can that be? That's not fair!

It's forbidden to use a copyrighted work without the permission granted by the copyright owner. And everybody who is fool enought to break the copyright has broken the law. But we've forgotten a tiny little detail, you better be able to pay for that copyright permission.

-We haven't discussed the subject of payment yet, you can't get something for nothing, you know?

-But I don't have any...

-I don't ask much, just a token in your trayful.

-One moment, back up. You're saying this is about money?

-Sorry sir, I don't have any money...

-Distortion!

-I prefer the term capitalist...

-Listen that, it's the sound of your freedom flying over the window...

Chapter 2: What things can be copyrighted?

Well, just the usual things like: books, plays, music, dance, movies and pictures.

-No, no, listen caryfully, you can't copyright an idea.

-Yes, I can.

-No you can't

A culture would be unwise to limite the power of a great idea. So we can only copyright the form an idea takes.

Chapter 3: Copyright duration and the public domain

The law says that the copyright only last for a fixed amout of time. For example, copyrighted photos(?) only last 40 years. For a culture, that is long enought to a copyright owner to make money from their work. After just 40 years the work falls into public domain, so anyone can use the work. And what the heck is the public domain? The public domain is a disgrace to the forces of evil.

-What are you saying exactally?

Any work in the public domain is free for anyone to use.

-Can you do that?

Yes, it's essential. A culture create new ideas by building on earlier works. So the public domain is necessary for a living, trilling society.

Unfortunatelly copyright keeps getting longer, and it seems to be no limit to how long a copyright can be extended(?). Now copyright lasts a life time: 70 years, and for some companies more than 100 years. So copyright last more like, forever.

Chapter 4: Fair use

And what the heck is fair use? You may thing this is crazy, but there are some limitations on copyright.

-Is it possible?

Yes, copyright can be broken. You may borrow a centain amount of a copyrighted work to: teach, news reporting, parody and critical comment.

-But how do I konw if it is fair use? There are centain rules that demonstrate fair use: first of all the nature of the work you borrowed, second of all is the amount of the work you borrowed, and there is one more, it must be something that doesn't shrink the work's value in the marktplace.

Now this is important: note that fair use is not a right, fair use is only a defensible position, and this is not fair.

Chapter 5: Why use Disney cartoons

Because this company is intimidating anybody who takes their copyrighted work. The point is, if fair use actually works, then movies like this one will have legal protection.

domingo, 13 de maio de 2007

Debugging sucks, Testing rocks

Inspirado pelo blog de Testes do Google  que eu redescobri esse fim de semana vou dar para o blog a direção de escrever sobre testes unitários, automação, quality assurance e assuntos relacionados.

A verdade é que eu me cansei de fazer debugging na primeira execução do código, de quebrar coisas com alterações, em parte também porque fiquei decepcionado com número de resultados na pesquisa de blogs do Googles para o termo "testes unitários", é ridículo (130, mesmo a pesquisa na web retorna poucos registros), e o pior é que a grande maioria foca em ferramental e não em "como escrever testes de modo eficiente".

Faz um tempo que ando incorporando a idéia de testes no meu dia-a-dia de deselvolvedor, mas sempre quando o prazo ou a complexidade aumenta eu digo "bom isso vai do jeito antigo mesmo" e entro no velho ciclo de erro->debug->acerto->novo erro. Chega. Agora quero ser um verdadeiro praticante de desenvolvimento orientado a testes, vamos ver no que isso vai dar.

O que não é um teste unitário

Muito interessante este post do Michael Feathers sobre o que não é um teste unitário:

Um teste não é unitário se...

...Acessa o banco de dados
...Comunica através da rede
...Grava/acessa arquivos no file system
...Não pode ser executado em paralelo com outros testes unitários
...Você precisa fazer coisas especiais como alterar arquivos de configuração, para executá-lo.

O seu argumento é que testes que façam as coisas acima não são ruins, mas também fogem da idéia principal que é testar código, quando nós começamos a misturar código de testes com acesso a bancos de dados, por exemplo, temos uma série de problema como capacidade de repetir os testes, simular erros e verificar se o problema está no código ou no sistema com o qual você está interfaceando.

Não que este tipo de teste não precise ser escrito, é que os testes unitário puros são muito subvalorizados.

Eu cometo todos estes erros e concordo com ele, apesar de achar um pouco de exagero o último item. A solução clara para estas limitações é trabalhar com Mock ou Fake Objects.

Por exemplo, ao testar um código de CRUD (create-read-update-delete) eu poderia criar uma classe falsa que contém um DataSet moldado com todas as variações de registros de uma tabela do meu banco de dados, como é uma representação em memória os testes irão executar rápido, sempre com resultado previsível e sem atrapalhar outros desenvolvedores.

É claro que eu precisaria de uma maneira de substituir a minha classe de acesso a dados para chamar a classe falsa ao invés do banco de dados verdadeiro, mas isso pode ser uma tarefa simples se você utilizar frameworks como o Enterprise Library ou o NHibernate que têm suporte para chamar classes parametrizadas em arquivos de configuração.

No próximo post coloco um exemplo prático, com código.

Links interessantes

Nos últimos dias coloquei algumas coisas interessantes no meu feed de links. Destaques:

Anúncio do Microsoft SQL Server Katmai

Que deve sair junto com o Longhorn Server e entre as novidades contém: extensões para armazenar dados espaciais e foco em Business Inteligence.

Propaganda do Windows Live Hotmail

Muito bacana onde o pai não deixa a filha voltar tarde porque acredita que a filha dançará o mambo na horizontal com um cara suspeito ("suspicious male" trocadilho intraduzível com e-mail suspeito "suspicious mail")

Lançamento do Windows Live Folders

Disco virtual da Microsoft com 500MB de espaço e permite compartilhar dados com contatos (shared) ou com qualquer um (public)

Lançemento do Windowsclient.net

Site focado para desenvolvimento de aplicações windows  forms e Windows Presentation Foundation.

Uma bela lista de recursos para Sharepoint no CodePlex

De tudo, web parts, ferramentas, templates e muito mais.

Passo-a-passo para preparar uma máquina para as novas tecnologias da MS

Resumindo, se eu postar pouco, olhe no meu feed de links que sempre tem no mínimo um item por dia do melhor que eu leio na net.

terça-feira, 8 de maio de 2007

Coisas que não podem passar em branco

Agora a noite a equipe do Google acabou de anunciar mudanças no Google Analytics, um serviço grátis para monitorar utilização do seu web site: quanto tempo o usuário permanece em cada página, que links ele clica, dados de localidade sobre o usuário e mais uma tonelada de gráficos. Há uma demo das novas funcionalidade, ela é impressionante.

Esse assunto é muito interessante, o Google acabou de comprar a DoubleClick, um mega player de anúncios na web, e lançou um serviço que promete melhorar o retorno do investimento em marketing para web: anúncios direcionados por atividade.

Um dos grandes problemas dos anúncios web é que a grande  maioria do usuários que clicam em ads não completam compras ou o registro no site, muitas vezes são até causados por concorrentes (tentando esgotar o orçamento do inimigo para ads na web). Os anúncios por atividade tem um custo maior, mas somente são cobrados quando o visitante completa um ciclo de tarefas na página, um cadastro ou uma compra. Com esse tipo de anúncio é muito mais simples de medir a taxa de retorno do investimento em marketing.

Também acessei dois sites que merecem uma visita, por lazer.

O primeiro é o foxytunes.com, esse site é mais um daqueles mashups que misturam diversos serviços da web em um único web site, mas é o paraíso para quem gosta de ouvir música no PC.

Quando você encontra o artista desejado em uma única página você tem: videos do youtube, rádios do last.fm, letras das músicas pelo lyricwiki, fotos do flickr, notícias do google e muitos outros. Em UMA ÚNICA página, sem postback ou propaganda, e tudo simultâneo.  É muito divertido.

O outro também é interessante, thebeststuffintheworld.com é um site onde literalmente os visitantes selecionam as melhores coisas do  mundo, nas categorias mais bizarras possíveis, e os melhores aparecem em um grande dashboard na home page. Nele podemos ver, por exemplo, que música é a melhor coisa no mundo para ficar chapado sem usar drogas ou que Elvis é o melhor cantor do além.

sábado, 5 de maio de 2007

P&P Guidance Wiki

Não sabia que existia esse wiki de Patterns & Pratices. Muito útil já que consolida um monte de artigos, check-lists, exemplos, etc. Ao que parece esse wiki é a fonte daquela ferramenta Guidance Explorer.

Esse vai direto para os meus bookmarks...

quinta-feira, 3 de maio de 2007

O que é Silverlight mesmo?

Um daqueles diagramas bonitos que tentam encaixar todas as tecnologias...

Sério agora, só lembre que esse CLR no meio do desenho NÃO é o .NET Framework. É um framework menor e com menos dependências e limitada aos namespaces citados.

Não conseguiu ir para Las Vegas?

Tudo bem, assista a TODAS as sessões públicas nesse link.

Windows Live API - Quanto custa?

Na MIX foram anunciados alguns termos de uso das APIs da Live. Os detalhes pode ser encontrados no site de desenvolvimento para live em dev.live.com. Mas em resumo é o seguinte:

  • Todas as APIs (Silverlight Streaming, Live Spaces, Live Contacts, etc) são grátis até que saiam da fase beta.
  • Quando sairem do beta, a principio todas as APIs são grátis até 1 milhão de usuários únicos (isso mesmo, não importa quantas vezes cada usuário usa as APIs ele é contado apenas uma vez) com as seguintes restrições:
  • Windows Live Search é grátis para até 750,000 buscas por mês. 
  • Virtual Earth (Live Maps) é grátis para até 3 milhões de mapas por mês. 
  • Silverlight video streaming é grátis para até 4 GB de espaço, com quantidade de streaming e usuários ilimitados.
  • Acima de 1 milhão de usuários, os sites deverão pagar 25 centavos de dólar, por usuário e por ano.
  • Para Live Search e Virtual Earth, os sites devem negociar os termos comerciais com a Microsoft 
  • Usuários serão medidos através da média por trimestre, ou seja, se em um mês houver pico de usuários, mas a média do trimestre ficar abaixo dos limites, o site ainda não precisa pagar nada.
  •  

    Na minha opnião, todas essas são ótimas notícias, e uma boa oportunidade de fazer dinheiro com as APIs do Live começa a aparecer.
    Hoje já é realidade lá na América sites inteiros baseados em combinação de APIs públicas (dê uma olhada em http://www.programmableweb.com/mashups) a Microsoft entra nesse nicho correndo atrás dos concorrentes, mas as novidades (principalmente o streaming de vídeo) podem mudar o jogo.

    Demos Update

    Você já pode baixar a demo da sessão do Scott Gunthrie e muitas outras na galeria do Silverlight

    MIX07 Welcome Kit

    Não, não. Eu não tenho nem vou sortear um welcome kit da MIX. Na verdade encontrei o post desse cara que teve o trabalho de tirar uma foto e fazer o inventário:

    1 camiseta Silverlight / Mix07
    1 cópia do Vista Ultimate
    1 cópia do Expression Studio
    3 faixas coloridas para identificar a sua "persona" (Azul=Desenvolvedor, Verde=Usuário de Negócios, Amarelo=Designer)
    1 adesivo do Silverlight
    1 USB key com a marca do Vista (contendo recursos do Live como: Platform In-A-Box, Live Search Starter Applications, Live Search Widgets)
    4 DVDs da MIX07 contendo Visual Studio "Orcas" Team Suite Beta 1; ASP.NET AJAX Resource Kit; WPF Virtual Bootcamp; Windows Media Center Resource Kit)
    1 pilha de folders e ofertas especiais

    foto aqui

    Até parece os eventos aqui do Brasil...

    Cobertura MIX07

     

    Seguem abaixo os principais anúncios da MIX:

    • O Silverlight beta 1.0 (conhecido como WPF/e)  foi lançado junto com uma licença go-live (o que isso significa? A Microsoft acha bom o suficiente para ir para produção), o release full desta versão 1.0 está prometida para julho.
    • Foi lançado o Silverlight 1.1 alpha com suporte para .NET(você pode utilizar C# ou VB.NET ) e também suporte para Ruby, Python e Managed Jscript. Esta é na minha opnião a melhor notícia até agora, significa que 1) você  pode utilizar uma linguagem com a qual você tenha familiaridade ao invés de Javascript e 2) é a abertura para suportar .NET em múltiplas plataformas, o key-note do Scott Gunthrie mostrou um aplicativo criado com o novo template Silverlight do Visual Studio rodando no OS/X.
    • Lançamento do Expression Studio RTM. Pacote dos 4 programas Expression. Também foi anunciado o Expression Blend 2.0 May Preview e Expression Media Encoder Preview ambos com suporte ao Silverligth. E para completar o Visual Studio Orcas Beta 1 ganha suporte ao Silverligth com o  Silverlight Tools Alpha for Orcas Beta 1.
    • Live Services.  Agora os serviços da Live foram consolidados no Live in a Box que permitem você integrar os diversos serviços de fotos, busca, rede social e o lançamento do Silverlight Streaming com 4GB grátis para você fazer streaming de vídeo, podcast, etc. 
    • Frameworks de produtividade: Isso não foi anunciado no keynote, mas junto com a MIX foram lançados alguns novos  frameworks. O primeiro é o Dynamic ASP.NET controls que utiliza um schema de banco de dados e convenções de código para fazer data-bind e gerar páginas ASP.NET.  O segundo é o “Jasper”, uma camada de acesso a dados dinâmico que é independente da camada de apresentação.  Há também o projeto codenome “Astoria”, ainda em testes nos laboratórios da MS. O objetivo do Astoria é retornar formatos padrão como XML, JSON, e RDF através de URLs amigáveis como “/dados/tabela[consulta]”. Esse CTP vem em dois sabores um download e um serviço online. A versão online inclui datasets prontos como o Microsoft Northwind e a enciclopédia Encarta. Em breve será possível criar os nossos próprios datasets hospedados no serviço online.
    • Finalmente, também foi anunciado o Silverlight Streaming para Windows Live. Esse serviço vai permitir que cada Live ID tenha 4GB de espaço para fazer streaming de video a 700 KB/s, sem qualquer logotipo ou propaganda, utilizando a rede de distribuição da Microsoft, o que significa uma qualidade muito maior que a maioria dos serviços disponíveis. Além disso o mesmo serviço permitirá que você faça upload da sua aplicação criada com o Silverlight e faça straming dela também.  

    Não esqueçam de acompanhar os meus itens compartilhados do Google Reader. Coloco todas as notícias sobre desenvolvimento que me chamam a atenção de  diversas fontes (MSDN Blogs, ZDNet, Techcrunch, etc).