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 需要我的应用程序的路径作为参数,当它获取它时,它会从谷歌应用程序引擎文件夹中导入内容并执行我的应用程序。我对此很满意。

我遇到的问题与我的测试有关,最重要的是我对测试在运行时加载其配置的方式有疑问。我有单独的测试配置,我不希望他们使用 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 方法中编辑代码,但是我的摆弄是毫无意义的,因为我真的不明白这里发生了什么。

我知道 app 对象是在应用程序文件夹中的init中创建的,它从那里获取其设置。我可能应该提到,应用程序文件夹中硬编码文件中的配置中没有任何内容,所有文件都通过简单地使用 app.config [“DATABASE”] 加载数据库的名称(config 是一个类似于对象的字典,在应用程序中随处可用)。tests.py中设置 app.test_client 的主线如下所示:

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文件添加到测试文件夹以使其成为模块并更改app.config.from_object('configtest')app.config.from_object('tests.configtest').

于 2013-07-29T14:12:18.510 回答