Post on 07-Aug-2015
Apresentação – Renato Groffe
Mais de 15 anos de experiência na área de Tecnologia
Pós-graduação em Engenharia de Software – ênfase em SOA
Cursando MBA em Business Intelligence (FIAP)
Graduação em Sistemas de Informação
Técnico em Processamento de Dados
MTAC (Microsoft Technical Audience Contributor), MCP, Microsoft Specialist, MCTS, OCA, ITIL, COBIT
Contatos Página no Facebook
https://www.facebook.com/RenatoGroffeSW
Canal .NEThttps://www.facebook.com/canaldotnet
Perfil no Facebookhttps://www.facebook.com/renatogroff
LinkedInhttp://br.linkedin.com/in/renatogroffe
Recursos Utilizados Visual Studio 2013 (preferencialmente com
o Update 4)
Moq
Visual Studio Unit Testing Framework (também conhecido como MS Test)
Cenários comuns dentro do desenvolvimento de software
Testes unitários, TDD, BDD: uma visão geral
Dificuldades técnicas na implementação e execução de testes unitários
Dummy objects, fake, stubs e mocks
Implementação de um exemplo prático em .NET
Agenda
Desenvolvimento de Software – Cenários Comuns
Pressões por rápida entrega
Prazos muito curtos
Equipes reduzidas
Mudanças frequentes em requisitos
Áreas de Negócio e Técnica não falam mesma língua
Testes não são levados tão a sério como se deveria
Como contornar estes problemas?
Metodologias ágeis◦ XP (Extreme Programming) e Scrum são os exemplos mais
famosos
Testes unitários automatizados◦ Validações em objetos e métodos (unidades)
◦ Alternativas na plataforma .NET: Visual Studio Unit Testing Framework (MS Test) NUnit (http://www.nunit.org/) xUnit.net (https://github.com/xunit)
Como contornar estes problemas?
TDD – Test-Driven Development
◦ Testes unitários codificados antes mesmo da implementação das partes que serão submetidas a análises → evita-se assim a elaboração de testes “viciados”
Como contornar estes problemas?
BDD – Behavior-Driven Development
◦ Testes baseados em user stories (histórias)
◦ Vocabulário compartilhado entre áreas de negócio e técnica (linguagem ubíqua)
◦ Frameworks permitem que as user stories sejam executadas como testes automatizados → uma alternativa muito utilizada em .NET é o SpecFlow
Ciclo de desenvolvimento em TDD
A implementação de uma funcionalidade segue um ciclo chamado Red-Green-Refactor (os testes unitários são executados em todos os estágios)
Ciclo de Desenvolvimento em BDD
Teste de aceitação → User story que serve de base para a implementação de uma funcionalidade e posterior validação da mesma
Dificuldades técnicas comuns
Dependências entre diferentes partes de um software
Inexistência de ambientes com configurações específicas para testes
Integrações com parceiros que não disponibilizam condições adequadas para testes
Solucionando estas dificuldades em testes unitários
Dummy objects → criação de objetos/parâmetros obrigatórios, mas que não afetarão o andamento de um teste
Fake objects → implementações para a geração de objetos necessários, porém descartadas em produção
Stubs → foco na verificação de estados/valores, não resultam em falhas nos testes
Mocks → enfatizam a interação entre objetos (comportamento), com possíveis falhas de execução
Como implementar isto simplificadamente em .NET?
Moq
◦ Framework open source
◦ Simplifica a utilização de Mocks e Stubs na validação de soluções construídas em .NET
◦ Permite definir o retorno de métodos, propriedades e até a geração de exceções em tempo de execução
◦ Dispensa a criação de Fakes e outras estruturas que seriam descartadas posteriormente
Como utilizar o Moq?
Estruturas definidas no namespace Moq
Importar no projeto de testes o package deste framework que se encontra no NuGet
Empregado em conjunto com frameworks como MS Test, Nunit, xUnit.net, SpecFlow
Como utilizar o Moq?
Utilizar a classe genérica Mock em conjunto com o tipo a ser simulado (normalmente uma interface)
◦ Método Setup → configura o método ou propriedade a ser simulado
◦ Método Returns → retorno a ser devolvido pelo elemento que se está simulando
◦ Método Throws → exceção que ocorre ao se invocar um método ou propriedade
Acessar a propriedade Object da instância genérica do tipo Mock, a fim de obter a referência que simula um comportamento
Como utilizar o Moq?
Alguns exemplos sobre como configurar um Mock Object (uma referência mais completa pode ser encontra no site do Moq):
Exemplo prático - Moq
Consulta a um serviço de crédito (via CPF) – status possíveis:
◦ Parâmetro de envio inválido
◦ Erro de comunicação
◦ Pessoa física sem Pendências
◦ Pessoa física inadimplente
A ideia por trás do uso de Mock Objects nesta situação é evitar consultas a um tipo de serviço que é pago → as empresas que fornecem os dados não costumam disponibilizar ambientes para testes
Fontes utilizados nesta apresentação
Link para download da solução de exemplo:
https://gallery.technet.microsoft.com/Exemplo-de-utilizao-dos-9537c977
Referências
Mocks não são Stubshttp://www.infoq.com/br/articles/mocks-Arent-Stubs
Moq – Quickstarthttps://github.com/Moq/moq4/wiki/Quickstart
Unit Testing with Mock Objectshttps://msdn.microsoft.com/en-us/library/ff650441.aspx