Как я могу получить цветной вывод в автотесте, используя Test/Unit, MiniTest?

Приложение Rails 3.2.1, использующее самоцветы minitest и autotest-rails.

Если я запускаю "тест рейка", вывод будет цветным. Но если я запускаю автотест, вывод не цветной.

Как я могу получить вывод цвета при использовании автотеста?

Вот мой 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

1 ответ

Решение

Если я запускаю "тест рейка", вывод будет цветным.

Это связано с тем, что при автотестировании "терминал", на котором запущены ваши тестовые процессы, не является ttyи когда вы запускаете напрямую, это так.

Во-первых, как это работает, цветовые коды определяются в escape-последовательностях, которые, если вы их записали, будут выглядеть примерно так \E[48mPRINT ME IN RED\E[0m ( подробности).

Ваш терминал понимает эти escape-последовательности (обычно), заменяя их цветами, улучшая внешний вид вывода.

Используя переменные окружения, определенные эмулятором терминала, и глядя на его входные и выходные потоки (то есть $stdin, $stdout, а также $stderr) процесс (ы) может определить поддержку цвета, и подключен ли он к терминалу (tty) или файл, или другой процесс, или т. д.

Когда один процесс запускает другой процесс, ваш процесс, а не терминал является владельцем, поэтому ваш test вывод не говорит с терминалом, который понимает цветные escape-последовательности, он говорит с автотестом, который этого не делает.

То же самое происходит при выполнении ваших тестов, но перенаправляя вывод в файл, escape-коды и последовательности будут бессмысленными.

Отношения выглядят так:

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

Есть несколько способов подделать поддержку, так что автотест выполняется в цвете, один из документированных здесь способов оказался бы наиболее надежным, не проверяя его самостоятельно.

Другой способ - просто замкнуть это "проверкой поддержки цвета", используя эту технику.

Метод #tty? в потоках не только полезен для вышеперечисленного, но также учитывает случай, когда запускается Ruby-debug или какая-то другая "интерактивная" команда, когда процесс управления не является tty, ruby-debug не может подсказать пользователь, если он подключен к другому приложению, которое может не понимать подсказки, поэтому при потоковой передаче вывода в файл или при запуске одного процесса в другом интеллектуальное программное обеспечение всегда сначала проверяет, может ли родительский процесс быть сбит с толку, запрашивая ввод или отправка нестандартного вывода.

Если вы хотите сделать дополнительное чтение, взгляните на $stdin.tty? из документации Ruby объясняется различие между потоками ввода и вывода процессов, которые рассматриваются как ttys, и влиянием, которое происходит на выполнение.

Другие вопросы по тегам