4

私はPythonでWebアプリケーションを作成しており、レタススプリンターを使用して受け入れテストを作成しています。

これを行うには、アプリケーションをテスト スイートで使用できるように、アプリケーションをバックグラウンドで起動する wsgi サーバーを取得する必要があります。これを行うために、別のスレッドでウェイトレス サーバー インスタンスを起動して、ブラウザーが次の場所に接続するようにしました。

def setUp():
    base = os.path.dirname(__file__) + "/../../.."
    world.app = loadapp('config:test.ini', relative_to=base)
    world.server_thread = thread.start_new_thread(serve_app,  (world.app,))

def serve_app(app):
    serve(app, host='0.0.0.0', port=7654)

これは非常にうまく機能します。実行中のアプリケーション インスタンスは、フィクスチャやモックなどをセットアップするためにテスト スイートで使用でき、サーバーはテストが接続するために使用できます。ただし、テストが終了すると、サーバーに信号を送信してサーバーを完全にシャットダウンする方法がありません。したがって、とにかく、私がKeyboardInterrupt生成したサーバースレッドに送信することができますか(ウェイトレスによってキャッチされ、きれいにシャットダウンするように促されます)、またはそれが失敗した場合、非ブロッキングを公開する既存の wsgi サーバー実装がありますかウェイトレスの代わりに採用できる方法はstart()ありますか?stop()

4

3 に答える 3

1

問題は、プロセスがシャットダウンしないことだけですか?

Python を Web 開発に使用してからしばらく経ちましたので、これらのライブラリの経験はありませんが、シャットダウンが問題である場合は、デーモン スレッドを使用するのが良いシナリオのようです。

ここで言及: http://docs.python.org/library/threading.html

于 2012-08-14T10:21:11.600 に答える
1

WSGI アプリの単体テストに WSGI サーバーは必ずしも必要ではありません ( example ) 。

受け入れテストの場合、別のプロセスでサーバーを起動し、完了したら SIGINT を送信できます。

現在の設定を使い続けたい場合。メイン スレッドでサーバーを実行し、バックグラウンド スレッドでテストを実行できます。次に、サブスレッドからメインスレッドに KeyboardInterrupt を送信できます。

于 2012-08-14T02:47:17.907 に答える
1

WSGI サーバーを実行するスレッドをデーモン スレッドとしてマークします。そうすれば、メインスレッドを終了するときに、サーバーが実行されているスレッドが完了するのを待たずに、アプリケーションを終了するだけです。

于 2012-08-14T11:08:20.687 に答える