2017-07-07 8 views
1

私は本番で同じコードのいくつかのインスタンスを使用するプログラムを書いています。インスタンスはネットワークを介して通信しますが、ここでは関係ありません。Python:forkを使用するプログラムをテストするには?

開発中に、私は最初のプロセスを複数回フォークしてインスタンスの完全な設定を取得します。これは非常に便利です。

しかし、これで統合テストを書いてみると、テストフレームワーク(unittest/nosetests/py.test)もフォークされているので、私は複数コピーのテストフレームワークになります。各子供の単位検定の出力が重複する。

簡単な例:

  • プログラムは、チャットクライアントである(Redisのpubsubに、例えば)
  • プログラムは、私が欲しい
  • を投稿して読んでメッセージするAPIを公開して、いくつかのネットワーク接続を介して他のクライアントに接続しますお互いに接続する2つのプログラムインスタンスを分岐するには
  • テストでは、クライアントとの間でメッセージの送受信を行うためにAPIを使用する必要があります。
  • メインプロセス子プロセスのエラーを監視し、テストスイートを実行します。

これを達成するには、子プロセスからテストフレームワークを "アンロード"するか、停止する必要があります。これどうやってするの?

私はテストスイートを呼び出すことによってこの問題を解決することができましたが、テストを行うたびにすべての子を再起動する必要があります。

+1

文字化けした結果を拡張し、テストしようとしているコードの大まかなアイデアを出すことができますか? – Dan

+0

完了 - もっと理解できることを希望します。 – arnuschky

+0

stdoutはスレッドセーフではないので、問題は出力にあると思います。各プロセスの標準出力をリダイレクトしたり、コードをリファクタリングして出力ビークルを注入したりすることができます。 – Dan

答えて

0

子プロセスは、テストフレームワークの実行中インスタンスを含む親の完全なスタックを継承するので、このコンテキストでプロセスをフォークするのは大変な作業です。 1は、テストフレームワークを初期化する前にforkし、その後、テストから子プロセスにアクセスすることである

数:

は、基本的にこれを解決するには、2つのオプションがあります。これは、子プロセスが長寿命である場合はうまく機能しますが、異なるテストフィクスチャ/シナリオでも子プロセスをテストごとに開始する場合は面倒です。

番号2は、単にsubprocess/Popenを使用してプロセスを開始するだけで、すべてをまとめてフォークすることです。私はこのタスクであなたを助けるxprocessと呼ばれるpytestプラグインを見つけました。私は必要なものを正確に提供しませんでしたが、正しい方向に私を指摘しました。

関連する問題