Presenting Win32-autogui. A Ruby Win32 GUI testing framework packaged as a RubyGem.
Win32-autogui provides a framework to enable GUI application testing with Ruby. This facilitates integration testing of Windows binaries using Ruby based tools like RSpec and Cucumber regardless of the language used to create the binaries.
The source code repository is available here: http://github.com/robertwahler/win32-autogui. The repository contains specs and an example Win32 program with source and specs written in Delphi (Object Pascal).
Here is a quick demo using the Ruby Interactive Shell (IRB) under Cygwin on Windows XP to drive "calc.exe."
Win32-autogui is available on RubyGems.org
gem install win32-autogui
Start up IRB
irb
Paste the following lines into your shell's IRB session.
Note: Window's "calc.exe" is used as the target binary by Win32-autogui's internal specs. The complete source to the wrapper is available here: spec/applications/calculator.rb.
require 'win32/autogui' include Autogui::Input class Calculator < Autogui::Application def initialize super :name => "calc", :title => "Calculator" end def edit_window main_window.children.find {|w| w.window_class == 'Edit'} end end
Now we can start up the calculator
calc = Calculator.new
calc.running?
Session screenshot
Get some information
calc.pid
calc.main_window.window_class
calc.main_window.children.count
Perform a calculation
calc.set_focus; type_in('2+2=')
Get the result
calc.edit_window.text
Shut it down
calc.close
calc.running?
Session screenshot
The Win32-autogui repository contains an example Win32 program with source, testable binary, and specs written in Delphi (Object Pascal) located here: http://github.com/robertwahler/win32-autogui/tree/master/examples/quicknote.
Quicknote is a bare bones notepad clone. Here is the spec file spec/form_splash_spec.rb for the splash screen functionality.
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper') include Autogui::Input describe "FormSplash" do after(:all) do if @application.running? @application.splash.wait_for_close if @application.splash @application.file_exit # still running? force it to close @application.close(:wait_for_close => true) @application.should_not be_running end end describe "startup with no command line parameters" do before(:all) do # --nosplash is the default, turn it back on @application = Quicknote.new :parameters => '' @application.should be_running end it "should show" do @application.splash.should_not be_nil end it "should close within 5 seconds" do @application.splash.should_not be_nil seconds = 5 timeout(seconds) do @application.splash.wait_for_close end @application.splash.should be_nil end end describe "startup with '--nosplash' command line parameter" do it "should not show" do @application = Quicknote.new :parameters => '--nosplash' @application.should be_running @application.splash.should be_nil end end end
The Quicknote.exe application wrapper. Each of the testable application windows must be defined in a subclass of Autogui::Application. Partial code from lib/quicknote.rb.
class Quicknote < Autogui::Application def initialize(options = {}) # relative path to app using Windows style path @name ="exe\\quicknote.exe" defaults = { :title=> "QuickNote -", :parameters => '--nosplash', :main_window_timeout => 20 } super defaults.merge(options) end def edit_window main_window.children.find {|w| w.window_class == 'TMemo'} end def status_bar main_window.children.find {|w| w.window_class == 'TStatusBar'} end def dialog_about Autogui::EnumerateDesktopWindows.new.find do |w| w.title.match(/About QuickNote/) && (w.pid == pid) end end def splash Autogui::EnumerateDesktopWindows.new.find do |w| w.title.match(/FormSplash/) && (w.pid == pid) end end def message_dialog_confirm Autogui::EnumerateDesktopWindows.new.find do |w| w.title.match(/Confirm/) && (w.pid == pid) end end # Title and class are the same as dialog_overwrite_confirm # Use child windows to differentiate def dialog_overwrite_confirm Autogui::EnumerateDesktopWindows.new.find do |w| w.title.match(/^Text File Save$/) && (w.pid == pid) && (w.window_class == "#32770") && (w.combined_text.match(/already exists/)) end end # Title and class are the same as dialog_overwrite_confirm def file_save_as_dialog Autogui::EnumerateDesktopWindows.new.find do |w| w.title.match(/Text File Save/) && (w.pid == pid) && (w.window_class == "#32770") && (w.combined_text.match(/Save \&in:/)) end end ...
Watchr provides a flexible alternative to Autotest.
NOTE: The following assumes a global setting of 'git config core.autocrlf input' and that you want to modify the Delphi 7 source to Quicknote which requires CRLF line endings.
Grab the source for Quicknote
cd ~/workspace
git clone http://github.com/robertwahler/win32-autogui -n
cd win32-autogui
git config core.autocrlf true
git checkout
Install watchr
gem install watchr
Run watchr
watchr spec/watchr.rb
Watchr will now watch the files defined in 'spec/watchr.rb' and run RSpec or Cucumber, as appropriate.
Session screenshot
For more information, please consult the source: http://github.com/robertwahler/win32-autogui.
article comments powered by DisqusCopyright 1999-2013, GearheadForHire, LLC
Site design by GearheadForHire, LLC | v2.3.0