我们有一个Flask应用程序,其中大多数基本的Flask设置代码都位于应用程序根目录下的文件run.py
中。所以基本上很多:
app = Flask(__name__)
app.debug = True
app.config(...)
app.config(...)
api = Api(app)
api.add_resource(resources.Registration, '/registration')
api.add_resource(...)
api.add_resource(...)
我正在尝试向其中添加单元测试,这是我们目前没有的。我大致以Flask教程项目(https://github.com/pallets/flask/tree/1.0.2/examples/tutorial)为例。
基本上,您将整个应用程序创建为可导入的模块-该模块是工厂。因此__init__.py
有一个create_app
函数可以创建您的应用(https://github.com/pallets/flask/blob/1.0.2/examples/tutorial/flaskr/init.py)。我认为这是在正常操作期间由主应用程序导入模块时自动调用的,但也可以在conftest.py(https://github.com/pallets/flask/blob/1.0.2/examples/tutorial/tests/conftest.py)中显式调用,我认为(?)会被自动调用。 pytest
启动。
所以我的问题实际上很简单:是否可以通过一种不错的方式来启动一些pytest
测试,而无需将主应用程序的代码重构为工厂模块?我不想过多地触摸主应用程序...我想把它作为一个非常简单的设置(如我的代码放在此问题的顶部)保留。
换句话说,一旦您删除了数据库内容,这就是教程conftest.py
中的基本应用设置:
@pytest.fixture
def app():
app = create_app({
'TESTING': True,
'DATABASE': db_path,
})
yield app
我希望没有app
的{{1}}。但是,由于我们所有的应用程序代码都只在基本的create_app
中,因此除了复制所有内容并使其保持同步之外,我想不出一种好方法。我无法从run.py
导入app
,因为它不是我不认为的模块。
很抱歉,这是如此基本-测试和导入声明都不是我的强项。
答案 0 :(得分:0)
我想我找到了一种方法...只要做到这一点,以便您可以包含父文件夹中的模块(按照Importing modules from parent folder),然后导入run并从中获取变量:
import os,sys,inspect
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir)
import run
@pytest.fixture
def app():
app = run.app
yield app
...当然,我将需要找到一种方法来调整行为以进行测试(即相当于本教程通过'Testing': True
的行为),所以这是我的下一个挑战。