mock的定义和使用场景

发布于:2025-03-13 ⋅ 阅读:(23) ⋅ 点赞:(0)

Python自动化中使用mock的示例

在Python自动化测试中,mock 用于模拟对象、函数或方法的行为,以便在隔离的环境中测试代码。以下是一个简单的示例:

假设你有一个 user.py 模块,其中包含一个 get_user_info 函数,用于从数据库获取用户信息:
# user.py
import requests

def get_user_info(user_id):
    url = f"https://example.com/api/users/{user_id}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None
现在,你要测试 get_user_info 函数,但不想在测试中真的发送网络请求到实际的数据库。这时可以使用 mock 来模拟 requests.get 函数的行为。测试代码如下:
import unittest
from unittest.mock import patch
from user import get_user_info

class TestGetUserInfo(unittest.TestCase):

    @patch('user.requests.get')
    def test_get_user_info_success(self, mock_get):
        # 模拟请求成功的情况
        mock_response = {
            'status_code': 200,
            'json': lambda: {'id': 1, 'name': 'John Doe'}
        }
        mock_get.return_value = mock_response

        result = get_user_info(1)

        self.assertEqual(result, {'id': 1, 'name': 'John Doe'})

    @patch('user.requests.get')
    def test_get_user_info_failure(self, mock_get):
        # 模拟请求失败的情况
        mock_response = {
            'status_code': 404,
            'json': lambda: {}
        }
        mock_get.return_value = mock_response

        result = get_user_info(2)

        self.assertIsNone(result)

if __name__ == '__main__':
    unittest.main()
在上述代码中,使用 @patch('user.requests.get') 装饰器来模拟 user 模块中的 requests.get 函数。在每个测试方法中,通过设置 mock_get.return_value 来模拟不同的响应情况,然后调用 get_user_info 函数进行测试,并使用断言来验证结果是否符合预期。