0

Flask-Scriptアプリケーションでテストを実行するために使用していますが、manage.pyファイルの重要な部分は次のようになります。

import unittest

from flask.ext.script import Manager
from project import app

manager = Manager(app)

@manager.command
def test():
    """Run unit tests."""
    app.config.from_object('config.Test')
    tests = unittest.TestLoader().discover('tests', pattern='*.py')
    unittest.TextTestRunner(verbosity=1).run(tests)

しかし、実行python manage.py testすると、アプリケーション全体を初期化しようとするため、たとえば、環境変数を設定していない場合KeyError、プロジェクトの__init__.pyファイルから次のようにスローされます。

File "project/__init__.py", line 19, in <module> app.config.from_object(os.environ['PROJECT_SETTINGS'])

または、環境変数を設定した場合、データベース テーブルが見つからないというエラーが発生します。

確かに、アプリは、テストが実行され、構成変数がtest()関数に設定された後にのみ初期化する必要があります。

4

1 に答える 1

1

これを機能させるには、いくつかの作業を行う必要があります。

  1. 不足している環境変数を設定します(すでに述べたように)。

  2. テストで使用するテスト データベースを作成し、テーブルを作成してテーブルを削除する および 関数をsetupテストに含めます。teardown

ステップ 1 を回避するには、アプリケーションの作成を関数内にカプセル化できるFlask アプリケーション ファクトリ パターンを使用することをお勧めします。これにより、テスト環境でアプリケーションを実行するために必要な変数などを渡すことができます。

def create_application(is_test=False):
    app = Flask(__name__)
    if not is_test:
       setup_app_not_for_test(app)
    else:
       setup_test_for_app(app)

    return app

ステップ2に関して、pytestやnose、またはフィクスチャを使用するあらゆる種類のテストフレームワークを使用している場合、データベーステーブルを追加/削除する機能をsetup簡単に追加できます。teardownさらに、sqlalchemy のような ORM を使用している場合は、SQLite イン メモリ データベースを非常に簡単に作成して、テストを実行できます。

# create db instance
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://:memory:"

# create all your tables
db.create_all()

# drop all your tables
db.drop_all()
于 2016-02-08T21:38:04.987 に答える