分析OpenStack中单元测试之mock & mox
来源:互联网 发布:淘宝联盟佣金是全店吗 编辑:程序博客网 时间:2024/04/29 20:40
在社区贡献OpenStackcode时,会经常短短的几行代码也要添加不少的UT,耗时耗力,mock & mox 是很好的实现隔离的单元测试模块, 理解它们能够更快的做UT的编码。
mock & mox:
都是python中用于实现单元测试的module库, 实现的是隔离, 它通过替换测试内容中的一部分(比如class, function等object). 专注在function的核心实现逻辑的测试上. 比如把db操作, I/O, 网络相关操所如socket, ssh等隔离掉, 在测试运行过程中, 当执行到它们时, 不会深入它们方法内部去执行, 而是直接返回我们假设的一个值。
mock的设计与我们知道mox实现框架不一样, mock是'action->assertion' 方式, mox是典型的'record -> replay->verify'方式, 以例子来分析
mock :
下面这个简单例子摘在mock源码包自带的使用介绍上
>>> from mock import Mock
>>> real = ProductionClass()
>>> real.method = Mock(return_value=3)
>>> real.method(3, 4, 5, key='value')
3
>>> real.method.assert_called_with(3, 4, 5, key='value')
前四行为action, 最后一行assertion,检查是否被调用, 并且可以同时检查调用的参数是否正确.
mox:
mox 的工作方式可以很清晰的在mox 发行的package中看代码,mox.py中可以得到很清晰的理解, 使用一般会经历三种模式的工作状态, 具体的测试时,有时第三种模式工作状态没有用到。
record mode: 创建一个mock对象, 设置mock对象的期望行为, 如返回的值, 传入参数及其顺序.
replay mode: 这一步开始真正的测试, 执行我们测试的方法
verify mode: 这一步开始校验我们在recode mode设置的一些行为是否被期望的执行, 执行是否正确.
关于mox创建mock object的使用是非线程安全的, 在多线程情况下调用需要使用互斥锁.
以下示例摘自mox.py, 简易清晰的讲述了mox工作流程, 3-13行为recode mode, 14-19行为replay mode, 19行之后为verify mode. 当然实际使用过程中很少这样简单, 会用到mox中提供的其他功能. 之后会讲到。
Suggested usage / workflow:
# Create Mox factory
my_mox = Mox()
# Create a mock data access object
mock_dao = my_mox.CreateMock(DAOClass)
# Set up expected behavior
mock_dao.RetrievePersonWithIdentifier('1').AndReturn(person)
mock_dao.DeletePerson(person)
# Put mocks in replay mode
my_mox.ReplayAll()
# Inject mock object and run test
controller.SetDao(mock_dao)
controller.DeletePersonById('1')
# Verify all methods were called as expected
my_mox.VerifyAll()
0 0
- 分析OpenStack中单元测试之mock & mox
- [OpenStack UT] 分析OpenStack中单元测试之mock & mox
- 单元测试之模拟Mock
- 单元测试之Mock
- 单元测试之Mock
- 单元测试之Stub和Mock
- 单元测试中mock的使用及mock神器jmockit实践
- 单元测试中mock的使用及mock神器jmockit实践
- C单元测试之Mock Test篇
- 如何在单元测试中mock系统调用
- 浅谈单元测试中Mock的使用
- 单元测试(四)单元测试之桩(stub)和模拟(mock)
- [OpenStack UT]单元测试之testscenarios
- 【OpenStack源码分析之八】openstack中虚拟机在线迁移
- java测试中单元测试中Junit、mock和代码覆盖率
- 比较完整的junit单元测试之-----mock模拟测试
- Java单元测试之模拟利器-使用PowerMock进行Mock测试
- 比较完整的junit单元测试之-----mock模拟测试
- 我们为什么要思考算法
- suse中包管理工具与zypper命令的作用
- html5 audio 语音播放在手机端使用注意(iphone,ipd,safari)
- posix线程编程
- 文档流(float)转绝对定位
- 分析OpenStack中单元测试之mock & mox
- php http与https转换
- opencv判断图片是彩色还是灰度
- ios tableView那些事 (十五)用故事模式自定义cell
- PHP 免费获取手机号码归属地
- Enum 类定义
- 使EditText有四边框的最快方法
- ios tableView那些事 (十六) UITableView中Cell重用机制导致内容重复解决方法
- 关于 RtlCaptureContext