扩展Rake的测试任务

时间:2011-11-01 10:31:53

标签: ruby rake rake-test

我使用PhantomJS进行了一些纯JavaScript,客户端测试。这些我想与rake test整合。

目前我用这个:

namespace :test do

  task :client do
    basedir = Rails.root.join("test", "client")
    sh "cd #{basedir} && phantomjs lib/run-qunit.js index.html"
  end

end

task :test => "test:client"

然而,这种整合远非完美;如果其中一个测试失败,rake就会中止。此外,与:units:functionals:integration相比,最后没有问题摘要(例如“6次测试,21次断言,1次失败,0次错误”)。

我可以轻松地提取这些数据,但是如何告诉Rake将其添加到总测试计数中?

1 个答案:

答案 0 :(得分:2)

您正在通过sh调用shell命令。 Ruby不知道,这是一个测试。 此外,如果发生故障,sh似乎会停止。

您必须做两件事:抓住错误并检查通话结果。

一个例子:

require 'rake'
$summary = Hash.new(0)

def mytest(name, cmd)
  $summary['test'] += 1
  sh cmd do |ok, res|
    if ok 
      $summary['ok'] += 1
    else
      $summary['failure'] += 1
      puts "#{cmd } failed"
    end
  end
end
namespace :test do
  task :one do |tsk|
     mytest(tsk.name, "dir")
  end
  task :two do |tsk|
     mytest(tsk.name, "undefined_cmd")
  end
  task :summary do
    p $summary
  end
end

task :test => "test:one"
task :test => "test:two"
task :test => "test:summary"
使用块来调用

sh来捕获失败。在块中,我分析结果(如果脚本因错误而停止,则为true;如果脚本停止,则结果为false。

供您使用时,您可以调整代码并将代码拆分为两个文件:所有测试都在一个文件中。并且rake文件获得Rake::TestTast

您的测试文件可能如下所示:

gem 'test-unit'
require 'test/unit'

class MyTest < Test::Unit::TestCase
  def test_one
    assert_nothing_raised{
      basedir = Rails.root.join("test", "client")        
      res = system("cd #{basedir} && phantomjs lib/run-qunit.js index.html")
      assert_true(res)
    }

  end
  def test_two
    assert_nothing_raised{
      res = `dir` #Test with windows
      assert_match(/C:/, res) #We are in c: 
    }
  end
end

仅当您的测试使用退出代码完成时,此方法才有效。也许您可以使用``来获取测试的输出以进行详细分析。