<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/xsl/novos.xsl"?>
<page xml:lang="pt-br">
  <html>
    <head>
      <meta content="eVd8g6RJNQaMw81MM2ZjqWUfUGKG5LEqBoLyR7xK5jw=" name="verify-v1"/>
    </head>
  </html>
  <topo/>
  <posts>
    <post>
      <titulo>
Rails + Cucumber = Desenvolvimento dirigido por testes - Parte I      </titulo>
      <tituloHtml>rails_cucumber_desenvolvimento_dirigido_por_testes_-_parte_i</tituloHtml>
      <mes>04/03</mes>
      <ano>2010</ano>
      <texto>
Muito se fala a respeito de TDD (Test Driven Development) hoje em dia, mas o que &#233; essa t&#233;cnica ninja de desenvolver?<br />Simples, como o pr&#243;prio nome j&#225; sugere voc&#234; &#233; guiado por testes, ou seja primeiro voc&#234; escreve o c&#243;digo de TESTE e somente depois programa! Soa diferente n&#233;?!<br /><br />Mas vamos tentar isso com o Rails e ver como funciona!<br />Vamos usar o Cucumber, pois ele deixa o teste muito mais amig&#225;vel, veremos a seguir...<br /><br />Instale as dep&#234;ndencias:<br />apt-get install libxml2 libxml2-dev libxslt-dev<br /><br />Instale o cucumber:<br />gem install database_cleaner webrat<br />Se der algum erro de depend&#234;ncia, ir&#225; aparecer algo como "NOME_DA_LIB is missing" na instala&#231;&#227;o do webrat, instale-a e tente de novo.<br />Ap&#243;s isso, instale o cucumber-rails<br />gem install cucumber-rails<br /><br />Crie uma aplica&#231;&#227;o RAILS e configure a conex&#227;o com o mysql<br />rails teste_cucumber -d mysql<br />Entre na pasta do projeto e execute:<br />cd teste_cucumber/<br />rake db:create:all<br /><br />Vamos colocar o cucumber no projeto:<br />ruby script/generate cucumber<br /><br />E verificar se est&#225; tudo instalado corretamente:<br />rake cucumber<br /><br />Agora que estamos com tudo instalado, vamos imaginar o caso de um simples cadastro, a pessoa tem que inserir nome (no m&#225;ximo 60chars) e email (no formato correto) no banco de dados atrav&#233;s de um CRUD (gerado pelo scaffold mesmo).<br /><br /><span class='subTitulo'>Etapa1 - Desenvolver.... O TESTE!</span><br />Isso mesmo, antes de desenvolver vamos escrever o c&#243;digo do teste!<br /><br />Vamos criar um passo onde vamos falar para o teste que queremos cadastrar uma pessoa no banco:<br />script/generate feature usuario id:integer, nome:string, email:string<br /><br />Dentro da pasta features/ aparecer&#225; um arquivo chamado, manage_usuarios.feature, vamos edit&#225;-lo assim:<br /><br />Feature: Manage usuarios<br />  In order to manage users<br />  As a system's user<br />  wants to register a user<br />  <br />  Scenario: Register new usuario sucessfull<br />    Given I am on the new usuario page<br />    When I fill in "Nome" with "Test name"<br />    And I fill in "Email" with "email@email.com"<br />    And I press "Create"<br />    Then I should see "Test name"<br />    And I should see "email@email.com"<br />    <br />  Scenario: Register new usuario email error<br />    Given I am on the new usuario page<br />    When I fill in "Nome" with "Nome de teste"<br />    And I fill in "Email" with "this_is_not_a_valid_email"<br />    And I press "Create"<br />    Then I should see "Email - Invalid email"<br /><br />  Scenario: Register new usuario name error<br />    Given I am on the new usuario page<br />    When I fill in "Nome" with "This_user_has_more_than_60_chars_lalalalalalalalalalalalalalalalalalalalalalalalalalalala"<br />    And I fill in "Email" with "email@email.com"<br />    And I press "Create"<br />    Then I should see "Nome - max 60 chars"<br /><br />Como o pr&#243;prio arquivo j&#225; diz, se um usu&#225;rio preencher o email de forma errada, deve aparecer o erro, se ele preencher o nome com mais de 60 caracteres, tamb&#233;m deve aparecer o erro, se for tudo certo, dever&#225; ver o seu nome e email na listagem.<br /><br /><span class='subTitulo'>2 Etapa - Executar os testes e ver se tem erros!</span><br />Agora vamos executar o teste:<br />rake cucumber<br /><br />Vixi! V&#225;rios erros, mas como o rails sabe o que tem que fazer simplesmente com o texto???<br />Dentro da pasta features/step_definitions est&#227;o os arquivos que falam a frase e como ela deve responder ao comando!<br />Bom, agora que sabemos onde est&#227;o os erros, vamos corrigir!<br /><br /><span class='subTitulo'>3 Etapa - Escreva seu c&#243;digo!</span><br />O primeiro erro que aparece &#233; que n&#227;o temos a rota para new_usuario, ent&#227;o vamos finalmente criar o scaffold com usu&#225;rios!<br />ruby script/generate scaffold Usuario id:integer nome:string email:string<br /><br />Vamos editar o arquivo de migra&#231;&#227;o db/migrate/20100304174346_create_usuarios.rb para que o banco tenha uma chave prim&#225;ria e respeite os limites de caracteres, do modo que fique assim:<br /><br /><pre><code class="ruby">class CreateUsuarios &lt; ActiveRecord::Migration  def self.up    create_table :usuarios, :primary_key =&gt; :id do |t|      t.integer :id, :null =&gt; false      t.string :nome, :limit =&gt; 60, :null =&gt; false      t.string :email, :limit=&gt;255, :null =&gt; false      t.timestamps    end  end  def self.down    drop_table :usuarios  endend</code></pre><br />Feito isso vamos executar o migrate do banco de dados!<br />rake db:migrate	<br /><br />Se tudo ocorreu bem j&#225; devemos ter nossa interface de CRUD funcionando no localhost, execute a aplica&#231;&#227;o do jeito que achar melhor para testarmos!<br /><br />Agora que codificamos uma parte, vamos testar o nosso c&#243;digo pra ver se passa na valida&#231;&#227;o:<br />rake cucumber<br /><br />Olha s&#243;! Passamos em 1, mas ainda faltam 2! Esquecemos de colocar as valida&#231;&#245;es no email e no nome.<br />Vamos editar o arquivo app/model/usuario.rb adicionando as valida&#231;&#245;es:<br /><pre><code class="ruby">class Usuario &lt; ActiveRecord::Base  validates_format_of     :email,                        :with       =&gt; /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i,                        :message    =&gt; '- Invalid email'  validates_length_of :nome, :within =&gt; (0..60), :message=&gt; "- max 60 chars"end</code></pre><br /><span class='subTitulo'>Etapa 4 - Execute os testes com sucesso!</span><br /><br />Agora vamos rodar o teste mais uma vez:<br />rake cucumber<br /><br />Agora sim :D passamos em todos os testes! E temos mais uma etapa que n&#227;o se aplica a esse projeto...<br /><br /><span class='subTitulo'>Etapa 5 - Refratore o c&#243;digo</span><br />Arrume seu c&#243;digo, pois agora os seus testes j&#225; garantem as funcionalidades b&#225;sicas e assim voc&#234; garante que o que voce alterar n&#227;o impactar&#225; no projeto.<br /><br /><span class='subTitulo'>Etapa 6 - Repita tudo at&#233; terminar!</span><br />Tudo nos agiles da vida &#233; assim! Fa&#231;a r&#225;pido, bem feito e fa&#231;a de novo! :D<br /><br />O projeto pode ser baixado aqui:<br /><a href="http://cbs.net.br/downloads/cucumber_teste.tar.gz">http://cbs.net.br/downloads/cucumber_teste.tar.gz</a><br /><br />No pr&#243;ximo POST trarei como fazer isso em portugu&#234;s!<br /><br />[]'s<br />Leonardo Baptista      </texto>
      <linguas>
        <lingua>
          <nome>pt-br</nome>
          <path>brasil.gif</path>
          <tituloHtml>rails_cucumber_desenvolvimento_dirigido_por_testes_-_parte_i</tituloHtml>
        </lingua>
        <lingua>
          <nome>en-us</nome>
          <path>usa.gif</path>
          <tituloHtml>rails_cucumber_test_driven_development_-_part_i</tituloHtml>
        </lingua>
      </linguas>
    </post>
    <post>
      <titulo>
FISL 2009 &#218;ltimo dia: Lei Azeredo e decep&#231;&#227;o na TV Digital      </titulo>
      <tituloHtml>fisl_2009_final</tituloHtml>
      <mes>27/06</mes>
      <ano>2009</ano>
      <texto>
Ol&#225; senhores!<br /><br />Hoje foi um dia e tanto no FISL, muitas apresenta&#231;&#245;es legais! A principal delas foi a palestra contra a lei de controle da internet do Azeredo. Acho muito foda (no sentido ruim da palavra) quando pol&#237;tico enfia o nariz onde n&#227;o deve. Pol&#237;tico entende de outras coisas e N&#195;O DE TECNOLOGIA.<br /><br />Teremos que, literalmente, encher o saco deste pol&#237;tico.<br /><br />Por&#233;m hoje tivemos uma decep&#231;&#227;o no F&#243;rum: A "apresenta&#231;&#227;o/libera&#231;&#227;o" do middleware brasileiro de referencia (voc&#234;s sabem como ele &#233; chamado).<br /><br />O que foi aquilo? Um dia para instala&#231;&#227;o do ambiente??<br />Mas at&#233; a&#237; tudo bem, se fosse liberado alguma coisa do JAVA DTV. Eles nos deram uma vers&#227;o compilada do LWUIT PRA CELULAR!!! Sim, todas as classes (N&#227;o presentes no JAVA DTV) est&#227;o l&#225;!<br /><br />A &#250;nica coisa que eles fizeram foi: Criar uma classe C++ que faz o wrapper de java pra c++ e volta pro java pra desenhar em awt ou swing (acredito ser para migrar de um jeito simples depois).<br /><br />Agora vem minha indigna&#231;&#227;o! Porra! Esperamos meses por isso j&#225;, desde outubro eles tem no site deles falando de uma vers&#227;o RC1 que nunca foi lan&#231;ada. Quando eles lan&#231;am alguma coisa eles vem com nada pronto?? N&#227;o estou falando mal do trabalho dos caras nas bibliotecas c++, que s&#227;o muitas, mas prometeram JAVA DTV - LWUIT no FISL e queremos ver JAVA DTV - LWUIT. Temos uma vers&#227;o da especifica&#231;&#227;o JAVA DTV desde JANEIRO e eles n&#227;o conseguiram fazer nada a mais que um exemplo que parece ser de uma semana antes do evento???<br /><br />Mas com indigna&#231;&#227;o vem resolu&#231;&#227;o de problemas! Sim, convido a TODOS a participarem do projeto <a href="http://code.google.com/p/middlewareopensource/">Middleware OpenSource</a> (realmente aberto) que estamos come&#231;ando. Desde o come&#231;o o projeto est&#225; com o c&#243;digo aberto e esperando ajuda da comunidade!<br /><br />Temos uma vers&#227;o do LWUIT rodando em v&#225;rias interfaces (AWT, SWING, SDL, Xorg, DFB,etc...) que precisa de adapta&#231;&#227;o para o JAVA DTV.<br /><br />N&#243;s j&#225; estamos trabalhando nela e voc&#234;?<br />Como a p&#225;gina principal do projeto diz, precisamos n&#227;o somente de programadores interessado. Entre na p&#225;gina e veja como voc&#234; pode nos ajudar. <br />      </texto>
      <linguas>
        <lingua>
          <nome>pt-br</nome>
          <path>brasil.gif</path>
          <tituloHtml>fisl_2009_final</tituloHtml>
        </lingua>
      </linguas>
    </post>
    <post>
      <titulo>
FISL 2009      </titulo>
      <tituloHtml>fisl_2009_comeco</tituloHtml>
      <mes>23/06</mes>
      <ano>2009</ano>
      <texto>
Ol&#225; galera!<br /><br />Embarquei hoje em um avi&#227;o aqui pra Porto Alegre e aqui estou, vendo coisas interessantes do FISL 10 (F&#243;rum Internacional Software Livre) que come&#231;a amanh&#227;.<br /><br />Muitas coisas legais! Estou tentando fazer minha agenda aqui, mas ta complicado... N&#227;o sei ao certo o que assistir.<br />S&#243; sei que amanh&#227; verei algumas coisas sobre python e rails e veremos o que mais tiver de interessante no evento.<br /><br />Estou levando minha c&#226;mera e tentarei tirar umas fotos!<br /><br />Bom, vou acabando por aqui porque vou l&#225; na PUC buscar meu crach&#225; pra n&#227;o ter rolo amanh&#227;!<br /><br />Abra&#231;os<br />Leonardo Baptista<br />      </texto>
      <linguas>
        <lingua>
          <nome>pt-br</nome>
          <path>brasil.gif</path>
          <tituloHtml>fisl_2009_comeco</tituloHtml>
        </lingua>
      </linguas>
    </post>
    <post>
      <titulo>
Abertura de um novo blog      </titulo>
      <tituloHtml>abertura_do_blog</tituloHtml>
      <mes>08/04</mes>
      <ano>2009</ano>
      <texto>
Ol&#225;! <br /><br />Depois de um longo tempo querendo fazer um blog "tecnol&#243;gico" (sim, est&#225; entre aspas, porque esse n&#227;o ser&#225; o &#250;nico assunto abordado aqui) surgiu-me um motivo para faze-lo!<br /><br />Eu estava querendoo aprender sobre XML/XSLT.<br />Sim! Fa&#231;a um teste no seu navegador, abra o c&#243;digo fonte da p&#225;gina! O que voce ver&#225; &#233; um xml limpo! Sem c&#243;digos extras de html! O seu navegador come&#231;a a renderizar a p&#225;gina do jeito que ele acha melhor, com as tags suportadas s&#243; por ele (tente abrir no firefox e salvar a p&#225;gina, voc&#234; ver&#225; v&#225;rios atributos nas tags pr&#243;prios do firefox). Bom, isso ser&#225; um assunto melhor tratado l&#225; na frente!<br /><br />Eu costumo ser distra&#237;do, esqueci de me apresentar. Para os que n&#227;o me conhecem:<br />Meu nome: Leonardo Baptista.<br />Me tornarei um bacharel em ci&#234;ncia da computa&#231;&#227;o no final deste ano (2009).<br />Sou diretor de projetos da Empresa Jr. Digito1 no SENAC.<br />E estou pendendo para a carreria acad&#234;mica (mestrado e doutorado).<br /><br />Como isso &#233; um texto introdut&#243;rio, vamos falar do que vamos falar :P!<br /><br /><span class='subTitulo'>Tecnologia</span><br />A parte de tecnologias ser&#225; abordada em v&#225;rias linguagens diferentes.<br />Tem uma raz&#227;o para isso: Se prender a uma linguagem s&#243; acaba se tornando chato! Eu gosto de conhecer v&#225;rias e os pontos fortes e fracos de cada uma.<br /><br />Vamos ver algumas que eu mexo:<br />* C / C++ -&gt; Dispensa coment&#225;rios!<br />* Ruby -&gt; Uma linguagem din&#226;mica muito boa. Este blog (al&#233;m de XML/XSLT) &#233; feito usando ela e seu framework para web: Rails. Uma pedida muito boa para desenvolvimento &#225;gil voltado para web.<br />* Python -&gt; Uma das linguagens que eu mais gosto! Realmente muito simples! Sempre tem um jeito simples de fazer algo complicado. Um 'imports' sempre resolve!<br />* C# / VB .NET -&gt; As apostas da microsoft. Tentaram inovar com o framework 3.5 falando que era din&#226;mico, s&#243; que n&#227;o &#233; bem assim que funciona. Quem sabe acertem no 4.0 ?<br />* Java -&gt; Pode ser uma das principais linguagens nesses tempos. Porque? A tv digital vem a&#237;! Preparem o Java DTV!<br /><br /><span class='subTitulo'>Tutoriais</span><br />Sempre que achar preciso, trarei um tutorial legal para o blog. Eu pretendo escrever alguns, mas como &#233; besteira ficar reinventando a roda, se j&#225; tiver um bom sobre algum assunto, s&#243; informarei aqui.<br /><br />Todos os c&#243;digos dos tutoriais ser&#227;o disponibilizados aqui, com explica&#231;&#245;es.<br />Os c&#243;digos-fonte s&#227;o de uso livre. N&#227;o possuem licensa alguma, por&#233;m se for copiar algo que eu fiz, por favor, inclua os cr&#233;ditos em seu trabalho.<br /><br /><span class='subTitulo'>Assuntos do dia-a-dia</span><br />Como voc&#234;s sabem, estou fazendo meu &#250;ltimo ano da gradua&#231;&#227;o! Assim quando sugir um assunto interessante em aula, eu tratarei aqui de um modo pr&#225;tico, sempre que poss&#237;vel.<br />E meu dia n&#227;o &#233; feito s&#243; de estudos! Coisas engra&#231;adas e interessantes fora da &#225;rea tecnol&#243;gica, tamb&#233;m estar&#227;o por aqui!<br /><br />Bom, essa postagem ficou um pouco extensa pois &#233; uma introdu&#231;&#227;o.<br />Nas postagens futuras serei o mais objetivo poss&#237;vel.<br /><br />Espero que continuem acessando meu blog \o/<br />Um abra&#231;o,<br /><br />Leonardo Baptista      </texto>
      <linguas>
        <lingua>
          <nome>pt-br</nome>
          <path>brasil.gif</path>
          <tituloHtml>abertura_do_blog</tituloHtml>
        </lingua>
        <lingua>
          <nome>en-us</nome>
          <path>usa.gif</path>
          <tituloHtml>blog_openning</tituloHtml>
        </lingua>
      </linguas>
    </post>
  </posts>
  <lateral/>
  <rodape/>
</page>
