2016-05-01 1 views
0

У меня есть ориентир, как следующим образом:Run тест, но не напечатать результат

benchmark_result = Benchmark.bm do |x| 
    x.report { send(test_name) } 
end 

Когда я запускаю это, я вижу выход из двух мест:

  1. send(test_name) в report блок. Я хочу продолжить этот вывод.
  2. Выход из блока Benchmark, то есть результирующий контрольный отчет печатается на консоль. Я не хочу, чтобы это произошло.

Я видел из here как временно скрывать вывод консоли. Но проблема в том, что я хочу, чтобы внутренний блок продолжал печатать свой вывод. Я просто не хочу видеть результаты тестов.

+2

Вы хотите видеть результаты вызова метода, но * не * показывать результат теста? Я не уверен, почему вы что-то сравнивали, а затем выбрасывали результаты. – tadman

+0

Я делаю «систему кэширования контрольных показателей», поэтому, когда я запрашиваю эталон для метода, мне не нужно снова запускать этот метод. Это специально для длительных методов, и я понимаю, что результаты не будут полностью точными. Люди неоднократно говорили мне об этом недавно опубликованном вопросе [здесь] (http://stackoverflow.com/questions/36961017/how-to-multiply-a-benchmark?noredirect1_comment61480374_36961017). В принципе, всякий раз, когда я запускаю тестовый пример, я сохраняю эталон, который отображается позже. –

+0

Интересный проект, спасибо за объяснение. Я думаю, что подход AmitA, где вы можете захватить результаты и сохранить их каким-то образом для последующего использования, является лучшим. Вы могли бы поместить их в какую-то небольшую базу данных, такую ​​как SQLite, чтобы организовать их, если необходимо. – tadman

ответ

3

При вызове метода report на Benchmark::Report объекта, отправляемого в блок с помощью Benchmark.bm или Benchmark.benchmark, он будет печатать на STDOUT. Если вы просто заинтересованы в контрольных показателей без печати отчета, вы можете сделать это:

benchmark_result = Benchmark.measure do 
    send(test_name) 
end 

Он возвращает Benchmark::Tms объект, который выглядит следующим образом:

=> #<Benchmark::Tms:0x007fb5b1b40118 
@cstime=0.0, 
@cutime=0.0, 
@label="", 
@real=4.5693013817071915e-05, 
@stime=0.0, 
@total=0.0, 
@utime=0.0> 

Если вы просто заинтересованы в истекшем режиме реального времени используется для выполнения вашего блока, выполните следующие действия (возвращает Float):

benchmark_result = Benchmark.realtime do 
    send(test_name) 
end 
+0

Я использовал «Тест» много раз, но на самом деле не читал [doc] (http://ruby-doc.org/stdlib-2.3.0/libdoc/benchmark/rdoc/Benchmark.html). Неплохая идея. –

0

Я принял ответ Amit, потому что это кажется каноническим, но я сделал еще один способ сделать это за это время.

От this question я добавил следующий код (немного изменен, чтобы включить touch/rm вызовы на файле null.txt):

def silence_output 
    # Store the original stderr and stdout in order to restore them later 
    @original_stderr = $stderr 
    @original_stdout = $stdout 

    # Redirect stderr and stdout 
    `touch null.txt` 
    $stderr = File.new(File.join(File.dirname(__FILE__), 'null.txt'), 'w') 
    $stdout = File.new(File.join(File.dirname(__FILE__), 'null.txt'), 'w') 
end 

# Replace stderr and stdout so anything else is output correctly 
def enable_output 
    $stderr = @original_stderr 
    $stdout = @original_stdout 
    @original_stderr = nil 
    @original_stdout = nil 
    `rm null.txt` 
end 

С этим я могу достичь своей цели, используя следующие:

silence_output 
benchmark_result = Benchmark.bm do |x| 
    x.report do 
    enable_output 
    send(test_name) 
    silence_output 
    end 
end 
enable_output 

Хотя, увидев лучший способ сделать это, это кажется очень взломанным.