首页 > 其他分享 >Mock post和get请求--实操及解释代码

Mock post和get请求--实操及解释代码

时间:2025-01-10 10:29:52浏览次数:3  
标签:get -- res Mock 实操 requests post mock

Mock post和get请求:深入理解与实践

在现代软件开发中,单元测试是确保代码质量和功能正确性的重要手段。然而,在实际开发过程中,我们经常会遇到一些难以直接测试的场景,例如依赖外部API的HTTP请求。为了解决这一问题,我们可以使用Python的unittest模块和mock库来模拟这些外部请求,从而实现对代码的全面测试。本文将详细介绍如何编写Mock post和get请求,并通过一个实际案例展示其应用。

什么是Mock?

Mock是一种用于替换真实对象或方法的技术,以便在测试环境中模拟其行为。通过Mock,我们可以控制被测代码的输入和输出,从而验证代码在不同情况下的表现。Python的unittest.mock模块提供了强大的工具来创建和管理Mock对象。

为什么需要Mock Post和Get请求?

在实际开发中,我们的代码往往需要与外部服务进行交互,例如调用REST API获取数据或提交表单。这些外部请求可能涉及网络延迟、不稳定的网络连接以及复杂的响应格式。为了提高测试的效率和可靠性,我们需要将这些外部依赖隔离开来,使用Mock技术来模拟这些请求的行为。

如何使用Mock Post和Get请求?

1. 安装必要的库

首先,确保你已经安装了requests库和unittest模块(通常Python自带)。

pip install requests

2. 编写被测函数

假设我们有一个简单的函数post_requestget_request,它们分别发送POST和GET请求并返回JSON响应。

import requests

def post_request(url, data):
    """模拟发送POST请求并返回JSON响应"""
    res = requests.post(url, data).json()
    return res

def get_request(url):
    """模拟发送GET请求并返回JSON响应"""
    res = requests.get(url).json()
    return res

3. 编写测试用例

接下来,我们使用unittestmock来编写测试用例。我们将使用@mock.patch装饰器来模拟requests.postrequests.get方法。

import unittest
from unittest import mock
import requests

class TestRequests(unittest.TestCase):
    def setUp(self):
        print('开始测试')

    @mock.patch('requests.post')  # 使用patch装饰器来mock requests.post方法
    def test_login(self, mock_post):
        """测试登录功能"""
        url = 'http://www.baidu.com/login'
        data = {
            'username': 'admin',
            'password': '123456'
        }
        # 设置mock对象的返回值
        mock_post.return_value.json.return_value = {'status': 200, 'msg': '登录成功'}

        # 调用被测试函数
        res = post_request(url, data)

        # 断言返回值是否符合预期
        self.assertEqual(res['status'], 200)
        self.assertEqual(res['msg'], '登录成功')

    @mock.patch('requests.get')
    def test_get_user_info(self, mock_get):
        """测试获取用户信息功能"""
        url = 'http://www.baidu.com/user_info'
        # 设置mock对象的返回值
        mock_get.return_value.json.return_value = {'status': 200, 'msg': '获取用户信息成功'}
        res = get_request(url)
        self.assertEqual(res['status'], 200)
        self.assertEqual(res['msg'], '获取用户信息成功')

    def tearDown(self):
        print('结束测试')

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

4. 解释测试用例

  • setUp方法:在每个测试方法执行前被调用,这里用于打印开始测试的信息。
  • @mock.patch装饰器:用于模拟requests.postrequests.get方法。这个装饰器会将requests.postrequests.get替换为一个Mock对象,并将其作为参数mock_postmock_get传入测试方法。
  • test_login方法:定义了一个测试方法test_login,用于测试登录功能。
    • 设置URL和数据:定义了测试中要使用的URL和数据。
    • 设置Mock对象的返回值:当调用mock_post时,设置其返回值为一个包含状态码和消息的JSON对象。
    • 调用被测试函数:调用post_request函数,实际上会使用模拟的requests.post方法。
    • 断言返回值:使用assertEqual方法断言返回的状态码和消息是否符合预期。
  • test_get_user_info方法:定义了一个测试方法test_get_user_info,用于测试获取用户信息功能。
    • 设置URL:定义了测试中要使用的URL。
    • 设置Mock对象的返回值:当调用mock_get时,设置其返回值为一个包含状态码和消息的JSON对象。
    • 调用被测试函数:调用get_request函数,实际上会使用模拟的requests.get方法。
    • 断言返回值:使用assertEqual方法断言返回的状态码和消息是否符合预期。
  • tearDown方法:在每个测试方法执行后被调用,这里用于打印结束测试的信息。
  • 主程序入口:如果这个脚本作为主程序运行,则调用unittest.main()来执行测试用例。

总结

通过使用unittestmock模块,我们可以有效地模拟外部HTTP请求,从而实现对代码的全面测试。这不仅提高了测试的效率和可靠性,还使得测试更加独立于外部环境,便于持续集成和持续部署。希望本文能够帮助你更好地理解和应用Mock技术,提升你的单元测试水平。

标签:get,--,res,Mock,实操,requests,post,mock
From: https://blog.csdn.net/python_jeff/article/details/145050497

相关文章

  • deepin-Wine 运行器合并打包器和添加从镜像提取 DLL 的功能
    Wine运行器是一个图形化工具,旨在简化Wine环境的管理和使用。它不仅提供了运行和管理Wine容器的功能,还增加了打包器和从镜像提取DLL的功能。以下是该工具的详细介绍和使用方法。一、工具概述Wine运行器是一个使用Python3的tkinter构建的图形化工具,旨在提供一个......
  • 【游戏设计原理】57 - 协同效应
    协同效应(Synery)原文介绍了协同效应,并举了游戏中的三个例子,游戏玩家创造性的组合,游戏机制的组合,锻造系统。当然游戏中的协同效应还有许多体现方式,以下是一些具体例子:1.角色技能组合在多人角色扮演游戏(RPG)中,不同角色的技能组合可能会产生更强的效果。例如,在《魔兽世界......
  • php反序列化
    一、序列化和反序列化1.什么是序列化和反序列化序列化(Serialization):把对象转换为字符串进行存储的过程反序列化(DeSerialization):把存储的字符串恢复为对象的过程2.应用场景:当对象需要被网络传输时当对象状态需要被持久化时3.序列化函数和反序列化函数:①序列化:seria......
  • 杜牧和李商隐,他们怎么了?
    在唐代诗坛,但凡是齐名的诗人,关系基本都是不错的。“李杜”的李白杜甫,虽然很多时候杜甫只能是李白的小迷弟,但是两人的关系其实不错,甚至还一度共同结伴旅游,有过美好的时光;“刘柳”的刘禹锡柳宗元,那是可以有难同当的兄弟;“元白”的元稹白居易更不用说了,互酬诗多了去,几天不见......
  • 牛李党争夹缝中的李商隐
    李商隐是晚唐最出色的诗人之一,杜牧与他齐名,二人并称为“小李杜”,李商隐又与李贺、李白合称“三李”。在清代孙洙编选的《唐诗三百首》中,收入李商隐的诗作32首,数量仅次于杜甫(38首),位居第二,其次为王维(29首)、李白第四(27首)。李商隐诗作的影响力可见一斑。李商隐流传最广的诗句......
  • 第一届solar杯·应急响应挑战赛 部分WP
    ‍官方题解:mp.weixin.qq.com/s/kMvwfBJgd7ugaWzm5U-5Ww笔者:Agony签到题题目:本题作为签到题,请给出邮服发件顺序。Received:frommail.da4s8gag.com([140.143.207.229])bynewxmmxszc6-1.qq.com(NewMX)withSMTPid6010A8ADfor;Thu,17Oct202411:24:01+......
  • 一些常用命令
    Java走socks5和http代理Java走Socks5代理java-DsocksProxyHost=127.0.0.1-DsocksProxyPort=1111-jarJava走http/https代理java-Dhttp.proxyHost=127.0.0.1-Dhttp.proxyPort=8080-jarjava-Dhttps.proxyHost=127.0.0.1-Dhttps.proxyPort=8080-jarKali代理配置proxyc......
  • langfuse从v2升级到v3(异机升级)
    环境:OS:Centos7说明:v3部署在新机器,我们需要将v2下的postgresql外挂的数据目录文件拷贝到v3下的外挂数据目录1.停掉v2版本停掉v2的目的是postgresql没有事务写入,可以直接拷贝数据目录到v3版本使用[root@localhostlangfuse]#pwd/home/middle/langfuse/langfuse[root@localho......
  • ABP项目添加第三方API客户端代理
    第三方API客户端代理启动模板中包含HttpApi.Client​项目,这个项目是应用程序自己的客户端代理,用于提供给其他应用访问。例如BlazorWebAssembly使用HttpApi.Client​项目生成的API客户端代理访问应用程序的服务。本文介绍在应用程序中如何访问其他应用的API。‍远程应用服务接......
  • JS-25 字符串方法_indexOF()
    indexOf方法用于确定一个字符串再另一个字符串中第一次出现的位置,返回结果是匹配开始的位置。如果返回-1,就表示不匹配'helloworld'.indexOf('o')//4'helloworld'.indexOf('a')//4-1'床前明月光,疑是地上霜。一去二三里,举头望明月,低头思故乡。'.indexOf("一去二三里")//12 i......