2011-01-26 4 views
2

私は、実行時間の長い実行スレッド、イベントをポーリングしたり、他のイベントを起動させたりするコードのBLOBを持っているとします(私の場合は、XMLRPC呼び出しを使用します)。それは単体テストすることができるようにクリーンなオブジェクトにリファクタリングする必要がありますが、その間に、いくつかの統合テストでは現在の動作の一部をブラックボックスのように扱いたいと思っています。たとえば、次のようにPythonコードをスレッドで修正せずにテストしていますか?

# long-lived code 
import xmlrpclib 
s = xmlrpclib.ServerProxy('http://XXX:yyyy') 
def do_stuff(): 
    while True: 
     ... 
     if s.xyz(): 
      s.do_thing(...) 

_

# test code 
import threading, time 
# stub out xmlrpclib 
def run_do_stuff(): 
    other_code.do_stuff() 

def setUp(): 
    t = threading.Thread(target=run_do_stuff) 
    t.setDaemon(True) 

def tearDown(): 
    # somehow kill t 
    t.join() 

def test1(): 
    t.start() 
    time.sleep(5) 
    assert some_XMLRPC_side_effects 

最後の大きな問題は、テスト対象のコードがCtrlキーを押しながらCまで、永久に実行するように設計された、と私は強制的にどのような方法が表示されないということです私はテストしているコードを変更せずに、最初からそれを起動することができるように、例外を発生させるか、そうでなければスレッドを終了させます。私はテスト中の関数を呼び出すとすぐにスレッドからフラグをポーリングする能力を失います。

私はこれがということを知っています。実際にテストがどのように動作するように設計されているか、統合テストは限られた価値などではありませんが、私は軽く働くことによってテストとデザインの価値を、一度に彼のソフトウェアを完全に再設計するのではなく、

答えて

0

私が探していた解決策を見つけたと思います。スレッドを使用する代わりに、別のプロセスを使用します。

モックを行い、制御された方法でコードを実行するための小さなpythonスタブを書くことができます。次に、各テストのサブプロセスでスタブを実行するための実際のテストを作成し、各テストが終了すると終了します。テストプロセスは、stdioまたはソケット経由でスタブと対話できます。

4

最後の大きな問題は、Ctrlキーを押しながらCまで、テスト対象のコードが永久に実行するように設計されていることである、と私は例外を発生させるか、そうでない場合は、スレッド

を殺すためにそれを強制するためにどのような方法が表示されません

テスト駆動開発のポイントは、になるようにデザインを再考することです。

ループは永遠に - 生産用のように見えますが、テスト可能ではありません。

ループを終了させます。それは生産を傷つけることはありません。テスト容易性が向上します。

「永遠に設計された」は、テスト容易性のために設計されていません。だから、テスト可能になるようにデザインを修正してください。

+0

すべての有効な点がありますが、私が良い開発実践に関する一般的なアドバイスを探していた場合は、この質問にロジスティクスに関する質問はありませんでした。 –

+0

@Mu Mind:わかりやすい単純な解決策があれば、「良い開発実践に関する一般的なアドバイス」を提供していないでしょう。 –

関連する問題