MST

星途 面试题库

面试题:Python中使用Mock技术调试RESTful API依赖

在测试一个调用外部RESTful API的Python应用时,外部API可能不稳定或尚未开发完成。请阐述如何使用Python的Mock技术(如unittest.mock库)来模拟外部API的响应,以便对本地应用进行调试和测试。提供一个具体的示例场景及实现代码。
11.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

1. 示例场景

假设我们有一个Python函数 get_user_info,它调用外部RESTful API获取用户信息。外部API地址为 https://example.com/api/user/{user_id},返回格式为JSON,包含用户姓名和年龄。现在我们要在外部API不稳定或未完成开发时,使用 unittest.mock 库模拟其响应进行测试。

2. 实现代码

import unittest
from unittest.mock import patch
import requests


def get_user_info(user_id):
    url = f"https://example.com/api/user/{user_id}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    return None


class TestGetUserInfo(unittest.TestCase):

    @patch('requests.get')
    def test_get_user_info(self, mock_get):
        mock_response = unittest.mock.Mock()
        mock_response.status_code = 200
        mock_response.json.return_value = {'name': 'John', 'age': 30}
        mock_get.return_value = mock_response

        result = get_user_info(1)
        self.assertEqual(result, {'name': 'John', 'age': 30})


if __name__ == '__main__':
    unittest.main()

在上述代码中:

  1. @patch('requests.get') 用于替换 requests.get 函数,这样在测试时不会真的发起HTTP请求。
  2. 创建 mock_response 模拟响应对象,设置其 status_codejson 方法的返回值。
  3. mock_get 的返回值设为 mock_response,这样在调用 get_user_info 时,requests.get 返回的就是我们模拟的响应。
  4. 最后断言 get_user_info 的返回结果与预期的模拟数据一致。