1

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 がアプリケーション フォルダーからではなく、フォルダーから構成を取得するように強制するにはどうすればよいですか?

4

1 に答える 1

0

これを解決する__init__.pyには、tests フォルダーにファイルを追加してモジュールにしapp.config.from_object('configtest')app.config.from_object('tests.configtest').

于 2013-07-29T14:12:18.510 に答える