Fiddler实现mock测试(模拟接口数据)接口测试-mock测试

大雄 500 2022-08-06


本文是关于mock模拟接口测试-模拟接口数据

一、mock原理

mock测试其根本任务就是能够模拟后端服务器接口数据。

其实就是提供前端页面与后端服务器之间的挡板服务,在不实际启动后端服务器的情况下,通过接口测试工具模拟请求发送到挡板(mock服务),挡板接收到请求返回提前模拟号的服务器接口数据的过程。

常见的接口测试工具都提供了mock测试的功能,如postman,具体操作参见:

二、Fiddler实现mock测试

大部分抓包工具也提供了mock测试功能,今天就重点讲一下Fiddler实现mock测试的过程。

1、案例介绍

我们以电话号码归属地查询的一个接口为例,假设现在只有接口地址和参数要求,该接口服务还未完全实现。

该接口的实际实现如下:

接口的参数:

url:https://tcc.taobao.com/cc/json/mobile_tel_segment.htmtel:18621984010

2、操作步骤

a、准备数据挡板数据

创建一个mock.txt文件,输入(根据需求设计即可,此处只取其中部分内容)作为挡板的数据,文件编码格式保持为ANSI编码或者utf-8 bom编码(UTF-8会出现中文乱码):

# __GetZoneResult_mock,与实际结果不同,主要是为了演示区别
__GetZoneResult_mock = {  
    mts:'1862198',
    province:'上海',
    catName:'中国联通',
    telString:'18621984010',
	areaVid:'29423',
	ispVid:'137815084',
	carrier:'上海联通'
}

b、打开fiddler工具

使用其中的AutoResponder功能实现mock测试。

c、参数设置

在AutoResponder中进行如下设置:

  • 勾选Enable rules

  • 勾选unmatched requests passthrough(当请求的url不能匹配的时候,可以通过挡板)

  • 点击Add rule

  • 在Edit rules中分别输入请求(上文get请求)和响应结果(mock数据文件),点击save

d、验证结果

浏览器地址栏再次输入请求(上文get请求),查看响应结果如下,就实现了对接口地址的模拟返回,这就是mock测试。

三、其他

1、其他mock数据

Fiddler中除了可以模拟返回响应正文内容,还可以模拟返回,只需要从响应内容的下拉框中选择、保存即可:

  • 一个新的页面

  • 302页面

  • 404页面

  • 502页面

  • 自定义响应

  • .......

2、注意事项

定义匹配请求值时,不建议直接给到参数部分,可以只给到路径,如果参数发生变化,也能得到mock数据,否则只能勾选unmatched requests passthrough,避免报错。

建议:https://tcc.taobao.com/cc/json/mobile_tel_segment.htm
不建议:https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=xxxxx

回到顶部

mock

回到顶部

1.mock是什么

两个系统联调,A完成B开发中,无需B开发完,也可以测试A系统,mock数据便是模拟B系统的接口,快速联调
准确的说:mock是python中一个用于支持单元测试的库,主要功能时使用mock对象代替指定的python对象,已达到模拟对象的行为
不需要关心如何实现的过程,只关注结果即可

回到顶部

2.mock环境搭建

python3.x中,集成到unittest中,直接导入

from unittest import mock
回到顶部

3.mock的优点

1.并行工作:无需等待两者都开发完,一方开发好即可测试
2.模拟无法访问的资源
3.系统具有隔离性:构造虚拟的post请求,不污染数据库中的数据
4.提高覆盖率:模拟500,400,301等不同的类型

回到顶部

4.mock的构成

回到顶部

5.mock中的方法

from unittest.mock import Mock
mock_obj = Mock() # 实例化Mock对象print(dir(mock_obj))# ['assert_any_call', 'assert_called', 'assert_called_once', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'assert_not_called', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'method_calls', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']
回到顶部

6.Mock中的构造方法

from unittest.mock import Mockprint(dir(Mock))# ['_NonCallableMock__get_return_value', '_NonCallableMock__get_side_effect', '_NonCallableMock__return_value_doc', '_NonCallableMock__set_return_value', '_NonCallableMock__set_side_effect', '__call__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattr__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_call_matcher', '_extract_mock_name', '_format_mock_call_signature', '_format_mock_failure_message', '_get_child_mock', '_mock_add_spec', '_mock_call', '_mock_check_sig', '_mock_return_value', '_mock_side_effect', 'assert_any_call', 'assert_called', 'assert_called_once', 'assert_called_once_with', 'assert_called_with', 'assert_has_calls', 'assert_not_called', 'attach_mock', 'call_args', 'call_args_list', 'call_count', 'called', 'configure_mock', 'mock_add_spec', 'mock_calls', 'reset_mock', 'return_value', 'side_effect']

1.name

name:mock对象的标识

from unittest import mock
mock_obj = Mock(name = 'xxx')print(f'name标识{mock_obj}')# name标识<Mock name='xxx' id='4445533296'>

2.return_value(用的最多)

return_value:该参数指定一个值或者对象

from unittest import mock
mock_obj1 = mock.Mock(return_value=100)print(f'return_value 指定值{mock_obj1()}')# return_value 指定值100

3.side_effect

side_effect:该参数指向一个可调用对象(一般是函数)
当mock对象被调用时,如果该参数的返回值是默认的DEFAULT,则mock对象返回return_value指定的值;
否则返回side_effect指定的对象的返回值

from unittest import mock
mock_obj2 = mock.Mock(return_value=100, side_effect=None)print(f'side_effect 默认值为None,输出return_values的值{mock_obj2()}')# side_effect 默认值为None,输出return_values的值100mock_obj3 = mock.Mock(return_value=100, side_effect=[200, 300])print(f'side_effect 指定值{mock_obj3()},return_value的值被覆盖')# side_effect 指定值200,return_value被覆盖print(f'side_effect 迭代输出指定值{mock_obj3()}')# side_effect 迭代输出指定值300

4.spec

spec:mock对象的属性值

from unittest.mock import Mockclass Foo(object):
    age = 20
    def f1(self):        return 
    def f2(self, name):        return name
mock_obj = Mock(spec=Foo)print(mock_obj.age) 
# <Mock name='mock.age' id='4541307032'>print(mock_obj.name) 
# AttributeError: Mock object has no attribute 'name' 没有name属性
回到顶部

7.mock 断言

1.assert_called_with()

assert_called_with(参数arg):检查函数调用参数是否正确

from unittest.mock import Mockclass Foo(object):
    value = 20
    def f1(self, arg):        return arg
mock_obj = Mock(spec=Foo)# f1正确的传参姿势mock_obj.f1(222)# mock_obj.f1.assert_called_with()  # 报错,没有传参# mock_obj.f1.assert_called_with(11)  # 报错,应该传222,传了11# mock_obj.f1.assert_called_with(222)  # 不报错

2.assert_called_once_with()

assert_called_once_with(参数arg):检查函数调用参数是否正确,但是只调用一次

from unittest.mock import Mock
mock = Mock()
mock()
mock.assert_called_once_with()# 不会报错mock()
mock.assert_called_once_with() 
# AssertionError: Expected 'mock' to be called once. Called 2 times.

以上就是小编为大家整理的mock模拟接口测试-模拟接口数据


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:从模拟接口到8K传输 显卡接口这些年变得太多,市面上常见的模拟接口有哪些
下一篇:设计人员和开发人员如何协作,如何与开发团队高效协作?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~