2

私は、python で書かれた一連のネットワーク化されたソフトウェアの単体テストを作成する任務を負っています。メッセージ ビルダーやその他の静的メソッドのユニットを作成するのは非常に簡単ですが、ネットワーク ループ スレッドのテストを作成する際に壁にぶつかりました。

例:接続先のサーバーは任意のポートにある可能性があり、実際に多数のサーバーを実行することなく、多数のポートに(並列ではなく順番に)接続する機能をテストできるようにしたいと考えています。これにアプローチする良い方法は何ですか?おそらく、サーバーの構築と破壊をテストの一部にしますか? 私を回避するもっと簡単な答えがあるに違いないと何かが教えてくれます。

ネットワーク化されたスレッドを単体テストする方法があると想像する必要がありますが、見つけられないようです。

4

4 に答える 4

1

ソケット オブジェクトを作成することを目的とした既存のコードにファクトリを導入してみます。次に、サーバーに接続したふりをするだけのモックソケットを作成するモックファクトリのテストパスで(または、テストしたいエラーの場合ではありませんか?)、証明するためにメッセージトラフィックをログに記録しますコードが適切なポートを使用して適切な種類のサーバーに接続していること。

テストを簡単にするために、まだスレッドを使用しないようにしてください。

于 2009-07-23T21:09:50.670 に答える
0

setUpでサーバーを実行し、tearDownでサーバーを閉じるテストケースがいくつかあります。それが非常にエレガントな方法であるかどうかはわかりませんが、私にとってはうまくいきます。

私はそれを持って幸せです、そしてそれは私を大いに助けます。

サーバーの初期化が非常に長い場合は、antを使用して自動化することもできます。antは、テストの実行前/実行後にサーバーを実行/停止します。

antとpythonに関する非常に興味深いチュートリアルについては、こちらをご覧ください

于 2009-07-23T20:34:18.120 に答える
0

モックソケットを作成する必要があります。これを行う正確な方法は、ソケットの作成方法によって異なり、ソケットジェネレーターを作成することをお勧めします。また、 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()
于 2009-07-24T16:10:50.913 に答える
0

ネットワーク ソフトウェアがどのように階層化されているか、およびテストをどの程度詳細にするかによって異なりますが、一部のシナリオでは、サーバーのセットアップと破棄をテストの一部にすることは確かに実行可能です。たとえば、Python ロギング パッケージ (Python の一部になる前) に取り組んでいたとき、 (1 つのテストで) 起動するテストがありました ( pyunit/は使用しませんでしunittestた。これは単なるアドホック スクリプトでした)。 TCP、UDP、HTTP、および HTTP/SOAP ポートでリッスンする 4 つのサーバーを作成し、それらにネットワーク トラフィックを送信しました。興味のある方は、ディストリビューションはこちら、関連するテスト スクリプトはアーカイブにありますlog_test.py。もちろん、Python ロギング パッケージはその後何らかの形で登場しましたが、古いパッケージはまだ Python 2.3 未満および 1.5.2 以上のバージョンで使用されています。

于 2009-07-23T19:13:46.487 に答える