Download - Mini curso - testes plataforma .net
Globalcode – open4education1 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Testes na plataforma .NET
Começando a desenvolver com confiança
Globalcode – open4education2 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
About: Vinicius Quaiato
• Arquitetura e desenvolvimento• Apaixonado pelo que faz• Apaixonado por testes• .NET Architects• .NET Magazine• Vegetariano• Pai• Santista• Geek
Globalcode – open4education3 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Contact: me
• http://viniciusquaiato.com
• [email protected]– msn e gtalk
• @vquaiato
Globalcode – open4education4 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Lambda3
• Parceria
• http://lambda3.com.br
Globalcode – open4education5 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Objetivos
Globalcode – open4education6 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
About: you
• Nome
• Expectativa
Globalcode – open4education7 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Globalcode – open4education8 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Fazer software dói
Globalcode – open4education9 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Fazer software cansa
Globalcode – open4education10 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Fazer software é difícil
Globalcode – open4education11 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Mas...
Globalcode – open4education12 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Precisa ser diferente!
Globalcode – open4education13 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Razões e problemas
• Difícil manter
• Difícil evoluir
• Bugs persistentes
• Correção gera outros bugs
• Medo mexer no código
• Perda de tempo
Globalcode – open4education14 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
And the life becomes sad...
Globalcode – open4education15 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Mas...
Globalcode – open4education16 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
O que são testes?
• Forma de garantir que o software:– Atende aos propósitos de negócio– Funciona como esperado
Globalcode – open4education17 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
O que são testes?
• Maneira verificável de garantir que o software atende às necessidades de negócio e que funciona como esperado.
Globalcode – open4education18 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Por que testar?
• Saber que algo funciona
Globalcode – open4education19 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Por que testar?
• Saber que algo terminou, ficou pronto
Globalcode – open4education20 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Como testamos hoje??
Globalcode – open4education21 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Ctrl + Shift + B
Globalcode – open4education22 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Ctrl + Shift + B
• Compilar NÃO é testar!
• Apenas significa que o código atende ao compilador, apenas isso!
Globalcode – open4education23 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
F5
Globalcode – open4education24 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
F5
• Executar a aplicação demora
• No geral testa-se apenas o que você pensa que alterou
O bater de asas de uma borboleta em Tóquio pode provocar um furacão em Nova Iorque
“ ”
Globalcode – open4education25 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Monkey
Globalcode – open4education26 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Monkey
• Executar a aplicação demora
• É bom para encontrar alguns bugs
• Testes não são apenas sobre bugs!
Globalcode – open4education27 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Testers
Globalcode – open4education28 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Testers
• São importantes!
• Executar a aplicação demora!
• Feedback demora!
• Bom para encontrar bugs
• Código construído sobre bug gera mais bugs!
Globalcode – open4education29 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
O que são testes?
• Maneira verificável de garantir que o software atende às necessidades de negócio e que funciona como esperado.
• Temos isso?
Globalcode – open4education30 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Por que não testar?
?
Globalcode – open4education31 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Por que não testar?
• Demora
Globalcode – open4education32 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Por que não testar?
• Eu sou senior!
Globalcode – open4education33 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Por que não testar?
• Estamos sem tempo
Globalcode – open4education34 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Bad news...
Mentira!
Globalcode – open4education35 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Por que não testar?
• Acredite: você não é bom o bastante!
• Testar pode consumir algum tempo, mas é necessário!
• Deixar de testar não te faz mais rápido, dá apenas uma falsa sensação de velocidade.
Globalcode – open4education36 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
É uma cilada Bino!
Globalcode – open4education37 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Vamos aproveitar a vida!
Globalcode – open4education38 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Unit Tests
• Testes unitários
• Pedaço de código
• Executa outro pedaço de código
• Verifica se tudo está correto
Globalcode – open4education39 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Unit Tests
• Escritos pelo desenvolvedor
• Rápidos de excutar
• Testam uma única unidade de código
Globalcode – open4education40 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Unit Tests
• Testes de unidade!– Unidade é um método ou função, uma
operação
• SUT– System Under Test
• Class• Method• Code
Globalcode – open4education41 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Unit Tests
• Executam de forma automatizada
• São repetíveis
• Qualquer um pode executar
• One click execution!
Globalcode – open4education42 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Unit Tests
• Provém feedback quase instantâneo
• Auxiliam o design da funcionalidade– Escrever testes tem de ser fácil– Está difícil? Refatore!
• Ajudam a realizar alterações
• Ajudam com regressões– Algo que funcionava e não funciona mais
Globalcode – open4education43 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Unit Tests
• E as desvantagens...
Globalcode – open4education44 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Nosso primeiro Unit Test
Globalcode – open4education45 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
MSTest
• Framework de Testes da Microsoft
• Fornece ferramentas necessárias para Unit Testing
• Ferramenta Command Line para executar Unit Tests
Globalcode – open4education46 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
MSTest
• Atributos para criação de testes– [TestClass]– [TestMethod]
• Métodos para asserção dos testes– Assert methods
• Rodador de testes integrado com Visual Studio
Globalcode – open4education47 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Conhecendo os atributos e métodos de Assert
Globalcode – open4education48 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Framework e Runner
• O teste é diferente de quem executa o teste
Globalcode – open4education49 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Framework e Runner
• Framework é um conjunto de bibliotecas
• Contém métodos de assert, atributos, helpers, define estrutura dos testes
• MSTest, NUnit, MbUnit, etc.
Globalcode – open4education50 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Framework e Runner
• Runner, ou rodador, é quem de fato executa os testes
• Um runner pode executar testes de vários frameworks
• Pode ser integrado a IDE, ser um command line ou um .exe
Globalcode – open4education51 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Diferença entre framework e runner
Globalcode – open4education52 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Anatomia AAA
• Testes no geral são curtos
• Basicamente seguem o padrão AAA
• Arrange
• Act
• Assert
Globalcode – open4education53 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Anatomia AAA
• Arrange– Você prepara o ambiente para o teste– Configura variáveis, objetos, monta relações– Prepara tudo que for necessário para que o
teste execute
Globalcode – open4education54 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Sobre o Arrange
• Em algumas situações o Arrange pode ser reaproveitado– [Setup]– [TestInitialize]– [FixtureSetup]
• O Arrange pode ser extenso
Globalcode – open4education55 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Arrange extenso
Globalcode – open4education56 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Anatomia AAA
• Act– É a execução do SUT– É a chamada para o método que está sendo
testado– É a execução da operação a ser testada
Globalcode – open4education57 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Sobre o Act
• Um teste deve atuar independente dos outros
• Um Act com muitos métodos é sinal de problema
Globalcode – open4education58 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Anatomia AAA
• Assert– É a verificação do resultado – Neste ponto faz-se a análise do resultado do
Act com o que era esperado
Globalcode – open4education59 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Sobre o Assert
• Um teste no geral tem apenas um Assert
• Mais de um Assert no teste mascara erros
Globalcode – open4education60 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Conhecendo a anatomia AAA de um teste
• setup e teardown
Globalcode – open4education61 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
NUnit
• Framework de unit testing
• Portado do JUnit
• Hoje é 100% escrito em C#
• Um dos frameworks mais utilizados
Globalcode – open4education62 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
NUnit
• Interfaces fluentes
• Asserções mais legíveis
• Mais opções de asserções
Globalcode – open4education63 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Conhecendo o NUnit
Globalcode – open4education64 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Exceptions
• E quando queremos uma exception?
• Exceptions podem ser regras de negócio
• Geralmente uma exception falha o teste
• Precisamos deixar claro que queremos isto ou não
Globalcode – open4education65 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demos
• Exceptions no MSTest
• Exceptions no NUnit
Globalcode – open4education66 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
TDD
• Test Driven Development
Globalcode – open4education67 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Não é (só)sobre testes
Globalcode – open4education68 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
TDD
• Basicamente segue o mantra:– Red, green, refactor
• Escreva um teste que falhe
• Faça o teste passar
• Refatore/melhor o código
Globalcode – open4education69 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
TDD
• Escrever os testes antes do código de produção
• Escrever código que o teste pediu
• Resultados:– Testes– Melhor design
• Menos acoplamento (acoplamento estável)• Classes e métodos coesos• Clareza no código
Globalcode – open4education70 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
TDD
• Por que teste antes?– O teste é o primeiro cliente do seu código– Faça como você gostaria que fosse– Ficou difícil? Talvez seja melhor pensar mais
Globalcode – open4education71 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
TDD
Globalcode – open4education72 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
TDD
• Vicia!
Globalcode – open4education73 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Praticando um pouco de TDD
Globalcode – open4education74 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Stubs e Mocks
• Servem para gerenciarmos dependências nos testes
• Ambos são objetos fake, “imitam” objetos reais
• São muito parecidos, mas têm propósitos distintos
Globalcode – open4education75 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Stubs
• Substitui de forma controlável uma dependência externa
• Mantém o teste em nossas mãos– Repetível– Rápido– Isolado
• Um Stub não fará o teste falhar
• Asserts não são feitos contra os Stubs
• Fornecem algum estado para o SUT
Globalcode – open4education76 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Conhecendo um Stub
Globalcode – open4education77 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Mocks
• É um objeto que reage às interações com o SUT
• Tem poder para falhar o teste
• Assert é realizado contra o mock
• Um mock por teste– SRP até no teste!
Globalcode – open4education78 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Conhecendo um Mock
Globalcode – open4education79 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Stubs e Mocks
• Indispensáveis
• Sem eles testar é doloroso e custoso
• Criá-los na mão é doloroso e custoso
• Gera muito retrabalho
• Gasta-se muito tempo
• Testar fica chato!
Globalcode – open4education80 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Frameworks de Mock
• Frameworks de isolamento
• Criam Mocks e Stubs de forma simples
• Não há retrabalho
• Lidam com vários tipos de configuração, sem causar dores
Globalcode – open4education81 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Frameworks de isolamento
• Moq
• Rhino Mocks
• TypeMock/Isolator 2010
• JustMock
Globalcode – open4education82 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Moq
• Fala-se: Mock you!
• API bastante simples
• Usa .NET 3.5– Lambdas e Linq
• Cria Stubs e Mocks
Globalcode – open4education83 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Demo
• Utilizando Moq com Stubs e Mocks
Globalcode – open4education84 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Links
• http://msdn.microsoft.com/en-us/library/ms182489%28VS.80%29.aspx
• http://code.google.com/p/moq/
• http://www.nunit.org/
• http://www.ayende.com/projects/rhino-mocks.aspx
• http://www.testdriven.net/
• http://martinfowler.com/articles/mocksArentStubs.html
• http://vimeo.com/user3553347/videos
• http://viniciusquaiato.com/blog/category/tdd/
• http://www.aniche.com.br/
Globalcode – open4education85 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Books
• The Art of Unit Testing
• Test Driven Development by example
• Growing Object-Oriented Software Guided by Tests
Globalcode – open4education86 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
Contact: me
• http://viniciusquaiato.com
• [email protected]– msn e gtalk
• @vquaiato
Globalcode – open4education87 Vinicius Quaiato @vquaiato http://viniciusquaiato.com
So...
• Thank you!