Python单元测试之mock使用

简介: Python单元测试之mock使用
什么是mock?比如当我们需要用一个接口时,这个接口还没有实现或者依赖第三方服务,为了保证当前功能的开发和测试,就需要使用mock模拟这些接口。

Python中使用mock对象替代掉指定的Python对象,实现控制Python对象的行为。mock模块在Python 3.3以后合并到unittest模块中了,可以直接通过导入使用。

Mock基本使用

Mock对象就是mock模块中的一个类的实例,能在整个测试套件中模拟大量的方法。创建后,就可以指定返回值并设置所需的属性,也可以断言调用了哪些方法/属性及其参数。

class Mock(spec=None, side_effect=None, return_value=DEFAULT, wraps=None, name=None, spec_set=None, **kwargs)

Mock类主要的几个参数:

  • name:命名一个mock对象,只是起到标识作用,可以通过print查看。
  • return_value: 定义mock方法的返回值,可以指定一个值(或者对象),当mock对象被调用时,返回return_value指定的值。
  • side_effect: 这个参数指向一个可调用对象,接收一个可迭代序列。可以抛出异常或者动态改变值。当传递这个参数的时候return_value 参数就会失效。
from unittest import mock
result1 = mock.Mock(name='mock名称')
print(result1)
mock_value1 = mock.Mock(return_value="返回值1")
print(mock_value1())
mock_value2 = mock.Mock(return_value="返回值2",side_effect= [1,2,3])
print(mock_value2())
print(mock_value2())
print(mock_value2())

img

img

Mock 步骤如下:

  • 导入 unittest 框架中的 mock
  • 找到要替换的对象A,可以是一个类、函数或者类实例
  • 实例化mock对象,设置mock对象的行为,比如调用的时候返回的值,被访问成员的时候返回什么值等。
  • 使用mock对象替换对象A
  • 调用并断言

mock一个未开发的接口

img

img

mock一个依赖关系的功能

实际工作中,我们也会遇到这样的场景,测试A模块,然后A模块依赖于B模块的调用,这时就可以借助mock在单元测试中分别测试正常返回和异常返回的情况。

访问baidu的功能,visit_baidu()方法依赖send_request的返回结果。

import requests


def send_request(url):
    r = requests.get(url)
    return r.status_code


def visit_baidu():
    url = 'http://www.baidu.com'
    return send_request(url)

用mock对象在单元测试中分别测试正常返回和异常返回的情况

from unittest import mock
import unittest
import demo


class TestReq(unittest.TestCase):
    def test_request_01(self):
        # 实例化mock对象,指定返回值,替换原有对象
        demo.send_request = mock.Mock(return_value='200')
        print(demo.send_request())
        self.assertEqual(demo.visit_baidu(), '200')

    def test_request_02(self):
        # 实例化mock对象,指定返回值,替换原有对象
        demo.send_request = mock.Mock(return_value='404')
        print(demo.send_request())
        self.assertEqual(demo.visit_baidu(), '404')


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

img

Mock的高级用法

mock库提供了patch函数来简化mock对象对原对象的替换,该函数会返回一个mock内部的类实例,它可以控制mock的范围,可以作为装饰器或者上下文管理器使用。

mock.patch(target,new = DEFAULT,spec = None,create = False,spec_set = None,autospec = None,new_callable = None,** kwargs )

mock装饰器使用格式

  • @patch("module名字.方法名")
  • @patch.object(类名, "方法名")

patch作为装饰器,需要把你想模拟的函数写在里面,然后在后面的单元测试案例中为它赋一个具体实例,再用return_value 来指定模拟函数返回的结果。

改造上面的单元测试:

from unittest import mock
import unittest
import demo


class TestReq(unittest.TestCase):
#在测试的参数里对该Mock对象设置一个参数
    @mock.patch("demo.send_request")
    def test_request_01(self,mock_request):
  # 指定一个返回值
        mock_request.return_value='200'
        self.assertEqual(demo.visit_baidu(), '200')

    @mock.patch("demo.send_request")
    def test_request_02(self,mock_request):
  # 指定一个返回值
        mock_request.return_value='404'
        self.assertEqual(demo.visit_baidu(), '404')


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

更多mock方法可以参考官方文档进行学习https://docs.python.org/zh-cn/dev/library/unittest.mock.html

参考:搜狗测试《控制你的数据——Python mock的基本使用》

[Python单元测试之mock使用](

目录
相关文章
|
2月前
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
|
2月前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
41 4
|
27天前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
184 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
2月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
146 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
1月前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
2月前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
41 4
|
2月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
125 3
|
2月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
79 1
|
2月前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
|
2月前
|
测试技术 开发者 UED
探索软件测试的深度:从单元测试到自动化测试
【10月更文挑战第30天】在软件开发的世界中,测试是确保产品质量和用户满意度的关键步骤。本文将深入探讨软件测试的不同层次,从基本的单元测试到复杂的自动化测试,揭示它们如何共同构建一个坚实的质量保证体系。我们将通过实际代码示例,展示如何在开发过程中实施有效的测试策略,以确保软件的稳定性和可靠性。无论你是新手还是经验丰富的开发者,这篇文章都将为你提供宝贵的见解和实用技巧。

热门文章

最新文章