Python单测各种模拟的使用

Python单测各种模拟的使用

相关包

  • from unittest import mock
  • from unittest.mock import patch
  • from unittest.mock import MagicMock

模拟类方法

同《模拟函数》

模拟requests

  • requests.get = MagicMock(return_value=MagicMock(json=MagicMock(return_value={"data": "日志"})))

模拟变量

根据变量所在的包路径引入

  • with patch("path1.path2.变量名", "变量值"):
  • resp_data = self.handler.get_data("other", "scenelog 2023-05-06")
  • \# 断言返回值
  • self.assertEqual(resp_data, "")

模拟函数

可以通过装饰器模拟,多个模拟多行,参数顺序为装饰器从下到上

  • class TestTegcloudOwnScenePullHandle(object):
  • @mock.patch.object(HttpRequestHandle, "only_request")
  • @mock.patch.object(TegcloudOwnScenePullHandler, "get_dimensions")
  • def test_get_data_err(self, ins_get_dimensions, ins_only_request):
  • ins_get_dimensions.return_value = (0, [])
  • ins_only_request.return_value = (
  • 404, "接口异常"
  • )

模拟aiohttp请求

目前GET请求是可以的,但是如果想模拟POST并携带body目前还没发现可行方案(make_mocked_request 没有body等参数)

  • from aiohttp.test_utils import make_mocked_request
  • class TestViewDataHandler(unittest.TestCase):
  • def test_get_health_res(self, mock_verify_url):
  • # 构造请求参数
  • request = make_mocked_request('GET', '/health',
  • headers={'msg_signature': 'signature'})

Pytest mock相同函数

  • class TestXXXclass(unittest.TestCase):
  • def test_func(self, scene_map_db_ins):
  • scene_map_db_ins.side_effect = [[{"xx": "123", "id": 21}],
  • [{"xx": "124", "id": 20}]]

Mock 异常

  • # 调用方法并捕获异常,在with内调用方法
  • with self.assertRaises(KeyError):
  • ins = test1(a=["123"],
  • b="2023-10-12 12:00:00",
  • c="2023-10-22 13:00:00",
  • d=s,
  • e=False)

本文作者:朝圣

本文链接:www.zh-noone.cn/2023/5/Python单测各种模拟的使用

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

MRO类继承先后的异常
0 条评论