数据无法模拟,自动化受阻怎么办?
前言
小编在的项目组中因为对接第三方服务特别多,系统逻辑也比较复杂,很多场景难以构造,影响到了自动化测试的进度和覆盖率。在做接口自动化的时候就遇到了以下3个问题:
1. 第三方系统不稳定,返回数据不满足自动化case需求;
2. 某些依赖的接口、方法还未开发完成,但需要提前准备自动化case;
3. 有些场景不易模仿、构造代价较高(如: 访问频次限制、重要数据删除等);
解决方法调研
后来小编调研发现了unittest库中集成的mock模块。应用后发现可以有效提高组内接口自动化的测试效率和测试覆盖率。
在Python 2的时候,mock还是单独的一个库,需要用pip去安装。到了Python 3,mock模块已经被整合到了unittest中,不再需要单独安装了,在unittest中就能找到mock.py。
下面小编以两个场景为例,讲一下怎么用mock去模拟接口返回做自动化,怎样用mock思维覆盖难以构造的测试场景。
01
场景一
接口/方法还未开发完成,或者某个接口/方法依赖的第三方服务无法正常使用,这时候就没办法用传统流程提前准备自动化case,也没办法后期对这类接口进行自动化验证了。
例如,有个接口/removeData,这里为了演示先准备了一个发送请求的函数。
def sendRequest():
# 接口为伪接口,无法访问
url = "http://127.0.0.1/removeData"
return requests.get(url=url)
直接调用发送请求访问接口是会报错的,无法访问。
response = sendRequest()
print(response)
此时如果想提前准备case,就可以用到unittest.mock。
sendRequest = Mock(return_value={"code": 0, "msg": "删除成功"})
response = sendRequest()
print(response)
再次执行就有期望的返回结果了。
然后再设计自动化的case就可以了。另外unittest.mock也支持构造异常情况。
sendRequest = Mock(side_effect=AssertionError('系统错误'))
response = sendRequest()
print(response)
如上,就通过side_effect参数和AssertionError异常类构造了一个“系统异常”的场景。
02
场景二
某些功能在自动化过程中难以模拟/执行成本过高,如访问频次限制、重要数据删除等,下面以一个删除C盘目录的方法为例。
def remove_dir(self, path="c:/"):
try:
shutil.rmtree(path)
return 'success'
except IOError:
return 'error'
return 'fail'
如果每次跑自动化case都去清空C盘目录,这个代价太大了。这时候就可以通过mock,来把这个方法替代掉。
a = remove()
# 通过mock替换该方法
a.remove_dir = Mock(return_value='success')
print(a.remove_dir())
03
写在最后
mock思想对于测试来说是十分重要的,通过mock实践能够达到并行工作、模拟那些无法访问的资源、构造异常场景、提升测试覆盖率等目的。小编这里只介绍了unittest中的mock模块的入门用法,更多花式用法可以阅读官方文档,落地到项目的自动化测试中进行使用。
另外,除了本文中unittest中的mock模块,还有很多mock落地的工具、平台值得学习&结合项目使用。例如easymock、api-mocker等mock平台,Mockito、jMock等单元测试mock工具。
官方文档地址:
https://docs.python.org/3/library/unittest.mock.html
- 一段oracle中的“复杂”分组统计sql
- 通过Chocolatey软件包管理器安装.NET Core
- rsync同步时,删除目标目录比源目录多余文件的方法(--delete)
- 近期一枚“大文娱”dawenyu.com域名以小六位价格易主
- 分布式监控系统Zabbix-3.0.3-完整安装记录(0)
- URL安全的Base64编码
- 温故而知新:设计模式之原型模式(Prototype)
- Windows 7上执行Cake 报错原因是Powershell 版本问题
- 温故而知新:类索引器
- Visual Studio Code 代理设置
- 温故而知新:设计模式之工厂模式(Factory)
- 通过Jexus 部署 dotnetcore版本MusicStore 示例程序
- jquery.mobile手机网页简要
- 跟张志东深聊腾讯的“进化力”
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 站长工具关键词挖掘采集,Python关键词批量挖掘采集工具
- python百度关键词相关搜索词采集,链轮查询采集exe工具
- Python最火爬虫框架Scrapy入门与实践,豆瓣电影 Top 250 数据采集
- Python爬虫三种解析方式,Pyhton360搜索排名查询
- Python关键词百度指数采集,抓包Cookie及json数据处理
- 常用的package.json,还有这么多你不知道的骚技巧
- 【词库】Python关键词筛选分类,Levenshtein编辑距离算法分词
- 爬取数据缺失的补坑,Python数据爬取的坑坑洼洼如何铲平
- 如何开发跨框架的组件
- SpringBoot系列之异步任务@Async使用教程
- 深入k8s:k8s部署&在k8s中运行第一个程序
- Java是如何实现Future模式的?万字详解!
- Tensorflow基础入门十大操作总结
- Django个人博客,三小时带你入门Django框架
- 微信公众号文章采集工具,可采集文章文字内容信息及图片