SlideShare uma empresa Scribd logo
 
Quem? WWR since 2005 workingwithrails.com/person/9354 Exclusivamente desde o início de 2008 Uma dúzia de projetos TargetTrust Yes, we do consulting.
Quem? <propaganda> mailee.me Envia e-mails HTML personalizados Recebe os retornos e trata Sistema de templates muito foda (graças ao Hpricot)‏ Envios automáticos por URL ou RSS Relatórios completos (ajax, links no próprio e-mail, geográficos...)‏ Importa contatos em vários formatos Permite integração com site ou por REST </propaganda>
Quem? <propaganda> &quot;Encontramos no Mailee o que faltava para nossas necessidades como agência digital. Os padrões de qualidade e usabilidade são incomparáveis e ganham de longe de qualquer outra solução de e-mail marketing que já utilizamos.&quot; - Lucas Wendling, GO-GO Internet Para Negócios &quot;O tipo de serviço que o Mailee oferece é, sem duvidas, um dos melhores já vistos. O que mais me chamou a atenção foi o seu design inovador web 2.0. Garanto que muitas pessoas vão se divertir de forma profissional ao usar o Mailee. Fantástico.&quot; - Ricardo Aureliano, Grupo Ribeiro Filho &quot;O que eu gostei no Mailee é a simplicidade de usar, atrelada aos recursos. Posso exportar todos meus contatos do e-mail sem nenhum esforço e manipular meu template facilmente. Para usá-lo não precisa nem FAQ, de tão intuitivo.&quot; - Leonardo Faria, Auto Simulado &quot;Testei várias ferramentas de email-marketing, mas nenhuma era rápida, precisa e prática de usar. Encontrei estas qualidades no Mailee e estou muito satisfeito. Estou indicando para todos os meus clientes, pois realmente confio no trabalho e na seriedade da equipe do Mailee. &quot; - Edison Marcelo dos Santos, CredInfo </propaganda>
Roteiro “ It is impossible not to notice Ruby on Rails. It has had a huge effect both in and outside the Ruby community... Rails has become a standard to which even well-established tools are comparing themselves to.” - Martin Fowler
Roteiro Apresentar práticas ágeis e ferramentas Rails que as suportam. Sempre com drops da sabedoria de Martin Fowler.
Comunicação “ Remember your code is for a human first and a computer second.” - Martin Fowler, Refactoring
Comunicação # Relacionamentos de modelo class   Presentation   <   ActiveRecord::Base belongs_to  :conference has_one  :speaker   has_many  :listeners end ra  =  Presentation .find_by_name( &quot;Rails & Agile&quot; )‏ ra .speaker.name ==> &quot;Juan Maiz&quot; ra .conference.name ==> &quot;Agile Weekend&quot; ra .listeners.count ==> 3560 (Megalomaniac...)‏
Comunicação # Escopos de modelo class   Customer   <   ActiveRecord::Base named_scope  :active ,   :condition   =>  &quot;active&quot; named_scope  :recent ,   :order   =>   &quot;created_at desc&quot; end Customer . active . recent
Comunicação # Comportamento! class   Category   <   ActiveRecord::Base acts_as_tree end Category .find_by_name( &quot;Ruby&quot; ).parent.name => Programming Languages
Comunicação # Transações Account .transaction  do john .draw( 100 )‏ mary .deposit( 100 )‏ end
Testes Ferramentas TDD padrão: - Unit (modelos)‏ - Functional (controles)‏ - Integration - Performance
Testes Unit def  test_should_not_save_speaker_without_name speaker  =  Speaker .new assert !  speaker .save,  &quot;Salvou speaker sem nome&quot; end
Testes Functional def  test_should_get_index get  :index assert_response  :success  assert_not_nil assigns( :conferences )‏ end
Testes Integração def  test_login_and_browse_conferences https! get  '/login' assert_response  :success post_via_redirect  &quot;/login&quot; , :user =>  'foo' , :pass =>  'bar' assert_equal  '/welcome' , path assert_equal  'Seja bem vindo, Foo!' , flash[ :notice ] get  '/conferences' assert_response  :success assert assigns( :conferences )‏ end
Testes E muitos addons para TDD: Mocha  mocha.rubyforge.org NullDB  avdi.org/projects/nulldb FactoryGirl  github.com/thoughtbot/factory_girl Machinist  github.com/notahat/machinist Selenium  seleniumhq.org/projects/on-rails Watir (FireWatir, SafariWatir, ChromeWatir)  wtr.rubyforge.org Celerity  celerity.rubyforge.org WebRat  svn.eastmedia.net/public/plugins/webrat RCov  eigenclass.org/hiki/rcov ZenTest  zentest.rubyforge.org
Testes # Mocha Sum .expects( :do ).with( 2 , 2 ).returns( 4 )‏ assert_equal  4 ,  Sum .do( 2 , 2 )‏ # FactoryGirl Factory .define  :speaker   do  | s | s .name  'Juan' s .address  'Mock address' end speaker  =  Factory .create( :speaker )‏
Testes # Machinist Sham .define  do name  {  Faker :: Name .name } address  {  Faker :: Lorem .paragraph } end Speaker .blueprint  do name email end Speaker .make
Testes # Watir (e similares)‏ browser  =  Watir :: Browser .new browser .goto  'http://www.google.com' browser .text_field( :name ,  'q' ).set  'rails' browser .button( :name ,  'btnG' ).click #WebRat test  'login'   do User.create!( :user  =>  'foo' ,  :pass  =>  'bar' )‏ visit  login_url fill_in  'Usuário' ,  :with  =>  'foo' fill_in 'Senha',  :with  =>  'bar' click_button  'Enviar' assert_contain  'Seja bem vindo, foo.' end
Testes &quot;With a business-readable DSL, programmers write the code but they show that code frequently to business people who can understand what it means. These customers can then make changes, maybe draft some code...&quot; - Martin Fowler martinfowler.com/bliki/BusinessReadableDSL.html
Testes Ferramentas BDD: Shoulda  thoughtbot.com/projects/shoulda RSpec  rspec.info Remarkable  github.com/carlosbrando/remarkable Cucumber  cukes.info Pickle  github.com/ianwhite/pickle Dan North user story dannorth.net/whats-in-a-story RSpec book pragprog.com/titles/achbd/the-rspec-book
Testes # Cucumber Gherkin Funcionalidade :  Cadastrar palestrantes Para  ter palestrantes nos eventos Como  um usuário administrador Eu quero  poder inserir palestrantes Cenário :  Cadastrar novo palestrante Dado  que estou na página de novo palestrante E  o total de palestrantes é 0 Quando  preencho &quot;Nome&quot; com &quot;Foo&quot; E  preencho &quot;Endereço&quot; com &quot;Bar&quot; E  clico em &quot;Criar&quot; Então  devo ver &quot;Foo&quot; E  devo ver &quot;Bar&quot; E  o total de palestrantes deve ser 1
Testes # Cucumber + RSpec + WebRat Given  /que estou na página de novo palestrante/   do   visit   '/speakers/new' end Given  /o total de palestrantes é 0/  do  Speaker .delete_all end # Generalizando! When   /^preencho &quot;(.+?)&quot; com &quot;(.+?)&quot;/   do | field ,  value | fill_in( field ,  :with  =>  value )  end Then  /^I should see &quot;([^\&quot;]*)&quot;$/  do  | text | response .should contain( text )‏ end Then  /o total de palestrantes deve ser (\d+?)/  do  | num | Speaker .count.should ==  num end
Testes # executando... Funcionalidade: Cadastrar palestrantes Para ter palestrantes nos eventos Como um usuário administrador Eu quero poder inserir palestrantes Cenário: Cadastrar novo palestrante Dado que estou na página de novo palestrante E o total de palestrantes é 0 Quando preencho &quot;Nome&quot; com &quot;Foo&quot; E preencho &quot;Endereço&quot; com &quot;Bar&quot; E clico em &quot;Criar&quot; Então devo ver &quot;Foo&quot; E devo ver &quot;Bar&quot; E o total de palestrantes deve ser 1
Propriedade coletiva Trocando figurinhas: rake notes:fixme rake notes:optimize rake notes:todo rake notes:custom  ANNOTATION=HELP
Propriedade coletiva rake db:migrate create_table  :speaker  do | t | t .string  :name t .string  :address t .timestamps end
Integração contínua Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day.  Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible.  Martin Fowler martinfowler.com/articles/continuousIntegration.html
Integração contínua Git + GitHub Virou padrão na comunidade Rails Controle distribuído (commit rápido)‏ git init git add file.txt git commit -a -m 'comment' git push git pull Propriedade  social  de código vimeo.com/1780571 Fork and go
Integração contínua Integrity integrityapp.com Cerberus cerberus.rubyforge.org CruiseControl.rb cruisecontrolrb.thoughtworks.com Continuous Builder dev.rubyonrails.org/svn/rails/plugins/continuous_builder Integration integration.rubyforge.org
Integração contínua CriuseControl.rb e semelhantes No &quot;git push&quot; baixa os arquivos, executa os testes e notifica a equipe. Fork no GitHub para Git: github.com/benburkert/cruisecontrolrb jamesshore.com/Blog/Why I Dont Like CruiseControl.html
Integração contínua Integration Baixa, atualiza, testa, gerar reports e se tudo estiver ok... comita. rake integrate task scm:status:check task log:clear task tmp:clear task backup:local task scm:update task db:migrate test:units test:functionals test:integration spec:lib spec:models spec:helpers spec:controllers spec:views test:rcov:units test:rcov:units:verify test:rcov:functionals test:rcov:functionals:verify spec:rcov spec:rcov:verify test:plugins:selected spec:plugins:selected test:selenium:server:start test_acceptance test:selenium:server:stop scm:commit
More stuff Documentação rake doc:app Style Check (style-check.rb)‏ cs.umd.edu/~nspring/software/style-check-readme.html rubyinside.com/
Conclusão &quot;... I'm increasingly positive about using Ruby for serious work where speed, responsiveness, and productivity are important.&quot; - Martin Fowler em 10/5/2006 martinfowler.com/bliki/EvaluatingRuby.html

Mais conteúdo relacionado

PPTX
II Oficina de Webdesign - Lecom
PDF
Trabalhando com posts e campos personalizados #CPBR9
PPT
Cobrancas online na sua aplicacao com MoIP
PDF
Tree top
KEY
Ruby para-programadores-php
PDF
Ruby para-programadores-php
KEY
Ruby para programadores PHP
PDF
Reasoning about Code with React
II Oficina de Webdesign - Lecom
Trabalhando com posts e campos personalizados #CPBR9
Cobrancas online na sua aplicacao com MoIP
Tree top
Ruby para-programadores-php
Ruby para-programadores-php
Ruby para programadores PHP
Reasoning about Code with React

Semelhante a rails_and_agile (20)

ODP
Introdução ao Desenvolvimento WEB com Ruby on Rails
PPT
2009 05 20 Floripa Flex
ODP
Desenvolvendo aplicações web com python e web2py
ODP
JavaScript - Aula Introdutória
ODP
Puppet – Torne Seu Datacenter áGil
ODP
Introdução ao Ruby on Rails
KEY
Programação Orientada a Testes
PPT
Desenvolvimento de web sites com php
ODP
Mini-curso RubyOnRails CESOL
ODP
Apresentação Minas - Desenvolvendo Sites
ODP
Apps Web em Wicket e Scala no GlassFish Java EE 6
PPT
Desenvolvendo aplicações web com o framework cakephp
PPT
Melhorando a Experiência do Usuário com JavaScript e jQuery
PPT
Tutorial sobre-flogs-12848
PPTX
Novidades no Deployment do Office 365
ODP
Php 07 Cakephp
PPTX
Introdução de web
PPTX
ASP.NET MVC Mini Curso
PDF
Construindo APIs RESTful com Spring
PPS
Tutorial Sobre Flogs
Introdução ao Desenvolvimento WEB com Ruby on Rails
2009 05 20 Floripa Flex
Desenvolvendo aplicações web com python e web2py
JavaScript - Aula Introdutória
Puppet – Torne Seu Datacenter áGil
Introdução ao Ruby on Rails
Programação Orientada a Testes
Desenvolvimento de web sites com php
Mini-curso RubyOnRails CESOL
Apresentação Minas - Desenvolvendo Sites
Apps Web em Wicket e Scala no GlassFish Java EE 6
Desenvolvendo aplicações web com o framework cakephp
Melhorando a Experiência do Usuário com JavaScript e jQuery
Tutorial sobre-flogs-12848
Novidades no Deployment do Office 365
Php 07 Cakephp
Introdução de web
ASP.NET MVC Mini Curso
Construindo APIs RESTful com Spring
Tutorial Sobre Flogs
Anúncio

Último (19)

PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PDF
Apple Pippin Uma breve introdução. - David Glotz
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PDF
Aula04-Academia Heri- Tecnologia Geral 2025
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
Processos na gestão de transportes, TM100 Col18
PPTX
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
PPTX
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
PPTX
Aula 18 - Manipulacao De Arquivos python
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
PPTX
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Apple Pippin Uma breve introdução. - David Glotz
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Gestão de transportes básica no SAP S/4HANA, S4611 Col20
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Aula04-Academia Heri- Tecnologia Geral 2025
Custos e liquidação no SAP Transportation Management, TM130 Col18
Otimizador de planejamento e execução no SAP Transportation Management, TM120...
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
Processos na gestão de transportes, TM100 Col18
Programação - Linguagem C - Variáveis, Palavras Reservadas, tipos de dados, c...
Como-se-implementa-um-softwareeeeeeeeeeeeeeeeeeeeeeeee.pptx
Aula 18 - Manipulacao De Arquivos python
COBITxITIL-Entenda as diferença em uso governança TI
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Gestao-de-Bugs-em-Software-Introducao.pptxxxxxxxx
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Anúncio

rails_and_agile

  • 1.  
  • 2. Quem? WWR since 2005 workingwithrails.com/person/9354 Exclusivamente desde o início de 2008 Uma dúzia de projetos TargetTrust Yes, we do consulting.
  • 3. Quem? <propaganda> mailee.me Envia e-mails HTML personalizados Recebe os retornos e trata Sistema de templates muito foda (graças ao Hpricot)‏ Envios automáticos por URL ou RSS Relatórios completos (ajax, links no próprio e-mail, geográficos...)‏ Importa contatos em vários formatos Permite integração com site ou por REST </propaganda>
  • 4. Quem? <propaganda> &quot;Encontramos no Mailee o que faltava para nossas necessidades como agência digital. Os padrões de qualidade e usabilidade são incomparáveis e ganham de longe de qualquer outra solução de e-mail marketing que já utilizamos.&quot; - Lucas Wendling, GO-GO Internet Para Negócios &quot;O tipo de serviço que o Mailee oferece é, sem duvidas, um dos melhores já vistos. O que mais me chamou a atenção foi o seu design inovador web 2.0. Garanto que muitas pessoas vão se divertir de forma profissional ao usar o Mailee. Fantástico.&quot; - Ricardo Aureliano, Grupo Ribeiro Filho &quot;O que eu gostei no Mailee é a simplicidade de usar, atrelada aos recursos. Posso exportar todos meus contatos do e-mail sem nenhum esforço e manipular meu template facilmente. Para usá-lo não precisa nem FAQ, de tão intuitivo.&quot; - Leonardo Faria, Auto Simulado &quot;Testei várias ferramentas de email-marketing, mas nenhuma era rápida, precisa e prática de usar. Encontrei estas qualidades no Mailee e estou muito satisfeito. Estou indicando para todos os meus clientes, pois realmente confio no trabalho e na seriedade da equipe do Mailee. &quot; - Edison Marcelo dos Santos, CredInfo </propaganda>
  • 5. Roteiro “ It is impossible not to notice Ruby on Rails. It has had a huge effect both in and outside the Ruby community... Rails has become a standard to which even well-established tools are comparing themselves to.” - Martin Fowler
  • 6. Roteiro Apresentar práticas ágeis e ferramentas Rails que as suportam. Sempre com drops da sabedoria de Martin Fowler.
  • 7. Comunicação “ Remember your code is for a human first and a computer second.” - Martin Fowler, Refactoring
  • 8. Comunicação # Relacionamentos de modelo class Presentation < ActiveRecord::Base belongs_to :conference has_one :speaker has_many :listeners end ra = Presentation .find_by_name( &quot;Rails & Agile&quot; )‏ ra .speaker.name ==> &quot;Juan Maiz&quot; ra .conference.name ==> &quot;Agile Weekend&quot; ra .listeners.count ==> 3560 (Megalomaniac...)‏
  • 9. Comunicação # Escopos de modelo class Customer < ActiveRecord::Base named_scope :active , :condition => &quot;active&quot; named_scope :recent , :order => &quot;created_at desc&quot; end Customer . active . recent
  • 10. Comunicação # Comportamento! class Category < ActiveRecord::Base acts_as_tree end Category .find_by_name( &quot;Ruby&quot; ).parent.name => Programming Languages
  • 11. Comunicação # Transações Account .transaction do john .draw( 100 )‏ mary .deposit( 100 )‏ end
  • 12. Testes Ferramentas TDD padrão: - Unit (modelos)‏ - Functional (controles)‏ - Integration - Performance
  • 13. Testes Unit def test_should_not_save_speaker_without_name speaker = Speaker .new assert ! speaker .save, &quot;Salvou speaker sem nome&quot; end
  • 14. Testes Functional def test_should_get_index get :index assert_response :success assert_not_nil assigns( :conferences )‏ end
  • 15. Testes Integração def test_login_and_browse_conferences https! get '/login' assert_response :success post_via_redirect &quot;/login&quot; , :user => 'foo' , :pass => 'bar' assert_equal '/welcome' , path assert_equal 'Seja bem vindo, Foo!' , flash[ :notice ] get '/conferences' assert_response :success assert assigns( :conferences )‏ end
  • 16. Testes E muitos addons para TDD: Mocha mocha.rubyforge.org NullDB avdi.org/projects/nulldb FactoryGirl github.com/thoughtbot/factory_girl Machinist github.com/notahat/machinist Selenium seleniumhq.org/projects/on-rails Watir (FireWatir, SafariWatir, ChromeWatir) wtr.rubyforge.org Celerity celerity.rubyforge.org WebRat svn.eastmedia.net/public/plugins/webrat RCov eigenclass.org/hiki/rcov ZenTest zentest.rubyforge.org
  • 17. Testes # Mocha Sum .expects( :do ).with( 2 , 2 ).returns( 4 )‏ assert_equal 4 , Sum .do( 2 , 2 )‏ # FactoryGirl Factory .define :speaker do | s | s .name 'Juan' s .address 'Mock address' end speaker = Factory .create( :speaker )‏
  • 18. Testes # Machinist Sham .define do name { Faker :: Name .name } address { Faker :: Lorem .paragraph } end Speaker .blueprint do name email end Speaker .make
  • 19. Testes # Watir (e similares)‏ browser = Watir :: Browser .new browser .goto 'http://www.google.com' browser .text_field( :name , 'q' ).set 'rails' browser .button( :name , 'btnG' ).click #WebRat test 'login' do User.create!( :user => 'foo' , :pass => 'bar' )‏ visit login_url fill_in 'Usuário' , :with => 'foo' fill_in 'Senha', :with => 'bar' click_button 'Enviar' assert_contain 'Seja bem vindo, foo.' end
  • 20. Testes &quot;With a business-readable DSL, programmers write the code but they show that code frequently to business people who can understand what it means. These customers can then make changes, maybe draft some code...&quot; - Martin Fowler martinfowler.com/bliki/BusinessReadableDSL.html
  • 21. Testes Ferramentas BDD: Shoulda thoughtbot.com/projects/shoulda RSpec rspec.info Remarkable github.com/carlosbrando/remarkable Cucumber cukes.info Pickle github.com/ianwhite/pickle Dan North user story dannorth.net/whats-in-a-story RSpec book pragprog.com/titles/achbd/the-rspec-book
  • 22. Testes # Cucumber Gherkin Funcionalidade : Cadastrar palestrantes Para ter palestrantes nos eventos Como um usuário administrador Eu quero poder inserir palestrantes Cenário : Cadastrar novo palestrante Dado que estou na página de novo palestrante E o total de palestrantes é 0 Quando preencho &quot;Nome&quot; com &quot;Foo&quot; E preencho &quot;Endereço&quot; com &quot;Bar&quot; E clico em &quot;Criar&quot; Então devo ver &quot;Foo&quot; E devo ver &quot;Bar&quot; E o total de palestrantes deve ser 1
  • 23. Testes # Cucumber + RSpec + WebRat Given /que estou na página de novo palestrante/ do visit '/speakers/new' end Given /o total de palestrantes é 0/ do Speaker .delete_all end # Generalizando! When /^preencho &quot;(.+?)&quot; com &quot;(.+?)&quot;/ do | field , value | fill_in( field , :with => value ) end Then /^I should see &quot;([^\&quot;]*)&quot;$/ do | text | response .should contain( text )‏ end Then /o total de palestrantes deve ser (\d+?)/ do | num | Speaker .count.should == num end
  • 24. Testes # executando... Funcionalidade: Cadastrar palestrantes Para ter palestrantes nos eventos Como um usuário administrador Eu quero poder inserir palestrantes Cenário: Cadastrar novo palestrante Dado que estou na página de novo palestrante E o total de palestrantes é 0 Quando preencho &quot;Nome&quot; com &quot;Foo&quot; E preencho &quot;Endereço&quot; com &quot;Bar&quot; E clico em &quot;Criar&quot; Então devo ver &quot;Foo&quot; E devo ver &quot;Bar&quot; E o total de palestrantes deve ser 1
  • 25. Propriedade coletiva Trocando figurinhas: rake notes:fixme rake notes:optimize rake notes:todo rake notes:custom ANNOTATION=HELP
  • 26. Propriedade coletiva rake db:migrate create_table :speaker do | t | t .string :name t .string :address t .timestamps end
  • 27. Integração contínua Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily - leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Martin Fowler martinfowler.com/articles/continuousIntegration.html
  • 28. Integração contínua Git + GitHub Virou padrão na comunidade Rails Controle distribuído (commit rápido)‏ git init git add file.txt git commit -a -m 'comment' git push git pull Propriedade social de código vimeo.com/1780571 Fork and go
  • 29. Integração contínua Integrity integrityapp.com Cerberus cerberus.rubyforge.org CruiseControl.rb cruisecontrolrb.thoughtworks.com Continuous Builder dev.rubyonrails.org/svn/rails/plugins/continuous_builder Integration integration.rubyforge.org
  • 30. Integração contínua CriuseControl.rb e semelhantes No &quot;git push&quot; baixa os arquivos, executa os testes e notifica a equipe. Fork no GitHub para Git: github.com/benburkert/cruisecontrolrb jamesshore.com/Blog/Why I Dont Like CruiseControl.html
  • 31. Integração contínua Integration Baixa, atualiza, testa, gerar reports e se tudo estiver ok... comita. rake integrate task scm:status:check task log:clear task tmp:clear task backup:local task scm:update task db:migrate test:units test:functionals test:integration spec:lib spec:models spec:helpers spec:controllers spec:views test:rcov:units test:rcov:units:verify test:rcov:functionals test:rcov:functionals:verify spec:rcov spec:rcov:verify test:plugins:selected spec:plugins:selected test:selenium:server:start test_acceptance test:selenium:server:stop scm:commit
  • 32. More stuff Documentação rake doc:app Style Check (style-check.rb)‏ cs.umd.edu/~nspring/software/style-check-readme.html rubyinside.com/
  • 33. Conclusão &quot;... I'm increasingly positive about using Ruby for serious work where speed, responsiveness, and productivity are important.&quot; - Martin Fowler em 10/5/2006 martinfowler.com/bliki/EvaluatingRuby.html