2012-02-21 12 views
6

Aplikacja Rails 3.2.1, przy użyciu klejnotów minitest i autotest-rails.Jak mogę uzyskać wydruk koloru w autotestie za pomocą Test/Unit, MiniTest?

Jeśli uruchomię "test prowizji", wydruk będzie kolorowy. Ale jeśli uruchomię autotest, dane wyjściowe nie będą kolorowe.

Jak uzyskać wydruk kolorowy podczas korzystania z autotestu?

Oto mój 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 

Odpowiedz

7

Jeśli uruchomię "test natarcia" wyjście jest w kolorze.

To dlatego pod AUTOTESTY „terminal” że test processess działa w nie jest tty, a po uruchomieniu bezpośrednio, to jest.

Po pierwsze, jak to działa, kody kolorów są zdefiniowane w sekwencjach specjalnych, które po ich zapisaniu wyglądałyby jak coś w rodzaju: \E[48mPRINT ME IN RED\E[0m (details).

Twój terminal rozumie sekwencje specjalne (zwykle), zastępując je kolorami, poprawiając wygląd wydruku.

Stosując zmienne środowiska określone przez terminal emulatora, a patrząc w to jest wprowadzane, i strumień wyjściowych (to znaczy $stdin, $stdout i $stderr) processe (I) można określić pomocy kolorów, i czy jest on podłączony do zacisku (tty) lub pliku, lub innego procesu, lub itp.

Gdy jeden proces rozpoczyna inny proces, proces, a nie terminal jest właścicielem, więc twoje wyjście test nie rozmawia z terminalem, który rozumie kolorową ucieczkę sekwencje, rozmawia z autotestem, co nie działa.

To samo zachowanie miałoby miejsce, podczas wykonywania testów, ale przekierowanie wyjścia do pliku, kody ucieczki i sekwencje byłyby bez znaczenia.

Relacja wygląda tak:

# 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) 

Istnieje kilka sposobów na fałszywe podpory, tak że autotest przebiega w kolorze, jedna droga documented here wydaje się być najbardziej wytrzymałe, bez testowane to sam.

Innym sposobem jest po prostu do zwarcia to „sprawdzić wsparcie kolorów” using this technique

Sposób #tty? na strumieniach jest nie tylko użyteczny dla powyższego, ale również rozważyć przypadek, że jeden uruchamia polecenie Ruby-debug lub inne polecenie "interakcyjne", gdy proces kontrolowania nie jest tty, nie ma możliwości, aby ruby-debugowanie mogło monitować użytkownika, jeśli jest on podłączony do innej aplikacji, która może nie rozumieć podpowiedzi, więc gdy Przesyłając strumieniowo dane wyjściowe do pliku lub uruchamiając jeden proces w innym, inteligentne oprogramowanie zawsze sprawdza najpierw, czy proces nadrzędny może być mylony przez zapytanie o dane wejściowe lub wysyłanie niestandardowych danych wyjściowych.

Jeśli chcesz zrobić dodatkowe czytanie, spójrz na $stdin.tty? z dokumentacji Ruby, wyjaśnia różnicę między strumieniami wejściowymi i wyjściowymi procesów, które są uważane za tty i efekt, który ma na wykonanie rzeczy.

+2

Oba te linki wydają się być martwe :( – alnorth29

+2

Post ma więcej niż 12 miesięcy! W przypadku obu wspomnianych technik obie techniki, które tu zostały udokumentowane, przestały działać, ale teoria brzmi dobrze, będziesz mieć znaleźć w kodzie, lub zapytać autora klejnotu, czy istnieje sposób na wymuszenie koloryzacji, pomijając sprawdzenie, czy dane wyjściowe są tty. –

Powiązane problemy