问题描述
[根据 https://stackoverflow.com/a/46369945/1021819 ,标题应为是指集成测试而不是单元测试]
[As per https://stackoverflow.com/a/46369945/1021819, the title should refer to integration tests rather than unit tests]
假设我想测试以下Flask API(来自此处):
Suppose I'd like to test the following Flask API (from here):
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
:
Having saved this as flaskapi.py
and run it, in the same directory I run the script 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/)),而我却无法为requests
响应对象.
Both the tests pass, but for the second test (defined in the TestFlaskApi
) class I haven't yet figured out how to assert that the JSON response is as expected (namely, {'hello': 'world'}
). This is because it is an instance of flask.wrappers.Response
(which is probably essentially a Werkzeug Response object (cf. http://werkzeug.pocoo.org/docs/0.11/wrappers/)), and I haven't been able to find an equivalent of the json()
method for requests
Response object.
如何对第二个response
的JSON内容进行断言?
How can I make assertions on the JSON content of the second response
?
推荐答案
我发现我可以通过将json.loads()
应用于get_data()
方法的输出来获取JSON数据:
I've found that I can get the JSON data by applying json.loads()
to the output of the get_data()
method:
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()
两个测试均按要求通过:
Both tests pass as desired:
..
----------------------------------------------------------------------
Ran 2 tests in 0.019s
OK
[Finished in 0.3s]
这篇关于如何将集成测试(而非单元测试)应用于Flask RESTful API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!