我使用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将其添加到总测试计数中?
答案 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
仅当您的测试使用退出代码完成时,此方法才有效。也许您可以使用``
来获取测试的输出以进行详细分析。