当前位置:  开发笔记 > 编程语言 > 正文

如何将集成测试(而不是单元测试)应用于Flask RESTful API

如何解决《如何将集成测试(而不是单元测试)应用于FlaskRESTfulAPI》经验,为你挑选了3个好方法。

[根据/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



1> TheGrimmScie..:

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测试文档


(作为答案帮助其他人登陆这里看到一个更清晰的方式来编写这些测试)
清洁和consice.

2> Kurt Peek..:

我发现我可以通过应用于方法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]



3> 小智..:

你在那里做的不是单元测试.在每种情况下,当使用请求库或烧瓶客户端时,您正在进行集成测试,因为您对端点进行实际的http调用并测试交互.

问题的标题或方法都不准确.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有