ネットワークスレッドでPyUnitではを使用して
-
19-09-2019 - |
質問
私はPythonで書かれ、ネットワークソフトウェアのスイートの書き込みユニットテストを担当しています。メッセージビルダーや他の静的メソッドの単位を書くことは非常に簡単ですが、それがスレッドをループネットワークのテストを書くことになると私は壁にヒットしました。
たとえば:それが接続するサーバーは、任意のポート上に置くことができ、そして私が実際に多数のサーバを実行することなく、多数のポート(シーケンスでは、平行でない)に接続する機能をテストできるようにしたいです。これにアプローチするための良い方法は何ですか?おそらく、サーバ構築とテストの破壊部分を作りますか?何かが私を忌避シンプルな答えがそこになければならない私に語っています。
私は、ネットワークスレッドをユニットテストする方法があると想像する必要がありますが、私はいずれかを見つけるように見えることはできません。
解決
私は、ソケットオブジェクトを作成することを目的としている既存のコードに工場を導入しようとするだろう。次に(?あなたはしないでください、あなたはまた、テストするエラーケース、またはしない)だけで、彼らは、サーバーに接続したふりモックソケットを作成し、模擬工場でのテストパスにして証明するメッセージトラフィックをログに記録あなたのコードは、サーバの右側のタイプに接続するために、適切なポートを使用しています。
テストを簡素化するために、まだスレッドを使用しないようにしてくださいます。
他のヒント
これは、ネットワーク・ソフトウェアが階層化し、どのように詳細な、あなたのテストになりたいが、それは、サーバーのセットアップとテストのティアダウン部分を作るためにいくつかのシナリオでは確かに可能ですがどのように依存します。 (これは、Pythonの一部になる前に)私はPythonのloggingパッケージに取り組んでいたとき、例えば、私は(私はpyunit
/ unittest
を使用しなかった - それだけでアドホックスクリプトだった)のテストを持っていた解雇(1でテスト)4台のサーバはTCP、UDP、HTTPおよびHTTP / SOAPポートをリッスンし、それらへのネットワークトラフィックを送信します。あなたが興味を持っている場合、分布はこことあります見て、アーカイブ内の関連するテストスクリプトはlog_test.py
です。 Pythonのloggingパッケージはもちろん、それ以来、いくつかの道のりを歩んできましたが、古いパッケージは、Pythonのバージョン<2.3および> = 1.5.2で使用するための周りはまだです。
私は、セットアップでサーバーを実行し、ティアダウンで、それを閉じて、いくつかのテストケースをしました。それはそれを行うには非常にエレガントな方法がある場合、私は知りませんが、それは私のための作品ます。
私はそれを持って幸せだし、それは私に多くのことができます。
サーバinitが非常に長い場合、、代替はアリとそれを自動化することです。アリは、テストを実行した後/前にサーバーを停止/実行します。
を参照してください。ここのアリとのpythonについて非常に興味深いチュートリアル
あなたはモックソケットを作成する必要があります。それを行うための正確な方法は、あなたがソケットの作成方法に依存するであろうとソケットジェネレータを作成することは良いでしょう。また、あなたの人生を容易にするために pymox のようなモックライブラリを使用することができます。また、おそらくちょうどテストの唯一の目的のためにソケット・ジェネレータを作成する必要をなくすことができます。
pymoxを使用して、あなたはこのような何かをするだろう
def test_connect(self):
m = mox.Mox()
m.StubOutWithMock(socket, 'socket')
socket_mock = m.MockAnything()
m.socket.socket(socket.AF_INET, socket.SOCK_STREAM).AndReturn(socket_mock)
socket_mock.connect(('test_server1', 80))
socket_mock.connect(('test_server2', 81))
socket_mock.connect(('test_server3', 82))
m.ReplayAll()
code_to_be_tested()
m.VerifyAll()
m.UnsetStubs()