mock测试是以可控的方式模拟真实的对象行为。程序员通常创造模拟对象来测试对象本身该具备的行为,很类似汽车设计者使用碰撞测试假人来模拟车辆碰撞中人的动态行为
一节课掌握接口测试中常见的Mock测试场景实战_哔哩哔哩_bilibili【python自动化测试工具、课件、笔记相关资料免费领取+微信:mashang-nn 记得备注喔(b站555)收藏等于白嫖,点赞三连才是真情!】, 视频播放量 1191、弹幕量 0、点赞数 2、投硬币枚数 0、收藏人数 3、转发人数 1, 视频作者 自动化测试码尚科技, 作者简介 领取笔记加微信:mashang-nn 备注:B站555,相关视频:b站最全Jmeter接口测试和Jmeter接口自动化测试实战全集,Postman接口测试使用教程+下载+安装及项目实战教程,全网最全接口测试教程,小白都能学会的接口测试,Postman接口测试实战从入门到精通,小白也能听懂的接口测试教程,2023B站最全RobotFramework自动化测试框架零基础入门到实战!(更新版),B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版),全网最全接口测试鉴权方式以及实战案例详解,怎么自学软件测试?自学软件测试需要多久?软件测试零基础入门到入职教程,200集!精辟简洁一学就会!深度揭秘高级测试核心内容!,App自动化测试Appium+UiAutomator2技巧,从0玩转Fiddler抓包在测试领域的四大应用实战!https://www.bilibili.com/video/BV1G84y1C7qK/?spm_id_from=333.337.search-card.all.click
之所以使用mock测试,是因为真实场景很难实现或者短期实现起来很困难。主要场景有:
通过代码制造假的输出(结果)
接口自动化测试客户端Mock
通过代码去模拟假的接口返回数据(访问真实接口的过程就可以省略)
举个栗子:要测试请求接口visit接口,实际上开发还没完成开发工作,我们先编写测试用例,数据都先准备空的,然后可以运行通过,等开发好接口以后,再把相应内容如info中的数据,实际结果等修改后运行
visit方法是在base.py模块中APICase类下
import unittest
from common.base import APICase
class TestRequest(unittest.TestCase, APICase):
def test_request(self):
"""
1.准备接口接口访问的数据
2.调用接口访问visit方法
3.断言
"""
info = {"headers": "", "json": "", "expected": ""}
# actual = self.visit(info)
actual = ""
self.assertEqual(info['expected'], actual)
mock是python的第三方库,所以使用mock前,需要先进行安装pip install mock
修改代码如下:
import unittest
from common.base import APICase
from mock import Mock
class TestRequest(unittest.TestCase, APICase):
def test_request(self):
"""
1.准备接口接口访问的数据
2.调用接口访问visit方法
3.断言
"""
info = {"headers": "", "json": "", "expected": ""}
self.visit = Mock(return_value="")
actual = self.visit(info)
# actual = ""
self.assertEqual(info['expected'], actual)
运行结果:
当接口没开发出来时,直接编写这行代码,因为调用的是mock返回的内容
actual = self.visit(info)当接口开发完成时,把这行代码注释掉即可
self.visit = Mock(return_value="")如果想设置返回的数据,也是可以的,如下
拿之前测试注册接口为例,修改代码如下:
import unittest
import requests
from mock import Mock
class TestRegister(unittest.TestCase):
def test_register_01(self):
'''步骤:
1.准备测试数据
2.发送接口请求,得到实际结果
3.预期结果和实际结果的断言
'''
# 1.准备测试数据
url = 'http://api.lemonban.com:8766/futureloan/member/register'
method = 'post'
headers = {'X-Lemonban-Media-Type': 'lemonban.v2'}
json_data = {"mobile_phone": "", "pwd": "12345678"}
expected = {
"code": 1,
"msg": "手机号为空",
"data": None,
"copyright": "Copyright 柠檬班 © 2017-2020 湖南省零檬信息技术有限公司 All Rights Reserved"
}
# 2.发送接口请求,得到实际结果
# 因为执行了Mock,所以就不会执行请求真实的接口了
requests.request = Mock(return_value=expected)
response = requests.request(method=method, url=url, headers=headers, json=json_data)
# mock返回的是expected的内容,因此是dict,所以实际结果要把之前代码上的.json去掉
actual = response
# 3.预期结果和实际结果的断言
self.assertEqual(expected, actual)
只需要修改两处代码,即可访问假的接口
加上下面这行代码
requests.request = Mock(return_value=expected)修改下面这行代码
actual = response.json() 修改为 actual = response
方法一:
开发的接口是在server,真实的服务器
我就自己冒充开发人员,写一个假的服务器,写一个假的接口,可以通过mockoon工具实现
直接去官网下载安装即可
打开mockoon,设置请求方法、URL、返回内容,点击开启服务按钮
这时候就可以请求服务接口了
方法二:
测试开发技术,自己做一个真实的服务出来,确实可以支持更多的响应,会省略很多步骤
用代码编写一个服务接口
from flask import Flask
app = Flask("py44")
@app.route('/member/register', methods=['post'])
def register():
return {"code": 11, "msg": "success"}
app.run(debug=True)
运行结果:
只有运行代码,才算开启服务
这时候就可以请求服务接口了
方法2的灵活之处就是可以支持更多响应,如设置请求体
from flask import Flask, request
app = Flask("py44")
@app.route('/member/register', methods=['post'])
def register():
username = request.form.get('username')
password = request.form.get('password')
if username == 'momo' and password == '123456':
return {"code": 11, "msg": "success"}
return {"code": 22, "msg": "failed"}
app.run(debug=True)
启动服务后,使用postman请求