2010-01-28 212 views
1

我可以用所期望一定的投入和时间一致的供应量预期输出的可执行文件的可执行文件(通过从红宝石system电话访问)?我主要使用Mac OSX 10.6(Snow Leopard),但我也可以访问Linux和Windows。我正在使用核磁共振红宝石1.8.7。如何在测试中用可执行文件替换可执行文件?

背景:我正在做几个DNA序列比对,每个线程中有一个比对。当我尝试使用BioRuby时,无论是BioRuby还是ruby的标准库的临时文件sometimes都会提升exceptions(这比静静地失败!)。

我成立了一个test能重现问题,但只有一些时间。我假设测试之间主要的可变性来源是线程,临时文件系统和用于对齐的可执行文件(ClustalW)。由于ClustalW可能不会发生故障,但可能是变异性的来源,我认为消除它可能有助于再现性。

对于那些想select isn't broken - 这就是我想知道太多。但是,according to the changelog,2009年8月关注tempfile的线程安全性。此外,我检查了BioRuby邮件列表是否正确调用BioRuby代码,似乎是这样。

回答

1

我真的不明白的问题是什么,或者以后究竟是你的,你就不能写东西像

#!/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

我试过类似的东西,看起来好像测试挂了,所以我做错了什么。但我又看了一遍,发现它甚至在我到达unix提示符后才打印出来。 – 2010-01-28 22:21:19

1

可以。在我为程序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 

,并传递到程序的该配置文件:

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

现在程序的运行不是真正的B方案,但模拟之一。

+0

谢天谢地,BioRuby允许您更改可执行文件的名称(您可以将它作为选项传递给'Bio :: ClustalW.new()')。我甚至尝试过将可执行文件的名称设置为'false'(unix命令,而不是布尔值) – 2010-01-28 22:33:15

0

您尝试过摩卡宝石吗?它用于测试很多,而且你完美地描述它。它“伪装”了一个对象的方法调用(包括ruby中的任何东西),并返回你想要的结果而不用实际运行该方法。以下示例文件:

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

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

puts system('ls') 

运行此脚本输出“猴子”,因为我删除了系统调用。您可以使用它来绕过您不想测试的应用程序的某些部分,以分解不相关的部分。