Cauê Guerra

November 22, 2009

Conquistando o mundo

Filed under: Uncategorized — Tags: — caueguerra @ 7:21 PM

Criei este blog faz algum tempo e acabei meio que por abandoná-lo. A razão disso é que eu estava tentando me controlar antes de poder dar a notícia de forma oficial:

Eu estou saindo do país. Mais precisamente, estou me mudando para a Austrália. Fui contratado como um consultor pela ThoughtWorks e a expectativa é que me mude até o fim de janeiro, estou apenas aguardando o visto.

O processo seletivo, como já citado pelo Leonardo Borges (que deve se mudar para lá na mesma época que eu), é longo e cansativo. Estou nesse processo desde abril, e de lá pra cá foram cerca de 5 entrevistas, 1 análise de código, 2 sessões de programação pareada e muita, muita espera. Mas valeu a pena, e foi o único processo em que participei até hoje onde me senti verdadeiramente avaliado.

Quanto a Caelum, sinto muito prazer e gratidão em ter sido desenvolvedor, instrutor e consultor por aquela que, considero eu, ser a melhor empresa de tecnologia do Brasil. Quase tudo do que sei hoje aprendi trabalhando ao lado de seus grandes profissionais. No entanto, o legado que a Caelum me deixa é muito maior que isso, são os amigos que acabei ganhando e espero continuar tão próximo quanto possível.

Em dezembro, após entregar minha monografia do trabalho de conclusão de curso, devo comemorar as últimas conquistas com amigos aqui em Sampa e todos estão convidados. Informações em breve. =D

October 3, 2009

Utilizando cucumber para testar qualquer aplicação web

Filed under: Testes — Tags: , , , , , , — caueguerra @ 12:27 AM

Há algum tempo venho utilizando o Cucumber em um cliente para testar aplicações web feitas em ASP e .NET. Nesse post, vou mostrar como configurar todo o ambiente, mas assumo que você já esteja familiarizado com Cucumber e Webrat. Além dessas duas bibliotecas, precisaremos ainda do Mechanize, uma gem capaz de automaticamente armazenar cookies, fazer redirects, enviar forms, etc; e tudo isso de forma integrada com o Webrat e Cucumber.

Para chegar a solução atual, fiz uma pesquisa em diversos sites, mas mesmo a referência oficial do webrat não funcionava para mim, então acredito que esse post possa beneficiar mais pessoas.

Antes de mais nada, é necessário instalarmos as gems que utilizaremos:

sudo gem install cucumber webrat mechanize

Para começar, vamos criar a estrutura de diretórios necessária:

|teste
|–features – onde ficarão nossas features
|—-step_definition – nossos webrat steps
|—-support – onde ficará nossos arquivos env.rb e paths.rb

Vamos agora configurar nosso arquivo features/support/env.rb:

  1. require 'webrat'
  2.  
  3. include Webrat::Methods
  4. include Webrat::Matchers
  5.  
  6. Webrat.configure do |config|
  7.   config.mode = :mechanize
  8. end
  9.  
  10. World do
  11.   Webrat::Session.new(Webrat::MechanizeAdapter.new)
  12. end

Crie também o arquivo features/step_definitions/webrat_steps.rb, note que esse arquivo é o mesmo que é gerado quando você utiliza o cucumber em aplicações Rails, mas reproduzi na integra esse arquivo:

  1. require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
  2.  
  3. # Commonly used webrat steps
  4. # http://github.com/brynary/webrat
  5.  
  6. Given /^I am on (.+)$/ do |page_name|
  7.   visit path_to(page_name)
  8. end
  9.  
  10. When /^I go to (.+)$/ do |page_name|
  11.   visit path_to(page_name)
  12. end
  13.  
  14. When /^I press "([^\"]*)"$/ do |button|
  15.   click_button(button)
  16. end
  17.  
  18. When /^I follow "([^\"]*)"$/ do |link|
  19.   click_link(link)
  20. end
  21.  
  22. When /^I follow "([^\"]*)" within "([^\"]*)"$/ do |link, parent|
  23.   click_link_within(parent, link)
  24. end
  25.  
  26. When /^I fill in "([^\"]*)" with "([^\"]*)"$/ do |field, value|
  27.   fill_in(field, :with => value)
  28. end
  29.  
  30. When /^I fill in "([^\"]*)" for "([^\"]*)"$/ do |value, field|
  31.   fill_in(field, :with => value)
  32. end
  33.  
  34. When /^I fill in the following:$/ do |fields|
  35.   fields.rows_hash.each do |name, value|
  36.     When %{I fill in "#{name}" with "#{value}"}
  37.   end
  38. end
  39.  
  40. When /^I select "([^\"]*)" from "([^\"]*)"$/ do |value, field|
  41.   select(value, :from => field)
  42. end
  43.  
  44. When /^I select "([^\"]*)" as the date and time$/ do |time|
  45.   select_datetime(time)
  46. end
  47.  
  48. When /^I select "([^\"]*)" as the "([^\"]*)" date and time$/ do |datetime, datetime_label|
  49.   select_datetime(datetime, :from => datetime_label)
  50. end
  51.  
  52. When /^I select "([^\"]*)" as the time$/ do |time|
  53.   select_time(time)
  54. end
  55.  
  56. When /^I select "([^\"]*)" as the "([^\"]*)" time$/ do |time, time_label|
  57.   select_time(time, :from => time_label)
  58. end
  59.  
  60. When /^I select "([^\"]*)" as the date$/ do |date|
  61.   select_date(date)
  62. end
  63.  
  64. When /^I select "([^\"]*)" as the "([^\"]*)" date$/ do |date, date_label|
  65.   select_date(date, :from => date_label)
  66. end
  67.  
  68. When /^I check "([^\"]*)"$/ do |field|
  69.   check(field)
  70. end
  71.  
  72. When /^I uncheck "([^\"]*)"$/ do |field|
  73.   uncheck(field)
  74. end
  75.  
  76. When /^I choose "([^\"]*)"$/ do |field|
  77.   choose(field)
  78. end
  79.  
  80. When /^I attach the file at "([^\"]*)" to "([^\"]*)"$/ do |path, field|
  81.   attach_file(field, path)
  82. end
  83.  
  84. Then /^I should see "([^\"]*)"$/ do |text|
  85.   response.should contain(text)
  86. end
  87.  
  88. Then /^I should see \/([^\/]*)\/$/ do |regexp|
  89.   regexp = Regexp.new(regexp)
  90.   response.should contain(regexp)
  91. end
  92.  
  93. Then /^I should not see "([^\"]*)"$/ do |text|
  94.   response.should_not contain(text)
  95. end
  96.  
  97. Then /^I should not see \/([^\/]*)\/$/ do |regexp|
  98.   regexp = Regexp.new(regexp)
  99.   response.should_not contain(regexp)
  100. end
  101.  
  102. Then /^the "([^\"]*)" field should contain "([^\"]*)"$/ do |field, value|
  103.   field_labeled(field).value.should =~ /#{value}/
  104. end
  105.  
  106. Then /^the "([^\"]*)" field should not contain "([^\"]*)"$/ do |field, value|
  107.   field_labeled(field).value.should_not =~ /#{value}/
  108. end
  109.  
  110. Then /^the "([^\"]*)" checkbox should be checked$/ do |label|
  111.   field_labeled(label).should be_checked
  112. end
  113.  
  114. Then /^the "([^\"]*)" checkbox should not be checked$/ do |label|
  115.   field_labeled(label).should_not be_checked
  116. end
  117.  
  118. Then /^I should be on (.+)$/ do |page_name|
  119.   URI.parse(current_url).path.should == path_to(page_name)
  120. end
  121.  
  122. Then /^show me the page$/ do
  123.   save_and_open_page
  124. end

Ainda precisamos criar nosso arquivo /features/support/paths.rb, que será responsável pelo mapeamento dos sites que iremos testar:

  1. module NavigationHelpers
  2.   # Maps a name to a path. Used by the
  3.   #
  4.   #   When /^I go to (.+)$/ do |page_name|
  5.   #
  6.   # step definition in webrat_steps.rb
  7.   #
  8.   def path_to(page_name)
  9.     case page_name
  10.  
  11.     when /google/                  # poderia ser minha_app
  12.       'http://www.google.com'      # e http://localhost:8080/minha_app
  13.     else
  14.       raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
  15.         "Now, go and add a mapping in #{__FILE__}"
  16.     end
  17.   end
  18. end
  19.  
  20. World(NavigationHelpers)

Agora só falta criarmos nosso teste. Crie o arquivo features/teste.feature:

  1. Feature: Testing
  2. In order to value
  3. As a role
  4. I want feature
  5.  
  6.   Scenario: google
  7.     Given I am on google
  8.     When I fill in "q" with "java são paulo curso"
  9.     And I press "Pesquisa Google"
  10.     Then I should see "Caelum"

Agora basta executarmos nosso teste com o comando

cucumber

September 23, 2009

Ser bom não basta, é preciso surpreender

Filed under: Uncategorized — Tags: — caueguerra @ 7:12 PM

Uns dias atrás, durante meu almoço, recebi uma ligação do gerente de meu banco. Sendo o gerente, resolvi atender pois acreditava que poderia se tratar de uma confirmação de alguma transação que eu ou um bandido havíamos realizado. Mas o diálogo que se seguiu foi parecido com o seguinte:

- “Oi Cauê, aqui é o fulano do Banco Real, e gostaria que você desse uma nota de 0 a 10 pro banco.”

- “Huum, 8″

- “8? Por que 8?”

- “Vocês são bons, mas não me surpreendem. Vocês apenas fazem o que tem que ser feito, o que eu pago através de tarifas para que seja feito”

- “Ok, obrigado pelo feedback”

De fato, fiquei bem feliz com a atitude do meu gerente, em buscar diretamente com seus clientes por feedback; mesmo achando que isso representava um fato isolado e que cairia em esquecimento em muito pouco tempo.

Estava enganado, nem uma semana depois recebo em minha casa a seguinte correspondência:

Banco Real - Cinemark

Ganhei um par de ingressos para assistir a qualquer filme no Cinemark, num envelope super caprichado e com os dizeres: “Ganhar um presente sempre é bom. Melhor ainda quando não estamos esperando”. Banco Real, vocês conseguiram! Me surpreenderam!

Mas essa não é a questão que quero levantar nesse post. Todo esse episódio me levou a pensar sobre o quanto surpreendemos as pessoas que estão a nossa volta, ou o quanto surpreendemos nossos chefes, colegas de trabalho, amigos, familiares, clientes. Será que você tem sido apenas “bom”? Ser apenas “bom” em um mundo cada vez mais competitivo é sinônimo de fracasso.

Mas se somos apenas “bons”, qual a maneira de melhorar? Pensando como o gerente do meu banco: pedindo feedback e escutando o que as pessoas tem a dizer!

Sempre que sou mal atendido em restaurantes, faço questão de não pagar os 10% de taxa serviço. O propósito disso é dar a oportunidade de ser questionado sobre qual foi o problema que não me deixou satisfeito, o que podia ser melhorado. Mas pra isso é preciso querer ouvir, posso contar nas mão o número de vezes em que essa minha atitude surtiu algum efeito.

Resumindo, tenha uma canal de comunicação sempre aberto. Com o tempo, e conforme a abertura dada, os feedbacks surgirão de forma espontânea. Surpreenda, e você construirá relacionamentos baseados em confiança e respeito.

Quanto melhor a comunicação, melhor a comunicação!

Powered by WordPress