如何将集成测试应用于 Flask RESTful API

新手上路,请多包涵

[根据 https://stackoverflow.com/a/46369945/1021819 ,标题应该指的是集成测试而不是单元测试]

假设我想测试以下 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 Response 对象(参见 http://werkzeug.pocoo.org/docs/0.11/wrappers/ )),我还没有无法为 requests Response 对象找到 json() 方法的等价物。

如何对第二个 response 的 JSON 内容进行断言?

原文由 Kurt Peek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 537
2 个回答

我发现我可以通过将 json.loads() 应用于 --- get_data() 方法的输出来获取 JSON 数据:

 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]

原文由 Kurt Peek 发布,翻译遵循 CC BY-SA 4.0 许可协议

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 <make your assertion here>

Flask 测试文档

原文由 TheGrimmScientist 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题