Dubles de Testes - Na Pratica

42
Parte 2 Ismael Soares

description

Nesta segunda parte da apresentação, Ismael explica como e quando utilizar cada Duble de Teste. No Final, faz comparações e conclui com dicas valiosas para serem usadas no dia-a-dia.

Transcript of Dubles de Testes - Na Pratica

Page 1: Dubles de Testes - Na Pratica

Parte 2

Ismael Soares

Page 2: Dubles de Testes - Na Pratica
Page 3: Dubles de Testes - Na Pratica
Page 4: Dubles de Testes - Na Pratica

Nota Fiscal Item

Produto Cliente

Add Item

Page 5: Dubles de Testes - Na Pratica
Page 6: Dubles de Testes - Na Pratica

Os métodos de um Dummy

Nunca podem ser chamados

Page 7: Dubles de Testes - Na Pratica
Page 8: Dubles de Testes - Na Pratica
Page 9: Dubles de Testes - Na Pratica
Page 10: Dubles de Testes - Na Pratica
Page 11: Dubles de Testes - Na Pratica

Como causar a Exception?

Page 12: Dubles de Testes - Na Pratica
Page 13: Dubles de Testes - Na Pratica
Page 14: Dubles de Testes - Na Pratica

Como testar uma String (HTML) gerada dinâmicamente?

Page 15: Dubles de Testes - Na Pratica
Page 16: Dubles de Testes - Na Pratica
Page 17: Dubles de Testes - Na Pratica
Page 18: Dubles de Testes - Na Pratica
Page 19: Dubles de Testes - Na Pratica
Page 20: Dubles de Testes - Na Pratica
Page 21: Dubles de Testes - Na Pratica
Page 22: Dubles de Testes - Na Pratica

Mocks ou

Stubs?

Page 23: Dubles de Testes - Na Pratica

No artigo: “Mocks aren’t Stubs”, Martin Fowler explica:

Stub – é apropriado para testar estado

Mock – é apropriado para testar comportamento

Page 24: Dubles de Testes - Na Pratica

public interface MailService { public void send (Message msg);

}

public class MailServiceStub implements MailService { private List<Message> messages = new ArrayList<Message>(); public void send (Message msg) { messages.add(msg); }

public int numberSent() { return messages.size(); }}

Exemplo - estado

class OrderStateTester... public void testOrderSendsMailIfUnfilled() { Order order = new Order(TALISKER, 51); MailServiceStub mailer = new MailServiceStub(); order.setMailer(mailer); order.fill(warehouse); assertEquals(1, mailer.numberSent()); }

Page 25: Dubles de Testes - Na Pratica

class OrderInteractionTester... public void testOrderSendsMailIfUnfilled() {

Order order = new Order(TALISKER, 51); Mock warehouse = mock(Warehouse.class); Mock mailer = mock(MailService.class); order.setMailer((MailService) mailer.proxy());

mailer.expects(once()).method("send"); warehouse.expects(once()).method("hasInventory") .withAnyArguments() .will(returnValue(false));

order.fill((Warehouse) warehouse.proxy()); }}}

Exemplo - comportamento

Page 26: Dubles de Testes - Na Pratica

Mocks ou

Spys?

Page 27: Dubles de Testes - Na Pratica

Verificação de comportamento efetuado (tudo roda)

1. A unidade sob teste é chamada

2.O spy captura informações

3.O teste verifica se elas estão corretas

Test Spy

Page 28: Dubles de Testes - Na Pratica

Test Mock

Especificação do comportamento esperado (falha cedo)

1.O mock é carregado com as chamadas esperadas

2.A unidade sob teste é chamada – se algo der errado os testes falham

Page 29: Dubles de Testes - Na Pratica

Quem precisa de tantos dublês quando

se tem o mock?

Mock O multi-uso dos testes

Page 30: Dubles de Testes - Na Pratica

Nem sempre o mais “fácil” é o melhor!

Page 31: Dubles de Testes - Na Pratica

Então devo ser

Classista ou

Mockista?

Page 32: Dubles de Testes - Na Pratica

O estilo TDD clássico utiliza objetos reais quando possível e um similar no caso contrário.

Um praticante do TDD Mockista, sempre irá utilizar um mock para qualquer objeto que tenha um comportamento interessante.

Page 33: Dubles de Testes - Na Pratica

Mas o ideal é ficar com as diferenças.

Não ser extremo!

Page 34: Dubles de Testes - Na Pratica

Como escolher?

Page 35: Dubles de Testes - Na Pratica

Analise o contexto

Há interações entre os objetos?

Use MOCK

Estas interações são importantes?

A quantidade e a ordem das interações são relevantes?

Caso contrário considere a possibilidade de usar outros dublês

Page 36: Dubles de Testes - Na Pratica

Reutilização

Será que isto que estou fazendo não será util em outras ocasiões?

Page 37: Dubles de Testes - Na Pratica

Não complique!

Procure fazer as coisas o mais legível possível

Page 38: Dubles de Testes - Na Pratica

Vantagens de usar dublês

Isola testes de unidade (bug em uma unidade não afeta testes da outra)

Acelera preparação ou execução dos testes

Permite testar mesmo que alguma componente não esteja pronta ou disponível

Evita efeitos colaterais indesejáveis

Page 39: Dubles de Testes - Na Pratica

Ferramentas para criar dublêsGenéricas:

Jmock EasyMockMockitoPowerMockJMockit

Específicas de APIsMockrunnerEJBMockSpringUnit

FakesWeb containers leves, BDs / ORMs

emmemória, HTMLUnit

Page 40: Dubles de Testes - Na Pratica
Page 41: Dubles de Testes - Na Pratica

Links Imagens

http://www.rethinkware.com/download/attachments/557237/testesunitarios.JPG?version=1&modificationDate=1274749852384http://www.yogodoshi.com/blog/wp-content/uploads/hacker2.jpghttp://3.bp.blogspot.com/__8RKQKezcsk/TQee5_GRrEI/AAAAAAAABtk/-RNZUvv3Boo/s1600/0000+ideia.jpghttp://www.corposaudavel.net/wp-content/uploads/beneficios-laranja.jpghttp://dojofloripa.wordpress.com/2006/10/17/trabalhando-com-stubs/http://i.s8.com.br/images/sport/cover/img2/21203992_4.jpghttp://www.stanford.edu/group/storytelling/cgi-bin/joomla/images/stories/Impostor.jpghttp://www.mxmasters.com.br/wp-content/uploads/2010/02/falso2.jpghttp://cdn.osabetudo.com/wp-content/uploads/2011/06/o_pensador_do_seculo_xxi_474185-257x300.jpghttp://alliancecoaching.files.wordpress.com/2009/10/multi-tarefa.pnghttp://www.guiadariviera.com.br/images/rivieraReciclagem/setas.jpg

Page 42: Dubles de Testes - Na Pratica

Referências

Artigo do Martin Fowler (Mocks Aren't Stubs)http://www.infoq.com/br/articles/mocks-Arent-Stubs#4

Curso de verão com Mariana Bravohttp://ccsl.ime.usp.br/agilcoop/files/TestesAutomatizados-3-1-Dubles-AgilCoop-Verao2009.pdf

Livro: xUnit Patternshttp://xunitpatterns.com/Test%20Spy.html