1

Python スクリプトで HTTP サーバーをモックしようとしていますが、失敗します。これが私がやっていることです:

import bottle
from restclient import GET
from threading import Thread

@bottle.route("/go")
def index():
    return "ok"


server = Thread(target = bottle.run)
server.setDaemon(True)
server.start()

print "Server started..."

response = GET("http://127.0.0.1:8080/go")

assert response.body == "ok"

print "Done..."

基本的に、別のスレッドで 1 つのテスト ルートを使用して bottle.py http サーバーを起動し、そこからの応答をモックしようとしています。

しかし、それはうまくいきません。サーバーは別のスレッドで開始されていないため、リクエストしようとすると常に「errno 111接続が拒否されました」というメッセージが表示されます。

問題は、どうすれば解決できるかということです。http サーバーをモックする他の方法はありますか?

4

1 に答える 1

7

Web サーバーが起動するのに十分な時間がありません。

あなたがするとき:

server.start()
print "Server started..."
response = GET("http://127.0.0.1:8080/go")   

サーバーを起動した直後にアクセスしようとすると、

どのスレッド (メインのスレッドまたはサーバーのスレッド) が最初に実行されるか (およびその期間) によっては、サーバーにアクセスしようとしたときにサーバーがまだ起動していない状況になる可能性があるため、Connection Refusedエラーが発生します。 .

次のことを試すことができます:

server.start()
import time
time.sleep(...) # Something long enough
# Continue your stuff.

time.sleepでわかるように-- スレッドまたはプロセスをスリープ状態にしますか? 、実行time.sleepすると、現在実行中のスレッドがスリープ状態になるだけなので、サーバースレッドが開始するのに十分な時間を残すことができます.

さて、これはすべて少しハックなので、サーバーの起動プロセスを調べて、サーバーが起動して実行されているかどうかを評価し、起動する前にこの状態で待機する方法があるかどうかを確認することをお勧めします.

ボトルのソースを見ると、それをきれいに行うための解決策がわかりません。サーバーが最終的に応答するまで、サーバーに繰り返しヒットすることをいつでも試みることができます。これにより、サーバーが稼働中であることが示されます。

于 2012-09-16T11:34:38.337 に答える