33

rails_and_agile

Embed Size (px)

Citation preview

Page 1: rails_and_agile
Page 2: rails_and_agile

Quem?WWR since 2005•workingwithrails.com/person/9354Exclusivamente desde o início de 2008Uma dúzia de projetosTargetTrustYes, we do consulting.

Page 3: rails_and_agile

Quem?<propaganda>

•mailee.meEnvia e-mails HTML personalizadosRecebe os retornos e trataSistema de templates muito foda (graças ao Hpricot)Envios automáticos por URL ou RSSRelatórios completos (ajax, links no próprio e-mail, geográficos...)Importa contatos em vários formatosPermite integração com site ou por REST

</propaganda>

Page 4: rails_and_agile

Quem?<propaganda>"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."- Lucas Wendling, GO-GO Internet Para Negócios

"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."- Ricardo Aureliano, Grupo Ribeiro Filho

"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."- Leonardo Faria, Auto Simulado

"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. "- Edison Marcelo dos Santos, CredInfo</propaganda>

Page 5: rails_and_agile

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

Page 6: rails_and_agile

RoteiroApresentar práticas ágeis e ferramentas Rails que as suportam. Sempre com drops da sabedoria de Martin Fowler.

Page 7: rails_and_agile

Comunicação

“Remember your code is for a human first and a computer second.”

- Martin Fowler, Refactoring

Page 8: rails_and_agile

Comunicação# Relacionamentos de modelo

class Presentation < ActiveRecord::Base belongs_to :conference has_one :speaker has_many :listenersend

ra = Presentation.find_by_name("Rails & Agile")ra.speaker.name==> "Juan Maiz"ra.conference.name==> "Agile Weekend"ra.listeners.count==> 3560 (Megalomaniac...)

Page 9: rails_and_agile

Comunicação

# Escopos de modeloclass Customer < ActiveRecord::Base named_scope :active, :condition => "active" named_scope :recent, :order => "created_at desc"end

Customer.active.recent

Page 10: rails_and_agile

Comunicação

# Comportamento!class Category < ActiveRecord::Base acts_as_treeend

Category.find_by_name("Ruby").parent.name=> Programming Languages

Page 11: rails_and_agile

Comunicação

# TransaçõesAccount.transaction do john.draw(100) mary.deposit(100)end

Page 12: rails_and_agile

TestesFerramentas TDD padrão:

- Unit (modelos)- Functional (controles)- Integration- Performance

Page 13: rails_and_agile

TestesUnit

def test_should_not_save_speaker_without_name speaker = Speaker.new assert ! speaker.save, "Salvou speaker sem nome"end

Page 14: rails_and_agile

TestesFunctional

def test_should_get_index get :index assert_response :success assert_not_nil assigns(:conferences)end

Page 15: rails_and_agile

TestesIntegraçãodef test_login_and_browse_conferences https! get '/login' assert_response :success post_via_redirect "/login", :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

Page 16: rails_and_agile

TestesE muitos addons para TDD:

Mocha mocha.rubyforge.orgNullDB avdi.org/projects/nulldbFactoryGirl github.com/thoughtbot/factory_girlMachinist github.com/notahat/machinistSelenium seleniumhq.org/projects/on-railsWatir (FireWatir, SafariWatir, ChromeWatir) wtr.rubyforge.orgCelerity celerity.rubyforge.orgWebRat svn.eastmedia.net/public/plugins/webratRCov eigenclass.org/hiki/rcovZenTest zentest.rubyforge.org

Page 17: rails_and_agile

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'endspeaker = Factory.create(:speaker)

Page 18: rails_and_agile

Testes# Machinist

Sham.define do name { Faker::Name.name } address { Faker::Lorem.paragraph }endSpeaker.blueprint do name emailendSpeaker.make

Page 19: rails_and_agile

Testes# Watir (e similares)

browser = Watir::Browser.newbrowser.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

Page 20: rails_and_agile

Testes"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..."- Martin Fowlermartinfowler.com/bliki/BusinessReadableDSL.html

Page 21: rails_and_agile

TestesFerramentas BDD:

Shoulda thoughtbot.com/projects/shouldaRSpec rspec.infoRemarkable github.com/carlosbrando/remarkableCucumber cukes.infoPickle github.com/ianwhite/pickle

Dan North user storydannorth.net/whats-in-a-storyRSpec bookpragprog.com/titles/achbd/the-rspec-book

Page 22: rails_and_agile

Testes# Cucumber GherkinFuncionalidade: 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 "Nome" com "Foo" E preencho "Endereço" com "Bar" E clico em "Criar" Então devo ver "Foo" E devo ver "Bar" E o total de palestrantes deve ser 1

Page 23: rails_and_agile

Testes# Cucumber + RSpec + WebRatGiven /que estou na página de novo palestrante/ do visit '/speakers/new'endGiven /o total de palestrantes é 0/ do Speaker.delete_allend# Generalizando!When /^preencho "(.+?)" com "(.+?)"/ do |field, value| fill_in(field, :with => value) endThen /^I should see "([^\"]*)"$/ do |text| response.should contain(text)endThen /o total de palestrantes deve ser (\d+?)/ do |num| Speaker.count.should == numend

Page 24: rails_and_agile

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 "Nome" com "Foo" E preencho "Endereço" com "Bar" E clico em "Criar" Então devo ver "Foo" E devo ver "Bar" E o total de palestrantes deve ser 1

Page 25: rails_and_agile

Propriedade coletivaTrocando figurinhas:rake notes:fixmerake notes:optimizerake notes:todorake notes:custom ANNOTATION=HELP

Page 26: rails_and_agile

Propriedade coletivarake db:migrate

create_table :speaker do |t| t.string :name t.string :address

t.timestampsend

Page 27: rails_and_agile

Integração contínuaContinuous 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 Fowlermartinfowler.com/articles/continuousIntegration.html

Page 28: rails_and_agile

Integração contínuaGit + GitHub

Virou padrão na comunidade RailsControle distribuído (commit rápido)git initgit add file.txtgit commit -a -m 'comment'git pushgit pull

Propriedade social de código•vimeo.com/1780571Fork and go

Page 29: rails_and_agile

Integração contínuaIntegrityintegrityapp.com

Cerberuscerberus.rubyforge.org

CruiseControl.rbcruisecontrolrb.thoughtworks.com

Continuous Builderdev.rubyonrails.org/svn/rails/plugins/continuous_builder

Integrationintegration.rubyforge.org

Page 30: rails_and_agile

Integração contínuaCriuseControl.rb e semelhantes

No "git push" 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

Page 31: rails_and_agile

Integração contínuaIntegrationBaixa, atualiza, testa, gerar reports e se tudo estiver ok... comita.

rake integratetask scm:status:checktask log:cleartask tmp:cleartask backup:localtask scm:updatetask db:migratetest:unitstest:functionalstest:integrationspec:libspec:modelsspec:helpersspec:controllersspec:views

test:rcov:unitstest:rcov:units:verifytest:rcov:functionalstest:rcov:functionals:verifyspec:rcovspec:rcov:verifytest:plugins:selectedspec:plugins:selectedtest:selenium:server:starttest_acceptancetest:selenium:server:stopscm:commit

Page 32: rails_and_agile

More stuffDocumentaçãorake doc:app

Style Check (style-check.rb)cs.umd.edu/~nspring/software/style-check-readme.html

rubyinside.com/

Page 33: rails_and_agile

Conclusão"... I'm increasingly positive about using Ruby for serious work where speed, responsiveness, and productivity are important."- Martin Fowler em 10/5/2006martinfowler.com/bliki/EvaluatingRuby.html