2008-04-22
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
[42m.[0m[41mF[0m[42m.[0m[42m.[0m[42m.[0m[42m.[0m[42m.
泣けてきます。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/ansigem 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