расширение тестовых заданий Rake - PullRequest
2 голосов
/ 01 ноября 2011

У меня есть несколько чистых JavaScript-тестов на стороне клиента с использованием PhantomJS. Это я хотел бы интегрировать с 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"

Однако эта интеграция далека от совершенства; если один из этих тестов не пройден, рейк прерывается. Кроме того, в отличие от :units, :functionals и :integration, в конце нет краткого описания проблем (например, «6 тестов, 21 утверждение, 1 сбой, 0 ошибок»).

Я мог бы извлечь эти данные достаточно легко, но как мне сказать Rake, чтобы добавить их в общий подсчет теста?

1 Ответ

2 голосов
/ 04 ноября 2011

Вы вызываете через sh команду оболочки.Руби не знает, что это тест.Кроме того, 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 для ok, 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

Это работает только в том случае, если тест завершен с кодом завершения. Возможно, вы можете использовать `` вместо этого и получить результаты теста для подробного анализа.

...