2010-01-28 113 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') 

運行此腳本輸出「猴子」,因爲我刪除了系統調用。您可以使用它來繞過您不想測試的應用程序的某些部分,以分解不相關的部分。