一.Mock概念

mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对上级模块的测试。
这里分为两类测试:一类是前端对接口的mock,一类是后端单元测试中涉及的mock

单纯的前端mock可以通过抓包工具Fiddler,Charles实现,通过修改代理返回的数据,实现多种场景的测试。这里在抓包工具之中会解释。

后端的Mock则是从接口的角度,如果一个接口A返回的数据需要依赖于另一个接口B,当敏捷开发中B接口还未开发完全时候这里会需要用到Mock。

在python3.0中mock模块已经被集成到unittest里面。

参考:
https://www.cnblogs.com/fnng/p/5648247.html
参考:https://docs.python.org/3/library/unittest.mock.html
参考:
http://engineroom.trackmaven.com/blog/making-a-mockery-of-python/

二.实现方式

1.借助一个mock服务平台

easymock

2.借助已有的框架

  • java ->
  • python -> unittest.mock

三.举一个栗子

定义一个Mock类

  • class Mock(spec=None,side_effect=None,return_value=DEFAULT,name=None)
  • spec:定义Mock对象的属性值,可以是一个列表,字符串,一个对象的实例
  • side_effect:可以用来抛出异常或者动态改变返回值,可以覆盖return_value
  • return_value:定义mock的返回值
  • name:作为mock对象的标识可以在print时候看到

简单的demo

这里我们需要测试的是一个Count类里面的add函数,但是这个函数还没有写出来.

  • count
'''这是一个计算类'''
class Count(object):def add(self):pass
  • test_count
'''这里要测试这个计算类'''
from unittest import mock
import unittest
from API_Mock.count import Countclass TestCount(unittest.TestCase):def test_add(self):mycount = Count()add_value = 13#这里mock了mycount类里面add函数的返回结果等于13mycount.add = mock.Mock(return_value=add_value)#这里相当于正常调用add函数result = mycount.add(8,5)#使用断言判断返回的结果是否和mock的相等self.assertEqual(result,add_value)if __name__ == '__main__':unittest.main()

输出结果:

Ran 1 test in 0.000sOKProcess finished with exit code 0

完成功能部分

  • count
'''这是一个计算类'''
class Count(object):def add(self, a, b):return a + b
  • test_count
'''这里要测试这个计算类'''
from unittest import mock
import unittest
from API_Mock.count import Countclass TestCount(unittest.TestCase):def test_add(self):mycount = Count()add_value = 13#这里使用side_effect参数覆盖了return_value的结果。mycount.add = mock.Mock(return_value=add_value , side_effect=mycount.add)#这里真正调用add方法并打印结果result = mycount.add(8,8)print(result)#检查mock方法是否获得了正确的参数mycount.add.assert_called_with(8,8)self.assertEqual(result, 16)if __name__ == '__main__':unittest.main()

解决测试依赖

上面只是针对单独的模块进行测试,假设我们测试的A模块需要B模块返回的数据作为前提,如果B模块返回的结果错误,也会导致A模块的测试失败。这里也需要mock来模拟B模块的返回。

1.原先模块
  • count
'''这是一个计算类'''
class Count(object):def add(self, a, b):return a + bdef mutiply(self,a,b):return a*bdef add_and_mutiply(self,a,b):addition = self.add(a,b)mutiple = self.mutiply(a,b)return (addition,mutiple)
  • test_count
'''这里要测试这个计算类'''
from unittest import mock
import unittest
from API_Mock.count import Countclass TestCount(unittest.TestCase):def test_add_and_mutiply(self):mycount = Count()x = 3y = 5addition,mutiple = mycount.add_and_mutiply(x,y)self.assertEqual(8,addition)self.assertEqual(15,mutiple)if __name__ == '__main__':unittest.main()
2.依赖项缺失

当依赖项缺失的时候,也就是模块B返回错误,这里依然要保证对模块A的测试是正常的。

这里给add函数返回结果+3

class Count(object):def add(self, a, b):return a + b+3

所以,会有以下报错

  • 报错
Ran 1 test in 0.000s
FAILED (failures=1)11 != 8
Expected :8
Actual   :11

测试用例运行失败,但是实际上模块A并没有任何改动,这里就需要mockB模块

  • test_count
'''这里要测试这个计算类'''
from unittest import mock
import unittest
from API_Mock.count import Count
from unittest.mock import patchclass TestCount(unittest.TestCase):def test_add_and_mutiply(self):mycount = Count()x = 3y = 5mycount.add = mock.Mock(return_value = 8)addition,mutiple = mycount.add_and_mutiply(x,y)mycount.add.assert_called_with(3,5)self.assertEqual(8,addition)self.assertEqual(15,mutiple)if __name__ == '__main__':unittest.main()

Mock测试是什么?相关推荐

  1. java的mock测试框架

    无论是敏捷开发.持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石.随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了.在敏捷开发.持续交付中要求单元测试一定要快(不能访 ...

  2. mockito mock测试框架

    1.简介 mock,[mɒk],adj. 虚拟的,模拟的. 如果你的代码对另一个类或者接口有依赖,mock测试能够帮你模拟这些依赖,从而完成测试. 使用场景: 类A有一个方法fun(B b),它依赖于 ...

  3. mock测试使用断言_使用自定义断言丰富测试代码

    mock测试使用断言 受GeeCON会议期间@tkaczanowski演讲的启发,我决定仔细研究AssertJ库的自定义断言. 在我的"骰子"游戏中,我创建了一个"机会& ...

  4. 使用junit+mockito进行mock测试实例

    刚开始做网站的时候,测试都是这样的(比如测试修改用户信息的表单逻辑):设置断点,启动运行程序,登陆,点击点击点击然后进入到测试的页面,输入测试数据,进入断点--..一个大的程序启动又慢,还要登陆,还要 ...

  5. Go单测测试 — 数据库 CRUD 的 Mock 测试

    今天继续跟着李文周大佬的博客学习Go的单元测试,最近在实践中也总结了一些如何用表格驱动的方式使用 gock Mock测试外部接口调用.以及怎么对GORM做mock测试,这些等这篇学完基础后,后面再单独 ...

  6. Spring MVC如何测试Controller(使用springmvc mock测试)

    在springmvc中一般的测试用例都是测试service层,今天我来演示下如何使用springmvc mock直接测试controller层代码. 1.什么是mock测试? mock测试就是在测试过 ...

  7. dubbo服务接口如何mock_小程聊微服务-基于dubbo的mock测试系统

    一.说在前面 基于微服务或者SOA的自动化测试系统每个公司都有自己的特有的,我今天就主要介绍一下,我们研发的一套mock测试系统. 二.目前面临的问题 1.测试人员面临的测试问题 我公司目前用的是基于 ...

  8. mock方法常用框架_什么是Mock测试?

    私底下接触到很多童鞋在问关于Mock测试的问题,今天就来一篇扫盲文. 在单元测试和接口测试过程中通常需要用到Mock测试,那么什么是Mock测试呢? mock 一词的英文翻译有模拟.虚拟的意思,所以M ...

  9. 什么是mock测试 等自己有时间好好研究一下

    from http://hi.baidu.com/sukobe/blog/item/7a67f0ed914a8b4a78f055ab.html 什么是mock测试 2008-05-31 15:09 [ ...

  10. 什么是API Mock测试?

    Mock测试就是在测试的时候,虚拟一个测试的对象,来对某些未完成或者不易获取的接口提前进行测试的方法. 要做到并不难,只需要到好合适的Mock工具,定义好接口文档就可以开始互不影响的同时开始工作,只需 ...

最新文章

  1. Windows Live Messenger 8.5 抢先试用
  2. 企业大型网络架构怎么做到零攻击?
  3. poj 1195(二维树状数组)
  4. android jni ndk 视频分享
  5. 代码 直接调节显示设备亮度_LED显示屏参数系列,亮度是什么,如何调节,如何选择...
  6. matlab 子图title的位置_matlab 画图基本介绍
  7. linux-基本开发环境搭建
  8. ubuntu 以太网已连接但是无法联网_5G物联网掀起工业自动化新高潮 连接器需求巨大...
  9. Hadoop 实现kmeans 算法
  10. [转载] python如何获取当前月份_Python-获取当前月的前x月月份日期
  11. java怎么给坦克上图片_Java坦克大战 (七) 之图片版
  12. 海量数据挖掘MMDS week6: 决策树Decision Trees
  13. mysql 10658_数据库mysql语句 - pymysql,sqlite3,MySQLdb,mysql.connector 第三方库常用sql语句...
  14. jpg照片太大怎么压缩?教你简单快速完成jpg压缩
  15. thinkpad E430拆装与升级
  16. mysql 查询 本周 上周,Mysql查询本周,上周,本月,上月数据
  17. 微信v3数据或者v4数据转wxid
  18. (2/2) sharex录制屏幕没有声音,升级高版本的 sharex
  19. matlab电学成像,利用MATLAB进行电磁学计算及可视化教学.PDF
  20. Err.number错误号和可捕获的 Microsoft access 数据库引擎和 DAO错误说明

热门文章

  1. macos如何取消开机声音
  2. 三种类型数据,轻松转换成 Excel
  3. 4.1 路由器(华硕 官改/梅林 华为 小米 路由) 使用花生壳 实现远程管理
  4. win7 任务计划功能的使用
  5. Prometheus TSDB
  6. Unity杂谈:敌人视野感知的实现
  7. 蓝桥杯单片机第十二届省赛
  8. Mybatis学习之selectKey标签用法
  9. 达梦数据库使用案例实践
  10. 阿里云网站建设云速成美站基础版、标准版和企业版功能区别及费用对比