我遇到了使用调用Ruby脚本的shell命令的问题,然后调用Rake。
我已经构建了一个测试自动化框架,在从命令行运行时执行以下操作(我在OSX Yosemite上):
然后调用Rake
rake = Rake.application
rake.init
rake.load_rakefile
rake['execute_tests'].invoke
Rake文件运行Cucumber任务,然后测试框架很高兴启动浏览器并开始执行测试。
Cucumber::Rake::Task.new(:execute_tests) do |task|
# => need to populate these so that the cucumber.yml parses
ENV['TEST_WEB_PARALLEL_OS'] = "null"
ENV['TEST_WEB_PARALLEL_OS_VERSION'] = "null"
ENV['TEST_WEB_PARALLEL_BROWSER'] = "null"
ENV['TEST_WEB_PARALLEL_BROWSER_VERSION'] = "null"
#------------------------------------------------
# Specify rake profile
#------------------------------------------------
runProfile = ENV['TEST_PLATFORM'].downcase + "_" + ENV['TEST_INTERFACE'].downcase + "_" + ENV['TEST_ENVIRONMENT'].downcase + "_" + ENV['TEST_TYPE'].downcase
# => running headless
if ENV['TEST_HEADLESS'] == "TRUE"
# => need to truncate poltergeist - using the @poltergeist tag in cucumber was causing issues with other drivers
ENV['TEST_BROWSER'] = "POLTER"
reportProfile = ENV['TEST_PLATFORM'].downcase + "_" + ENV['TEST_INTERFACE'].downcase + "_" + ENV['TEST_ENVIRONMENT'].downcase + "_" + ENV['TEST_TYPE'].downcase + "_" + osHelper.getOperatingSystem.to_s + "_" + ENV['TEST_BROWSER'].downcase + "_hlst"
# => running headed
else
reportProfile = ENV['TEST_PLATFORM'].downcase + "_" + ENV['TEST_INTERFACE'].downcase + "_" + ENV['TEST_ENVIRONMENT'].downcase + "_" + ENV['TEST_TYPE'].downcase + "_" + osHelper.getOperatingSystem.to_s + "_" + ENV['TEST_BROWSER'].downcase + "_lst"
end
#------------------------------------------------
# Set the env var then run profile
#------------------------------------------------
ENV['REPORT_PROFILE'] = reportProfile
ENV['RUN_PROFILE'] = runProfile
task.profile = runProfile
end
当我从命令行执行时,这一切都非常有效。问题是我想在测试框架的前面放置一个基本的GUI。我正在使用Shoe3来做到这一点。
当我从GUI调用我的初始Ruby脚本时......
`ruby ./exe/execute_web_tests_local_singlethread.rb salesforce integration regression headed chrome false false`
...然后代码执行,直到下一行尝试执行:
rake.load_rakefile
此时代码故障转移。我没有看到来自子流程的任何输出或堆栈跟踪,因此无法调试超出了知道该流程在上面指定的行中崩溃的程度。
不幸的是,这和我一样具体。如果有人能提供我可能会如何调查和/或解决这个问题,我们将不胜感激。
我也尝试过使用Open3,这导致了同样的问题。
干杯
答案 0 :(得分:2)
当您使用ruby ./exe/execute_web_tests_local_singlethread.rb
向Ruby发送shell时,子进程将在父进程的当前工作目录(即运行GUI应用程序的目录)中运行。
调用rake.load_rakefile
时,它将查找相对于当前工作目录的Rakefile
,不相对于您要调用的脚本的目录
有几种方法可以解决这个问题。一种方法是在执行命令之前在父进程(您的GUI)中设置RAKEOPT
环境变量。这将由子进程继承:
ENV['RAKEOPT'] = "--rakefile ./exe/Rakefile"
或者,您可以更改父进程中的工作目录:
Dir.chdir("./exe") do
`ruby execute_web_tests_local_singlethread.rb salesforce integration regression headed chrome false false`
end
这可能不太明智。如果您的应用程序是线程化的并且依赖于当前目录(并且可能是Shoes),那么修改当前目录可能会产生一些意想不到的后果。
最后一件事:您可能无法启动以这种方式运行浏览器的子进程。据我所知,完整浏览器和无头浏览器都需要有关您正在运行的图形环境的信息。当您运行附加到GUI终端会话的进程时,这很好,但是您可能遇到其他问题试图从Shoes内部启动另一个图形化过程。
希望有所帮助!