1、mock测试
mock测试,就是在测试活动中,对于某些不容易构造或者不容易获取的比较复杂的数据/场景,用一个虚拟的对象(mock对象)来创建用于测试的测试方法。
2、mock测试的作用
解决不同的单元之间由于耦合而难于开发、测试的问题,mock既可用于单元测试,也可用于集成测试、系统测试过程中;
3、mock适用场景
- 构造独立的测试环境,将需要被测的单元和其依赖模块分开,不关注被测单元的依赖对象,只关注被测单元的功能逻辑;
- 被测单元依赖的功能模块尚未开发完成,而被测单元需要依赖模块的返回值进行后续处理;
- 前后端项目中,后端接口开发完成前,用于接口联调;
- 依赖的上游接口尚未完成开发,需要进行联调;
- 被测模块依赖的对象比较难模拟或者构造比较复杂;
4、mock实现的方式
搭建一个Mock Server,通过该服务提供mock接口
- 使用第三方mock平台: Moco
- 自己开发的mock服务
- 使用mock框架搭建mock服务: Python+Flask
5、关于Flask框架
Flask是一个轻量级的Python Web框架,是一个微型框架,具有灵活性和可扩展性;Flask框架可以用于构建任何类型的Web应用程序,包括单页面应用程序、企业应用程序、博客、社交媒体应用程序等等;
6、Flask框架搭建mock服务
- 安装Flask
pip3 install Flask
- 检查是否安装成功
flask --version
- 案例:模拟登录接口
接口文档描述:
from flask import Flask, request, jsonify
# 创建实例
app = Flask(__name__)
# 解决接收报文中文乱码问题
app.config['JSON_AS_ASCII'] = False
# 登录接口,指定路由和请求方法
@app.route('/newlogin/login.do', methods=['POST'], strict_slashes=False)
def login():
# 获取请求的数据
data = request.get_json()
# 用户名和密码从data中取值
username = data['username']
psw = data['psw']
"""
测试场景:
1) 用户名、密码正确(test_001/123456);
2) 用户名/密码错误;
"""
if username == 'test_001' and psw == '123456':
return jsonify(
{
"content": {
"data": {
"resultCode": 100,
"iframeRedirect": True,
"iframeRedirectUrl":
"//h5.m.taobao.com/other/loginend.html?origin=https%3A%2F%2Fmain.m.taobao.com"
},
"status": 0,
"success": True
},
"hasError": False
}
)
elif username != 'test_001' or psw != '123456':
return jsonify(
{
"content": {
"data": {
"titleMsg": "账号名或登录密码不正确",
"resultCode": 100
},
"status": 0,
"success": True
},
"hasError": False
}
)
if __name__ == "__main__":
app.run()
服务启动,运行结果如下:
* Serving Flask app 'mockServer_demo'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
基于测试用例,写mock数据
import requests
import pytest
def test_login_01():
data = {
'username': 'test_001',
'psw': '123456'
}
url = 'http://127.0.0.1:5000/newlogin/login.do'
res = requests.post(url=url, json=data)
print("=================登录接口响应===================")
print(res.text)
if __name__ == '__main__':
pytest.main(['-s', 'test_demo_01.py'])
运行结果如下:
test_demo_01.py::test_login_01
-------------------------------- live log call ---------------------------------
2023_55_09/15/23 14:55:42 (connectionpool.py:213) INFO Starting new HTTP connection (1): 127.0.0.1)
=================登录接口响应===================
{"content":{"data":{"iframeRedirect":true,"iframeRedirectUrl":"//h5.m.taobao.com/other/loginend.html?origin=https%3A%2F%2Fmain.m.taobao.com","resultCode":100},"status":0,"success":true},"hasError":false}
PASSED
============================== 1 passed in 0.07s ===============================
Process finished with exit code 0
有些时候我们会需要根据接口中参数的不同,返回不同的Mock数据,这个时候我们就需要使用根据需要的场景,修改参数,但是如果需要服务修改后,需要停止之前的服务,重启服务