Как я могу получить цветной вывод в автотесте, используя 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, и влиянием, которое происходит на выполнение.