【问题标题】:Calling a ruby script using a shell command fails at 'load_rakefile'使用 shell 命令调用 ruby​​ 脚本在“load_rakefile”处失败
【发布时间】:2016-02-21 10:44:24
【问题描述】:

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

我已经构建了一个测试自动化框架,它在从命令行运行时执行以下操作(我在 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
    

当我从命令行执行时,这一切都运行良好。问题是我想在测试框架的前面放一个基本的 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,这导致了同样的问题。

干杯

【问题讨论】:

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


    【解决方案1】:

    当您使用ruby ./exe/execute_web_tests_local_singlethread.rb 转至 Ruby 时,子进程将在父进程的当前工作目录中运行(即运行您的 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 内部启动另一个图形进程。

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-11
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多