我正在使用Watir开发一个带有一系列模块的Ruby程序。
示例模块如下所示:
demoMod1.rb
DEMOMOD1 = true #this module has been loaded
module demoMod1
def reload(browser)
browser.goto("demo1.html")
end
end
有几个文件具有非常相似的命名功能(例如:reload()
),因此demoMod2和demoMod3都具有相同的重载功能(除了指向不同的页面)。
当预计不会测试该区域时,模块会从需求列表中注释掉。 (根据设计规格)
然后程序动态加载测试用例文件(代码将在main.rb中执行)。每个测试用例文件都包含一个runTest()
函数,该函数从模块中调用相应的部分。每个测试都会检查模块是否已加载,如果已加载,则执行测试。
示例测试用例文件如下所示:
test1.rb
def runTest(browser) # test case 1
if(defined?(DEMOMOD1)).nil?
return nil #if the module is not there, dont run this test
end
demoMod1::reload(browser)
end
根据规范,单个文件列出了所需的所有模块,因此用户只需注释掉不需要测试的部分而无需查看主文件。主要文件如下。
main.rb的
require 'Watir'
SITE = #internal site - address removed =/ sorry
FOLDER = File.dirname(__FILE__) + '/lib'
SHORTNAME = 'Test' #for reporting
LONGNAME = 'In Development' #for reporting
#I know - globals.. yuck... avoid...
require FOLDER + '/lib/requires'
#includes the function to require each module from the module folder
require FOLDER + '/www/include/report.module'
#creates an html report to view the test results
# Get list of tests
def getTests()
Dir.chdir(FOLDER + '/Tests')
files = Dir.glob("*.rb")
return files
end #eofunc
# Run each test
def runTests(files, browser, report)
testSuite = String.new
files.each do |test|
suite = test.split(" - ") # name convention: suite - testname.rb
if !(suite[0]==testSuite)
testSuite = suite[0]
report.newTestSuiteName(testSuite)
end #eoif
load FOLDER + '/Tests/' + test #load the test case file
runTest(browser) #run the test case
end #eoeach
end #eofunc
begin
browser = Watir::Browser.new
browser.goto(SITE)
report = Report.new()
reportname = report.createReport(SHORTNAME, LONGNAME) #vars in Vars.rb
files = getTests()
runTests(files, browser, report)
report.finishReport(reportname, SITE)
browser.close
report.openReport(reportname) #launch report in a new browser
end #eofunc
我希望每个runTest()
能够访问demoMod1::reload()
和demoMod2::reload()
,但事实并非如此。我收到了undefined method 'reload' for demoMod1:Module
的错误消息。我可以使用include demoMod1
解决错误,但之后(如果我有正确的话),则不需要范围,只使用reload()
就行了。但是,这需要每个模块都有完全唯一的名称,这不是一个很好的解决方案。
我错过了什么?
答案 0 :(得分:0)
您是否尝试使用Test / Unit / rSpec或类似的东西来运行测试?
除此之外,我的理解是:
要求模块所在的文件仅使其可用。您需要使用include将其放入类中才能使用它。
您是否考虑过为您的考试准备课程,例如Test
然后TestType1
和TestType2
从该父类继承?
例如:
require fileWithYourModules
class Test
# stuff I want to have available to all tests
end
class TestSubType1 < Test
include demoMod1
end
class TestSubType2 < Test
include demoMod2
end
然后,它允许您调用相同的方法名称,并根据其具有的测试类使其行为不同。
我确信有更优雅的解决方案,我只是一个测试人员而不是程序员! :)
答案 1 :(得分:0)
通过更改模块中的函数名称,我可以使其工作。
示例模块:
DEMOMOD1 = true
module DemoMod1
def DemoMod1.reload(browser) #<---------
browser.goto('demo1.htm')
end
end
与&lt; ---箭头的线是主要变化(也必须更改模块名称,没有首都首字母... oops)
示例测试用例:
def runTest(browser) # test case 1
if(defined?(DEMOMOD1)).nil?
return nil #if the module is not there, dont run this test
end
DemoMod1::reload(browser)
### OR ### Both work
DemoMod1.reload(browser)
end