我有一个问题,关于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是类似于对象的字典,在应用程序中随处可用)。设置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从他们的文件夹中获取配置而不是从应用程序文件夹中获取它?
答案 0 :(得分:0)
我相信要解决此问题,您应该将__init__.py
文件添加到tests文件夹中,使其成为模块,并将app.config.from_object('configtest')
更改为app.config.from_object('tests.configtest')
。