Windowsでテスト結果を見やすくする

Macのautotestの記事とかを見て、autotestは毎回走るところがちょっとなと思っていたのですが、あの色が付いたテストはいいなーって思って、Windowsでやってみました。

スクリーンショット

こんな感じになります。大量のテストを行うと、こけた箇所が分かりやすいです。また、全部緑になると心が癒されます。

やったこと

  • redgreenのインストール

gemからインストールできます。

gem install redgreen


このgemを使うと、テストで「.」(=通過)には緑、「F」は赤で表示されるようになります。便利ですね。最初は「Term::ANSIColor for Ruby」を使おうとしていました。(汗)
Unix系OSのターミナルなら、これで十分です。Windowの場合は、仮にこの状態でテストを行うと、以下のような結果になります。
なお、テストで使う際には、TestHelper内でrequireすればおkです。

  • test_helper.rb
ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'

require 'redgreen'

class Test::Unit::TestCase
・・・
  • テスト結果

Loaded suite user_test
Started
.F.....


泣けてきます。WindowsのターミナルはANSIに対応していないので、色を指定するコードがそのままでてしまいます。

WindowsコマンドプロンプトANSI対応にする

便利なものってあるものです。

先日調べたときは見つけられなかったんだけど、今日たまたまRubyist Magazine - スはスペックのス 【第 1 回】 RSpec の概要と、RSpec on Rails (モデル編)を読もうとして発見。いますぐ gem install win32console するべし。

WindowsでRailsのログをカラー表示する - jitteの日記


ここにある、win32/console/ansiをインストールすると、コマンドプロンプトでもANSIを解釈するようになります。これもgemでインストールできます。

gem install win32/console/ansi
gem install win32console

テスト結果に色を付けてみる

先ほども少し触れたのですが、TestHelperの先頭を以下のようにします。

  • test_helper.rb
ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'

require 'win32/console/ansi'
require 'redgreen'
class Test::Unit::TestCase


これでテストを通すと、テスト結果が次のようになります。


デフォルトのredgreenは微妙に醜いです。なので、/trunk/lib/rubytui.rb - rubytui - Tracを参考にredgreen.rbを次のように変更。こうすると、on_greenなど、テキストを覆う形式が使えるようになります。

  • redgreen.rb
require 'test/unit'
require 'test/unit/ui/console/testrunner'

# cute.
module Color
  COLORS = {:clear => 0, 
            :red => 31, 
            :green => 32, 
            :yellow => 33, 
            :on_red => 41, 
            :on_green => 42,
            :on_yellow => 43}
  def self.method_missing(color_name, *args)
    color(color_name) + args.first + color(:clear) 
  end
  def self.color(color)
    "\e[#{COLORS[color.to_sym]}m"
  end
end

class Test::Unit::UI::Console::RedGreenTestRunner < Test::Unit::UI::Console::TestRunner
  def initialize(suite, output_level=NORMAL, io=$stdout)
    super
  end
  
  def output_single(something, level=NORMAL)
    return unless (output?(level))
    something = case something
                when '.' then Color.on_green('.')
                when 'F' then Color.on_red("F")
                when 'E' then Color.on_yellow("E")
                else something
                end
    @io.write(something) 
    @io.flush
  end
end


これでテストを通すと、スクリーンショットのようになります。


また、実際は、test/ 下にlibディレクトリを作って次のようにしてます。

  • test_helper.rb
ENV["RAILS_ENV"] = "test"
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
require 'test_help'

#add test/lib to load path
$LOAD_PATH.unshift File.expand_path(File.dirname(__FILE__) + "/lib/")
require 'visualized_test_interface'

class Test::Unit::TestCase
  • test/lib/visualized_test_interface.rb
#!/usr/bin/env ruby
if PLATFORM =~ /win32/ 
  require 'win32/console/ansi'
  require 'redgreen'
end