Top Banner
Dublês de Teste @marcosbrizeno
30

Dubles de teste

Aug 27, 2014

Download

Software

Marcos Brizeno

Apresentação simples e direta sobre os cinco tipos de dublês: stub, fake, dummy, mock e spy.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Dubles de teste

Dublês de Teste@marcosbrizeno

Page 2: Dubles de teste
Page 3: Dubles de teste

Mocks ou Dublês

Mock -> Um tipo de Dublê

Dublê -> Stub,Fake,Dummy,Spy e Mock

Formalmente -> Dublê de Teste (Test Double)

Informalmente -> Mock

Page 4: Dubles de teste
Page 5: Dubles de teste

Stubs

Substitui um comportamento

Pode retornar um valor

Page 6: Dubles de teste

def find_overpriced_items_in(items_list) items = Item.find(items_list) items.select do |item| average_price = AveragePrice::Service.get_average_price(item.global_id) item.price > (average_price * 1.2) endend

should "return all overpriced items in the list" do overpriced_item = Factory.create_item :price => 125 AveragePrice::Service.stubs(:get_average_price).returns(100) assert_equal [overpriced_item], find_overpriced_items_in([overpriced_item])end

ExemploWeb

service

Stub do web service

Page 7: Dubles de teste

Fake

Substitui um objeto

Page 8: Dubles de teste

module AveragePrice class Service def get_average_price(global_id) 100 end endend

Exemplo

should "return all overpriced items in the list" do overpriced_item = Factory.create_item :price => 125 assert_equal [overpriced_item], find_overpriced_items_in([overpriced_item])end

Page 9: Dubles de teste

Fake

Podem ter regras

Page 10: Dubles de teste

module AveragePrice class Service ITEM_PRICE_100 = 1 ITEM_PRICE_200 = 2 def get_average_price(global_id) return 100 if(global_id == ITEM_PRICE_100) return 200 if(global_id == ITEM_PRICE_200) 150 end endend

Exemplo

Page 11: Dubles de teste

Stub vs Fake

Page 12: Dubles de teste

Dummy

Substitui um objeto

Não possui lógica

Page 13: Dubles de teste

class DummyItem def method_missing(method, *args, &block) nil endend

Exemplo

Page 14: Dubles de teste

Dummy

Page 15: Dubles de teste

Exemplo

should "return false if item price is less or equal than 20% plus average price" do dummy_item = DummyItem.new promo_item = PromoItem.new(dummy_item, :price => 100) AveragePrice::Service.stubs(:get_average_price).returns(120) assert_false promo_item.overpriced?end

should "return false if item price is less or equal than 20% plus average price" do promo_item = PromoItem.new(nil, :price => 100) AveragePrice::Service.stubs(:get_average_price).returns(120) assert_false promo_item.overpriced?end

tanto faz

Dummy

Page 16: Dubles de teste

Fake vs Dummy

Dummy é um Fake simplificado

Page 17: Dubles de teste

Fake vs DummyVoce pode não saber que usa

Page 18: Dubles de teste

Mock

Testar chamada de métodos

Parâmetros

Número de vezes

Page 19: Dubles de teste

class PromoItem def initialize(item) @item = item end! def overpriced? price > (AveragePrice::Service.get_average_price(@item.global_id)*1.2) endend

should "use AveragePrice service to get the average price" do item = Factory.create_item(:global_id => 99) promo_item = PromoItem.new(item, :price => 100)! AveragePrice::Service.expects(:get_average_price).with(item.global_id).once promo_item.overpriced?end

Exemplo

chamada esperada

uma única vez

parâmetro específico

Page 20: Dubles de teste

Spy

Testar chamada de métodos

Parâmetros

Número de vezes

Page 21: Dubles de teste

def remove_overpriced_items_in(items) items.reject do |item| item.overpriced? endend

should "use AveragePrice service to get the average price" do item_spy = mock() remove_overpriced_items_in([item_spy]) assert_received(item_spy, :overpriced) do |expect| expect.once endend

Exemplo

chamada esperadauma única

vez

Page 22: Dubles de teste

Mock vs Spy

Configuração

Ação

Asserção

Configuração

Expectativa

Ação

Page 23: Dubles de teste

Mock vs SpyAlto acoplamento

Page 24: Dubles de teste

Só Dublê

Rápidos

IsoladosSem significado

Page 25: Dubles de teste

Só Dublêshould “break hope in humanity" do item = Item.new item.stubs(:price).returns(200) assert_equal 200, item.priceend

Page 26: Dubles de teste

Sem Dublê

Dependências explícitas

Teste real

Impossível

Page 27: Dubles de teste

Sem Dublêdef promo_items_not_sold PromoItems.all( :conditions => ["created_on <= ? AND sold != ?”, DateTime.now - 2.days, true])end

Page 28: Dubles de teste
Page 29: Dubles de teste

Moar links

http://blog.8thlight.com/uncle-bob/2014/05/14/TheLittleMocker.html

https://www.destroyallsoftware.com/blog/2014/test-isolation-is-about-avoiding-mocks

http://www.thoughtworks.com/insights/blog/mockists-are-dead-long-live-classicists

www.thoughtworks.com/insights/blog/write-better-tests-5-steps

Page 30: Dubles de teste

Obrigado