【问题标题】:Unit testing Flask app running under uwsgi单元测试在 uwsgi 下运行的 Flask 应用
【发布时间】:2017-12-22 17:51:19
【问题描述】:

我对 python 比较陌生,正在寻找一种 python 的方式来处理这种做法。

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

据我所知,python 应用程序经常使用

if __name__ == '__main__':

pattern 用于隔离在脚本单独运行时应该运行的代码,而在导入时不应该运行的代码。但是,在这种情况下,无论是在 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 时检查 print(name) 的输出时,输出是“flask_app”,所以我看不到将其用作鉴别器。

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

【问题讨论】:

  • flask documentation 对您的烧瓶应用程序进行单元测试有一些想法。
  • 我已经阅读了 @larsks 的那些文档,但它们并没有给我太多的帮助,但我会重新查看它们,看看我错过了什么。

标签: python unit-testing flask


【解决方案1】:

事实证明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

然后用

包装初始化代码
if IN_UWSGI:

这似乎比检查正在执行导入的模块的模块名称更可靠,这是我唯一能想到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多