2012-02-21 13 views
6

aplicación Rails 3.2.1, utilizando las gemas minitest y autotest-rails.¿Cómo puedo obtener una salida de color en el autotest usando Test/Unit, MiniTest?

Si ejecuto "rake test" la salida es en color. Pero si ejecuto autotest, la salida no está en color.

¿Cómo puedo obtener una salida de color cuando uso el autotest?

Aquí es mi 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 

Respuesta

7

Si me quedo "prueba rastrillo" la salida es en color.

Esto es debido a que bajo el autotest "terminal" que su processess prueba se está ejecutando en no es un tty, y cuando se ejecuta directamente, lo es.

En primer lugar, cómo funciona, los códigos de color se definen en las secuencias de escape, que si los escribes se verían como \E[48mPRINT ME IN RED\E[0m (details).

Su terminal entiende estas secuencias de escape (normalmente), reemplazándolas por colores, mejorando la apariencia de la salida.

Mediante el uso de variables ambientales definidas por el emulador de terminal, y mirando a es que es de entrada y flujos de salida (es decir $stdin, $stdout, y $stderr) processe (s) se puede determinar el apoyo color, y si está conectado a un terminal (tty) o un archivo, o de otro proceso, o etc

cuando un proceso se inicia otro proceso, el proceso, no el terminal es el propietario, por lo que su salida no se test hablando con un terminal que comprende de escape de color secuencias, está hablando con autotest, que no lo hace.

El mismo comportamiento podría ocurrir, ejecutar las pruebas, pero redirigir la salida a un archivo, los códigos de escape y las secuencias no tendrían sentido.

La relación se parece a esto:

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

Hay algunas maneras de falsificar el soporte, de manera que autotest se ejecuta en color, una forma documented here parecería ser la más robusta, sin haber probado yo mismo.

La otra manera, es simplemente provocar un cortocircuito que está "chequeos de soporte de color" using this technique

El método #tty? sobre los arroyos no es sólo útil para el anterior, pero también tienen en cuenta el caso de que uno ejecuta Ruby-debug, o algún otro comando "interactivo", cuando el proceso de control no es un tty, no hay forma de que ruby-debug pueda avisar al usuario, si está conectado a otra aplicación, que podría no entender las instrucciones, entonces cuando transmisión de salida a un archivo, o ejecución de un proceso dentro de otro, el software inteligente siempre verifica primero, para ver si el proceso principal puede confundirse al solicitar entrada o enviar un resultado no estándar.

Si desea realizar lecturas adicionales, consulte $stdin.tty? de la documentación de Ruby, explica la diferencia entre los flujos de entrada y salida de procesos que se consideran ttys y el efecto que tiene sobre cómo se ejecutan las cosas.

+2

Ambos enlaces parecen estar muertos :( – alnorth29

+2

¡La publicación tiene más de 12 meses! Para ambas técnicas mencionadas, las técnicas que aquí se documentaron ya no funcionan, pero la teoría es sólida, tendrás para encontrar en el código, o pregunte al autor de gemas si hay una manera de forzar la coloración, evitando el control de si la salida es un tty. –

Cuestiones relacionadas