Posts tagged ruby

Jun09

Who said you can't test Swing apps?

cucumber tdd bdd swinger java jruby ruby | comments

In my job, we build a lot of desktop applications. They used to be written mostly in C++ for sake of performance a long time ago, but we’ve migrated all apps to Java, since Swing got to a reasonable level of performance these days.

Since I’ve got there in 2005, I’ve been preaching loudly about the benefits of test-driven development and managed to get quite a lot of people infected with the test-first bug.

However, we’ve got a lot of legacy code. I mean A LOT, really. That kind of code that was never meant to be tested in isolation, and unfortunately, will never be.

That doesn’t mean we can’t make use of automated testing. We just have to go up all the way up to the UI to be able to do it. I know, it’s slow and brittle but it’s much better than nothing.

I’ve been working a lot with Cucumber and investigating it deeply to see if that could be the missing piece we needed to make testers and developers really work together, so we could free ourselves from the manual testing hell.

Cucumber also makes UI testing a lot less brittle and easier to maintain since we can change the UI and keep the tests we already got, having only to fix the step definitions mostly.

That’s why I started writing Swinger. Swinger is a collection of step definitions that you can use to automate testing in Java/Swing applications. It makes use of the Jemmy library to find and manipulate Swing widgets.

It’s still very experimental and it has a long way to go before I can release it as a gem, but so far I’ve been able to write some interesting and mildly complex test cases with it.

I’m using the SwingSet demo application that comes with the JDK as my test bed and it’s quite fun to watch Cucumber drive it crazy in a matter of seconds. Wanna take a look? Check it out:

Continue reading »

Jun07

Looks like I am blogging again: printing out Cucumber steps

ruby cucumber rake | comments

UPDATE: This functionality turned into a patch and got into Cucumber as a built-in formatter. Use cucumber -f steps to use it.

For at least a minimally interesting inaugural post, let me explain the name of the blog:

Rice and Beans is a very frequent food combination seen in Brazil, which food experts believe to be a healthy foundation for a lot of typical brazilian dishes due to the mix of carbs and proteins.

Now, to something really useful. This is a little rake task I wrote to printout any Cucumber step definition for your project. It is very hackish, but it works for now. I intend to turn this into a proper formatter and add it to Cucumber.

desc 'List all step definitions'
task :steps do

  # let's collect all steps in this hash, grouped by source file
  $steps = {}

  module Cucumber
    class StepDefinition
      # let's override the step constructor to 
      # capture the necessary information
      alias_method :old_initialize, :initialize
      def initialize(regexp, &proc)
        caller[1] =~/.+\/(.+)\./
        $steps[$1] ||= []
        $steps[$1] << regexp.to_s[8..-3]
        old_initialize(regexp, &proc)
      end
    end
  end

  # require the files containing the step definitions,
  # so they get all instantiated and captured
  require File.dirname(__FILE__) + '/path/to/your_steps.rb'

  # printing out results
  $steps.keys.sort.each do |file|
    puts file + ":"
    $steps[file].sort.each { |s| puts "  " + s }
    puts
  end
end

And you get this kind of output on your console when the task is ran:

HTML parse error: 
<pre>
checkbox_steps:
  I click the checkbox "([^\"]*)"
  the checkbox "([^\"]*)" should (not )*be selected

combobox_steps:
  I change the combobox "([^\"]*)" to "([^\"]*)"
  I should have the combobox "([^\"]*)" with "([^\"]*)"

dialog_steps:
  I close the dialog "([^\"]*)"
  I should (not )*see the dialog "([^\"]*)"
  the dialog "([^\"]*)" is the container
  the dialog "([^\"]*)" is visible
Continue reading »