3

Thriftを使用してサービスを作成していますが、期待どおりに動作/応答することを確認するために、いくつかのテストを適用する必要があります。これを達成するための最も堅牢なアプローチは、unittestモジュールを使用することであるように思われます。

単体テストのメソッド内から直接「テスト」モード(特定の「テスト」ポートで開始、「テスト」データを使用など)でサービスを開始したいのですが、その時点でブロックをsetUp呼び出して接続を待機しています。serve()

tearDownテストを実行し、メソッドを使用してサービスをクリーンに停止できるように、サービスを開始するための最良のアプローチは何でしょうか。

4

3 に答える 3

7

提供する「完全な分離」は、単体テスト設計unittest対象)には優れていますが、必ずしも統合テストには適していません。それらを再利用することの魅力を理解しています。私は、独自のテストランナーなどを利用しています。しかし、それが統合テストに使用するのに適した力のようなものであることに気づき、私は単体テストをコーディングするのとはかなり異なる方法でコーディングすることによって補償しようとしています。unittestunittest

統合テストでサーバーをスポーンする必要がある場合、モジュールの開始時に、別のプロセスでsubprocess、またはインストールに適した他の方法で、別のプロセスでサーバーを実行する場合は、スポーンを実行する傾向があります。ノードなど-そして、テストモジュールがすべて終了したときにそのサーバーに終了要求を送信する終了コードをatexitに登録します。これは、単体テストで必要とされるほど「明確に分離」されていませんが、統合テストには十分であり、サーバーの起動と初期化のオーバーヘッドを償却します。これは、複数のテストにわたって非常に高くなる可能性があります。

とを使用setUpしたい場合でもtearDown、別のプロセスを使用することをお勧めします(「継続的ビルドファーム」などに多数のプロセスがある場合は、別のノードを使用することをお勧めします)。@Nedの回答が示唆しているように、同じプロセスで別のスレッドを使用すると、危険だと思います。サーバーとテストの間に望ましくない相互作用が発生しやすく、バグが隠れたり、他のバグが発生したりする可能性があります。

私が正しく理解していれば、サーバーを同じプロセスだけでなく、テストと同じスレッドで実行しようとしているのですが、それは私には間違いなく悪い考えのようです-もちろん、サーバーがない限り、すべてがブロックされます非常に特別にコーディングされています!-)

于 2010-03-06T17:49:58.903 に答える
1

サーバーがバックグラウンドで実行されているときにテストを起動するコンテキストマネージャーを作成できます。

if __name__ == '__main__':
    with background_server():
        print('Server loaded, launching the tests...')
        unittest.main(exit=False)

私が使用するコードbackground_server

@contextlib.contextmanager
def background_server():
    # Launching the server
    pid_server = os.fork()
    if not pid_server:  # Child code
        launch_server()  # Blocking call (until signal.SIGINT)
        print('Interuption detected, server closed...')
        sys.exit()  # Closing the process

    # HACK: Wait for the server to be launched
    while True:
        try:
            requests.get("http://localhost:5000/", timeout=0.5)
            break
        except requests.exceptions.ConnectionError:
            pass
        time.sleep(0.3)

    try:
        yield
    finally:
        # Closing the server
        os.kill(pid_server, signal.SIGINT)
于 2017-02-01T23:24:05.327 に答える
0

ブロックする場合serve()、最善の策は、setUpを呼び出すためにスレッドを生成することserve()です。次に、メソッドでThriftを停止する方法を理解する必要がありますtearDown

于 2010-03-06T14:31:31.513 に答える