87
Globalcode – open4education Vinicius Quaiato @vquaiato http://viniciusquaiato.com Testes na plataforma .NET Começando a desenvolver com confiança

Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Embed Size (px)

DESCRIPTION

Slides do minicursos de Testes na plataforma .NET ministrado por Vinicius Quaiato na Globalcode em São Paulo.

Citation preview

Page 1: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education1 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Testes na plataforma .NET

Começando a desenvolver com confiança

Page 2: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 3: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education3 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Contact: me

• http://viniciusquaiato.com

[email protected]– msn e gtalk

• @vquaiato

Page 4: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education4 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Lambda3

• Parceria

• http://lambda3.com.br

Page 5: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education5 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Objetivos

Page 6: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education6 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

About: you

• Nome

• Expectativa

Page 7: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education7 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Page 8: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education8 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Fazer software dói

Page 9: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education9 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Fazer software cansa

Page 10: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education10 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Fazer software é difícil

Page 11: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education11 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Mas...

Page 12: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education12 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Precisa ser diferente!

Page 13: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 14: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education14 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

And the life becomes sad...

Page 15: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education15 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Mas...

Page 16: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 17: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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.

Page 18: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education18 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Por que testar?

• Saber que algo funciona

Page 19: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education19 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Por que testar?

• Saber que algo terminou, ficou pronto

Page 20: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education20 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Como testamos hoje??

Page 21: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education21 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Ctrl + Shift + B

Page 22: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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!

Page 23: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education23 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

F5

Page 24: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

“ ”

Page 25: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education25 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Monkey

Page 26: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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!

Page 27: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education27 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Testers

Page 28: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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!

Page 29: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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?

Page 30: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education30 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Por que não testar?

?

Page 31: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education31 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Por que não testar?

• Demora

Page 32: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education32 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Por que não testar?

• Eu sou senior!

Page 33: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education33 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Por que não testar?

• Estamos sem tempo

Page 34: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education34 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Bad news...

Mentira!

Page 35: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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.

Page 36: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education36 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

É uma cilada Bino!

Page 37: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education37 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Vamos aproveitar a vida!

Page 38: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 39: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education39 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Unit Tests

• Escritos pelo desenvolvedor

• Rápidos de excutar

• Testam uma única unidade de código

Page 40: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 41: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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!

Page 42: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 43: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education43 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Unit Tests

• E as desvantagens...

Page 44: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education44 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Nosso primeiro Unit Test

Page 45: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 46: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 47: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education47 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Conhecendo os atributos e métodos de Assert

Page 48: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education48 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Framework e Runner

• O teste é diferente de quem executa o teste

Page 49: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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.

Page 50: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 51: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education51 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Diferença entre framework e runner

Page 52: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 53: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 54: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 55: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education55 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Arrange extenso

Page 56: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 57: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 58: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 59: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 60: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education60 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Conhecendo a anatomia AAA de um teste

• setup e teardown

Page 61: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 62: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education62 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

NUnit

• Interfaces fluentes

• Asserções mais legíveis

• Mais opções de asserções

Page 63: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education63 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Conhecendo o NUnit

Page 64: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 65: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education65 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demos

• Exceptions no MSTest

• Exceptions no NUnit

Page 66: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education66 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

TDD

• Test Driven Development

Page 67: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education67 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Não é (só)sobre testes

Page 68: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 69: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 70: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 71: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education71 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

TDD

Page 72: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education72 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

TDD

• Vicia!

Page 73: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education73 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Praticando um pouco de TDD

Page 74: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 75: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 76: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education76 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Conhecendo um Stub

Page 77: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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!

Page 78: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education78 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Conhecendo um Mock

Page 79: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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!

Page 80: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 81: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education81 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Frameworks de isolamento

• Moq

• Rhino Mocks

• TypeMock/Isolator 2010

• JustMock

Page 82: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 83: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education83 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Demo

• Utilizando Moq com Stubs e Mocks

Page 84: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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/

Page 85: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

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

Page 86: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education86 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

Contact: me

• http://viniciusquaiato.com

[email protected]– msn e gtalk

• @vquaiato

Page 87: Minicurso Testes em .NET - Globalcode Vinicius Quaiato

Globalcode – open4education87 Vinicius Quaiato @vquaiato http://viniciusquaiato.com

So...

• Thank you!