Python がモジュールをインポートしてパッケージ内にオブジェクトを作成する方法について質問があります。私は Google App Engine で Flask を使用していますが、問題はより一般的なものだと思います。
私のアプリの構造は次のとおりです。
app/
application/
__init__.py
flaskr.py
models.py
mainConfig.py
etc...
tests/
tests.py
configtest.py
apptest.py
run.py
Google App Engineランチャーを使用していますが、ほとんどの場合問題なく動作します。アプリを実行したいときは、dev_appserver.py を使用するだけです。Appserver は、アプリへのパスを引数として必要とします。それを取得すると、Google アプリ エンジン フォルダから内容をインポートし、アプリを実行します。私はそれで満足しています。
私が抱えている問題は私のテストに関するものです。最も重要なのは、実行時にテストが構成をロードする方法に問題があることです。テスト用に個別の構成があります。mainConfig.py を使用したくありません。configTests.py を使用する必要があります。残念ながら、現時点では、テストを実行するたびに、テストはデフォルトのアプリ構成を使用しており、独自のオプションは使用していません。たとえば、データをアプリ データベースに挿入し、構成でハードコーディングしたテスト データベースには挿入しません。
apptest.pyを介してテストを実行します。ファイルはかなり単純で、次のようになります。
#!/usr/bin/python
import optparse
import sys
import unittest2
USAGE = """%prog SDK_PATH TEST_PATH
Run unit tests for App Engine apps.
SDK_PATH Path to the SDK installation
TEST_PATH Path to package containing test modules"""
def main(sdk_path, test_path):
sys.path.insert(0, sdk_path)
import dev_appserver
dev_appserver.fix_sys_path()
suite = unittest2.loader.TestLoader().discover(test_path)
unittest2.TextTestRunner(verbosity=2).run(suite)
if __name__ == '__main__':
SDK_PATH = u"pathToGoogle\\Google\\google_appengine"
TEST_PATH = u"pathtoapp\\app\\tests\\"
main(SDK_PATH, TEST_PATH)
私はしばらくの間、この問題をいじろうとしています。アプリケーション ディレクトリ内でテストをあちこちに移動し、テストの setUp メソッドでコードを編集していますが、ここで何が起こっているのかよくわからないので、いじくり回すのはまったく無意味です。
アプリオブジェクトはアプリケーションフォルダー内のinitに作成され、そこから設定を取得することを知っています。おそらく、アプリケーションフォルダー内のファイルにハードコードされた構成からは何も言及する必要はなく、すべてのファイルは app.config["DATABASE"] を使用するだけでデータベースの名前をロードします(configはオブジェクトのような辞書であり、アプリケーション内のどこでも使用できます)。app.test_clientを設定する tests.pyの主な行は次のようになります。
from application import app
class FlaskrTestCase(unittest.TestCase):
def setUp(self):
app.config.from_object('configtest')
self.app = app.test_client()
ここで何が起こっているのでしょうか?どうすれば修正できますか? tests.py がアプリケーション フォルダーからではなく、フォルダーから構成を取得するように強制するにはどうすればよいですか?