SlideShare uma empresa Scribd logo
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

Mais conteúdo relacionado

Mais procurados

[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
Bárbara Cabral da Conceição, CTFL
 
Testes com javascript
Testes com javascriptTestes com javascript
Testes com javascript
Laí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 JavaScript
Rogé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 chefes
David Robert Camargo de Campos
 
Code Smells
Code SmellsCode Smells
Code Smells
Rodrigo Branas
 
Dito Tech Talk RSpec
Dito Tech Talk RSpecDito Tech Talk RSpec
Dito Tech Talk RSpec
guest49d83b2
 
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
iMasters
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
Giovanni Bassi
 
BDD - JBehave + SeleniumHQ + PhantomJS + Fixture Factory
BDD - JBehave + SeleniumHQ + PhantomJS  + Fixture FactoryBDD - JBehave + SeleniumHQ + PhantomJS  + Fixture Factory
BDD - JBehave + SeleniumHQ + PhantomJS + Fixture Factory
Andre Vinicius Buzzo
 
Javascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosJavascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - Conceitos
Wesley 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 2017
Vitor 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 sistemas
Vitor Mattos
 
tmn - Introdução ao JavaScript
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScript
Claudio 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
 
Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014Refatorar é preciso. Palestra TDC 2014
Refatorar é preciso. Palestra TDC 2014
Daniel Archer Marques Cramer
 
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
ronaldoferraz
 
Codigo limpo
Codigo limpoCodigo limpo
Codigo limpo
diegomcunha
 
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
Diego 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ódigo
Paula Grangeiro
 
DDD - Linguagem Ubíqua
DDD - Linguagem UbíquaDDD - Linguagem Ubíqua
DDD - Linguagem Ubíqua
Eduardo Bregaida
 

Mais procurados (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
 

Destaque

Ajax em java
Ajax em javaAjax em java
Ajax em java
Maurício Linhares
 
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
Maurício Linhares
 
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
Synergia - Engenharia de Software e Sistemas
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizados
Rodrigo Maia
 
BDD com Cucumber
BDD com CucumberBDD com Cucumber
BDD com Cucumber
Luciano Costa
 
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
Maurí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 Servidores
Diego 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 ágil
Samanta Cicilia
 
Testes Rápidos
Testes RápidosTestes Rápidos
Testes Rápidos
SuccesSoft LTDA
 
Testes ágeis
Testes ágeisTestes ágeis
Testes ágeis
Qualister
 
JavaScript Applications
JavaScript ApplicationsJavaScript Applications
JavaScript Applications
Luciano Costa
 
Docker e suas tecnologias
Docker e suas tecnologiasDocker e suas tecnologias
Docker e suas tecnologias
Cesar Augusto Nogueira
 
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
Maurício Linhares
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
Maurício Linhares
 
BDD em Ação - Testadores 2015
BDD em Ação - Testadores 2015BDD em Ação - Testadores 2015
BDD em Ação - Testadores 2015
Alan Rafael Batista
 
Plano de gerenciamento_da_qualidade
Plano de gerenciamento_da_qualidadePlano de gerenciamento_da_qualidade
Plano de gerenciamento_da_qualidade
Sharles Sa
 
Mercado de TI
Mercado de TIMercado de TI
Mercado de TI
Maurício Linhares
 
Demoiselle 3 Está chegando a hora
Demoiselle 3 Está chegando a horaDemoiselle 3 Está chegando a hora
Demoiselle 3 Está chegando a hora
Vanderson 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 OfficeDrop
Maurício Linhares
 
Demoiselle Behave - Visão Geral
Demoiselle Behave - Visão GeralDemoiselle Behave - Visão Geral
Demoiselle Behave - Visão Geral
Vanderson Silva
 

Destaque (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
 

Semelhante a Behaviour-Driven Development com Ruby

RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em Teste
Eduardo Mendes
 
Ruby & Rails
Ruby & RailsRuby & Rails
Ruby & Rails
Sergio Henrique
 
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
abacrazy
 
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
ismaelstahelin
 
Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
Eduardo Bregaida
 
Growing oos guided_by_tests entire
Growing oos guided_by_tests entireGrowing oos guided_by_tests entire
Growing oos guided_by_tests entire
André Mendonça Bastos
 
TDD com Python (Completo)
TDD com Python (Completo)TDD com Python (Completo)
TDD com Python (Completo)
Osvaldo Santana Neto
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
Marcelo Zeferino
 
Bdd&tdd
Bdd&tddBdd&tdd
Testing node.js
Testing node.jsTesting node.js
Testing node.js
Carlos Mendes
 
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
Thiago Cifani
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
Comunidade NetPonto
 
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
Dickson S. Guedes
 
Drupal e a Qualidade de Software
Drupal e a Qualidade de SoftwareDrupal e a Qualidade de Software
Drupal e a Qualidade de Software
Daniel 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 Dissertacao
Marcius 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 Patterns
Herval Freire
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
André Borgonovo
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
Eduardo Jorge
 
Testes Automatizados em Ruby on Rails
Testes Automatizados em Ruby on RailsTestes Automatizados em Ruby on Rails
Testes Automatizados em Ruby on Rails
Thiago Cifani
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
Gregorio Melo
 

Semelhante a 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
 

Último

Eletiva_O-mundo-conectado-Ensino-Médio.docx.pdf
Eletiva_O-mundo-conectado-Ensino-Médio.docx.pdfEletiva_O-mundo-conectado-Ensino-Médio.docx.pdf
Eletiva_O-mundo-conectado-Ensino-Médio.docx.pdf
barbosajucy47
 
Subindo uma aplicação WordPress em docker na AWS
Subindo uma aplicação WordPress em docker na AWSSubindo uma aplicação WordPress em docker na AWS
Subindo uma aplicação WordPress em docker na AWS
Ismael Ash
 
se38_layout_erro_xxxxxxxxxxxxxxxxxx.docx
se38_layout_erro_xxxxxxxxxxxxxxxxxx.docxse38_layout_erro_xxxxxxxxxxxxxxxxxx.docx
se38_layout_erro_xxxxxxxxxxxxxxxxxx.docx
ronaldos10
 
Ferramentas que irão te ajudar a entrar no mundo de DevOps/CLoud
Ferramentas que irão te ajudar a entrar no mundo de   DevOps/CLoudFerramentas que irão te ajudar a entrar no mundo de   DevOps/CLoud
Ferramentas que irão te ajudar a entrar no mundo de DevOps/CLoud
Ismael Ash
 
ExpoGestão 2024 - Desvendando um mundo em ebulição
ExpoGestão 2024 - Desvendando um mundo em ebuliçãoExpoGestão 2024 - Desvendando um mundo em ebulição
ExpoGestão 2024 - Desvendando um mundo em ebulição
ExpoGestão
 
Segurança da Informação - Onde estou e para onde eu vou.pptx
Segurança da Informação - Onde estou e para onde eu vou.pptxSegurança da Informação - Onde estou e para onde eu vou.pptx
Segurança da Informação - Onde estou e para onde eu vou.pptx
Divina Vitorino
 
INTELIGÊNCIA ARTIFICIAL + COMPUTAÇÃO QUÂNTICA = MAIOR REVOLUÇÃO TECNOLÓGICA D...
INTELIGÊNCIA ARTIFICIAL + COMPUTAÇÃO QUÂNTICA = MAIOR REVOLUÇÃO TECNOLÓGICA D...INTELIGÊNCIA ARTIFICIAL + COMPUTAÇÃO QUÂNTICA = MAIOR REVOLUÇÃO TECNOLÓGICA D...
INTELIGÊNCIA ARTIFICIAL + COMPUTAÇÃO QUÂNTICA = MAIOR REVOLUÇÃO TECNOLÓGICA D...
Faga1939
 

Último (7)

Eletiva_O-mundo-conectado-Ensino-Médio.docx.pdf
Eletiva_O-mundo-conectado-Ensino-Médio.docx.pdfEletiva_O-mundo-conectado-Ensino-Médio.docx.pdf
Eletiva_O-mundo-conectado-Ensino-Médio.docx.pdf
 
Subindo uma aplicação WordPress em docker na AWS
Subindo uma aplicação WordPress em docker na AWSSubindo uma aplicação WordPress em docker na AWS
Subindo uma aplicação WordPress em docker na AWS
 
se38_layout_erro_xxxxxxxxxxxxxxxxxx.docx
se38_layout_erro_xxxxxxxxxxxxxxxxxx.docxse38_layout_erro_xxxxxxxxxxxxxxxxxx.docx
se38_layout_erro_xxxxxxxxxxxxxxxxxx.docx
 
Ferramentas que irão te ajudar a entrar no mundo de DevOps/CLoud
Ferramentas que irão te ajudar a entrar no mundo de   DevOps/CLoudFerramentas que irão te ajudar a entrar no mundo de   DevOps/CLoud
Ferramentas que irão te ajudar a entrar no mundo de DevOps/CLoud
 
ExpoGestão 2024 - Desvendando um mundo em ebulição
ExpoGestão 2024 - Desvendando um mundo em ebuliçãoExpoGestão 2024 - Desvendando um mundo em ebulição
ExpoGestão 2024 - Desvendando um mundo em ebulição
 
Segurança da Informação - Onde estou e para onde eu vou.pptx
Segurança da Informação - Onde estou e para onde eu vou.pptxSegurança da Informação - Onde estou e para onde eu vou.pptx
Segurança da Informação - Onde estou e para onde eu vou.pptx
 
INTELIGÊNCIA ARTIFICIAL + COMPUTAÇÃO QUÂNTICA = MAIOR REVOLUÇÃO TECNOLÓGICA D...
INTELIGÊNCIA ARTIFICIAL + COMPUTAÇÃO QUÂNTICA = MAIOR REVOLUÇÃO TECNOLÓGICA D...INTELIGÊNCIA ARTIFICIAL + COMPUTAÇÃO QUÂNTICA = MAIOR REVOLUÇÃO TECNOLÓGICA D...
INTELIGÊNCIA ARTIFICIAL + COMPUTAÇÃO QUÂNTICA = MAIOR REVOLUÇÃO TECNOLÓGICA D...
 

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