说到接口测试,必问 mock,mock 通俗一点来说就是模拟接口返回。解决接口的依赖关系,主要是为了解耦,单元测试用的多。

什么是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

PS:我用的是pycharm运行的下面的代码,在pycharm中,没有安装上unittest(但是后来发现运行代码并不影响),直接安装了mock,在安装mock之前需要先升级pip到19以上的版本才行。

单元测试场景(依赖关系)

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

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

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

#保存为temple.py
#coding:utf- def zhifu():
'''假设这里是一个支付的功能,未开发完
支付成功返回:{"result": "success", "reason":"null"}
支付失败返回:{"result": "fail", "reason":"余额不足"}
reason 返回失败原因
'''
pass def zhifu_statues():
'''根据支付的结果 or 判断跳转到对应页面'''
result = zhifu()
print(result)
try:
if result["result"] == "success":
return "支付成功"
elif result["result"] == "fail":
print("失败原因:%s" % result["reason"])
return "支付失败"
else:
return "未知错误异常"
except:
return "Error,服务端返回异常"

以下为单元测试用例设计:

#保存为unittest_cases.py

# coding:utf-8
from unittest import mock
import unittest
import temple class Test_zhifu_statues(unittest.TestCase):
'''单元测试用例'''
def test_01(self):
'''测试支付成功场景'''
#mock一个支付成功数据
temple.zhifu = mock.Mock(return_value={"result": "success", "reason": "null"})
#根据支付结果测试页面跳转
statues = temple.zhifu_statues()
print(statues)
self.assertEqual(statues, "支付成功")
def test_02(self):
'''测试支付失败场景'''
#mock一个支付失败的数据
temple.zhifu = mock.Mock(return_value={"result": "fail", "reason": "余额不足"})
#根据支付结果测试页面跳转
statues = temple.zhifu_statues()
print(statues)
self.assertEqual(statues,'支付失败')
def test_03(self):
temple.zhifu = mock.Mock(return_value={"result": "", "reason": "未知错误"})
statues = temple.zhifu_statues()
print(statues)
self.assertEqual(statues,'未知错误异常') if __name__=="__main__":
unittest.main()

运行效果截图:

【Mock】mock基础、简单的单元测试代码练习。的更多相关文章

  1. 前端开发:mock.js的简单应用(生成随机数据,拦截 Ajax 请求)

    摘要 在前端开发过程中,后端接口还没有完全开发完成时,前端开发人员就需要学会自己模拟后端接口数据,更快更好的完成开发任务.模拟后端接口数据的js库有很多,今天就简单就简单的分享下mock.js在前端开 ...

  2. vue+vux-ui+axios+mock搭建一个简单vue框架

    1.首先感谢同事 2.之前一直在做angularjs的项目,目前vue火热,所以自己搭建了一个的vue框架,在此作为记录 vue+vux-ui这里就不介绍了,有很多博客都写的很详细了. 下面简单记录下 ...

  3. fiddler实现后端接口 mock(不需要修改开发代码)

    转载:http://blog.csdn.net/huazhongkejidaxuezpp/article/details/50435552 步骤   1.  获取 接口 定义(接口返回的json串) ...

  4. Visual Studio 2015的安装和简单的单元测试

    何为单元测试 绝大多数的软件都是由多人合作完成的,大家的工作相互有依赖关系.软件的很多错误都来源于程序员对模块功能的误解.疏忽或不了解其他模块的变化.如何能让自己负责的模块功能的定义尽量的明确,模块内 ...

  5. 基础 | batchnorm原理及代码详解

    https://blog.csdn.net/qq_25737169/article/details/79048516 https://www.cnblogs.com/bonelee/p/8528722 ...

  6. 全网最新最简单的 OpenJDK13 代码编译

    目录 开始咯 1.下载源码 2.安装编译需要的依赖 3.安装 jdk 12 4.检查配置 5.开始编译 6.验证是否成功 回顾 个人博客原文:全网最新最简单的 OpenJDK13 代码编译 最近因写文 ...

  7. 使用junit进行最简单的单元测试

    使用junit进行最简单的单元测试 使用工具: jdk IDEA Maven 第一步 创建一个Maven项目 第二步 导入junit依赖 <dependency> <groupId& ...

  8. Django基础,Day6 - 单元测试tests

    在django项目app目录下,有个tests.py,我们通常可以直接在这文件中写我们的单元测试代码. test for a model 根据前面章节的操作步骤下来,在Question Model中有 ...

  9. 在Android Studio进行“简单配置”单元测试(Android Junit)

    起因 在Android studio 刚出.本人就想弄单元测试,可惜当时Android studio不知道抽什么风(准确来说,应该是我不会弄而已).无法执行到相应的代码.后来今天突然自己又抽风.又想去 ...

随机推荐

  1. mongodb查询数据库中某个字段中的值包含某个字符串的方法

    正则表达式最能解决: 例如: db.getCollection(.*$/}) 这里主要是注意正则表达式要写对,该转义的注意转义,否则报错.

  2. Git 删除提交记录

    .Checkout git checkout --orphan latest_branch 2. Add all the files git add -A 3. Commit the changes ...

  3. 求教如何在win7 X64系统上安装.net 3.5 sp1

    其实win7系统已自带net 3.5.1了.开始菜单——控制面板——程序——打开或关闭windows功能,找到Microsoft .NET Framework 3.5.1,去掉选项,确定.然后再进入“ ...

  4. 【hadoop】 hdfs shell 命令交互

    1.put 本地文件上传至hdfs中 2. cat 查看内容 3. 删除文件,文件夹 4. ls 5. copyFromLocal 复制本地文件到HDFS , copyToLocal hdfs 复制到 ...

  5. 5、二、App Components(应用程序组件):0、概述

    二.App Components(应用程序组件) 0.概述   App Components Android's application framework lets you create rich ...

  6. 4、一、Introduction(入门):3、System Permissions(系统权限)

    3.System Permissions(系统权限)   Android is a privilege-separated operating system, in which each applic ...

  7. C# Linq删除父级的同时删除子级

    之前使用Include获取外键对象列表后,进行删除,一直报错操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null...后面还有一串.尝试了几种方式,比如将u.AlbumList=null ...

  8. VS2017 配置ImageMagick

    以下配置仅供参考,我配置完了怎样都用不了... 直接下载源码使用VS进行编译. 源码下载地址:http://imagemagick.org/script/install-source.php#wind ...

  9. distri.lua线程间通信的设计

    首先简单介绍下distri.lua中的线程设计方案. distri.lua提供一个API函数fork用于创建新的C线程,这个C线程运行独立的lua虚拟机,为了在各线程之间通信 每个线程都会创建一个ch ...

  10. mdadm命令详解

    创建阵列(-C或--create) --raid-devices(-n) 功能:指定阵列中成员盘个数. 举例:mdadm --create /dev/md0 -l5 -n2 /dev/sdb /dev ...