簡體   English   中英

如何在python中對POST方法進行單元測試?

[英]How to unit test a POST method in python?

我有一個將包含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

創建本地服務器將是一個過大的殺傷力,您可以做的是使用unitest庫修補post()方法,以便它使用修補方法將數據發送到內部斷言方法,這里是鏈接https://docs.python.org /3/library/unittest.mock-examples.html 您應該查看第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

下面的完整工作示例為EDIT:

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://github.com/getsentry/responses

如果要驗證發送的JSON,則應嘗試json.loads() ,如果您傳遞的輸入不能被解碼為JSON,則會拋出ValueError。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM