20

gevent.socket通信に使用する Python クライアント + サーバーを作成しています。コードのソケット レベルの動作をテストする良い方法はありますか (たとえば、無効な証明書を使用した SSL 接続が拒否されることを確認するなど)。それともspawn、実際のサーバーだけが最も簡単ですか?

編集:複雑な相互作用が関係しているため、SSLコンポーネントをテストするのに「素朴な」モックが十分であるとは思いません。私はそれで間違っていますか?または、SSL化されたものをテストするより良い方法はありますか?

4

3 に答える 3

18

サーバーを簡単に起動して、テストケースでアクセスできます。gevent独自のテストスイートは、geventの組み込みサーバーをテストするためのものとまったく同じです。

例えば:

class SimpleServer(gevent.server.StreamServer):

    def handle(self, socket, address):
        socket.sendall('hello and goodbye!')

class Test(unittest.TestCase):      

    def test(self):
        server = SimpleServer(('127.0.0.1', 0))
        server.start()
        client = gevent.socket.create_connection(('127.0.0.1', server.server_port))
        response = client.makefile().read()
        assert response == 'hello and goodbye!'
        server.stop()

ポート値に使用0するということは、サーバーが使用可能なポートを使用することを意味します。サーバーの起動後、によって選択された実際の値が属性bindとして使用可能になりserver_portます。

StreamServerSSLもサポートし、コンストラクターkeyfileに引数を渡し、ハンドラーに渡す前にcertfile各ソケットをラップします。SSLObject

使用せず、サーバーがGreenletStreamServerに基づいている場合は、実際にそれを生成する必要があります。テストケースの最後にそれを殺すことを忘れないでください。

サーバーの起動とグリーンレットの生成は、geventでの高速操作であり、新しいスレッドまたはプロセスを作成するよりもはるかに高速であり、テストケースごとに新しいサーバーを簡単に作成できます。サーバーが不要になったらすぐにクリーンアップすることを忘れないでください。

gevent APIをモックする必要はないと思います。サーバーとクライアントが同じプロセス内で幸せに暮らせるので、geventAPIを使用する方がはるかに簡単です。

于 2010-10-29T04:45:00.883 に答える
9

モックとスタブは素晴らしいですが、統合の次のレベルに引き上げる必要がある場合もあります。サーバーの生成は、たとえ偽物であっても時間がかかる可能性があるため、別のテストスイート(統合テストと呼びます)が適切であると考えてください。

「使用するようにテストする」が私のガイドラインです。モックとスタブを作成してテストが簡単になる場合は、それほど有用ではありません(ただし、ほとんどのテストの方が優れています)。不正なSSL証明書の処理が心配な場合は、必ずいくつかの不正なSSL証明書を作成し、それらにフィードできるテストフィクスチャを作成してください。それがサーバーの生成を意味する場合は、そうです。たぶん、それがあなたを十分に悩ませているなら、それはそれを別の方法でテスト可能にするリファクタリングにつながるでしょう。

于 2010-10-29T01:06:25.400 に答える
8

別の(IMOより良い)方法があります:使用しているライブラリをモックする必要があります。Python のモック ヘルパーの例はmoxです。

有効な証明書を持つサーバーのセット、無効な証明書を持つ別のサーバー、SSL サポートがまったくないサーバー、パケットにまったく応答しないサーバーなどは必要ありません。「ダミー」クライアントソケットでそれらの動作をシミュレートできます。 . Mox での動作方法は、最初に何を期待し、どのように反応するかを「教え」、次に実際の gevent.socket をモック化されたものと交換しながら実際のコードを実行します。コツをつかむにはある程度の練習が必要ですが、それだけの価値があります。

于 2010-10-28T23:49:35.077 に答える