mock的定义和使用场景
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 函数进行测试,并使用断言来验证结果是否符合预期。