我正在尝试将测试中发生的失败和错误写入日志文件,以便它们不会出现在屏幕上,但看起来好像错误和断言失败写入 STDOUT 而不是 STDERR。经过数小时的谷歌搜索后,我无法找到有关如何重定向此输出的信息,非常感谢帮助。
问问题
1377 次
3 回答
1
您是否尝试过将输出重定向到 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
我不确定这是否会起作用......
于 2011-08-17T20:46:58.653 回答
1
为什么错误不应该出现在标准输出上?到目前为止,我还没有准备好的解决方案来抑制特定错误的输出。
如果您接受未更改的输出,我有一个将错误和失败存储在文件中的解决方案。为通知创建第二个文件没有问题...
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
于 2011-08-17T22:32:35.553 回答
0
我希望我理解你的问题是正确的。
你的意思是这样的:
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
这是在标准输出和文件输出之间跳过的版本。输出开关只是一个临时解决方案——也许它可以做得更好。
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)
于 2011-08-17T20:41:26.337 回答