Aplicación Rails 3.2.1, usando las gemas minitest y autotest-rails.

Si ejecuto "prueba de rastrillo", la salida es en color. Pero si ejecuto la prueba automática, la salida no es en color.

¿Cómo puedo obtener resultados en color cuando utilizo la prueba automática?

Aquí está 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
6
croceldon 22 feb. 2012 a las 00:54

1 respuesta

La mejor respuesta

Si ejecuto "prueba de rastrillo", la salida es en color.

Esto se debe a que, en autotest, el "terminal" en el que se ejecutan los procesos de prueba no es un tty, y cuando lo ejecuta directamente, lo es.

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

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

Mediante el uso de variables ambientales definidas por el emulador de terminal, y mirando sus flujos de entrada y salida (es decir, $stdin, $stdout y $stderr), los procesos pueden determinar el soporte de color. y si está conectado a una terminal (tty) o un archivo, u otro proceso, etc.

Cuando un proceso inicia otro proceso, su proceso, no el terminal, es el propietario, por lo que su salida test no está hablando con un terminal que entiende las secuencias de escape de colores, está hablando con el autotest, que no lo hace.

El mismo comportamiento sucedería al ejecutar sus pruebas, pero redirigiendo la salida a un archivo, los códigos de escape y las secuencias no tendrían sentido.

La relación se ve así:

# 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 formas de falsificar el soporte, de modo que el autotest se ejecute en color, unidireccional documentado aquí parece ser el más sólido, sin haberlo probado yo mismo.

La otra forma, es simplemente hacer un cortocircuito en su "verificación de compatibilidad de color" usando esta técnica

El método #tty? en las transmisiones no solo es útil para lo anterior, sino que también considera el caso de que uno ejecute Ruby-debug, o algún otro comando "interactivo", cuando el proceso de control no es un tty, hay de ninguna manera ruby-debug puede avisar al usuario, si está conectado a otra aplicación, que podría no entender las indicaciones, por lo que cuando se transmite la salida a un archivo o se ejecuta un proceso dentro de otro, el software inteligente siempre verifica primero, para ver si el padre El proceso puede confundirse al solicitar una entrada o enviar una salida no estándar.

Si desea leer más, eche un vistazo a $stdin.tty? de la documentación de Ruby, explica la diferencia entre los flujos de entrada y salida de los procesos que se consideran ttys y el efecto que tiene sobre cómo se ejecutan las cosas.

8
Lee Hambley 23 feb. 2012 a las 15:32
3
Ambos enlaces parecen estar muertos :(
 – 
alnorth29
30 sep. 2013 a las 10:39
2
¡La publicación tiene más de 12 meses! Para las dos técnicas mencionadas, las dos técnicas que se documentaron aquí ya no funcionan, pero la teoría es sólida, tendrá que buscarla en el código o preguntarle al autor de la gema si hay una manera de forzar la coloración, sin pasar por el control. para saber si la salida es un tty.
 – 
Lee Hambley
30 sep. 2013 a las 11:06