Как заменить исполняемый файл пробным в тесте? - PullRequest
1 голос
/ 28 января 2010

Могу ли я заменить исполняемый файл (доступ к которому осуществляется через вызов system из ruby) на исполняемый файл, который ожидает определенный ввод и выдает ожидаемый вывод в согласованное количество времени? Я в основном работаю на Mac OSX 10.6 (Snow Leopard), но у меня также есть доступ к Linux и Windows. Я использую MRI ruby ​​1.8.7.

Справочная информация : Я смотрю на несколько выравниваний последовательности ДНК, по одному в каждой нити. Когда я пытаюсь использовать BioRuby для этого, либо временный файл BioRuby, либо стандартная библиотека ruby ​​ иногда поднимают исключения (что лучше, чем молчаливый сбой!).

Я настроил тест , который воспроизводит проблему, но только в некоторых случаях. Я предполагаю, что основными источниками изменчивости между тестами являются многопоточность, система временных файлов и исполняемый файл, используемый для выравнивания (ClustalW). Поскольку ClustalW, вероятно, не работает со сбоями, но может быть источником изменчивости, я думаю, что устранение этого может способствовать воспроизводимости.

Для тех, кто думает выбор не нарушен - это то, что мне тоже интересно. Тем не менее, в соответствии с журналом изменений , в августе 2009 года существовала обеспокоенность по поводу безопасности потоков tempfile. Кроме того, я проверил в списке рассылки BioRuby, правильно ли я вызываю код BioRuby, и, похоже, дело.

Ответы [ 3 ]

1 голос
/ 28 января 2010

Можно. В случаях, когда я пишу функциональный тест для программы A, мне может понадобиться «смоделировать» программу B, которую A запускает через систему. Затем я делаю настраиваемый путь к программе B со значением по умолчанию:

class ProgramA

  def initialize(argv)
    @args = ParseArgs(argv)
    @config = Config.new(@args.config_path || default_config_path)
  end

  def run
    command = [
      program_b_path,
      '--verbose',
      '--do_something_wonderful',
    ].join(' ')
    system(command)
    ...
  end

  def program_a_path
    @config.fetch('program_b_path', default_program_b_path)
  end

end

Программа A использует переключатель "--config PATH", который может переопределить путь к файлу конфигурации по умолчанию. Тест устанавливает файл конфигурации в / tmp:

program_b_path: /home/wayne/project/tests/mock_program_b.rb

И передает программе A этот файл конфигурации:

program_a.rb --config /tmp/config.yaml

Теперь программа A будет запускать не реальную программу B, а фиктивную.

1 голос
/ 28 января 2010

Я действительно не понимаю, в чем проблема или что именно вы ищете, не могли бы вы просто написать что-то вроде

#!/bin/sh
#Test for input (syntax might be wrong, but you get the idea)
if [ $* ne "expected input" ]; then
    echo "expected output for failure"
    exit -1
fi
#have it work in a consistent amount of time 
$CONSISTENT_AMOUNT_OF_TIME = 20
sleep $CONSISTENT_AMOUNT_OF_TIME
echo "expected output"
0 голосов
/ 28 января 2010

Вы пробовали драгоценный камень мокко? Он часто используется для тестирования, и вы прекрасно это описываете. Он «подделывает» вызов метода объекта (который включает в себя почти все в ruby) и возвращает нужный результат без фактического запуска метода. Возьмите этот файл примера:

# test.rb
require 'rubygems'
require 'mocha'

self.stubs(:system).with('ls').returns('monkey')

puts system('ls')

Запуск этого скрипта выдает «обезьяну», потому что я отключил системный вызов. Вы можете использовать это, чтобы обойти части приложения, которые вы не хотите тестировать, чтобы отделить ненужные части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...