代码之家  ›  专栏  ›  技术社区  ›  Andrew Grimm atk

如何在测试中用模拟可执行文件替换可执行文件?

  •  1
  • Andrew Grimm atk  · 技术社区  · 15 年前

    我能替换一个可执行文件吗(通过 system 从ruby调用)具有一个可执行文件,该可执行文件需要一定的输入并在一致的时间内提供预期的输出?我主要在Mac OSX 10.6(雪豹)上操作,但我也可以访问Linux和Windows。我用的是核磁共振Ruby 1.8.7。

    背景 :我正在做几个DNA序列比对,每根线一个。当我尝试使用bioruby时,要么使用bioruby,要么使用ruby的标准库的tempfile sometimes 提升 exceptions (这比默默失败要好!).

    我设置了一个 test 这再现了问题,但只是一部分时间。我假设测试之间可变性的主要来源是线程、tempfile系统和用于对齐的可执行文件(clustalw)。由于clustalw可能没有故障,但可能是变异的来源,我认为消除它可能有助于再现性。

    对于那些思考 select isn't broken -这也是我想知道的。然而, according to the changelog ,2009年8月,有人担心tempfile的线程安全。此外,我还查看了bioruby邮件列表,是否正确地调用了bioruby代码,似乎是这样的。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Vinko Vrsalovic    15 年前

    我真的不明白问题是什么,你到底在追求什么,难道你就不能这样写吗?

    #!/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"
    
        2
  •  1
  •   Wayne Conrad    15 年前

    你可以。在我为程序A编写功能测试的情况下,我可能需要“模拟”A通过系统运行的程序B。然后我要做的是使程序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,而是模拟程序B。

        3
  •  0
  •   Jaime Bellmyer    15 年前

    你试过摩卡宝石吗?它在测试中使用了很多,你描述得很完美。它“伪造”对象的方法调用(在Ruby中几乎包含任何内容),并返回所需的结果,而不实际运行该方法。以这个示例文件为例:

    # test.rb
    require 'rubygems'
    require 'mocha'
    
    self.stubs(:system).with('ls').returns('monkey')
    
    puts system('ls')
    

    运行这个脚本会输出“monkey”,因为我漏掉了系统调用。您可以使用它来绕过您不想测试的应用程序的某些部分,从而找出不相关的部分。