如何在python中对POST方法进行单元测试?

时间:2018-07-27 15:11:03

标签: python unit-testing post

我有一个将包含JSON的POST发送到Elasticsearch实例的方法。我正在尝试编写一个单元测试来验证发送的JSON的内容,但是我不确定该如何进行。我应该在python中创建本地服务器并让其验证POST或其他内容吗?我目前有这个:

class TestAnalytics(BaseTest):

    def test_post(self):
        info = {"test1": "value1", "test2": "value2"}
        resp = requests.post(config.tool_repo_urls['es_url'], data=json.dumps(info), headers={'Content-Type': 'application/json'})
        assert_equal(resp.status_code, 200)  # verify valid response code

2 个答案:

答案 0 :(得分:2)

创建本地服务器将是一个过大的杀伤力,您可以做的是使用unitest库修补post()方法,以便它使用修补方法将数据发送到内部声明方法,这里是链接{{3} }。您应该查看 27.6.2部分。贴片装饰器

示例:

class TestAnalytics(BaseTest):

    @patch('requests.post')
    def test_post(self,mock_post):
        info = {"test1": "value1", "test2": "value2"}
        resp = requests.post(config.tool_repo_urls['es_url'], data=json.dumps(info), headers={'Content-Type': 'application/json'})
        #Some checks done on mock_post object

下面的完整示例 编辑:

import json

from unittest import TestCase
from unittest.mock import patch

import requests


class TestAnalytics(TestCase):

    @patch('requests.post')
    def test_post(self, mock_post):
        info = {"test1": "value1", "test2": "value2"}
        resp = requests.post("www.someurl.com", data=json.dumps(info), headers={'Content-Type': 'application/json'})
        mock_post.assert_called_with("www.someurl.com", data=json.dumps(info), headers={'Content-Type': 'application/json'})


TestAnalytics().test_post()

方法assert_called_with检查是否使用在调用中指定的参数精确调用了修补的方法。在这种情况下,它为True

将其更改为例如

mock_post.assert_called_with("www.someurl.com", data=json.dumps(info))

会给:

AssertionError: Expected call: post('www.someurl.com', data='{"test1": "value1", "test2": "value2"}')
Actual call: post('www.someurl.com', data='{"test1": "value1", "test2": "value2"}', headers={'Content-Type': 'application/json'})

您还可以使用mock_post对象检查单个参数,请查看上面的链接以获取MagicMock可以做什么的完整说明

EDIT2

最近发现了这个用于单元测试的小库requests

https://docs.python.org/3/library/unittest.mock-examples.html

答案 1 :(得分:0)

如果您想验证发送的JSON,则应尝试json.loads(),如果您传递的输入不能被解码为JSON,则会抛出ValueError。