rwebunit 0.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,6 @@
1
+ CHANGELOG
2
+
3
+ == 0.1.0
4
+
5
+ * Initial release.
6
+ * Most common web actions and assertions implemented.
data/MIT-LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2006 Zhimin Zhan, zhimin@zhimin.com
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
+
data/README ADDED
@@ -0,0 +1,30 @@
1
+ rWebUnit is a ruby version of thoughtwork's open source jWebUnit, which 'facilitates creation of
2
+ acceptance tests for web applications'.
3
+
4
+ rWebUnit wraps the popular web testing framework: WATIR (jWebUnit depends on HttpUnit).
5
+ Because underlying technologies are different (HttpUnit simulates a browser, Watir drives IE), rWebUnit does
6
+ not support full jWebUnit API.
7
+
8
+ For example,
9
+ jWebUnit: checkCheckBox("name", "new_value") can set new value for a checkbox, but rWebUnit/Watir can't.
10
+ On the other hand, HttpUnit has limited support of Javascript, You don't need to worry about it in Watir.
11
+
12
+ Here are reasons you might want to try rWebUnit instead of using Watir directly.
13
+
14
+ * already familar with jWebUnit framework (arguably, more readable tests)
15
+ * want to use WebTest - Page framework to design your tests (look at sample\kongming_webtest.rb)
16
+ * want to use a high level of API beyond specific framework: WATIR
17
+ * utilize common test methods included in rWebUnit (like getToday ...)
18
+
19
+ TODO:
20
+ ====
21
+ * file upload (waiting for Watir 2.0?)
22
+ * script to convert jWebUnit -> rWebUnit, and vice versa.
23
+
24
+ FAQ:
25
+ ===
26
+ 1. How can I run rWebUnit tests without showing IE window?
27
+
28
+ A: This is really a WATIR question. Append '-b' option your command.
29
+ Example: ruby hide_webtest.rb -b
30
+
data/Rakefile ADDED
@@ -0,0 +1,68 @@
1
+ require 'rubygems'
2
+ require 'rake/testtask'
3
+ require 'rake/rdoctask'
4
+
5
+ Gem::manage_gems
6
+ require 'rake/gempackagetask'
7
+
8
+
9
+ $:.unshift(File.dirname(__FILE__) + "/lib")
10
+ require 'rwebunit'
11
+
12
+ desc "Default task"
13
+ task :default => [ :clean, :test ]
14
+
15
+ desc "Clean generated files"
16
+ task :clean do
17
+ rm_rf 'pkg'
18
+ rm_rf 'doc'
19
+ end
20
+
21
+ # run the unit tests
22
+ Rake::TestTask.new("test") { |t|
23
+ t.test_files = FileList['test/test*.rb']
24
+ t.verbose= true
25
+ }
26
+
27
+ # Generate the RDoc documentation
28
+ Rake::RDocTask.new { |rdoc|
29
+ rdoc.rdoc_dir = 'doc'
30
+ rdoc.title = 'rWebUnit'
31
+ rdoc.template = "#{ENV['template']}.rb" if ENV['template']
32
+ rdoc.rdoc_files.include('README')
33
+ rdoc.rdoc_files.include('lib/rwebunit.rb')
34
+ rdoc.rdoc_files.include('lib/rwebunit/*.rb')
35
+ }
36
+
37
+ spec = Gem::Specification.new do |s|
38
+ s.platform= Gem::Platform::RUBY
39
+ s.name = "rwebunit"
40
+ s.version = "0.1"
41
+ s.summary = "An wrap of WATIR for functional testing of web applications"
42
+ # s.description = ""
43
+
44
+ s.author = "Zhimin Zhan"
45
+ s.email = "zhimin@zhimin.com"
46
+ s.homepage= "http://www.zhimin.com/rWebUnit"
47
+ # s.rubyforge_project = ""
48
+
49
+ s.has_rdoc = true
50
+ s.requirements << 'none'
51
+ s.require_path = "lib"
52
+ s.autorequire = "rwebunit"
53
+
54
+ s.files = [ "Rakefile", "README", "CHANGELOG", "MIT-LICENSE" ]
55
+ # s.files = s.files + Dir.glob( "bin/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
56
+ s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
57
+ s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
58
+ s.files = s.files + Dir.glob( "sample/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
59
+ s.files = s.files + Dir.glob( "docs/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
60
+
61
+ s.add_dependency("watir", ">= 1.4.1")
62
+ end
63
+
64
+ Rake::GemPackageTask.new(spec) do |pkg|
65
+ pkg.need_zip = true
66
+ end
67
+
68
+
@@ -0,0 +1,129 @@
1
+ <html>
2
+ <head>
3
+ <title>rWebUnit </title>
4
+ </head>
5
+ <body>
6
+ <p></p>
7
+
8
+ <table class="bodyTable">
9
+ <tr class="a">
10
+ <th>Watir Test</th>
11
+ <th>rWebUnit Test</th>
12
+ </tr>
13
+ <tr class="b">
14
+ <td valign="top" nowrap="nowrap">
15
+ <div class="source">
16
+ <pre>
17
+ require 'watir'
18
+ require 'test/unit'
19
+
20
+ class WatirSearchExample < Test::Unit::TestCase
21
+
22
+ def test_search
23
+ ie= Watir::IE.new
24
+ ie.goto("http://www.google.com")
25
+ ie.text_field( :name, " q"). set(" httpunit")
26
+ ie.button( :name, " btnG"). click
27
+ ie.link( :text, " HttpUnit Home"). click
28
+ assert_equal(" HttpUnit Home", ie.document.title)
29
+ assert( ie.contains_text(" User' s Manual"))
30
+ end
31
+
32
+ end
33
+ </pre>
34
+ </div>
35
+ </td>
36
+ <td valign="top" nowrap="nowrap">
37
+ <div class="source">
38
+ <pre>
39
+
40
+ require 'rwebunit'
41
+
42
+ class RWebUnitSearchExample < RWebUnit::WebTestCase
43
+
44
+ def test_search()
45
+ getTestContext().base_url="http://www.google.com"
46
+ beginAt("/")
47
+ setFormElement(" q", " httpunit")
48
+ clickButtonWithValue(" Google Search")
49
+ clickLinkWithText(" HttpUnit Home")
50
+ assertTitleEquals(" HttpUnit Home")
51
+ assertLinkPresentWithText(" User' s Manual")
52
+ end
53
+
54
+ end
55
+ </pre>
56
+ </div>
57
+ </td>
58
+ </tr>
59
+ </table>
60
+ <br/>
61
+ <table class="bodyTable">
62
+ <tr class="a">
63
+ <th>jWebUnit TestCase</th>
64
+ <th>rWebUnit TestCase</th>
65
+ </tr>
66
+ <tr class="b">
67
+ <td valign="top" nowrap="nowrap">
68
+ <div class="source">
69
+ <pre>
70
+ import net.sourceforge.jwebunit.WebTestCase;
71
+
72
+ public class JWebUnitSearchExample extends WebTestCase {
73
+
74
+ public JWebUnitSearchExample(String name) {
75
+ super(name);
76
+ }
77
+
78
+ public void setUp() {
79
+ getTestContext().setBaseUrl("http://www.google.com");
80
+ }
81
+
82
+ public void testSearch() {
83
+ beginAt("/");
84
+ setFormElement("q", "httpunit");
85
+ submit("btnG");
86
+ clickLinkWithText("HttpUnit");
87
+ assertTitleEquals("HttpUnit");
88
+ assertLinkPresentWithText("User's Manual");
89
+ }
90
+ }
91
+ </pre>
92
+ </div>
93
+ </td>
94
+
95
+ <td valign="top" nowrap="nowrap">
96
+
97
+ <div class="source">
98
+ <pre>
99
+ require 'rwebunit'
100
+
101
+ class RWebUnitSearchExample < RWebUnit::WebTestCase
102
+
103
+ def initialize( name)
104
+ super( name)
105
+ end
106
+
107
+ def setup
108
+ getTestContext(). setBaseUrl(" http:// www.google.com")
109
+ end
110
+
111
+ def test_search
112
+ beginAt("/")
113
+ setFormElement(" q", " httpunit")
114
+ submit(" btnG")
115
+ clickLinkWithText(" HttpUnit Home")
116
+ assertTitleEquals(" HttpUnit Home")
117
+ assertLinkPresentWithText(" User' s Manual")
118
+ end
119
+ end
120
+ </pre>
121
+ </div>
122
+
123
+ </td>
124
+ </tr>
125
+ </table>
126
+
127
+
128
+ </body>
129
+ </html>
@@ -0,0 +1,19 @@
1
+ #***********************************************************
2
+ #* Copyright (c) 2006, Zhimin Zhan.
3
+ #* Distributed open-source, see full license in MIT-LICENSE
4
+ #***********************************************************
5
+
6
+ module RWebUnit
7
+
8
+ ##
9
+ # Store test optionns
10
+ #
11
+ class TestContext
12
+ attr_accessor :base_url
13
+
14
+ def setBaseUrl(baseUrl)
15
+ @base_url = baseUrl
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,80 @@
1
+ #***********************************************************
2
+ #* Copyright (c) 2006, Zhimin Zhan.
3
+ #* Distributed open-source, see full license in MIT-LICENSE
4
+ #***********************************************************
5
+
6
+ module RWebUnit
7
+ module Utils
8
+
9
+ #useful methods for test data
10
+ def getToday_AU()
11
+ format_date(Time.now, "%02d/%02d/%04d")
12
+ end
13
+ alias getToday getToday_AU
14
+
15
+ def getToday_US()
16
+ sprintf("%02d/%02d/%04d", Time.now.month, Time.now.day, Time.now.year)
17
+ end
18
+
19
+ def getDaysBefore(days)
20
+ nil if !(days.instance_of?(Fixnum))
21
+ format_date(Time.now - days * 24 * 3600)
22
+ end
23
+
24
+ def getYesterday
25
+ getDaysBefore(1)
26
+ end
27
+
28
+ def getDaysAfter(days)
29
+ nil if !(days.instance_of?(Fixnum))
30
+ format_date(Time.now + days * 24 * 3600)
31
+ end
32
+
33
+ def getTomorrow
34
+ getDaysAfter(1)
35
+ end
36
+
37
+ #TODO: getDaysBefore, getDaysAfter, getYesterday, getTomorrow
38
+
39
+ # return a random number >= min, but <= max
40
+ def randomNumber(min, max)
41
+ rand(max-min+1)+min
42
+ end
43
+
44
+ def randomBoolean()
45
+ return randomNumber(0, 1) == 1
46
+ end
47
+
48
+ def randomChar(lowercase)
49
+ sprintf("%c", random_number(97, 122)) if lowercase
50
+ sprintf("%c", random_number(65, 90)) unless lowercase
51
+ end
52
+
53
+ def randomDigit()
54
+ sprintf("%c", randomNumber(48, 57))
55
+ end
56
+
57
+ def randomString(length, lowercase)
58
+ randomStr = ""
59
+ length.times {
60
+ randomStr += randomChar(lowercase)
61
+ }
62
+ randomStr
63
+ end
64
+
65
+ # Return a random string in a rangeof pre-defined strings
66
+ def randomStringInCollection(arr)
67
+ return nil if arr.empty?
68
+ index = random_number(0, arr.length-1)
69
+ arr[index]
70
+ end
71
+
72
+ private
73
+ def format_date(date, date_format = nil)
74
+ date_format ||= "%02d/%02d/%04d"
75
+ sprintf(date_format, date.day, date.month, date.year)
76
+ end
77
+
78
+
79
+ end
80
+ end
@@ -0,0 +1,62 @@
1
+ #***********************************************************
2
+ #* Copyright (c) 2006, Zhimin Zhan.
3
+ #* Distributed open-source, see full license in MIT-LICENSE
4
+ #***********************************************************
5
+
6
+ module RWebUnit
7
+
8
+ # WebPage (children of AbstractWebPage) encapsulates a real web page.
9
+ # For example,
10
+ # beginAt("/home")
11
+ # @browser.clickLinkWithText("/login")
12
+ # @browser.setFormElement("username", "sa")
13
+ # Can be rewritten to
14
+ # beginAt("/home")
15
+ # home_page = HomePage.new
16
+ # login_page = home_page.clickLoginLink
17
+ # login_page.enterUserName("sa")
18
+ #
19
+ # So you only need change in LoingPage class if UI changes, which happen quite often.
20
+ class AbstractWebPage
21
+
22
+ # browser: passed to do assertion within the page
23
+ # page_text: text used to identify the page, title will be the first candidate
24
+ attr_accessor :browser, :page_text
25
+
26
+ def initialize(ie, page_text=nil)
27
+ @browser = ie
28
+ @page_text = page_text
29
+ assertOnPage
30
+ end
31
+
32
+ def assertTextPresent(text)
33
+ @browser.assertTextPresent(text)
34
+ end
35
+
36
+ def assertTextInElement(elementID, text)
37
+ @browser.assertTextInElement(elementID, text)
38
+ end
39
+
40
+ def assertOnPage()
41
+ assertTextPresent(@page_text) if @page_text
42
+ end
43
+
44
+ def assertNotOnPage()
45
+ assertTextNotPresent(@page_text) if @page_text
46
+ end
47
+
48
+ def submit
49
+ @browser.submit
50
+ end
51
+
52
+ def getElementValue(elementId)
53
+ @browser.getElemenValue(elementId)
54
+ end
55
+
56
+ def dumpResponse(stream = nil)
57
+ @browser.dumpResponse(stream)
58
+ end
59
+
60
+ end
61
+
62
+ end
@@ -0,0 +1,160 @@
1
+ #***********************************************************
2
+ #* Copyright (c) 2006, Zhimin Zhan.
3
+ #* Distributed open-source, see full license in MIT-LICENSE
4
+ #***********************************************************
5
+
6
+ require 'test/unit'
7
+
8
+ module RWebUnit
9
+
10
+ class WebTestCase < Test::Unit::TestCase
11
+ include RWebUnit::Utils
12
+
13
+ attr_reader :web_tester
14
+
15
+ def initialize(name=nil)
16
+ super(name) if name
17
+ @web_tester = WebTester.new
18
+ end
19
+
20
+ def default_test
21
+ super unless(self.class == WebTestCase)
22
+ end
23
+
24
+ def getTestContext
25
+ @web_tester.test_context
26
+ end
27
+
28
+ def beginAt(url)
29
+ @web_tester.beginAt(url)
30
+ end
31
+
32
+ def openBrowser(baseUrl, relativeUrl)
33
+ getTestContext().base_url = baseUrl
34
+ beginAt(relativeUrl)
35
+ end
36
+
37
+ def closeBrowser
38
+ @web_tester.closeBrowser
39
+ end
40
+
41
+ def goBack()
42
+ @web_tester.goBack
43
+ end
44
+
45
+ def goForward()
46
+ @web_tester.goForward
47
+ end
48
+
49
+ def gotoPage(page)
50
+ @web_tester.gotoPage(page)
51
+ end
52
+
53
+ # assertions
54
+ def assertTitleEquals(title)
55
+ @web_tester.assertTitleEquals(title)
56
+ end
57
+
58
+ def assertTextPresent(text)
59
+ @web_tester.assertTextPresent(text)
60
+ end
61
+
62
+ def assertTextNotPresent(text)
63
+ @web_tester.assertTextNotPresent(text)
64
+ end
65
+
66
+ # textfields
67
+ def setFormElement(elementName, elementValue)
68
+ @web_tester.setFormElement(elementName, elementValue)
69
+ end
70
+
71
+ def assertTextPresentInTextField(textfieldName, text, msg = nil)
72
+ @web_tester.assertTextPresentInTextField(textfieldName, text, msg)
73
+ end
74
+
75
+ #links
76
+ def clickLinkWithText(linkText)
77
+ @web_tester.clickLinkWithText(linkText)
78
+ end
79
+
80
+ def assertLinkPresentWithText(linkText)
81
+ @web_tester.assertLinkPresentWithText(linkText)
82
+ end
83
+
84
+ def assertLinkNotPresentWithText(linkText)
85
+ @web_tester.assertLinkNotPresentWithText(linkText)
86
+ end
87
+
88
+ ##
89
+ # buttons
90
+
91
+ # submit the form using the first (index) submit button
92
+ def submit()
93
+ @web_tester.submit()
94
+ end
95
+
96
+ def submit(buttonId)
97
+ @web_tester.submit(buttonId)
98
+ end
99
+
100
+ def clickButton(buttonId)
101
+ @web_tester.clickButton(buttonId)
102
+ end
103
+
104
+ def clickButtonWithCaption(caption)
105
+ @web_tester.clickButtonWithCaption(caption)
106
+ end
107
+
108
+ def clickButtonWithValue(value)
109
+ @web_tester.clickButtonWithValue(value)
110
+ end
111
+
112
+ def assertButtonNotPresent(buttonID)
113
+ @web_tester.assertButtonNotPresent(buttonID)
114
+ end
115
+
116
+ def assertButtonNotPresentWithText(text)
117
+ @web_tester.assertButtonNotPresentWithText(text)
118
+ end
119
+
120
+ def assertButtonPresent(buttonID)
121
+ @web_tester.assertButtonPresent(buttonID)
122
+ end
123
+
124
+ def assertButtonPresentWithText(buttonID)
125
+ @web_tester.assertButtonPresentWithText(buttonID)
126
+ end
127
+
128
+ # checkbox
129
+ def checkCheckbox(checkBoxName)
130
+ @web_tester.checkCheckbox(checkBoxName)
131
+ end
132
+
133
+ def uncheckCheckbox(checkBoxName)
134
+ @web_tester.uncheckCheckbox(checkBoxName)
135
+ end
136
+
137
+ # combo box
138
+ def selectOption(selectName, option)
139
+ @web_tester.selectOption(selectName, option)
140
+ end
141
+
142
+ # dhtml related
143
+ def assertElementPresent(elementID)
144
+ @web_tester.assertElementPresent(elementID)
145
+ end
146
+
147
+ def assertElementNotPresent(elementID)
148
+ @web_tester.assertElementNotPresent(elementID)
149
+ end
150
+
151
+ # ---
152
+ # For deubgging
153
+ # ---
154
+ def dumpResponse(stream = nil)
155
+ @web_tester.dumpResponse(stream)
156
+ end
157
+
158
+ end
159
+
160
+ end
@@ -0,0 +1,277 @@
1
+ #***********************************************************
2
+ #* Copyright (c) 2006, Zhimin Zhan.
3
+ #* Distributed open-source, see full license in MIT-LICENSE
4
+ #***********************************************************
5
+
6
+ require 'watir/watir_simple.rb'
7
+ require 'runit/assert'
8
+
9
+ module RWebUnit
10
+
11
+ ##
12
+ # Wrapping WATIR and provide assertions
13
+ #
14
+ class WebTester
15
+ include Watir::Simple
16
+ include RUNIT::Assert
17
+
18
+ attr_accessor :test_context
19
+
20
+ def initialize
21
+ @test_context = TestContext.new
22
+ end
23
+
24
+ def beginAt(relativeURL)
25
+ url = @test_context.base_url + relativeURL
26
+ new_browser_at(url) # create @@browser
27
+ end
28
+
29
+ def closeBrowser
30
+ begin
31
+ close_browser
32
+ rescue
33
+ end
34
+ end
35
+
36
+
37
+ def goBack
38
+ go_back()
39
+ end
40
+
41
+ def goForward
42
+ go_forward()
43
+ end
44
+
45
+ def gotoPage(page)
46
+ navigate_to(page)
47
+ end
48
+
49
+ # assertions
50
+ def assertTitleEquals(title)
51
+ assert_equals(title, html_title())
52
+ end
53
+
54
+ # text fields
55
+ def setFormElement(elementName, elementValue)
56
+ enter_text_into_field_with_name(elementName, elementValue)
57
+ end
58
+ alias enterText setFormElement
59
+
60
+ def assertTextPresentInTextField(textfieldName, text, msg = nil)
61
+ assert_text_in_field(textfieldName, text, msg)
62
+ end
63
+
64
+ #links
65
+ def clickLink(linkId)
66
+ click_link_with_id(linkId)
67
+ end
68
+
69
+ def clickLinkWithText(linkText)
70
+ click_link_with_text(linkText)
71
+ end
72
+
73
+ def assertLinkPresentWithText(linkText)
74
+ html_links.each { |link|
75
+ return if linkText == link.text
76
+ }
77
+ assert(false, "can't find the link with text: #{linkText}")
78
+ end
79
+
80
+ def assertLinkNotPresentWithText(linkText)
81
+ html_links.each { |link|
82
+ assert(linkText != link.text, "unexpected link: #{linkText} found")
83
+ }
84
+ end
85
+
86
+ ##
87
+ # buttons
88
+
89
+ # submit first submit button
90
+ def submit(buttonName = nil)
91
+ if (buttonName.nil?) then
92
+ html_buttons.each { |button|
93
+ next if button.type != 'submit'
94
+ button.click
95
+ return
96
+ }
97
+ else
98
+ click_button_with_name(buttonName)
99
+ end
100
+ end
101
+
102
+ def clickButton(buttonId)
103
+ click_button_with_id(buttonId)
104
+ end
105
+
106
+ def clickButtonWithCaption(caption)
107
+ click_button_with_caption(caption)
108
+ end
109
+
110
+ def clickButtonWithValue(value)
111
+ click_button_with_value(value)
112
+ end
113
+
114
+ def assertButtonNotPresent(buttonId)
115
+ html_buttons.each { |button|
116
+ assert(button.id != buttonId, "unexpected button id: #{buttonId} found")
117
+ }
118
+ end
119
+
120
+ def assertButtonNotPresentWithText(text)
121
+ html_buttons.each { |button|
122
+ assert(button.value != text, "unexpected button id: #{text} found")
123
+ }
124
+ end
125
+
126
+ def assertButtonPresent(buttonID)
127
+ html_buttons.each { |button|
128
+ return if buttonID == button.id
129
+ }
130
+ assert(false, "can't find the button with id: #{buttonID}")
131
+ end
132
+
133
+ def assertButtonPresentWithText(buttonText)
134
+ html_buttons.each { |button|
135
+ return if buttonText == button.value
136
+ }
137
+ assert(false, "can't find the button with text: #{buttonText}")
138
+ end
139
+
140
+ # checkbox
141
+ def checkCheckbox(checkBoxName)
142
+ @@browser.checkbox(:name, checkBoxName).set
143
+ end
144
+
145
+ def uncheckCheckbox(checkBoxName)
146
+ @@browser.checkbox(:name, checkBoxName).clear
147
+ end
148
+
149
+ def assertCheckboxNotSelected(checkBoxName)
150
+ rasie
151
+ end
152
+
153
+ def assertCheckboxSelected(checkBoxName)
154
+ raise
155
+ end
156
+
157
+
158
+ # combo box
159
+ def selectOption(selectName, option)
160
+ @@browser.select_from_combobox_with_name(selectName, option)
161
+ end
162
+
163
+ def assertOptionValueNotPresent(selectName, optionValue)
164
+ html_selects.each { |select|
165
+ select.o.each do |option| # items in the list
166
+ assert(!(select.name == selectName && option.value == optionValue), "unexpected select option: #{optionValue} for #{selectName} found")
167
+ end
168
+ }
169
+ end
170
+
171
+ def assertOptionNotPresent(selectName, optionLabel)
172
+ html_selects.each { |select|
173
+ select.o.each do |option| # items in the list
174
+ assert(!(select.name == selectName && option.text == optionLabel), "unexpected select option: #{optionLabel} for #{selectName} found")
175
+ end
176
+ }
177
+ end
178
+
179
+ def assertOptionValuePresent(selectName, optionValue)
180
+ html_selects.each { |select|
181
+ select.o.each do |option| # items in the list
182
+ return if (select.name == selectName && option.value == optionValue)
183
+ end
184
+ }
185
+ assert(false, "can't find the combob box with value: #{optionValue}")
186
+ end
187
+
188
+ def assertOptionPresent(selectName, optionLabel)
189
+ html_selects.each { |select|
190
+ select.o.each do |option| # items in the list
191
+ return if (select.name == selectName && option.text == optionLabel)
192
+ end
193
+ }
194
+ assert(false, "can't find the combob box: #{selectName} with value: #{optionLabel}")
195
+ end
196
+
197
+ #text
198
+ def assertTextPresent(text)
199
+ puts html_body() if $DEBUG
200
+ assert((html_body().include? text), 'expected text: ' + text + ' not found')
201
+ end
202
+
203
+ def assertTextNotPresent(text)
204
+ assert(!(html_body().include? text), 'expected text: ' + text + ' found')
205
+ end
206
+
207
+ def assertElementPresent(elementID)
208
+ elem = @@browser.document.getElementById(elementID)
209
+ assert_not_nil(elem)
210
+ end
211
+
212
+ def assertElementNotPresent(elementID)
213
+ elem = @@browser.document.getElementById(elementID)
214
+ assert_nil(elem)
215
+ end
216
+
217
+ def assertTextInElement(elementID, text)
218
+ elem = @@browser.document.getElementById(elementID)
219
+ assert_not_nil(elem.innerText)
220
+ assert(elem.innerText.include?(text))
221
+ end
222
+
223
+ def getElementValue(elementId)
224
+ elem = @@browser.document.getElementById(elementId)
225
+ return nil if elem == nil
226
+ elem_val = elem.invoke('innerText')
227
+ return elem_val
228
+ end
229
+
230
+ # ---
231
+ # For deubgging
232
+ # ---
233
+ def dumpResponse(stream = nil)
234
+ if stream.nil?
235
+ puts html_body # std out
236
+ else
237
+ stream.puts html_body
238
+ end
239
+ end
240
+
241
+ private
242
+ def html_body
243
+ @@browser.html()
244
+ end
245
+
246
+ def html_title
247
+ @@browser.document.title
248
+ end
249
+
250
+ def html_links
251
+ @@browser.links
252
+ end
253
+
254
+ def html_buttons
255
+ @@browser.buttons
256
+ end
257
+
258
+ def html_selects
259
+ @@browser.select_lists
260
+ end
261
+
262
+ def assert_equals(expected, actual, msg=nil)
263
+ assert(expected == actual, (msg.nil?) ? "Expected: #{expected} diff from actual: #{actual}" : msg)
264
+ end
265
+ alias assert_equal assert_equals
266
+
267
+ def assert_nil(actual, msg="")
268
+ assert(actual.nil?, msg)
269
+ end
270
+
271
+ def assert_not_nil(actual, msg="")
272
+ assert(!actual.nil?, msg)
273
+ end
274
+
275
+ end
276
+
277
+ end
data/lib/rwebunit.rb ADDED
@@ -0,0 +1,13 @@
1
+ #***********************************************************
2
+ #* Copyright (c) 2006, Zhimin Zhan.
3
+ #* Distributed open-source, see full license in MIT-LICENSE
4
+ #***********************************************************
5
+
6
+ # Extra full path to load libraries
7
+ require File.dirname(__FILE__) + "/rwebunit/test_utils"
8
+ require File.dirname(__FILE__) + "/rwebunit/web_page"
9
+ require File.dirname(__FILE__) + "/rwebunit/web_testcase"
10
+ require File.dirname(__FILE__) + "/rwebunit/web_tester"
11
+ require File.dirname(__FILE__) + "/rwebunit/test_context"
12
+
13
+
@@ -0,0 +1,63 @@
1
+ require "rwebunit"
2
+
3
+ class KongmingHomePage < RWebUnit::AbstractWebPage
4
+
5
+ def initialize(browser, title)
6
+ super(browser, title)
7
+ end
8
+
9
+ def assertTheListLinkPresent
10
+ @browser.assertLinkPresentWithText('The List')
11
+ end
12
+
13
+ def assertDashboardLinkPresent
14
+ @browser.assertLinkPresentWithText('Dashboard')
15
+ end
16
+
17
+ def assertTestCenterLinkPresent
18
+ @browser.assertLinkPresentWithText('Test center')
19
+ end
20
+
21
+ def assertTestWebServiceLinkPresent
22
+ @browser.assertLinkPresentWithText('Test web service')
23
+ end
24
+
25
+ def clickXMLFormatterLink
26
+ @browser.clickLinkWithText("XML Formatter")
27
+ KongmingXMLFormatterPage.new(@browser)
28
+ end
29
+
30
+ def clickHttpCallerLink
31
+ @browser.clickLinkWithText("Http Caller")
32
+ KongmingXMLFormatterPage.new(@browser)
33
+ end
34
+
35
+ end
36
+
37
+ class KongmingXMLFormatterPage < RWebUnit::AbstractWebPage
38
+
39
+ def initialize(browser)
40
+ super(browser, "Format XML")
41
+ end
42
+
43
+ def clickFillExampleLink
44
+ @browser.clickLinkWithText("Fill example")
45
+ end
46
+
47
+ def enterXml(inputXml)
48
+ @browser.enterText("inputText", inputXml)
49
+ end
50
+
51
+ def clickFormat
52
+ @browser.clickButtonWithValue("Format")
53
+ end
54
+
55
+ end
56
+
57
+ class KongmingXMLFormatterPage < RWebUnit::AbstractWebPage
58
+
59
+ def initialize(browser)
60
+ super(browser, "Http Caller")
61
+ end
62
+
63
+ end
@@ -0,0 +1,79 @@
1
+ require "rwebunit"
2
+
3
+ $:.unshift File.dirname(__FILE__)
4
+ require "kongming_pages.rb"
5
+
6
+ class TestWuning < RWebUnit::WebTestCase
7
+
8
+ def initialize(name)
9
+ super(name)
10
+ end
11
+
12
+ def setup
13
+ super
14
+ openBrowser("http://localhost:3721", "/home")
15
+ end
16
+
17
+ def teardown
18
+ super
19
+ closeBrowser()
20
+ end
21
+
22
+ def test_homepage_exists()
23
+ kongming_homepage = KongmingHomePage.new(@web_tester, "Welcome")
24
+ end
25
+
26
+ def test_all_links_exist
27
+ kongming_homepage = KongmingHomePage.new(@web_tester, "Welcome")
28
+ kongming_homepage.assertTheListLinkPresent()
29
+ kongming_homepage.assertDashboardLinkPresent
30
+ kongming_homepage.assertTestCenterLinkPresent
31
+ kongming_homepage.assertTestWebServiceLinkPresent
32
+ end
33
+
34
+ # enter text in a text field, then click a button
35
+ def test_format_xml
36
+ kongming_homepage = KongmingHomePage.new(@web_tester, "Welcome")
37
+ kongming_xmlformatter_page = kongming_homepage.clickXMLFormatterLink
38
+ kongming_xmlformatter_page.enterXml("<name><first>James</first><last>Bond</last></name>")
39
+ kongming_xmlformatter_page.clickFormat
40
+ end
41
+
42
+ # Invoke link to populate date using javascripts (clickFillExampleLink)
43
+ # Calling submit
44
+ # Check special text before and after submit
45
+ def test_format_xml_sample
46
+ kongming_homepage = KongmingHomePage.new(@web_tester, "Welcome")
47
+ kongming_xmlformatter_page = kongming_homepage.clickXMLFormatterLink
48
+ kongming_xmlformatter_page.clickFillExampleLink
49
+ @web_tester.assertElementNotPresent("formatted_xml")
50
+ kongming_xmlformatter_page.submit
51
+ @web_tester.assertElementPresent("formatted_xml")
52
+ end
53
+
54
+ # web testcase can utilize useful methods defined in test_utils
55
+ def test_can_call_utils
56
+ kongming_homepage = KongmingHomePage.new(@web_tester, "Welcome")
57
+ kongming_xmlformatter_page = kongming_homepage.clickXMLFormatterLink
58
+ kongming_xmlformatter_page.enterXml("<date><now>" + getToday + "</now></date>")
59
+ kongming_xmlformatter_page.clickFormat
60
+ end
61
+
62
+ def test_combobox
63
+ kongming_homepage = KongmingHomePage.new(@web_tester, "Welcome")
64
+ kongming_httpcaller_page = kongming_homepage.clickHttpCallerLink
65
+ # html:
66
+ # <select name="method">
67
+ # <option value="POST">HTTP POST </option>
68
+ # <option value="GET"> HTTP GET </option>
69
+ # </select>
70
+
71
+ @web_tester.assertOptionPresent("method", "HTTP POST") # trimmed
72
+ @web_tester.assertOptionPresent("method", "HTTP GET")
73
+ @web_tester.assertOptionNotPresent("method", "PUT")
74
+ @web_tester.assertOptionValuePresent("method", "POST")
75
+ @web_tester.assertOptionValuePresent("method", "GET")
76
+ @web_tester.assertOptionValueNotPresent("method", "HEAD")
77
+ end
78
+
79
+ end
@@ -0,0 +1,14 @@
1
+ require 'rwebunit'
2
+
3
+ class RWebUnitSearchExample < RWebUnit::WebTestCase
4
+
5
+ def test_search()
6
+ getTestContext().base_url = "http://www.google.com"
7
+ beginAt("/")
8
+ setFormElement("q", "httpunit")
9
+ clickButtonWithCaption("Google Search")
10
+ clickLinkWithText("HttpUnit Home")
11
+ assertTitleEquals("HttpUnit Home")
12
+ assertLinkPresentWithText("User's Manual")
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ # the same test used in jWebUnit home page written in rWebUnit
2
+ require 'rwebunit'
3
+
4
+ class RWebUnitSearchExample < RWebUnit::WebTestCase
5
+
6
+ def initialize(name)
7
+ super(name)
8
+ end
9
+
10
+ def setup
11
+ getTestContext().setBaseUrl("http://www.google.com")
12
+ end
13
+
14
+ def test_search()
15
+ beginAt("/")
16
+ setFormElement("q", "httpunit")
17
+ submit("btnG")
18
+ clickLinkWithText("HttpUnit Home")
19
+ assertTitleEquals("HttpUnit Home")
20
+ assertLinkPresentWithText("User's Manual")
21
+ end
22
+ end
@@ -0,0 +1,16 @@
1
+ require 'watir'
2
+ require 'test/unit'
3
+
4
+ class WatirSearchExample < Test::Unit::TestCase
5
+
6
+ def test_search
7
+ ie = Watir::IE.new
8
+ ie.goto("http://www.google.com")
9
+ ie.text_field(:name, "q").set("httpunit")
10
+ ie.button(:name, "btnG").click
11
+ ie.link(:text, "HttpUnit Home").click
12
+ assert_equal("HttpUnit Home", ie.document.title)
13
+ assert(ie.contains_text("User's Manual"))
14
+ end
15
+
16
+ end
@@ -0,0 +1,73 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib/rwebunit")
2
+ $:.unshift File.dirname(__FILE__)
3
+
4
+ require "test_utils.rb"
5
+ require 'test/unit'
6
+
7
+ class TestWebTestCase < Test::Unit::TestCase
8
+ include RWebUnit::Utils
9
+
10
+ def setup
11
+ end
12
+
13
+ def teardown
14
+ end
15
+
16
+ def test_getToday
17
+ today_str = sprintf("%02d/%02d/%04d", Time.now.day, Time.now.month, Time.now.year)
18
+ assert_equal(today_str, getToday)
19
+ end
20
+
21
+ def test_getDaysBefore
22
+ yesterday = Time.now - 24 * 3600 * 1
23
+ yesterday_str = sprintf("%02d/%02d/%04d", yesterday.day, yesterday.month, yesterday.year)
24
+ assert_equal(yesterday_str, getDaysBefore(1))
25
+ assert_equal(yesterday_str, getYesterday)
26
+ end
27
+
28
+ def test_getDaysAfter
29
+ tomorrow = Time.now + 24 * 3600 * 1
30
+ tomorrow_str = sprintf("%02d/%02d/%04d", tomorrow.day, tomorrow.month, tomorrow.year)
31
+ assert_equal(tomorrow_str, getDaysAfter(1))
32
+ assert_equal(tomorrow_str, getTomorrow)
33
+ end
34
+
35
+ def test_randomBoolean
36
+ true_count = 0
37
+ false_count = 0
38
+ 100.times {
39
+ obj = randomBoolean
40
+ assert(obj.instance_of?(TrueClass) || obj.instance_of?(FalseClass), "can only be true or false")
41
+ true_count += 1 if obj
42
+ false_count += 1 if !obj
43
+ }
44
+ assert(true_count > 0, "it is not random")
45
+ assert(false_count > 0, "it is not random")
46
+ end
47
+
48
+ def test_randomNumber
49
+ tmp_array = []
50
+ 1000.times {
51
+ num = randomNumber(1,10)
52
+ assert(num.instance_of?(Fixnum), "can only be number")
53
+ tmp_array << num
54
+ }
55
+ uniq_numbers = tmp_array.uniq.sort
56
+ assert_equal(10, uniq_numbers.length)
57
+ assert_equal(1, uniq_numbers[0])
58
+ assert_equal(10, uniq_numbers[9])
59
+ end
60
+
61
+ def test_randomDigit
62
+ tmp_array = []
63
+ 1000.times {
64
+ dc = randomDigit()
65
+ tmp_array << dc
66
+ }
67
+ uniq_digits = tmp_array.uniq.sort
68
+ assert_equal(10, uniq_digits.length)
69
+ assert_equal('0', uniq_digits[0])
70
+ assert_equal('9', uniq_digits[9])
71
+ end
72
+
73
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.11
3
+ specification_version: 1
4
+ name: rwebunit
5
+ version: !ruby/object:Gem::Version
6
+ version: "0.1"
7
+ date: 2006-04-11 00:00:00 +10:00
8
+ summary: An wrap of WATIR for functional testing of web applications
9
+ require_paths:
10
+ - lib
11
+ email: zhimin@zhimin.com
12
+ homepage: http://www.zhimin.com/rWebUnit
13
+ rubyforge_project:
14
+ description:
15
+ autorequire: rwebunit
16
+ default_executable:
17
+ bindir: bin
18
+ has_rdoc: true
19
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
20
+ requirements:
21
+ - - ">"
22
+ - !ruby/object:Gem::Version
23
+ version: 0.0.0
24
+ version:
25
+ platform: ruby
26
+ signing_key:
27
+ cert_chain:
28
+ authors:
29
+ - Zhimin Zhan
30
+ files:
31
+ - Rakefile
32
+ - README
33
+ - CHANGELOG
34
+ - MIT-LICENSE
35
+ - lib/rwebunit.rb
36
+ - lib/rwebunit
37
+ - lib/rwebunit/test_context.rb
38
+ - lib/rwebunit/test_utils.rb
39
+ - lib/rwebunit/web_page.rb
40
+ - lib/rwebunit/web_testcase.rb
41
+ - lib/rwebunit/web_tester.rb
42
+ - test/test_test_utils.rb
43
+ - sample/kongming_pages.rb
44
+ - sample/kongming_webtest.rb
45
+ - sample/sample_rwebunit_test.rb
46
+ - sample/sample_rwebunit_testcase.rb
47
+ - sample/sample_watir_test.rb
48
+ - docs/html
49
+ - docs/html/index.html
50
+ test_files: []
51
+
52
+ rdoc_options: []
53
+
54
+ extra_rdoc_files: []
55
+
56
+ executables: []
57
+
58
+ extensions: []
59
+
60
+ requirements:
61
+ - none
62
+ dependencies:
63
+ - !ruby/object:Gem::Dependency
64
+ name: watir
65
+ version_requirement:
66
+ version_requirements: !ruby/object:Gem::Version::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 1.4.1
71
+ version: