2012-02-21 7 views
6

Rails 3.2.1 app、minitestとautotest-railsのgemを使用しています。Test/Unit、MiniTestを使用してオートテストでカラー出力を取得するにはどうすればよいですか?

"rake test"を実行すると、出力はカラーになります。しかし、私がオートテストを実行すると、出力はカラーではありません。

自動テストを使用すると、どのようにしてカラー出力が得られますか?ここで

は私のtest_helper.rbです:

ENV["RAILS_ENV"] = "test" 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require 'turn/autorun' 

Turn.config do |c| 
# use one of output formats: 
# :outline - turn's original case/test outline mode [default] 
# :progress - indicates progress with progress bar 
# :dotted - test/unit's traditional dot-progress mode 
# :pretty - new pretty reporter 
# :marshal - dump output as YAML (normal run mode only) 
# :cue  - interactive testing 
c.format = :pretty 
# turn on invoke/execute tracing, enable full backtrace 
c.trace = true 
# use humanized test names (works only with :outline format) 
c.natural = true 
end 

class ActiveSupport::TestCase 
    # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order. 
    # 
    # Note: You'll currently still have to declare fixtures explicitly in integration tests 
    # -- they do not yet inherit this setting 
    fixtures :all 

    # Add more helper methods to be used by all tests here... 
end 

答えて

7

私は出力がカラーである "すくいテスト" を実行した場合。

自動テストの下でテストprocessessがで実行されている「端末」はttyではなく、あなたが直接実行したときに、それがあるためです。

まず、カラーコードはエスケープシーケンスで定義されています。それらを書き留めると、\E[48mPRINT ME IN RED\E[0mdetails)のようになります。

端末は、これらのエスケープシーケンスを(通常は)色で置き換えて理解し、出力の外観を改善します。それは入力だだし、出力ストリーム(すなわち、$stdout$stdinあり、$stderr)processe(s)は、カラーサポートを決定することができ、それは端末に接続しているかどうかの端末エミュレータで定義された環境変数を使用し、そして見ることによって

tty)、ファイル、または別のプロセスなど

1つのプロセスが別のプロセスを開始すると、プロセスではなく端末がオーナーになるので、testの出力はカラーエスケープを理解している端末シーケンス、それはオートテストには話していますが、それはそうではありません。

同じ動作がテストを実行しますが、出力をファイルにリダイレクトすると、エスケープコードとシーケンスは無意味になります。

関係は次のようになります。

# rake test 
Terminal Application 
\- Bash 
    \- rake   # Rake's $stdout.tty? => true 
        # (Bash is a terminal emulator) 

# autotest 
Terminal Application 
\- Bash 
    \- autotest 
     \- rake  # Rake's $stdout.tty? => false 
         # (Autotest is not a terminal emulator) 

、片道documented hereはそれを自分自身をテストせずに、最も堅牢であるように思われる色の自動テスト実行されるように、偽のいくつかの方法がサポートは、あります。

他の方法は、それがストリームにusing this technique

方法#tty?は、上記のためだけに有用ではありません「色をサポートするためのチェック」が、また、その1つのケースを考えています短絡するだけです制御プロセスがttyでない場合、ruby-debugやその他の「対話型」コマンドを実行すると、プロンプトを理解できないかもしれない別のアプリケーションに接続されている場合、ruby-debugがユーザーにプロンプ​​トを出す方法はありませんファイルへの出力のストリーミング、または別のプロセス内での1つのプロセスの実行では、スマート・ソフトウェアは常に最初にチェックし、入力のプロンプトまたは非標準出力の送信によって親プロセスが混乱するかどうかを確認します。

追加の読書をしたい場合は、Rubyのドキュメンテーションの$stdin.tty?を見てください。ttysと見なされるプロセス入出力ストリームと、どのように物事が実行されるかの違いについて説明します。

+2

これらのリンクは両方とも死んでいるようです:( – alnorth29

+2

投稿は12ヶ月を超えています!両方のテクニックについては、ここで文書化された両方のテクニックはもう機能しませんが、理論は健全です。コードで見つけたり、宝石の作者に出力がttyであるかどうかのチェックをバイパスして、色付けを強制する方法があるかどうか尋ねてください。 –

関連する問題