首页 文章

单元测试在uwsgi下运行的Flask应用程序

提问于
浏览
2

我是python的新手,我正在寻找一种pythonic方式来处理这种做法 .

我继承了一个相当简单的Python 2.7 Flask应用程序,它在uwsgi下运行,我想添加一些单元测试 . 它在缩进级别0进行一些初始化,当它在uwsgi中运行时需要,但在测试时需要跳过 .

我了解到python应用经常使用

if __name__ == '__main__':

用于隔离代码的模式,该代码应在脚本自行运行时运行,并且在导入时不应运行 . 但是,在这种情况下,当脚本在uwsgi下运行时以及脚本导入单元测试时, __name__ 都是相同的;脚本的名称,所以我不能用它来区分uwsgi和单元测试环境 .

此示例代码说明了我正在使用的内容 .

在Flask应用程序(flask_app.py)中:

import logging
import bcrypt
from flask import Flask, jsonify, abort, make_response, request
from ConfigParser import SafeConfigParser

#  some initialization that only makes sense when running from the uwsgi context on the server
PARSER = SafeConfigParser()
PARSER.read('config.ini')
LOG_FILE = PARSER.get('General', 'logfile')

APP = Flask(__name__)

@APP.route('/', methods=['GET'])
def index
    ...

@APP.route('/<p1>/<p2>', methods=['PUT'])
def put(p1, p2):
    ...

if __name__ == '__main__':
    APP.run(debug = True, host='0.0.0.0')

在单元测试中(tests.py):

import os
import unittest
from flask import json

from flask_app import APP

class FlaskAppTestCase(unittest.TestCase):

    def setUp(self):
        self.APP = APP.test_client()

    def test_GET(self):
        resp = self.APP.get('/')
        assert 'Some Html' in resp.data

    def test_PUT(self):
        resp = self.APP.put('/1/2')
        assert 'Got 1, 2' in resp.data

if __name__ == '__main__':
    unittest.main()

我想要做的是移动初始化,使其仅在通过uwsgi执行flask_app时运行,而不是在通过tests.py运行时运行,可能通过检查 name 并确定基于该执行的路径,但是当我执行时在uwsgi下运行flask_app或执行tests.py输出是"flask_app"时检查print的输出( name ),所以我似乎无法将其用作鉴别器 .

在python中有一种惯用的方法来处理这个问题吗?

1 回答

  • 2

    事实证明the Python module for uWSGI实际上提供了一种机制来确定应用程序是否在uWSGI下运行 . 如果你在uWSGI上下文中, uwsgi 模块可以导入,所以我最后检查是否可以导入该模块,如果可以的话只执行初始化代码 .

    #   detect if we're running under uWSGI; only init if we are, not if we're testing
    try:
        import uwsgi
        IN_UWSGI = True
    except ImportError:
        IN_UWSGI = False
    

    然后用init包装init代码

    if IN_UWSGI:
    

    这比检查正在进行导入的模块的模块名称更可靠,这是我能想到的唯一其他事情 .

相关问题