Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在';处使用shell命令调用ruby脚本失败;装载耙铲';_Ruby On Rails_Ruby_Shell_Rake_Shoes - Fatal编程技术网

Ruby on rails 在';处使用shell命令调用ruby脚本失败;装载耙铲';

Ruby on rails 在';处使用shell命令调用ruby脚本失败;装载耙铲';,ruby-on-rails,ruby,shell,rake,shoes,Ruby On Rails,Ruby,Shell,Rake,Shoes,我在使用shell命令调用Ruby脚本时遇到了一个问题,然后Ruby脚本调用Rake 我已经构建了一个测试自动化框架,当从命令行运行时(我在OSX Yosemite上),它会执行以下操作: 调用一个Ruby脚本,该脚本设置一组环境变量 然后调用Rake rake = Rake.application rake.init rake.load_rakefile rake['execute_tests'].invoke Rake文件运行Cucumber任务,然后测试框架愉快地启动浏览器并开始执行测

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

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

  • 调用一个Ruby脚本,该脚本设置一组环境变量
  • 然后调用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
    
    这时,代码就失效了。我看不到子进程的任何输出或stacktrace,因此我无法在知道进程在上面指定的行上失败之后进行调试

    不幸的是,这是我能说的最具体的。如果有人能为我如何着手调查和/或解决这一问题提供任何建议,我将不胜感激

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


    干杯

    当您使用Ruby./exe/execute\u web\u tests\u local\u singlethread.rb向Ruby抛售时,子进程将在父进程的当前工作目录(即GUI应用程序运行的目录)中运行

    调用
    rake.load\u 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
    
    这可能不可取。如果应用程序是线程化的并且依赖于当前目录(可能是),那么修改当前目录可能会产生一些意外的后果

    最后一件事:您可能无法启动以这种方式运行浏览器的子进程。就我所知,完整浏览器和无头浏览器都需要有关您正在运行的图形环境的信息。当您运行附加到GUI终端会话的进程时,这很好,但在尝试从内部启动另一个图形进程时,可能会遇到其他问题

    希望有帮助