behaviour-driven development com ruby

42
Behaviour-Driven Developement com Ruby Técnicas, ferramentas e experiências. Jony dos Santos Kostetzer

Upload: jony-dos-santos-kostetzer

Post on 26-Jan-2015

1.997 views

Category:

Technology


0 download

DESCRIPTION

Palestra sobre BDD ministrada no RS Rails 2009.* Os slides de "Live coding" foram alterados contendo o link para o repositório no GitHub.

TRANSCRIPT

Page 1: Behaviour-Driven Development com Ruby

Behaviour-Driven Developement com RubyTécnicas, ferramentas e experiências.

Jony dos Santos Kostetzer

Page 2: Behaviour-Driven Development com Ruby

Agenda

Definições

Por que escrever testes?

TDD e BDD

BDD

RSpec - explicações e live coding

Cucumber - explicações e live coding

Page 3: Behaviour-Driven Development com Ruby

Desenvolvimento orientado por testes

Em linhas gerais: Testar antes. Codificar depois.

“Como eu gostaria que minha aplicação se comportasse?”

Origem: eXtremme Programming

Page 4: Behaviour-Driven Development com Ruby

O Ciclo TDDred-green-refactor

Refactor Green

Red

Page 5: Behaviour-Driven Development com Ruby

Vantagens

1. Testando primeiro, você sabe exatamente o que seu sofware precisa fazer.

2. Foco: Escrever o código mais simples que resolve o problema.

3. Saber quando parar: Teste define quando se atinge o “suficiente”.

4. Código mais limpo e organizado.

Page 6: Behaviour-Driven Development com Ruby

Vantagens

5. Identificar o mais cedo possível problemas de regressão.

6. Segurança e refactoring sem medo.

7. Satisfação!

Page 7: Behaviour-Driven Development com Ruby

MANUTENABILIDADE!

Page 8: Behaviour-Driven Development com Ruby

Manutenabilidade?

Quão fácil é modificar o software.

Testes são fundamentais neste quesito - considerar o futuro.

Codigo sem testes = código legado.

Funciona? Sorte!

Além de tudo: seu código, sua carreira!

Page 9: Behaviour-Driven Development com Ruby

Bons programadores conseguem resolver um problema proposto de alguma forma.

Page 10: Behaviour-Driven Development com Ruby

Programadores excepcionais os resolvem de forma sustentável.

Page 11: Behaviour-Driven Development com Ruby

BDD - Behaviour-Driven Development

TDD + Novo Vocabulário + Novo ponto de vista

Ferramenta de design.

Nova abordagem: Foco em especificações de comportamento e não nos testes de verificação.

Testes são o meio. Ou seja, especificar comportamento utilizando testes.

Escrever software que importa!

Documentação executável

Clareza do código - comportamento

Page 12: Behaviour-Driven Development com Ruby

Testes em Ruby

Diversos frameworks.

Melhor x pior: Apenas escolha o que melhor lhe convir!

test/unit

miniunit

Shoulda

Micronaut

test-spec

RSpec

Cucumber

Page 13: Behaviour-Driven Development com Ruby

RSpec

DSL (Domain-Specific Language) para descrever comportamento de objetos.

Expressividade

Legibilidade

Similar a estar falando com um cliente.

Page 14: Behaviour-Driven Development com Ruby

BDD - Novo vocabulário

test/unit rspec

Asserções Expectativasshould /

should_not

Método de teste

Exemplo de código

it()

Caso de teste

Grupo de exemplos

describe()

Page 15: Behaviour-Driven Development com Ruby

Terminologias

test/unit rspec

class SomeClassTest < Test::Unit::TestCase

describe SomeClass

def test_something it "should do something descriptive"

def setup before(:each)

def teardown after(:each)

assert_equal 4, array.length array.length.should == 4

Page 16: Behaviour-Driven Development com Ruby

Grupo de exemplos (Example group)

describe Client do ... end

describe “A bank transaction” do ... end

describe Document, “being shared” do ... end

Page 17: Behaviour-Driven Development com Ruby

Exemplos de código (code examples)

it “should require a valid username” do ... end

it “should not charge a user when he has sufficient credits for the payment” do ... end

it “should not retrieve expired documents” do ... end

Page 18: Behaviour-Driven Development com Ruby

Expectativas (Expectations)

“ “.should be_blank

user.birthday.should == Date.today

client.active?.should be_false

client.should_not be_active

message.should match(/on Sunday/)

team.should have(11).players

Page 19: Behaviour-Driven Development com Ruby

Integrandoexample groups + code examples

Page 20: Behaviour-Driven Development com Ruby

Integrandoexample groups + code examples

Page 21: Behaviour-Driven Development com Ruby

Integrandoexample groups + code examples + contexts

Page 22: Behaviour-Driven Development com Ruby

Code examples

Page 23: Behaviour-Driven Development com Ruby

Matchers pré-existentes

Igualdade

===, ==, eql, equal

Texto

should match(/regex/), =~

Array

should include, length.should, have(3).items

Page 24: Behaviour-Driven Development com Ruby

Matchers

o.should be_closed -> o.closed?.should be_true

o.should be_an_instance_of(String) -> o.instance_of?(String).should be_true

o.should have_key(:id) -> o.has_key?(:id).should be_true

o.should have(5).characters -> o.characteres.length.should == 5

o.should have_at_least(12).rooms -> o.rooms.length.should >= 12

o.should be <= 7

Page 25: Behaviour-Driven Development com Ruby

Before/After

Antes de cada exemplo:

before(:each)

after(:each)

Antes de cada grupo de exemplos:

before(:all)

after(:all)

Page 26: Behaviour-Driven Development com Ruby

Outros idiomas

lambda { #codigo }.should change(algo) - (by, from, to)

lambda { #codigo }.should raise_error

lambda { #codigo }.should throw_symbol

Page 27: Behaviour-Driven Development com Ruby

Live codingRSpec

http://github.com/jonysk/rsrails_rspec

Page 28: Behaviour-Driven Development com Ruby

Cucumber

Ferramenta para descrever comportamento a partir da camada superior

No Rails: das views para os models. Substituem os Testes de Integração

Foco na interface e depois camadas inferiores (Outside-in)

O que o usuário espera? - Colaboração entre stakeholders e desenvolvedores para especificar.

Testes de aceitação

Page 29: Behaviour-Driven Development com Ruby

E por que não começar nos models? (Inside-out)

Construir o que você precisa ao invés do que você acha que precisa.

Descoberta gradual do que precisa ser implementado em baixo nível.

Page 30: Behaviour-Driven Development com Ruby

Relação Cucumber e RSpec

Cucumber: descrever o comportamento da aplicação.

“Make sure you’re writing the right code”

RSpec: descrever o comportamento dos objetos

“Make sure you’re writing the code right”

Red-green-refactor permanece:

Inicia no ciclo externo (Cucumber)

Termina no ciclo interno (RSpec)

Page 31: Behaviour-Driven Development com Ruby

Instalação

RSpec

gem install rspec rspec-rails

Para utilizar com Rails:

Dentro do projeto: script/generate rspec

Cucumber + webrat

gem install cucumber webrat

Para utilizar com Rails:

Dentro do projeto: script/generate cucumber

Page 32: Behaviour-Driven Development com Ruby

Cucumber features

Título / Narrativa / Cenários

Page 33: Behaviour-Driven Development com Ruby

Exemplo de feature

Page 34: Behaviour-Driven Development com Ruby

Internacionalização!

Page 35: Behaviour-Driven Development com Ruby

Implementando dos passos

Page 36: Behaviour-Driven Development com Ruby

Cucumber + webrat

Simulação de um browser

Comandos de integração intuitivos:

fill_in “campo”, :with => “valor”

visit “/pagina”

check “campo”

click_button “campo”

Page 37: Behaviour-Driven Development com Ruby

Matchers principais

should contain(‘text’)

should have_selector(‘#menu ul li.selected”, :content => “Dashboard”)

CSS3

should have_xpath(‘//node[@prop=”value”]’)

Page 38: Behaviour-Driven Development com Ruby

Implementando dos passos

Page 39: Behaviour-Driven Development com Ruby

Live codingCucumber

http://github.com/jonysk/rsrails_cucumber

Page 40: Behaviour-Driven Development com Ruby

Webrat + Selenium

gem install selenium-client

Habilitando Selenium no env.rb:

Desabilitar fixtures transacionais:

# Cucumber::Rails.use_transactional_fixtures

Webrat.configure do |config| config.mode = :selenium

end

Page 41: Behaviour-Driven Development com Ruby

Outros tópicos

Integração continua (Integrity, CruiseControl.rb)

Ferramentas: autotest, rcov, heckle, etc

Macros: muito atenção.

Page 42: Behaviour-Driven Development com Ruby

Obrigado!

twitter: @jonysk jonysk.net

[email protected]