python 如何在测试中使用 Mock

作者:路上有莉 时间:2022-01-08 07:41:09 

目录
  • Mock概念

  • Mock类

  • 简单的例子体验下 Mock 的功能特点

  • 一个相对正式的 Mock 例子

  • 一个完整的测试例子

  • 断言方法

Mock概念

mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对所依赖的模块的测试。

一般有两种场景:

  • 前端对后端接口的 mock,

  • 后端服务之间的测试中涉及的mock,常常发生在单元测试的时候。

前端mock可以通过一些工具来完成:

  • 使用抓包工具Fiddler,Charles 来实现,通过修改代理返回的数据,实现多种场景的测试。

  • 使用一些API管理工具来模拟,比如yapi,Easy Mock 等

  • 当然有编码能力的,也可以使用node.js,python的fastAPI来模拟

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

对于测试人员,对接口测试的时候,部分接口尚未开发完成,在约定了接口定义之后,也可以使用 Mock 来模拟。

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

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时候看到

简单的例子体验下 Mock 的功能特点


from unittest import mock
def add(num1,num2):
return num1 + num2 # pass

add = mock.Mock(return_value=200) # 创建mock对象

print( add(10,20) )

你会发现无论输入的参数是什么,输出结果都是200。等于方法被 Mock 拦截处理了。

一个相对正式的 Mock 例子

正常情况:


import requests
def request_scm():
# res = requests.get('http://www.mysx-scm.com')
res = requests.get('http://baidu.com')
return res.status_code

import unittest
from unittest import mock
class TestScmApi(unittest.TestCase):

def testUrl(self):
 # request_scm = mock.Mock(return_value=200)
 self.assertEqual(request_scm(), 200, msg='testUrl 出现错误')

if __name__ == '__main__':
unittest.main()

可以分别把两个 # 注释移到下一句试试。

一个完整的测试例子


import requests

class scmapi():
def request_scm():
 res = requests.get('http://www.mysx-scm.com')
 # res = requests.get('http://baidu.com')
 return res.status_code

def pay_alipay():
 '''
 待实现
 return 200
 '''
 return 0

import unittest
from unittest import mock

class TestScmApi(unittest.TestCase):

needmock = True
def setUpClass():
 print("setUpClass():所有方法之前执行")

def tearDownClass():
 print("tearDownClass():所有方法之后执行")

def setUp(self):
 self.scmapi = scmapi()
 print("setUp():每个方法之前执行")

def tearDown(self):
 print("teardown():每个方法之后执行")

def test_request_scm(self):
 if self.needmock:
  scmapi.request_scm = mock.Mock(return_value=200)
 self.assertEqual(scmapi.request_scm(), 200, msg='test_request_scm 出现错误')

def test_pay_alipay(self):
 if self.needmock:
  scmapi.pay_alipay = mock.Mock(return_value=200)
 self.assertEqual(scmapi.pay_alipay(), 200, msg='test_pay_alipay 出现错误')

if __name__ == '__main__':
unittest.main()

断言方法

基本的断言方法提供了测试结果是True还是False。所有的断言方法都有一个msg参数,如果指定msg参数的值,则将该信息作为失败的错误信息返回。

序号断言方法断言描述
1assertEqual(arg1, arg2, msg=None)验证arg1=arg2,不等则fail
2assertNotEqual(arg1, arg2, msg=None)验证arg1 != arg2, 相等则fail
3assertTrue(expr, msg=None)验证expr是true,如果为false,则fail
4assertFalse(expr,msg=None)验证expr是false,如果为true,则fail
5assertIs(arg1, arg2, msg=None)验证arg1、arg2是同一个对象,不是则fail
6assertIsNot(arg1, arg2, msg=None)验证arg1、arg2不是同一个对象,是则fail
7assertIsNone(expr, msg=None)验证expr是None,不是则fail
8assertIsNotNone(expr, msg=None)验证expr不是None,是则fail
9assertIn(arg1, arg2, msg=None)验证arg1是arg2的子串,不是则fail
10assertNotIn(arg1, arg2, msg=None)验证arg1不是arg2的子串,是则fail
11assertIsInstance(obj, cls, msg=None)验证obj是cls的实例,不是则fail
12assertNotIsInstance(obj, cls, msg=None)验证obj不是cls的实例,是则fail

来源:https://www.cnblogs.com/chxl-china/p/14446003.html

标签:python,测试,mock
0
投稿

猜你喜欢

  • vue实现nav导航栏的方法

    2024-05-09 15:18:22
  • SQL语句练习实例之四 找出促销活动中销售额最高的职员

    2011-11-03 16:47:03
  • 使用Python脚本生成随机IP的简单方法

    2023-12-30 06:46:28
  • python基于Node2Vec实现节点分类及其可视化示例详解

    2022-04-16 06:49:33
  • python实现汉诺塔算法

    2022-11-11 04:57:51
  • PHP垃圾回收机制超详细介绍

    2023-11-21 23:11:44
  • python 删除指定时间间隔之前的文件实例

    2023-07-19 17:58:38
  • Python使用pymysql从MySQL数据库中读出数据的方法

    2024-01-26 15:26:24
  • MySQL中数据查询语句整理大全

    2024-01-15 21:59:05
  • 深入学习JavaScript 高阶函数

    2024-04-18 09:30:05
  • Dreamweaver量身打造Wordpress留言板(二)

    2009-12-12 17:35:00
  • VS Code有哪些奇技淫巧(必知)

    2022-01-07 21:10:47
  • 番茄的js表单验证类

    2008-01-07 13:53:00
  • 从零开始学Golang的接口

    2023-10-09 02:26:03
  • Centos7下安装和配置MySQL5.7.20的详细教程

    2024-01-17 06:21:13
  • Python实现简单层次聚类算法以及可视化

    2023-09-04 00:16:21
  • WEB手绘稿常用元素 之 箭头

    2009-05-08 12:33:00
  • Python2.X/Python3.X中urllib库区别讲解

    2022-08-03 01:45:39
  • python 爬取天气网卫星图片

    2022-01-11 15:52:48
  • python实现scrapy爬虫每天定时抓取数据的示例代码

    2022-05-04 22:33:18
  • asp之家 网络编程 m.aspxhome.com