SlideShare uma empresa Scribd logo
 
Quem? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Quem? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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;([^amp;quot;]*)&quot;$/  do  | text | response .should contain( text )‏ end Then  /o total de palestrantes deve ser (+?)/  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 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
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

Semelhante a rails_and_agile

Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on Rails
Julio Betta
 
2009 05 20 Floripa Flex
2009 05 20 Floripa Flex2009 05 20 Floripa Flex
2009 05 20 Floripa Flex
Eduardo Kraus
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyDesenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2py
Gilson Filho
 
JavaScript - Aula Introdutória
JavaScript - Aula IntrodutóriaJavaScript - Aula Introdutória
JavaScript - Aula Introdutória
lucasleite
 
Puppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGilPuppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGil
jefesrodrigues
 
Introdução ao Ruby on Rails
Introdução ao Ruby on RailsIntrodução ao Ruby on Rails
Introdução ao Ruby on Rails
Juan Maiz
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
Gregorio Melo
 
Desenvolvimento de web sites com php
Desenvolvimento de web sites com phpDesenvolvimento de web sites com php
Desenvolvimento de web sites com php
brenod123
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOL
targinosilveira
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sites
thiagolima
 
Apps Web em Wicket e Scala no GlassFish Java EE 6
Apps Web em Wicket e Scala no GlassFish Java EE 6Apps Web em Wicket e Scala no GlassFish Java EE 6
Apps Web em Wicket e Scala no GlassFish Java EE 6
Bruno Borges
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
Rodrigo Aramburu
 
Melhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQueryMelhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQuery
Harlley Oliveira
 
Tutorial sobre-flogs-12848
Tutorial sobre-flogs-12848Tutorial sobre-flogs-12848
Tutorial sobre-flogs-12848
Mariá Pohlmann da Silveira
 
Novidades no Deployment do Office 365
Novidades no Deployment do Office 365Novidades no Deployment do Office 365
Novidades no Deployment do Office 365
Bruno Lopes
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
Regis Magalhães
 
Introdução de web
Introdução de webIntrodução de web
Introdução de web
Sedu
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
Vinicius Rocha
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
Mateus Malaquias
 
Tutorial Sobre Flogs
Tutorial Sobre FlogsTutorial Sobre Flogs
Tutorial Sobre Flogs
neuza
 

Semelhante a rails_and_agile (20)

Introdução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on RailsIntrodução ao Desenvolvimento WEB com Ruby on Rails
Introdução ao Desenvolvimento WEB com Ruby on Rails
 
2009 05 20 Floripa Flex
2009 05 20 Floripa Flex2009 05 20 Floripa Flex
2009 05 20 Floripa Flex
 
Desenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2pyDesenvolvendo aplicações web com python e web2py
Desenvolvendo aplicações web com python e web2py
 
JavaScript - Aula Introdutória
JavaScript - Aula IntrodutóriaJavaScript - Aula Introdutória
JavaScript - Aula Introdutória
 
Puppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGilPuppet – Torne Seu Datacenter áGil
Puppet – Torne Seu Datacenter áGil
 
Introdução ao Ruby on Rails
Introdução ao Ruby on RailsIntrodução ao Ruby on Rails
Introdução ao Ruby on Rails
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Desenvolvimento de web sites com php
Desenvolvimento de web sites com phpDesenvolvimento de web sites com php
Desenvolvimento de web sites com php
 
Mini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOLMini-curso RubyOnRails CESOL
Mini-curso RubyOnRails CESOL
 
Apresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo SitesApresentação Minas - Desenvolvendo Sites
Apresentação Minas - Desenvolvendo Sites
 
Apps Web em Wicket e Scala no GlassFish Java EE 6
Apps Web em Wicket e Scala no GlassFish Java EE 6Apps Web em Wicket e Scala no GlassFish Java EE 6
Apps Web em Wicket e Scala no GlassFish Java EE 6
 
Desenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephpDesenvolvendo aplicações web com o framework cakephp
Desenvolvendo aplicações web com o framework cakephp
 
Melhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQueryMelhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQuery
 
Tutorial sobre-flogs-12848
Tutorial sobre-flogs-12848Tutorial sobre-flogs-12848
Tutorial sobre-flogs-12848
 
Novidades no Deployment do Office 365
Novidades no Deployment do Office 365Novidades no Deployment do Office 365
Novidades no Deployment do Office 365
 
Php 07 Cakephp
Php 07 CakephpPhp 07 Cakephp
Php 07 Cakephp
 
Introdução de web
Introdução de webIntrodução de web
Introdução de web
 
ASP.NET MVC Mini Curso
ASP.NET MVC Mini CursoASP.NET MVC Mini Curso
ASP.NET MVC Mini Curso
 
Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
 
Tutorial Sobre Flogs
Tutorial Sobre FlogsTutorial Sobre Flogs
Tutorial Sobre Flogs
 

Último

Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
joaovmp3
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
Danilo Pinotti
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
Momento da Informática
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
WELITONNOGUEIRA3
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
Momento da Informática
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
Faga1939
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
TomasSousa7
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
Momento da Informática
 

Último (8)

Certificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdfCertificado Jornada Python Da Hashtag.pdf
Certificado Jornada Python Da Hashtag.pdf
 
Segurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas PráticasSegurança Digital Pessoal e Boas Práticas
Segurança Digital Pessoal e Boas Práticas
 
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdfTOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
TOO - TÉCNICAS DE ORIENTAÇÃO A OBJETOS aula 1.pdf
 
Manual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdfManual-de-Credenciamento ANATER 2023.pdf
Manual-de-Credenciamento ANATER 2023.pdf
 
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdfDESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
DESENVOLVIMENTO DE SOFTWARE I_aula1-2.pdf
 
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
PRODUÇÃO E CONSUMO DE ENERGIA DA PRÉ-HISTÓRIA À ERA CONTEMPORÂNEA E SUA EVOLU...
 
História da Rádio- 1936-1970 século XIX .2.pptx
História da Rádio- 1936-1970 século XIX   .2.pptxHistória da Rádio- 1936-1970 século XIX   .2.pptx
História da Rádio- 1936-1970 século XIX .2.pptx
 
Logica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptxLogica de Progamacao - Aula (1) (1).pptx
Logica de Progamacao - Aula (1) (1).pptx
 

rails_and_agile

  • 1.  
  • 2.
  • 3.
  • 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.
  • 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.
  • 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;([^amp;quot;]*)&quot;$/ do | text | response .should contain( text )‏ end Then /o total de palestrantes deve ser (+?)/ 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.
  • 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