使用shell命令调用ruby脚本会失败,因为load_rakefile'

时间:2016-02-21 10:44:24

标签: ruby-on-rails ruby shell rake shoes

我遇到了使用调用Ruby脚本的shell命令的问题,然后调用Rake。

我已经构建了一个测试自动化框架,在从命令行运行时执行以下操作(我在OSX Yosemite上):

  1. 调用设置一堆环境变量的Ruby脚本
  2. 然后调用Rake

    rake = Rake.application
    rake.init
    rake.load_rakefile
    rake['execute_tests'].invoke
    
  3. 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
    
  4. 当我从命令行执行时,这一切都非常有效。问题是我想在测试框架的前面放置一个基本的GUI。我正在使用Shoe3来做到这一点。

    当我从GUI调用我的初始Ruby脚本时......

    `ruby ./exe/execute_web_tests_local_singlethread.rb salesforce integration regression headed chrome false false`
    

    ...然后代码执行,直到下一行尝试执行:

    rake.load_rakefile
    

    此时代码故障转移。我没有看到来自子流程的任何输出或堆栈跟踪,因此无法调试超出了知道该流程在上面指定的行中崩溃的程度。

    Screenshot of GUI failing

    不幸的是,这和我一样具体。如果有人能提供我可能会如何调查和/或解决这个问题,我们将不胜感激。

    我也尝试过使用Open3,这导致了同样的问题。

    干杯

1 个答案:

答案 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内部启动另一个图形化过程。

希望有所帮助!