本文介绍了如何将集成测试(而非单元测试)应用于Flask RESTful API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

[根据 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-03 17:28