Elemar DEV

Tecnologia e desenvolvimento .net

Conhecendo Microsoft Fakes – Parte 1 de 2 – Shims

Olá pessoal. Tudo certo?!

Microsoft está lançando, junto ao VS 2012, um novo framework de isolamento. Trata-se do Microsoft Fakes.

Para dar uma ideia de como esse framework funciona, apresento essa mini-série com apenas dois posts. Neste, falo sobre o recurso que considero mais relevante: Shims.

O que é Microsoft Fakes?

Reproduzindo a definição do msdn:

Microsoft Fakes is an isolation framework for creating delegate-based test stubs and shims in .NET Framework applications. The Fakes framework can be used to shim any .NET method, including non-virtual and static methods in sealed types.

Entendeu? Não? Vamos para um exemplo prático.

Código que desejamos testar

Considere a seguinte classe:

Alguns testes que gostaria de realizar:

  • Gostaria de garantir que a data utilizada seja sempre a data atual;
  • Gostaria de garantir que, caso fosse fornecido um “output”, ele seria utilizado;
  • Gostaria de garantir que as propriedades estivessem setadas quando o “output” fosse acionado.

O problema dos métodos estáticos – sem usar o Microsoft Fakes

O código indicado tem um problema sério. A chamada para a propriedade estática Datetime.Now. Afinal, como testar essa característica?!

Uma saída seria uma refatoração do código. Considere:

Eis uma redução evidente do acoplamento. Invertemos a dependência e tudo parece estar resolvido. Entretanto, você realmente gostou dessa solução?! Para mim, parece ser excesso de cuidado que pode se reverter em código desnecessário rapidamente.

Resolvendo o problema dos métodos estáticos com Shims

Uma alternativa para fazer esse tipo de teste é através da utilização de Shims – novo recurso do Microsoft Fakes.

Pegando a definição do MSDN:

Shim types are one of two technologies that the Microsoft Fakes Framework uses to let you easily isolate unit tests from the environment. Shim types allow detouring of hard-coded dependencies on static or non-overridable methods.

Shims são tipos gerados pelo Visual Studio 2012 quando você solicita a geração de Fakes para um Assembly (na lista de referências para o projeto). Veja:

image Com eles, podemos escrever um teste para o código proposto da seguinte forma:

Vamos entender o que foi feito:

  • Microsoft Fakes provê um “gestor de trabalho”, chamado ShimContext. Ele determina o espaço onde os Shims estarão atuando (por isso o bloco using).
  • Todos os tipos “Shim” permitem configurações de como deverão se comportar quando um método for evocado – no exemplo, configurei a propriedade Now para retornar uma data fixa.
  • Fiz a chamada ao meu SUT naturalmente.

Por baixo dos panos, a infraestrutura do IntelliTrace substitui as chamadas ao método original pela especificada no Shim.

Considere agora o seguinte código:

A ideia aqui é simplesmente demonstrar um código que tem dependência de IO – o que é muito ruim para testar. Veja como escrevi os testes para esse método:

Veja como os Shims removeram, elegantemente, a necessidade de IO dos nossos testes.

Bacana, não?!

Concluindo essa primeira parte

Shims possibilitam que testemos nosso SUT ignorando acoplamentos mais fortes – sejam eles estáticos, ou não.

Considero uma opção muito interessante para cenários onde estejamos trabalhando com código legado onde o redesign implique em esforço inadequado. Entretanto, temos que considerar que a necessidade de Shims geralmente estará associada a um design mais pobre. Além disso, eles adicionam alguma penalidade de performance para os testes.

Se você gostou de Shims, considere dar uma olhada na documentação oficial: http://msdn.microsoft.com/en-us/library/hh549176. Lá, você encontra como utilizar o framework para cenários com métodos não estáticos, por exemplo.

Também é importante destacar que Shims funcionam apenas no VS ou no Team Build.

Para esse post, era isso.

8 Comments on “Conhecendo Microsoft Fakes – Parte 1 de 2 – Shims

  1. Eduardo Pires
    22/08/2012

    Muito bom esse post, vou esperar pelo próximo!

    Elemar, você usa qual framework para gerar fakes, mocks?
    Consegue comparar com o que a MS ofereceu no VS2012?

    Por coincidência estava lendo sobre isso hoje em um artigo que não avaliou muito bem o FW de Fakes da MS, se puder dê uma olhada:

    VS11 Fakes Framework Considered Harmful
    http://blog.pluralsight.com/2012/04/23/vs11-fakes-framework/

    Abraços!

    • elemarjr
      22/08/2012

      Não concordo com o autor. Microsoft Fakes são ferramentas – boas, por sinal. Não podem ser responsabilizadas por mau uso.

      • Eduardo Pires
        22/08/2012

        Você substituiria alguma que acredito que deva usar atualmente por Microsoft Fakes? Em qual ponto discorda do autor?
        Estou buscando aprender as diferenças também por isso lhe questiono.

        • elemarjr
          22/08/2012

          Sem problemas!

          Eu adotaria Shims para sistemas legados onde fosse muito complicado usar Moq (mocks/stubs). Em outros casos, preferiria refinar meu design.

          Acho que o autor dá responsabilidades demais para a ferramenta. Ele assume que os desenvolvedores vão fazer uso ruim das ferramentas e, por isso, elas seriam inadequadas.

          O que você acha?!

  2. Fernando Correia
    22/08/2012

    Muito bom. Isso realmente vai simplificar alguns casos de testes mais difíceis de implementar sem criar um excesso de interfaces e inversões de controle e sem usar o TypeMock. Agora, infelizmente a internet me estragou, pra mim shim é outra coisa.

  3. Pingback: Conhecendo Microsoft Fakes – Parte 2 de 2 – Stubs « Elemar DEV

  4. alexsandro_xpt
    08/02/2013

    “Além disso, eles adicionam alguma penalidade de performance para os testes”

    “Performance. Shims run slower because they rewrite your code at run time. Stubs do not have this performance overhead and are as fast as virtual methods can go.”

    Realmente, teste de 200ms foi pra 15 a 35 segundos :( para uma app pequenina 10s+ não é muito tempo pra num teste rodar não?

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

Você está comentando usando sua conta WordPress.com. Sair / Mudar )

Imagem do Twitter

Você está comentando usando sua conta Twitter. Sair / Mudar )

Foto do Facebook

Você está comentando usando sua conta Facebook. Sair / Mudar )

Conectando a %s

Informação

Publicado às 22/08/2012 por em Post e marcado , .

Estatísticas

  • 427,217 hits
%d bloggers like this: