Записать Ruby Test :: Ошибки и сбои модуля в файл - PullRequest
1 голос
/ 18 августа 2011

Я пытаюсь записать сбои и ошибки, возникающие при тестировании, в файл журнала, чтобы они не отображались на экране, но кажется, что ошибки и утверждения об ошибках записываются в STDOUT вместо STDERR.Мне не удалось найти информацию о том, как перенаправить этот вывод после нескольких часов поиска в Google, и буду очень признателен за помощь.

Ответы [ 3 ]

1 голос
/ 18 августа 2011

Вы пытались перенаправить вывод в StringIO, чтобы позже записать его в файл журнала?

original_stdout = $stdout
original_stderr = $stderr
fake_stdout = StringIO.new
fake_stderr = StringIO.new

$stdout = fake_stdout
$stderr = fake_stderr

Затем после запуска тестов:

$stdout = original_stdout
$stderr = original_stderr

@stdout = fake_stdout.string
@stderr = fake_stderr.string

Яне совсем уверен, что это будет работать, хотя ...

1 голос
/ 18 августа 2011

Почему ошибки не должны быть на stdout? До сих пор у меня нет готового решения для подавления вывода для конкретных ошибок.

Если вы примете неизменный вывод, у меня есть решение для хранения ошибок и сбоев в файле. Создать второй файл для уведомлений не составит труда ...

gem 'test-unit'
require 'test/unit'

module Test
  module Unit
    class TestSuite
      alias :old_run :run
      def run(result, &progress_block)
        old_run(result, &progress_block)
        File.open('test.log', 'w'){|f|
          result.faults.each{|err|
            case err
              when Test::Unit::Error, Test::Unit::Failure
                f << err.long_display
                f << "\n===========\n"
              #not in log file
              when Test::Unit::Pending, Test::Unit::Notification, Test::Unit::Omission
              end
          }
        }
      end
    end
  end
end


class MyTest < Test::Unit::TestCase

  def test_1()
    assert_equal( 3, 1+1) #failure
  end
  def test_2()
    1 / 0 #force an error
  end
  def test_3()
    notify 'sss'
  end
  def test_4()
    pend "MeineKlasse.new"
  end
  def test_5
    omit 'aaa' if RUBY_VERSION == '1.9.2'
  end

  def test_5
    assert_in_delta( 0.1, 0.00001, 1.0/10)
  end

end
0 голосов
/ 18 августа 2011

Надеюсь, я правильно понял ваш вопрос.

Вы имеете в виду что-то вроде этого:

gem 'test-unit'
require 'test/unit'

class StdOutLogger < IO
  def initialize(*)
    super
    @file = File.open('log.txt', 'w')
    @stdout = true
  end 
  #write to stdout and file
  def write(s)
    $stdout << s
    @file << s
  end
end
STDOUT = StdOutLogger.new(1)

class MyTest < Test::Unit::TestCase      
  def test_1()
    assert_equal( 2, 1+1)
    assert_equal( 2, 4/2)

    assert_equal( 1, 3/2)
    assert_equal( 1.5, 3/2.0)
  end
end

Но я бы порекомендовал скопировать стандартный вывод на уровне операционной системы

ruby mytest.rb > log.txt

Вот версия для пропуска между stdout и выводом файла. Выходной переключатель является лишь временным решением - возможно, его можно сделать лучше.

class StdOutLogger < IO
  def initialize(*)
    super
    @file = File.open('log.txt', 'w')
    @stdout = true
  end 
  def write(s)
    case s
      when /\AError:/
        @stdout = false #change to file
      when /\A(Pending):/
        @stdout = true #change to file
    end

    if @stdout
    $stdout << s
    else
    @file << s
    end
  end
end
STDOUT = StdOutLogger.new(1)
...