17

特定のWebサービスAPIをラップするPythonモジュールを作成しています。すべてRESTなので、実装は比較的簡単です。

ただし、単体テストに関しては問題が見つかりました。このモジュールを作成したサービスを実行していないため、それらをハンマーで叩きたくないのですが、同時に、実行するためにデータを取得する必要があります。テスト。SimpleHTTPServerを見ましたが、これで問題ありません。

問題の一部を解決しましたが、スレッドを終了できないように見えるため、テストアプリケーションを複数回起動すると「アドレスはすでに使用されています」という問題が発生します。

ここにいくつかのサンプルコードがあります

PORT = 8001

handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), handler)

httpd_thread = threading.Thread(target=httpd.serve_forever)
httpd_thread.setDaemon(True)
httpd_thread.start()

api_data = urllib.urlopen("http://localhost:8001/post/index.json")
print "Data start:"
print json.load(api_data)

ここで、「index.json」は私が作成したモックJSONファイルであり、本物を置き換えます。プログラムが終了した後、どうすれば優雅に物事をきれいにできますか?

4

3 に答える 3

12

Trueを設定してTCPServerallow_reuse_addressのサブクラスを使用してみてください。

class TestServer(SocketServer.TCPServer):
    allow_reuse_address = True

...
httpd = TestServer(("", PORT), handler)
于 2009-12-31T13:57:26.037 に答える
5

古いスレッドですが、ここでの回答は役に立ちませんでした。HTTPServerを使用しており、各単体テストの後にシャットダウンしています(デフォルトでは、HTTPServerにはallow_reuse_address = 1が設定されています)。しかし、shutdownを呼び出した後、まだ使用中のアドレスの問題が発生しました。私は以下を使用して修正しました:

from BaseHTTPServer import HTTPServer

class MyHTTPServer(HTTPServer):
    def shutdown(self):
        self.socket.close()
        HTTPServer.shutdown(self)

これがデフォルトで発生しない理由がわかりませんか?これは最適ではないかもしれませんか?

于 2012-10-30T10:17:09.990 に答える
4

に構築されたサーバーを使用しますwsgirefhttp://docs.python.org/library/wsgiref.html

単体テストを追加するので、このサーバーに機能を追加するのは非常に簡単です。

サーバーを。で起動しますsubprocesshttp://docs.python.org/library/subprocess.html?highlight=subprocess#module-subprocess

この種のテストにはスレッドを使用しません。なんで?(1)単体テストサーバーはかなり複雑なので、クライアントアプリケーションから完全に分離しておく必要があります。(2)クライアントアプリケーションは、別々のハードウェア上の別々のプロセスになります。その構成に対して現実的なパフォーマンスの期待があることを確認する必要があります。(3)もっと簡単です。(4)すべてのプラットフォーム間で移植可能です。(5)スタンドアロンの単体テストから、すでに実行されている本番環境のようなサーバーとの統合テストに変更するのは簡単です。

実際には、ログが適切にシャットダウンされるように、サーバーを合理的に制御された方法でシャットダウンする小さなWSGIアプリケーションがあります。

于 2009-12-31T12:46:38.037 に答える