[根据/sf/ask/17360801/,标题应参考集成测试而不是单元测试]
假设我想测试以下Flask API(从这里开始):
import flask import flask_restful app = flask.Flask(__name__) api = flask_restful.Api(app) class HelloWorld(flask_restful.Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld, '/') if __name__ == "__main__": app.run(debug=True)
将此保存flaskapi.py
并运行后,在同一目录中运行脚本test_flaskapi.py
:
import unittest import flaskapi import requests class TestFlaskApiUsingRequests(unittest.TestCase): def test_hello_world(self): response = requests.get('http://localhost:5000') self.assertEqual(response.json(), {'hello': 'world'}) class TestFlaskApi(unittest.TestCase): def setUp(self): self.app = flaskapi.app.test_client() def test_hello_world(self): response = self.app.get('/') if __name__ == "__main__": unittest.main()
两个测试都通过了,但对于第二个测试(在TestFlaskApi
类中定义),我还没有弄清楚如何断言JSON响应是否符合预期(即{'hello': 'world'}
).这是因为它是一个实例flask.wrappers.Response
(可能基本上是一个Werkzeug响应对象(参见http://werkzeug.pocoo.org/docs/0.11/wrappers/)),但我找不到相应的Response对象的json()
方法.requests
如何对第二个JSON内容进行断言response
?
Flask提供了一个test_client,可以在测试中使用:
from source.api import app from unittest import TestCase class TestIntegrations(TestCase): def setUp(self): self.app = app.test_client() def test_thing(self): response = self.app.get('/') assert
Flask测试文档
我发现我可以通过应用于方法json.loads()
的输出来获取JSON数据get_data()
:
import unittest import flaskapi import requests import json import sys class TestFlaskApiUsingRequests(unittest.TestCase): def test_hello_world(self): response = requests.get('http://localhost:5000') self.assertEqual(response.json(), {'hello': 'world'}) class TestFlaskApi(unittest.TestCase): def setUp(self): self.app = flaskapi.app.test_client() def test_hello_world(self): response = self.app.get('/') self.assertEqual( json.loads(response.get_data().decode(sys.getdefaultencoding())), {'hello': 'world'} ) if __name__ == "__main__": unittest.main()
两个测试都按照需要通过:
.. ---------------------------------------------------------------------- Ran 2 tests in 0.019s OK [Finished in 0.3s]
你在那里做的不是单元测试.在每种情况下,当使用请求库或烧瓶客户端时,您正在进行集成测试,因为您对端点进行实际的http调用并测试交互.
问题的标题或方法都不准确.