Shoulda x RSpec: Cuidado nas comparações

Tenho visto diversas pessoas falando do Shoulda, e algumas que já sentiram o gosto do RSpec e depois também gostaram do Shoulda. Até aí sem problemas. Agora, ao passo que surgem comparações entre RSpec e Shoulda, um sinal amarelo deveria aparecer por aí e deixar algumas coisas bem claras. E este é o objetivo do post.

Primeiro ponto

Em primeiro lugar, a diferença fundamental é: RSpec é totalmente focado no teste de comportamento (Behaviour). Esse é o seu objetivo e a orientação de sua sintaxe. Ok, é possível sim fazer testes no estilo unit/test com RSpec, mas obviamente, não é a intenção ao usá-lo. É como uma implicação na lógica clássica: vou usar RSpec, logo (deveria) me focar em testar comportamento. E, numa implicação, o inverso não é necessariamente verdadeiro.

Resumindo: RSpec é focado em testar comportamento (Behaviour Driven Development). Shoulda não é focado em testar comportamento (Test Driven Development sem o “behaviour” na história), mas tem a intenção de melhorar o test/unit com helpers, macros e contextos. É um açucar sintático que torna os test/unit mais, digamos, pragmáticos e também documentados.

Dito isso, deve-se ter muito cuidado ao compará-los porque são ABORDAGENS e VISÕES diferentes, embora o objetivo de testar seja o mesmo.

Podemos comparar apenas da seguinte forma: Eu gosto mais de RSpec, ou eu gosto mais de Shoulda. Ponto. Qualquer comparação dizendo “este é melhor”, ou “este é pior” deve ser evitada e levar essa diferença fundamental em consideração: “Eu gosto de testar comportamento com o RSpec” ou “Eu prefiro testar no modelo test/unit com Shoulda” são argumentos válidos e não depreciativos entre ambos.

Segundo ponto

Agora, quando eu vejo alguém falando que faz “BDD com Shoulda”, isso me preocupa um pouco. Eu me pergunto: “Será mesmo?”. Confesso, sou um pouco purista no que tange a testar comportamento e estou sempre procurando uma melhor forma de fazê-lo. E já vi opiniões semelhantes por aí.
É possível fazer BDD com Shoulda? Sim, mas de fato não é a tendência ao usar o Shoulda. Vejamos porque.

Suponhamos a seguinte linha, retirada da documentacao do Shoulda:

class Article < ActiveRecord::Base {
  named_scope :visible, :conditions => {:visible => true}
}

E o teste para ela com Shoulda:

should_have_named_scope :visible, :conditions => {:visible => true}

Então eu pergunto: testei comportamento ou garanti que existe aquela linha de código no meu Model? Naturalmente, a segunda opção. Não que isso esteja errado, pelo contrário, seu teste tem 100% de cobertura.

Mas, e se minha lógica estiver errada? Digamos que você esqueceu que ao chamar Article.visible não deveria incluir os itens que não foram publicados ainda. Ou seja, você esqueceu uma condição que deveria fazer parte da regra. Mas você tem o teste, então (teoricamente) sua mente está livre do medo de ter errado.

É nesse ponto que entra a idéia de testar comportamento. É mais provável que você descubra esse problema se pensou anteriormente no comportamento que sua busca deveria ter. Note, eu disse que é mais provável, não é garantido que você perceberia isso imediatamente.

OK, e como eu testo o comportamento neste caso?

Estamos lidando com uma busca. Logo, vamos testar o comportamento desta busca simulando-a com exemplos (sintaxe abaixo é RSpec):

describe Article, "being displayed on the website" do
  it "should display only visible entries" do
    visible = Article.create(:name => "Art1", :visible => true, :published_at => Time.now)
    hidden = Article.create(:name => "Art2", :visible => false, :published_at => Time.now)
    visible_not_published = Article.create(:name => "Art3", :visible => true, :published_at => nil)
 
    Article.visible.should be_eql([visible])
  end
end

Nota: Num contexto real, estou usando o plugin factory_girl, da própria empresa que criou o Shoulda. É ótimo, sugiro o uso.

Simulei alguns cenários e acredito que é mais provável que eu encontre um erro no comportamento dessa forma, pois fui obrigado a formular um exemplo. Quem é acostumado a unit/test geralmente olha essa situação como um pouco de overkill: o que faria em uma linha, demorou bem mais tendo que pensar nos exemplos e na construção do teste em si.

Mas, o foco de BDD é CLAREZA nos testes e não DRY. Nem sempre um teste deve ser DRY.

É claro que é perfeitamente possível fazer isso com Shoulda e outras libs. A questão é: macros como should_have_named_scope induzem a esquecer o comportamento em benefício da simplicidade e rapidez em escrever o teste.

After all, it’s a matter of taste..

Escolher entre Shoulda e RSpec é uma questão de gosto, como eu falei no começo. Ou você gosta de focar seus testes no comportamento de um objeto, ou você prefere utilizar asserções do test/unit.

Para finalizar, volto a dizer que estamos falando aqui de BDD e TDD, e o objetivo aqui não é comparar frameworks nem gerar flames. “Shouldeiros”, não me crucifiquem por favor :)
E opiniões são bem vindas sobre isso tudo.

Obrigado!

Pixily procurando mais railers brasileiros

Estamos buscando mais brasileiros para o time, abaixo alguns detalhes sobre a oportunidade.

Pixily, a well-funded start-up is looking for experienced Rails programmers. We provide you with excellent opportunities to learn and work with the best in the industry and build amazing products.

About Pixily:

Pixily helps professionals, home offices and small businesses aggregate, organize and find paper and digital documents. You mail-in your paper documents periodically to us in prepaid envelopes or boxes, we scan them into your online accounts and make the content searchable. You can then search, organize, share, and download documents. You can also upload documents or scan them into your account directly.

With Pixily, you save money, time, space and trees.

Get a taste for the beta by viewing this video

What you can expect:

• A great working environment
• An opportunity to work with the best
• An opportunity to learn and apply cool scalable technologies in cloud computing, Rails, Ajax, RSpec and Java
• An opportunity to be creative and make large contributions
• An opportunity to grow with the company

What we are looking for:

• Strong fundamentals (MVC, data structures, etc.,)
• Experience in at least one production Rails application
• A working knowledge of Javascript, CSS and SQL. (Expertise in Javascript and CSS would be a big plus)
• Good spoken and written communication skills in English
• Ability to work in geographically distributed teams over IM and phone
• A Smart Generalist. (Competent in both depth and breadth of technologies)

Please send your resume to careers@pixily.com, if you are interested.

Pixily is an Equal Opportunity Employer.

Palestra “Conhecendo Ruby on Rails”, em Porto Alegre

UPDATE: Agradeço a presença de todos que participaram, o encontro foi ótimo. Os slides estão disponíveis na seção de Palestras. Qualquer dúvida, entre em contato direto comigo por e-mail ou deixe um comentário :)

O Instituto de Informática Unisinos convida para o evento gratuito “Conhecendo Ruby on Rails”, onde serão abordados os seguintes tópicos:

  • Conhecendo o Ruby on Rails: Princípios por trás do Rails. Por que Ruby on Rails?
  • Mercado interno e externo: oportunidades
  • Cases e Projetos
  • Demonstração
  • Entre outros tópicos

O evento é gratuito e acontecerá no dia 13/6 (sexta-feira) no Auditório do Centro Empresarial Presidente Kennedy, em Porto Alegre.
Inscrições até dia 11 de junho.

==> As vagas são limitadas!

Realização: 13/06/2008
Horário: às 18h30min
Local: Auditório do Centro Empresarial Presidente Kennedy
Avenida Carlos Gomes, 111 - Bairro Auxiliadora - Porto Alegre

INSCRIÇÕES ON-LINE

Acesse o link: http://www.ccti.unisinos.br/ccti_interna.php?corpo=acontece&codigo=253

Pixily, aí vou eu!

Depois de 2 semanas de negociação, diversas entrevistas, e uma madrugada em claro com muita coca-cola (programador geralmente adora isso, diz aí), tenho a satisfação de dizer que entrei para o time da Pixily!

A Pixily é um startup focado estritamente nos EUA. É um serviço online que ajuda clientes a agregar, organizar, localizar e compartilhar papéis e documentos digitais. Dessa forma:

Pixily - Como funciona

Você coleta seus papéis e os envia por correio, é feita a conversão em arquivos PDF e os conteúdos são indexados para que seja possível buscar, compartilhar, organizar, etc.

Quero agradecer a ajuda do Fábio Espindula, que colaborou nesse processo e tem se mostrado uma pessoa fantástica. Ao Fábio Akita também, pelo auxilio nas dúvidas em relação a exportação de serviços e pelas dicas valiosas.

É isso aí, que venha o desafio!

Curso de Ruby on Rails - nova turma

Para os residentes da região metropolitana de Porto Alegre - RS, estão abertas vagas para a Formação Desenvolvedor Web com Ruby on Rails, a ser realizada no Instituto de Informática Unisinos.

Mais detalhes da formação.

A carga horária é de 80 horas, dividia em 3 módulos. A estrutura está adequada tanto para profissionais que já programam em outras linguagens como iniciantes. Na página acima têm todos os detalhes ;)

Rails caminhando para o Lighthouse

Não sei se é oficial (nem mesmo se estou atrasado comentando isso), mas vi agora que passaram a constar alguns tickets no Lighthouse: http://rails.lighthouseapp.com/

Agora a logística parece ser Github + Lighthouse. O Github é muito bacana, já tem vários forks do Rails, o último que vi é um esforço para implementar características thread-safe.

Legal, vamos acompanhar o progresso da migração :)

UPDATE: Pois é, passei batido no feed do weblog.rubyonrails.com e não vi o anúncio oficial hehe. Não só o Rails foi para o Lighthouse, mas também o Capistrano e Prototype. Acontece ;)

FISL, um balanço geral

Acabaram ontem os 3 ótimos dias de FISL (com uma baita churrascada), que a cada ano fica mais interessante. Neste ano poucas palestras me atraíram, mas o que realmente valeu à pena foi conhecer grandes pessoas, tanto da comunidade Rails, como de outros lugares.

O Lucas Húngaro e o Tiago (Lecom), Ronaldo Ferraz e a Taís (Brasigo/BlogBlogs), Fábio Akita e Rodrigo (Sugerworks), Carlos Eduardo (e-Genial), Everton Carpes, Weldyss Santos, Vinícius Teles (ImproveIT), o pessoal da UDESC (Grupo Colméia), Sylvestre Mergulhão, entre outros que me fogem da memória neste instante.
Revi também os amigos, Júlio Santos Monteiro, Evandro Dutra, Pablo Targa e outros que convivem comigo na universidade, como o Joni Canal e o Eduardo Pittol.

Conheci também o Evan “Rabble” Henshaw-Plath, profissional que trabalha no Yahoo! e é responsável pelo recente Fireeagle.com, e outros sites como Odeo.com. Ele foi palestrante na RailsConf 2007 também. Chegou com irreverência no stand do Rails Brasil, questionando-nos “Onde estão os Macs?”. Extremamente gentil e simpático.

Assisti à palestra de Seaside com Randal Schwartz. Foi uma pena que ficou muito focada na linguagem, e o framework sobrou pouco tempo. Um detalhe interessante é que já nos primeiros slides ele disse acreditar que o Seaside será o próximo Rails. Ávidos e curiosos (rsrs), eu e o Júlio (que o abordou) conversamos rapidamente com ele, e resolvi perguntar o por quê desta opinião. Segundo ele, dois fatores: velocidade e debugging. A propósito, o debugging é fora do comum mesmo, pretendo olhar (novamente, mas com calma) o Seaside.

Algumas descobertas:

  • A Globo.com está utilizando Rails em alguns de seus projetos, como a intranet. Estão contratando profissionais também.
  • A Propus também usa Rails em alguns de seus projetos.
  • O Yahoo! parece estar gradativamente entrando no Rails, agora com o Fireeagle. O Rabble nos contou mais ou menos a arquitetura deles, que está otimizada principalmente para o PHP, mas aos poucos o Rails tem entrado na jogada.

O encerramento foi magnífico, com o onipresente Jon “maddog” Hall que, com muita sabedoria e irreverência (assim como em TODOS os FISL que ele fala), levantou o público através de aplausos.

Resumindo: foi ótimo! Infelizmente minha câmera estava há alguns kilômetros daqui, mas aguardo as fotos do pessoal que estiver lendo e que, por gentileza, puder mandar para jonysk AT gmail DOT com. :)

Gerenciando seus plugins Rails com GIT + braid

Este cenário surgiu da necessidade de sincronizar o desenvolvimento de mais pessoas num projeto Rails (usando GIT), no que diz respeito a vendor branches externos (plugins). Quando se usa SVN, instalar plugins no Rails com ./script/plugin install -x parece uma maravilha até o momento que você começa a alterar seus plugins.. Quando faz isso, não pode comitá-los, e fica no impasse sobre o que fazer. Nem preciso comentar o quão estranho seria mandar patchs para equipe…

As premissas, antes de tudo, eram:

  1. Não usar SVN.
  2. Flexibilidade para SVN e GIT como repositórios remotos.
  3. Possibilidade de trabalhar em ambiente multiusuário, ou seja, vários desenvolvedores.

Deixe-me explicar a primeira premissa: Usar Subversion implicaria em merges a cada atualização dos plugins. Independente da solução que fosse usada para o merge de um plugin (piston, svnmerge, svn_load_dirs), o Subversion não trabalha bem com arquivos removidos/renomeados/movidos. Seja qual for a estratégia, o fato de fazer merge em repositórios diferentes no Subversion é um “tiro no escuro”: você nunca sabe está realmente idêntico ao repositório que você sincronizou, principalmente quando há mudanças drásticas neles (arquivos removidos/renomeados/movidos), e vai deixando seu rastro de desorganização com o tempo. No site do Piston eles também comentam sobre isso.

Leia o artigo completo »

Capistrano com remote_cache + mongrel_cluster

Uma dica rápida para fazer o deploy usando remote_cache e mongrel_cluster. Antes da dica, uma introdução nos temas abordados:

Capistrano é uma ferramenta que, a grosso modo, permite realizar tarefas remotas de todos os tipos. Uma das aplicações comuns é no processo de deployment do Rails que é, de longe, facilitado pelo Capistrano :)

mongrel_cluster é, em suma, um Gem que agrupa um cluster de servidores de aplicação Mongrel, simplificando a tarefa de gerenciá-los.

Remote cache é uma estratégia de deployment do Capistrano que executa uma tarefa interessante: ela faz um clone do repositório GIT (ou um checkout, se for Subversion) e atualiza a aplicação apenas com um rsync, ou seja, copia apenas os arquivos modificados para a release atual.

Leia o artigo completo »

Ufa, um layout “clean”

Ok, o senso estético dos programadores não costuma ser muito apurado. Eu mesmo já me peguei olhando para trás nos temas antigos e pensando “onde eu estava com a cabeça ao tentar usar isso?”.
Mas é inegável que gostamos de um ambiente agradável. Seja um site, blog, ou a querida IDE, cheia de janelas e aquele syntax highlight nos códigos que “enchem” nossos olhos.

Sem mais, acho que dessa vez achei um tema bem agradável. Nada mais de bordas quadradas!