Pivotal Labs

Main menu

Skip to primary content
Skip to secondary content
  • About
  • Case Studies
  • Team
    • Executives
    • Locations
      • San Francisco (HQ)
      • Boston
      • Boulder
      • Denver
      • London
      • Los Angeles
      • New York
  • Community
    • Blogs
    • Tech Talks
    • Events
  • Careers
    • Lifestyle
    • Principles & Practices
    • Benefits
    • FAQ
    • Apply
  • Contact
    • Press Room
    • Press Releases
    • In The News
    • Press Kit
  • All
  • Labs
  • Standup
  • Tracker

Java Functional Testing with JRuby and RSpec

Pivotal Labs
Sunday, January 13, 2008

One of our client Java projects is pioneering the use of RSpec Story Framework for functional tests.

Overview

RSpec provides two frameworks for writing and executing examples of how your application should behave:

  • a Story Framework for describing behaviour at the application level
  • a Spec Framework for describing behaviour at the object level

JRuby is an 100% pure-Java implementation of the Ruby programming language.

How can Java projects benefit from RSpec Story Framework? Let’s consider an example.

Example

There is a Java back-end application server with proprietary remote interface. The server manages current states of all patents reviewed by multiple patent offices. Close to real life examples below have no proprietary information and object names has been changed. RSpec can help describe how server works and should be used, also what happens in special conditions.

stories/councilReview.txt

one of stories from the server specification:

Story: patent review by counsel

  A Council review of a patent should change the patent review state
  and affect rolled up state of the patent application case.

   Scenario: legal counsel reviews patent
    Given a patent
    And the patent roll up state is ACTIVE
    When the legal council reviews the patent
    Then patent state should be ON_HOLD
    And patent case rolled up state should be SUSPENDED

   Scenario: legal counsel releases patent from the review bin
    Given a patent
    And the patent roll up state is ON_HOLD
    When the legal council release the patent from the review bin
    Then the patent state should be ACTIVE
    And the patent case rolled up state should be ACTIVE

How it works with Java

steps/patentstateoperations.rb

Steps define our Domain Specific Language or DSL

steps_for(:patent_state_operations) do

 Given "a patent" do
   $patent_state_action_stub = PatentStateActionManager.new("local")
   $patent_id = Random.new
  end

 Given "the patent roll up state is '$state'" do |state|
   patent_state_action_stub.setState(patent_id, state);
 end

 When "a '$reviewer' releases the patent from the review bin" do |type|
    newState = patent_state_action_stub.releaseFromBin(patent_id, reviewer);
 end

 When "a '$reviewer' reviews the patent" do |type|
    newState = patent_state_action_stub.addToBin(patent_id, reviewer);
 end

 Then "patent state should be '$state'" do |state|
   newState.should be state
 end
end

helpers/helper.rb

loads required Java classes using JRuby:

 require 'rubygems'
 require 'spec'
 require 'spec/story'
 require 'java'

 include_class 'client.project.functionaltests.PatentStateActionManager'

 class Spec::Story::Runner::ScenarioRunner
   def initialize
    @listeners = []
  end
end

Dir[File.dirname(__FILE__) + "/../steps/*.rb"].uniq.each { |file| require file }

all.rb

JRuby runs all the stories for the project:

 dir = File.expand_path(File.dirname(__FILE__))
 require "#{dir}/helpers/helper"

 with_steps_for :patent_state_operations do
   run "#{dir}/stories/councilReview.txt"
 end

And since we are on Java Project developers use the above Ruby steps to delegate most of the calls to some Java manager, which serves as a fixture for the functional tests.

PatentStateActionManager.java

This is a Java fixture to pass data to the application via RPC

 public class PatentStateActionManager {

  public PatentStateActionManager(String instanceType) {
  ... // get connection to server via RPC
  }

  public String addToBin(long patentId, String review) {
  ... // call RPC method
  }

  public String releaseFromBin(long patentId, String review) {
  ... // another RPC call
  }

  public void setState(long patentId, String newState) {
  ... // java land, Java developers do what they want
  }
}

Results

As a result we have a executable text specification described in close to English language. Majority of the boiler-plate code contained in Java fixtures and Ruby steps.

Project Managers and Quality Engineers can use RSpec stories to define and exercise the behavior of the application.

Java Developers implemented a few stories to demonstrate the use of all steps for Quality Engineers. In addition to Java unit tests that cover the project code, functional tests cover the application use cases.

Next steps

Quality Engineers will fill the story book with more stories covering many conditions and states.

Java Developers will provide support for fixtures as interfaces evolves over the time.

Customers will define future stories as Pending stories.

And Test Valentines are moving to wider adoption of RSpec including:

  • continuous build integration
  • test results publishing
  • common steps for widely used interfaces:
    • Remote Control of Web apps using Selenium-RC
    • Command line and shell
  • interactive console introduction
  • functional point coverage
  • 0 Shares
  • Share on Facebook
  • Share on Twitter

5 Comments

  1. Brian Takita says:

    Sweet

    January 15, 2008 at 7:32 am

  2. Joe Moore says:

    Great post! Maybe we can use this on our project. I’m very curious about the Story text file and the Steps file.

    January 15, 2008 at 3:40 pm

  3. Ola Bini says:

    Hi Paul,

    Got the link to this post from Paul Hammant.

    I actually just released JtestR, a framework that takes care of the integration between your build process in Java, and testing frameworks in Ruby. I still haven’t support for the story runner, but that’s coming in 0.2. For now, it includes Test/Unit, dust, RSpec, mocha and ActiveSupport. Mocha has been modified and extended so you can mock any (non-final) methods and classes.

    More info at: http://jtestr.codehaus.org

    There seems to be some overlap in what we’re doing.

    Cheers

    January 15, 2008 at 6:19 pm

  4. Aslak Hellesøy says:

    It’s great to see RSpec break into the Java space. I hope the .Net folks will follow soon.

    Ola, Paul – I’d love to see you two collaborating on your similar efforts.

    January 23, 2008 at 12:54 am

  5. Jim Alateras says:

    This is very interesting. I have been developing with Java for over 10 years and have recently started working with Ruby and RoR. I have used rspec and absolutely love it and am looking at also using cucumber.

    Will definitely be following your progress on this.

    November 6, 2008 at 11:36 am

Add New Comment Cancel reply

Your email address will not be published.

Pivotal Labs

Pivotal Labs

Recent Posts

  • Does the set of all sets contain itself?
  • Standup 3/8/2012
  • Standup 3/7/2012
Subscribe to Pivotal's Feed

Author Topics

riddles (1)
agile (167)
capistrano (2)
rails (26)
movember (1)
git (10)
railsdoc (1)
object-design (1)
bdd (3)
cucumber (3)
linkedin (1)
oauth (1)
ruby (17)
tdd (2)
lvh.me (1)
rails 3.1.1 (1)
selenium (6)
homebrew (1)
mysql (5)
rvm (1)
sproutcore (1)
paperclip (2)
pry (1)
amazon (1)
heroku (1)
rails3 (2)
jasmine (3)
design (3)
process (12)
productivity (8)
learning (1)
olin (1)
migrations (2)
mongodb (2)
devise (2)
javascript (13)
rubymine (4)
ipad (1)
whurl (1)
head.js (1)
pairing (2)
tools (4)
pair programming (1)
rspec (10)
rspec2 (1)
ruby19 (1)
incubation (3)
startup (5)
api (1)
presenter (1)
vanna (1)
pivotal tracker (5)
capybara (1)
fakeweb (1)
webmock (1)
intern (1)
ruby on rails (25)
meetup (1)
textmate (1)
testing (20)
solr (4)
nyc-standup (11)
community (1)
opensource (3)
activerecord (4)
chrome (1)
mp4 (1)
activeresource (1)
flash (3)
neo4j (1)
nginx (1)
rsoc (1)
meta programming (1)
agile standup (7)
government (3)
webos (4)
xss (1)
jquery (1)
bundler (2)
ci (3)
gems (5)
postgresql (1)
geminstaller (1)
gemcutter (1)
cloud (2)
rack (2)
refraction (1)
gem (5)
refactoring (1)
validations (1)
webrat (1)
engine-yard (1)
firefox (2)
jsunit (1)
mongrel (2)
thin (1)
unicorn (1)
facebook (1)
rubygems (5)
jruby (1)
actioncontroller (1)
rails 2.3 (1)
palmpre (1)
autotest (1)
mac (2)
hosting (1)
goruco (11)
database (3)
railsconf (11)
gogaruco (4)
deployment (4)
github (1)
ie (1)
ajax (1)
intellij (1)
json (1)
asset packaging (1)
polonium (1)
character encoding (1)
utf-8 (1)
test (3)
civics (1)
hpricot (1)
rake (3)
sms (1)
unicode (1)
iphone (1)
java (1)
safari (1)
memory leaks (1)
rr (3)
editor (1)
css (1)
nyc (3)
performance (5)
fun (5)
enterprise rails (1)
health (1)
new and cool (1)
general (2)
treetop (1)
errors (1)
stack (1)
trace (1)
cache (1)
cookies (1)
freesoftware (1)
conferences (1)
development (1)
driven (1)
proxy (1)
caching (1)
peertopatent (1)
languages (1)
rest (2)
rubyforge (1)
sake (1)
file (1)
upload (1)
constants (1)
osx (1)
terminal (1)
pairprogramming (2)
  • About
  • Case Studies
  • Team
  • Community
  • Careers
  • Contact
  • Labs
  • Events

Contact Us

contact@pivotallabs.com
+1 415-77-PIVOT
TwitterLinkedInFacebook

Pivotal Tracker

Tracker is the award-winning agile project management tool that enables real-time collaboration around a shared, prioritized backlog.
Visit pivotaltracker.com >