From: Joe Van Dyk Date: 2005-06-09T05:15:33+09:00 Subject: Re: Test-Driven Development in GUIs On 6/7/05, Joe Van Dyk wrote: > Hi, > > Anyone have any tips for writing GUIs in Ruby (using Tk, for example) > using a TDD approach? > > A google search gave me > http://approximity.com/ruby/rubytk.html#testfirst, which claims that > some guy is writing a book on TDD for GUIs, using Ruby/Tk as preferred > language/toolkit. That section links to > http://www.c2.com/cgi/wiki?TestFirstUserInterfaces, while informative, > doesn't contain any information that I can see on a book. > > Say, for the purposes of this discussion, say that you had a small Tk > application that monitored the status of ten websites. If the website > was up and was active and performing well, the GUI would display a > "Working!" message and perhaps showed data about the site (latency, > bandwidth, whatever). The GUI could also display graphs of > uptime/downtime, view history reports, and moderately complex GUI > stuff like that. > > How would you go about testing that GUI application? There's a strong > chance that if I get some good ideas from my head and from this > discussion, that I'd write that application and also write a HOWTO on > TDD with GUIs. > > Thanks, > Joe > Here's a very simple example of a quick UI app that's unit tested. Comments appreciated. If you run the application like 'ruby file.rb test', the tests will get run. If you run it like 'ruby file.rb', the gui will be displayed. In a real application, the tests would be in their own file, of course. As I do more research, I'll post more examples. require 'tk' require 'test/unit' class App attr_accessor :sum, :inc_button, :display_button, :power_2_button def initialize @sum = 0 root = TkRoot.new :title => 'my app', :geometry => '300x300' @inc_button = TkButton.new(root, :text => "Increment!", :command => proc { inc } ) @inc_button.pack :expand => true @power_2_button = TkButton.new(root, :text => "Power of 2", :command => proc { power2 } ) @power_2_button.pack :expand => true end def inc @sum += 1 display end def power2 @sum *= @sum display end def display puts @sum end end class TestApp < Test::Unit::TestCase def testInc app = App.new assert_equal 0, app.sum app.inc_button.invoke assert_equal 1, app.sum app.inc_button.invoke assert_equal 2, app.sum end def testPower2 app = App.new assert_equal 0, app.sum app.power_2_button.invoke assert_equal 0, app.sum app.inc_button.invoke assert_equal 1, app.sum app.power_2_button.invoke assert_equal 1, app.sum app.inc_button.invoke assert_equal 2, app.sum app.power_2_button.invoke app.power_2_button.invoke assert_equal 16, app.sum end end if ARGV[0] != 'test' App.new Tk.mainloop exit end