SlideShare a Scribd company logo
1 of 42
Download to read offline
Behaviour-Driven
Developement com Ruby
Técnicas, ferramentas e experiências.


Jony dos Santos Kostetzer
Agenda
Definições
Por que escrever testes?
TDD e BDD
BDD
RSpec - explicações e live coding
Cucumber - explicações e live coding
Desenvolvimento orientado
por testes

Em linhas gerais: Testar antes. Codificar depois.
“Como eu gostaria que minha aplicação se
comportasse?”
Origem: eXtremme Programming
O Ciclo TDD
red-green-refactor



                     Red




        Refactor           Green
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.
Vantagens


5. Identificar o mais cedo possível problemas de
   regressão.
6. Segurança e refactoring sem medo.
7. Satisfação!
MANUTENABILIDADE!
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!
Bons programadores
conseguem resolver um
problema proposto de alguma
forma.
Programadores excepcionais os
resolvem de forma sustentável.
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
Testes em Ruby
Diversos frameworks.
Melhor x pior: Apenas escolha o que melhor lhe convir!
  test/unit
  miniunit
  Shoulda
  Micronaut
  test-spec
  RSpec
  Cucumber
RSpec

DSL (Domain-Specific Language) para descrever
comportamento de objetos.
Expressividade
Legibilidade
Similar a estar falando com um cliente.
BDD - Novo vocabulário
     test/unit      rspec

                                 should /
    Asserções    Expectativas
                                should_not
    Método de    Exemplo de
                                   it()
      teste        código
     Caso de      Grupo de
                                describe()
      teste       exemplos
Terminologias
         test/unit                      rspec
   class SomeClassTest <         describe SomeClass
     Test::Unit::TestCase
                                it "should do something
     def test_something
                                       descriptive"
         def setup                   before(:each)

       def teardown                   after(:each)

assert_equal 4, array.length   array.length.should == 4
Grupo de exemplos
(Example group)

describe Client do ... end
describe “A bank transaction” do ... end
describe Document, “being shared” do ... end
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
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
Integrando
example groups + code examples
Integrando
example groups + code examples
Integrando
example groups + code examples + contexts
Code examples
Matchers pré-existentes
Igualdade
  ===, ==, eql, equal
Texto
  should match(/regex/), =~
Array
  should include, length.should, have(3).items
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
Before/After
 Antes de cada exemplo:
   before(:each)
   after(:each)
 Antes de cada grupo de exemplos:
   before(:all)
   after(:all)
Outros idiomas


lambda { #codigo }.should change(algo) - (by, from, to)
lambda { #codigo }.should raise_error
lambda { #codigo }.should throw_symbol
Live coding
         RSpec
http://github.com/jonysk/rsrails_rspec
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
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.
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)
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
Cucumber features
Título / Narrativa / Cenários
Exemplo de feature
Internacionalização!
Implementando dos passos
Cucumber + webrat
Simulação de um browser
Comandos de integração intuitivos:
  fill_in “campo”, :with => “valor”
  visit “/pagina”
  check “campo”
  click_button “campo”
Matchers principais

 should contain(‘text’)
 should have_selector(‘#menu ul li.selected”, :content
 => “Dashboard”)
   CSS3
 should have_xpath(‘//node[@prop=”value”]’)
Implementando dos passos
Live coding
      Cucumber
http://github.com/jonysk/rsrails_cucumber
Webrat + Selenium
gem install selenium-client
Habilitando Selenium no env.rb:
 Webrat.configure do |config|
   config.mode = :selenium
 end
Desabilitar fixtures transacionais:
  # Cucumber::Rails.use_transactional_fixtures
Outros tópicos


Integração continua (Integrity, CruiseControl.rb)
Ferramentas: autotest, rcov, heckle, etc
Macros: muito atenção.
Obrigado!
twitter: @jonysk
   jonysk.net
jony@jonysk.net

More Related Content

What's hot

Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascriptLaís Lima
 
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptTDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptRogério Moraes de Carvalho
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesDavid Robert Camargo de Campos
 
Dito Tech Talk RSpec
Dito Tech Talk RSpecDito Tech Talk RSpec
Dito Tech Talk RSpecguest49d83b2
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPiMasters
 
BDD - JBehave + SeleniumHQ + PhantomJS + Fixture Factory
BDD - JBehave + SeleniumHQ + PhantomJS  + Fixture FactoryBDD - JBehave + SeleniumHQ + PhantomJS  + Fixture Factory
BDD - JBehave + SeleniumHQ + PhantomJS + Fixture FactoryAndre Vinicius Buzzo
 
Javascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosJavascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosWesley Lemos
 
Xdebug seus problemas acabaram - tdc floripa 2017
Xdebug   seus problemas acabaram - tdc floripa 2017Xdebug   seus problemas acabaram - tdc floripa 2017
Xdebug seus problemas acabaram - tdc floripa 2017Vitor Mattos
 
BDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasBDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasVitor Mattos
 
tmn - Introdução ao JavaScript
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScriptClaudio Gamboa
 
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...iMasters
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoronaldoferraz
 
Introdução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyIntrodução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyDiego Rubin
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoPaula Grangeiro
 

What's hot (20)

[Node js] frameworks de testes end to-end baseados em nodejs
[Node js] frameworks de testes end to-end baseados em nodejs [Node js] frameworks de testes end to-end baseados em nodejs
[Node js] frameworks de testes end to-end baseados em nodejs
 
Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascript
 
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScriptTDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
TDC 2011 Goiânia: Evolução da linguagem de programação JavaScript
 
Robustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefesRobustez de Software - Como ouvir menos reclamações dos seus chefes
Robustez de Software - Como ouvir menos reclamações dos seus chefes
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Dito Tech Talk RSpec
Dito Tech Talk RSpecDito Tech Talk RSpec
Dito Tech Talk RSpec
 
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHPPHP Experience 2016 - [Palestra] Rumo à Certificação PHP
PHP Experience 2016 - [Palestra] Rumo à Certificação PHP
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
BDD - JBehave + SeleniumHQ + PhantomJS + Fixture Factory
BDD - JBehave + SeleniumHQ + PhantomJS  + Fixture FactoryBDD - JBehave + SeleniumHQ + PhantomJS  + Fixture Factory
BDD - JBehave + SeleniumHQ + PhantomJS + Fixture Factory
 
Javascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosJavascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - Conceitos
 
Xdebug seus problemas acabaram - tdc floripa 2017
Xdebug   seus problemas acabaram - tdc floripa 2017Xdebug   seus problemas acabaram - tdc floripa 2017
Xdebug seus problemas acabaram - tdc floripa 2017
 
BDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemasBDD: Torne viva a documentação de seus sistemas
BDD: Torne viva a documentação de seus sistemas
 
tmn - Introdução ao JavaScript
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScript
 
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
PHP Experience 2016 - [Palestra] Vagrant, LXC, Docker, etc: Entenda as difere...
 
Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014
 
Criando sua própria linguagem de programação
Criando sua própria linguagem de programaçãoCriando sua própria linguagem de programação
Criando sua própria linguagem de programação
 
Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
 
Introdução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação RubyIntrodução a Linguagem de Programação Ruby
Introdução a Linguagem de Programação Ruby
 
Testes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de códigoTestes unitários como ferramentas de design de código
Testes unitários como ferramentas de design de código
 
DDD - Linguagem Ubíqua
DDD - Linguagem UbíquaDDD - Linguagem Ubíqua
DDD - Linguagem Ubíqua
 

Viewers also liked

Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Maurício Linhares
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizadosRodrigo Maia
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 
Plano de projeto - Sistema de Remoção de Servidores
Plano de projeto - Sistema de Remoção de ServidoresPlano de projeto - Sistema de Remoção de Servidores
Plano de projeto - Sistema de Remoção de ServidoresDiego Armando
 
O que faz (ou não) um tester no mundo ágil
O que faz (ou não) um tester no mundo ágilO que faz (ou não) um tester no mundo ágil
O que faz (ou não) um tester no mundo ágilSamanta Cicilia
 
Testes ágeis
Testes ágeisTestes ágeis
Testes ágeisQualister
 
JavaScript Applications
JavaScript ApplicationsJavaScript Applications
JavaScript ApplicationsLuciano Costa
 
Cuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecCuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecMaurício Linhares
 
Plano de gerenciamento_da_qualidade
Plano de gerenciamento_da_qualidadePlano de gerenciamento_da_qualidade
Plano de gerenciamento_da_qualidadeSharles Sa
 
Demoiselle 3 Está chegando a hora
Demoiselle 3 Está chegando a horaDemoiselle 3 Está chegando a hora
Demoiselle 3 Está chegando a horaVanderson Silva
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMaurício Linhares
 
Demoiselle Behave - Visão Geral
Demoiselle Behave - Visão GeralDemoiselle Behave - Visão Geral
Demoiselle Behave - Visão GeralVanderson Silva
 

Viewers also liked (20)

Ajax em java
Ajax em javaAjax em java
Ajax em java
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010
 
Aplicações Web Ricas e Acessíveis
Aplicações Web Ricas e AcessíveisAplicações Web Ricas e Acessíveis
Aplicações Web Ricas e Acessíveis
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizados
 
BDD com Cucumber
BDD com CucumberBDD com Cucumber
BDD com Cucumber
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Plano de projeto - Sistema de Remoção de Servidores
Plano de projeto - Sistema de Remoção de ServidoresPlano de projeto - Sistema de Remoção de Servidores
Plano de projeto - Sistema de Remoção de Servidores
 
O que faz (ou não) um tester no mundo ágil
O que faz (ou não) um tester no mundo ágilO que faz (ou não) um tester no mundo ágil
O que faz (ou não) um tester no mundo ágil
 
Testes Rápidos
Testes RápidosTestes Rápidos
Testes Rápidos
 
Testes ágeis
Testes ágeisTestes ágeis
Testes ágeis
 
JavaScript Applications
JavaScript ApplicationsJavaScript Applications
JavaScript Applications
 
Docker e suas tecnologias
Docker e suas tecnologiasDocker e suas tecnologias
Docker e suas tecnologias
 
Cuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpecCuso Ruby - Aula 05 - Testes com RSpec
Cuso Ruby - Aula 05 - Testes com RSpec
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
BDD em Ação - Testadores 2015
BDD em Ação - Testadores 2015BDD em Ação - Testadores 2015
BDD em Ação - Testadores 2015
 
Plano de gerenciamento_da_qualidade
Plano de gerenciamento_da_qualidadePlano de gerenciamento_da_qualidade
Plano de gerenciamento_da_qualidade
 
Mercado de TI
Mercado de TIMercado de TI
Mercado de TI
 
Demoiselle 3 Está chegando a hora
Demoiselle 3 Está chegando a horaDemoiselle 3 Está chegando a hora
Demoiselle 3 Está chegando a hora
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
 
Demoiselle Behave - Visão Geral
Demoiselle Behave - Visão GeralDemoiselle Behave - Visão Geral
Demoiselle Behave - Visão Geral
 

Similar to Behaviour-Driven Development com Ruby

RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteEduardo Mendes
 
Scrum e o Ambiente de Desenvolvimento Ágil
Scrum e o Ambiente de Desenvolvimento ÁgilScrum e o Ambiente de Desenvolvimento Ágil
Scrum e o Ambiente de Desenvolvimento Ágilabacrazy
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Railsismaelstahelin
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalEduardo Bregaida
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehaveMarcelo Zeferino
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorDickson S. Guedes
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDaniel Carvalhinho
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoMarcius Brandão
 
Padrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsPadrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsHerval Freire
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
Testes Automatizados em Ruby on Rails
Testes Automatizados em Ruby on RailsTestes Automatizados em Ruby on Rails
Testes Automatizados em Ruby on RailsThiago Cifani
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a TestesGregorio Melo
 

Similar to Behaviour-Driven Development com Ruby (20)

RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em Teste
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
 
Scrum e o Ambiente de Desenvolvimento Ágil
Scrum e o Ambiente de Desenvolvimento ÁgilScrum e o Ambiente de Desenvolvimento Ágil
Scrum e o Ambiente de Desenvolvimento Ágil
 
Esta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com RailsEsta começando a programar para a web? Então começe com Rails
Esta começando a programar para a web? Então começe com Rails
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
 
Growing oos guided_by_tests entire
Growing oos guided_by_tests entireGrowing oos guided_by_tests entire
Growing oos guided_by_tests entire
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
 
Bdd&tdd
Bdd&tddBdd&tdd
Bdd&tdd
 
Testing node.js
Testing node.jsTesting node.js
Testing node.js
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de Software
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da Dissertacao
 
Padrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsPadrões De Projeto e Anti Patterns
Padrões De Projeto e Anti Patterns
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Testes Automatizados em Ruby on Rails
Testes Automatizados em Ruby on RailsTestes Automatizados em Ruby on Rails
Testes Automatizados em Ruby on Rails
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 

Behaviour-Driven Development com Ruby

  • 1. Behaviour-Driven Developement com Ruby Técnicas, ferramentas e experiências. Jony dos Santos Kostetzer
  • 2. Agenda Definições Por que escrever testes? TDD e BDD BDD RSpec - explicações e live coding Cucumber - explicações e live coding
  • 3. Desenvolvimento orientado por testes Em linhas gerais: Testar antes. Codificar depois. “Como eu gostaria que minha aplicação se comportasse?” Origem: eXtremme Programming
  • 4. O Ciclo TDD red-green-refactor Red Refactor Green
  • 5. 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.
  • 6. Vantagens 5. Identificar o mais cedo possível problemas de regressão. 6. Segurança e refactoring sem medo. 7. Satisfação!
  • 8. 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!
  • 9. Bons programadores conseguem resolver um problema proposto de alguma forma.
  • 10. Programadores excepcionais os resolvem de forma sustentável.
  • 11. 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
  • 12. Testes em Ruby Diversos frameworks. Melhor x pior: Apenas escolha o que melhor lhe convir! test/unit miniunit Shoulda Micronaut test-spec RSpec Cucumber
  • 13. RSpec DSL (Domain-Specific Language) para descrever comportamento de objetos. Expressividade Legibilidade Similar a estar falando com um cliente.
  • 14. BDD - Novo vocabulário test/unit rspec should / Asserções Expectativas should_not Método de Exemplo de it() teste código Caso de Grupo de describe() teste exemplos
  • 15. Terminologias test/unit rspec class SomeClassTest < describe SomeClass Test::Unit::TestCase it "should do something def test_something descriptive" def setup before(:each) def teardown after(:each) assert_equal 4, array.length array.length.should == 4
  • 16. Grupo de exemplos (Example group) describe Client do ... end describe “A bank transaction” do ... end describe Document, “being shared” do ... end
  • 17. 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
  • 18. 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
  • 21. Integrando example groups + code examples + contexts
  • 23. Matchers pré-existentes Igualdade ===, ==, eql, equal Texto should match(/regex/), =~ Array should include, length.should, have(3).items
  • 24. 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
  • 25. Before/After Antes de cada exemplo: before(:each) after(:each) Antes de cada grupo de exemplos: before(:all) after(:all)
  • 26. Outros idiomas lambda { #codigo }.should change(algo) - (by, from, to) lambda { #codigo }.should raise_error lambda { #codigo }.should throw_symbol
  • 27. Live coding RSpec http://github.com/jonysk/rsrails_rspec
  • 28. 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
  • 29. 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.
  • 30. 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)
  • 31. 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
  • 32. Cucumber features Título / Narrativa / Cenários
  • 36. Cucumber + webrat Simulação de um browser Comandos de integração intuitivos: fill_in “campo”, :with => “valor” visit “/pagina” check “campo” click_button “campo”
  • 37. Matchers principais should contain(‘text’) should have_selector(‘#menu ul li.selected”, :content => “Dashboard”) CSS3 should have_xpath(‘//node[@prop=”value”]’)
  • 39. Live coding Cucumber http://github.com/jonysk/rsrails_cucumber
  • 40. Webrat + Selenium gem install selenium-client Habilitando Selenium no env.rb: Webrat.configure do |config| config.mode = :selenium end Desabilitar fixtures transacionais: # Cucumber::Rails.use_transactional_fixtures
  • 41. Outros tópicos Integração continua (Integrity, CruiseControl.rb) Ferramentas: autotest, rcov, heckle, etc Macros: muito atenção.
  • 42. Obrigado! twitter: @jonysk jonysk.net jony@jonysk.net