flask_restful应用程序上的单元测试不起作用-卡在烧瓶服务器上运行

时间:2018-08-16 17:57:18

标签: unit-testing flask-restful

我的工具:Python 3.5.0,flask 1.0.2,mac osx

我的问题: 我有一个非常简单的RESTful应用,其中有两个正在运行的端点。我通过unittest编写了两个非常简单的单元测试,由于我现在不确定,因此它们没有继续进行。如果执行以下操作,测试将成功:

  1. 如果我单独运行服务器,请在http://127.0.0.1:8015/上说(而不要设置setUp())
  2. 运行测试,以便它们调用request.get(http://127.0.0.1:8015/employee/3
  3. 测试运行正常并且通过

如果我使用以下setUp(self)定义运行测试,则测试将挂起:

Serving Flask app "testing" (lazy loading)
Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
Debug mode: off
Running on http://127.0.0.1:8015/ (Press CTRL+C to quit)

这是相关代码

def setUp(self):
    self.app = Flask("testing")
    self.app.testing = True 
    self.client = self.app.test_client()
    self.EmployeeId = 4

    with self.app.app_context():
        db_connect = create_engine('sqlite:///some.db')       
        self.api = Api(self.app)  
        self.api.add_resource(server.Car, '/car/<employee_id>') # Route_4
        app.run(port=8015, debug=False)

def test_api_can_get_employee_by_id(self):
    res = requests.get(url = 'http://127.0.0.1:8015/car/{}'.format(self.EmployeeId))
    data = res.json()
    self.assertEqual(res.status_code, 200)
    self.assertIn('mazda', data["data"][0]['make_model'])

我已经上网了,没有发现真正涵盖我问题的资源。服务器的设置在测试过程中起作用,但是不执行单元测试。您如何建议对此进行故障排除?我愿意接受所有建议,包括更改方法。谢谢!

1 个答案:

答案 0 :(得分:0)

对于那些在Google搜索“单元测试无法在Flask上运行”之后绊脚石的人来说,

无论模块如何加载,您的代码都有可能始终启动Flask服务器。如果是这样,即使单元测试也将启动服务器,服务器将不确定地监听连接。

例如,这会卡住:

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello World!"

app.run()

相反,仅当您的模块是主程序时,才需要启动Flask服务器:

from flask import Flask
app = Flask(__name__)


@app.route('/')
def hello():
    return "Hello World!"

if __name__ == '__main__':
    app.run()

有关“ 名称 =='主要'”块here的更多信息。

关于原始问题,此答案不能解决。为此,您需要启动Flask服务器,但是要以非阻塞方式(例如另一个线程或进程)启动。有很多方法可以执行此操作,并且没有任何其他信息,这个问题太模糊了,无法按原样回答。