什么是mock

unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西。
它的主要功能是使用mock对象替代掉指定的Python对象,以达到模拟对象的行为。

学过python自动化的对unittest并不陌生,unittest其实是单元测试框架,
但对于单元测试,估计很多小伙伴都不懂,单元测试才是自动化测试的至高境界,其中mock是单元测试的脊髓所在

mock能做什么:

  • 1.前后端联调,如果你是一个前端页面开发,现在需要开发一个功能:
    下一个订单,支付页面的接口,根据支付结果,支付成功,展示支付成功页,支付失败,展示支付失败页。
    要完成此功能,你需要调用后端的接口,根据返回给你的结果,来展示不同的页面。此时后端接口还没开发好,
    作为一个前端开发总不能等别人开发好了,你再开发,那你只有加班的命了。
    为了同步开发完成任务,此时,你可以根据接口文档的规定,把接口的地址和入参传过去,然后自己mock接口的不同返回界面,来完成前端的开发任务

  • 2.单元测试,单元测试的目的是测试某个小小单元的功能,但现实中开发的函数或方法都是有依赖关系的,比如b函数的参数,需要调用a函数的返回结果,但是我前面已经测试a函数了
    这种情况下,就不需要再测一次a函数了,此时就可以用mock模块来模拟调用这部分内容,并给出返回结果

  • 3.第三方接口依赖,在做接口自动化的时候,有时候需要调用第三方的接口,但是别人公司的接口服务不受你的控制,有可能别人提供的测试环境今天服务给你开着,别人就关掉了,
    给自动化接口测试带来很多的麻烦,此时就可以自己写一个mock-server来模拟接口的返回数据

mock环境准备

1.python2.x的版本,mock是一个独立的模块,需要用pip安装

pip install -U mock

3.从Python 3.3以后的版本mock已经合并到unittest模块中了,是unittest单元测试的一部分,直接导入过来就行

from unittest import mock

依赖关系

1.如下场景:支付是一个独立的接口,由其它开发提供,根据支付的接口返回状态去显示失败,还是成功,这个是你需要实现的功能

也就是说你写一个b功能,你的同事写一个a功能,你的b功能需要根据a功能的结果去判断,然后实现对应的功能。这就是存在依赖关系,你同事开发的进度你是无法控制的
你要是等他开发完了,你再开发,那你就坐等加班吧.

2.以下是自己写的 zhifu_statues()函数功能,大概设计如下,保存为temple.py文件

  1. # 保存为temple.py
  2. # coding:utf-8
  3. def zhifu():
  4. '''假设这里是一个支付的功能,未开发完
  5. 支付成功返回:{"result": "success", "reason":"null"}
  6. 支付失败返回:{"result": "fail", "reason":"余额不足"}
  7. reason返回失败原因
  8. '''
  9. pass
  10. def zhifu_statues():
  11. '''根据支付的结果success or fail,判断跳转到对应页面'''
  12. result = zhifu()
  13. print(result)
  14. try:
  15. if result["result"] == "success":
  16. return "支付成功"
  17. elif result["result"] == "fail":
  18. print("失败原因:%s" % result["reason"])
  19. return "支付失败"
  20. else:
  21. return "未知错误异常"
  22. except:
  23. return "Error, 服务端返回异常!"

3.单元测试用例设计

  1. # coding:utf-8
  2. from unittest import mock
  3. import unittest
  4. import temple
  5. class Test_zhifu_statues(unittest.TestCase):
  6. '''单元测试用例'''
  7. def test_01(self):
  8. '''测试支付成功场景'''
  9. # mock一个支付成功的数据
  10. temple.zhifu = mock.Mock(return_value={"result": "success", "reason":"null"})
  11. # 根据支付结果测试页面跳转
  12. statues = temple.zhifu_statues()
  13. print(statues)
  14. self.assertEqual(statues, "支付成功")
  15. def test_02(self):
  16. '''测试支付失败场景'''
  17. # mock一个支付成功的数据
  18. temple.zhifu = mock.Mock(return_value={"result": "fail", "reason": "余额不足"})
  19. # 根据支付结果测试页面跳转
  20. statues = temple.zhifu_statues()
  21. self.assertEqual(statues, "支付失败")
  22. if __name__ == "__main__":
  23. unittest.main()

4.单元测试是为了保证函数的每个分支都测到,以上zhifu_statues()函数有四个分支,也就是说要写四个案例,这里我只写了2个

python文档1-unittest单元测试之mock的更多相关文章

  1. python笔记24-unittest单元测试之mock.patch

    前言 上一篇python笔记23-unittest单元测试之mock对mock已经有初步的认识, 本篇继续介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创 ...

  2. 基于 Python 官方 GitHub 构建 Python 文档

    最近在学 Python,所以总是在看 Python 的官方文档, https://docs.python.org/2/ 因为祖传基因的影响,我总是喜欢把这些文档保存到本地,不过 Python 的文档实 ...

  3. python 文档

    python 文档 https://docs.python.org/2/library/index.html

  4. 9.9 Python 文档字符串

    9.9 Python 文档字符串. 进入 Python 标准库所在的目录. 检查每个 .py 文件看是否有__doc__ 字符串, 如果有, 对其格式进行适当的整理归类. 你的程序执行完毕后, 应该会 ...

  5. 第8.19节 使用__doc__访问Python文档字符串(DocStrings )

    __doc__特殊变量用于查看类.函数.模块的帮助信息,这些帮助信息存放在文档字符串中. 一. 关于文档字符串 关于文档字符串前面很多章节提到过,DocStrings 文档字符串用于程序的文档说明,并 ...

  6. python文档2-unittest单元测试之mock.patch

    介绍mock里面另一种实现方式,patch装饰器的使用,patch() 作为函数装饰器,为您创建模拟并将其传递到装饰函数 patch简介 1.unittest.mock.patch(target,ne ...

  7. python笔记23-unittest单元测试之mock

    什么是mock unittest.mock是一个用于在Python中进行单元测试的库,Mock翻译过来就是模拟的意思,顾名思义这个库的主要功能是模拟一些东西. 它的主要功能是使用mock对象替代掉指定 ...

  8. Python文档

    详细的为代码编写文档,这其实是写好代码的重要部分. 常见编写代码的陷阱: 1.别忘了冒号.一定要记住在复合语句首行末未输入":" 2.从第一行开始.要确定顶层(无嵌套)程序代码从第 ...

  9. Python -- 文档测试

    Python内置的“文档测试”(doctest)模块可以直接提取注释中的代码并执行测试. 例子: # mydict2.py class Dict(dict): ''' Simple dict but ...

随机推荐

  1. 事件处理 及冒泡 阻止默认事件 以及tab 切换的思路

    1.axios post通过点击事件提交数据不需要使用input直接使用state2.pdd你好天天象上默认执行点击(1,2,3)也可以执行并且能切换页码3.tab 针对新闻不同时4.天天象上首页和精 ...

  2. C++基础之自增和自减运算符的重载

    1. 格式 1.1 分为前置和后置格式: int x = 0; int y = 0; // 后置自增运算符 x++; // 前置自增运算符 ++x; // 后置自减运算符 y--; // 前置自减运算 ...

  3. 【经验】 Java BigInteger类以及其在算法题中的应用

    [经验] Java BigInteger类以及其在算法题中的应用 标签(空格分隔): 经验 本来在刷九度的数学类型题,有进制转换和大数运算,故而用到了java BigInteger类,使用了之后才发现 ...

  4. 【LeetCode】500. Keyboard Row 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力解 字典 + set 日期 题目地址:https ...

  5. python学习第二天:命令行模式和python交互模式

    命令行模式 安装完python开发环境和工具之后,在Windows开始菜单选择"命令提示符",就会进入到命令行模式: 或者都可以,然后 点击enter键,弹出下图中的窗口,即命令行 ...

  6. 【嵌入式AI】全志 XR806 say hello world

      欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文介绍了全志 ...

  7. Least Angle Regression

    目录 引 一些基本的假设 LARS算法 算法 与别的方法结合 LARS与LASSO的关系 LARS 与 Stagewise 代码 Efron B, Hastie T, Johnstone I M, e ...

  8. MySQL数据库基础(3)DDL和DML

    一.使用DDL定义数据库和表结构 结构化查询语言:(Structured Query Language,SQL)是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,专用于存取数据以及查询.更新和 ...

  9. Gradle sync failed (3 s 402 ms) - Android Studio问题解决方法

    问题:Gradle同步失败 解决方法: 删除gradle-wrpper.jar中的 implementation 'com.android.support:design:30.+' 最后在Build中 ...

  10. 编写Java程序,使用抽象类和抽象方法构建不同动物的扑食行为,抽象类设计

    返回本章节 返回作业目录 需求说明: 不同的动物都有进食的行为,但是在进食前需要捕获到食物后才可以进食. 要求定义一个抽象的动物类,该类中有一个抽象的捕食方法,和一个非抽象的进食方法.在进食方法中调用 ...