2017-10-11 20 views
0

私はフラスコマイクロサービスを開発して、いくつかのデータをcassandraデータベースから公開しています。これは、コマンドラインから呼び出されているガンコーンによって提供されます。問題は、データベースに接続する場所と方法、特に単体テストを行うときにデータベースの必要性を模擬する方法やバイパスする方法を検討する際に混乱していることです。フラスコポストフォーク接続to cassandra

私の最初の試みは

それは、個々の要求のためのオーバーヘッドを削減シングル「グローバル」な接続を作ってあげることを考え
def create_app(): 
    app = Flask(__name__) 

    app.debug = True 

    cluster = Cluster([os.environ['CASSANDRA_HOST']]) 
    app.cassandra = cluster.connect(os.environ['CASSANDRA_KEYSPACE']) 

    return app 

を次のようにアプリの作成時に接続することでした。これは、CIパイプラインの隔離された環境でのユニットテストのポイントではない、接続しようとするユニットテストを明らかに失敗します。

次に、Cassandraの人々からslidesを調べると、フラスコの使用には@app.before_first_requestと一般的なルールとして「ポストフォーク」を接続することが記載されています。私はポストフォークがこの文脈で何を意味するのか分かりません。とにかく

@app.before_first_request 
def before_request(): 
    app.cluster = Cluster([os.environ['CASSANDRA_HOST']]) 
    app.cassandra = app.cluster.connect(os.environ['CASSANDRA_KEYSPACE']) 

をやっても動作しますが、それでも孤立ユニットテストと同じ問題を抱えています。

postを読むと、私はgunicorn(ポストフォーク)によって生成されるフラスコインスタンスごとに1つのcassandraセッションを作成しているので、接続自体に問題はないと思います。

私の質問は、明示的にデータベースに達することなく、エンドポイントを単体テストできるようにするためにどの戦略に従うかを減らします。

答えて

0

一般的な考え方は、プロセスごとに1つのクラスタ/セッションを作成し、フォーク上に作成し、プロセスの存続期間中保持することです。ほとんどのサーバーは、このようなリソースを設定するためのポストフォーク「フック」を提供しています。

Gunicornフックはhere

uWSGIアナログはdriver FAQが参照され、文書化されています。

関連する問題