千纸鹤

  博客园  ::  :: 新随笔  ::  ::  :: 管理
  5 随笔 :: 70 文章 :: 0 评论 :: 9301 阅读
《一》Mock Server是什么
(1)定义
Mock简称测试桩,挡板
(2)为什么会用到mock
想要获得不容易构造的数据,从而使用mock去写,进行创建数据
(3)测试领域应用
实例:支付宝、微信支付接口属于第三方调用,需要花钱。mock技术,可以做一个假的接口,模拟真实的返回数据,继续做后面的流程
(4)开发领域应用
前后端联调,前端页面功能写完,后端没有做好,前端使用mock模拟后端返回来端数据,前端页面进行查看效果
(5)mock实现手段
1.unittest内置的mock模块,开发可以实现相关的业务进行单元测试
2.postman里面做mock
a.创建Mock Servers
Mock Servers >>> create mock server >>>
Select collection to mock: Request URL(/Vipmock) Response Body({"httpstatus":200,"msg":"success"}) >>> Next
Configuration: Mock server name(Vipmock) >>> Create Mock Server
b.复制Mock地址
Mock Servers >>> Vipmock >>> Cope Mock URL
c.此时此刻Collections和Environments模块下有Vipmock
(1)Collections >>> Vipmock >>> {{url}}//Vipmock
(2)Environments >>> Vipmock >>> url(initial value):真实地址
d.将b步骤复制的地址代替C(1)的{{url}}
响应数据:{"httpstatus":200,"msg":"success"}
e.复制Vipmock接口,运行所有接口数据
(1)将Vipmock>Vipmock的接口复制到Vipshop项目名下
(2)Vipshop:Run collection(一起运行)
3.自动化mock用Flask
Flask属于后端开发框架,同时也是一个轻量级的web应用框架
Flask有自带的服务器,利用python+第三方库将代码写好,在内置的服务器发布和运行代码,通过自己的网址进行访问即可。框架外发需部署到linux环境上去。
测试应用
基于flask做mockserver
基于flask写接口(接口测试,没接口项目案例,使用flask写接口项目)
缺少接口案例,使用flask创建接口案例
Flask安装
安装flask第三方框架
pip install flask
显示是否安装好
pip list(pip show flask)
Flask规则
1.导包:from flask import Flask
2.创建实例: app = Flask(__name__)(固定写法)
3.创建路由 @app.route(页面路径,请求方式)
4.函数体
5.运行:app.run() 实时更新代码:app.run(debug=True)

《二》Flask框架介绍
demo01.py
# A开发 注册功能
def test_demo1():
pass

demo02.py
# B开发 登录功能
def test_demo2():
pass

demo03.py
from test014.demo01 import test_demo1
from test014.demo02 import test_demo2

def fun():
res1=test_demo1()
res2=test_demo2()
if res1 == res2:
return 1
else:
return 2

test_mock.py
'''
功能 A开发和B开发的功能均不动
mock 创建真实的返回数据
开发 A 注册
开发 B 登录
开发 C 首页(注册 登录) 需要返回值
unittest的mock 构造了返回值 给到A开发注册的功能的值,给到B开发登录的功能的值(demo03的res1和res2都有值,均返回1)
断言
'''
import unittest
from unittest import TestCase, mock
from test014 import demo03

class TestCase01(unittest.TestCase):
# 注册的功能 有值给我
# 登录的功能 有值给我
def testcase01(self):
# 创建一个返回值给注册和登录
# 把1 给到 res1=test_demo1()
# 把1 给到 res2=test_demo2()
demo03.test_demo1=mock.Mock(return_value=1)
demo03.test_demo2=mock.Mock(return_value=2)

self.assertEqual(2,demo03.fun())

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

《三》Flask框架开发接口
flask1.py
公共代码
# 开头的代码
import pytest
import requests
from pathlib import Path
from flask import Flask, request, jsonify, render_template
# 创建实例(固定写法)
app = Flask(__name__)

#(第一种~第十三种)

# 结尾的代码
# 运行
if __name__ == '__main__':
# 启动服务,debug=True(可以实时更新)
app.run(debug=True)
# 修改端口号
# app.run('127.0.0.1', 5555)
(1)基础方法实例
第一种示例
@app.route('/home')
def first_flask():
return 'hello world'
(2)请求方法实例
第二种示例:若没写请求方式,默认get(postman: http://127.0.0.1:5000/api/login 访问)
@app.route('/api/login')
def first_flask():
return 'heelo world'
第三种示例:改为post的请求方式 (postman: http://127.0.0.1:5000/api/login 访问)
@app.route('/api/login', methods=['post'])
def first_flask():
return 'heelo world'
第四种示例:改为get和post的请求方式 (postman: http://127.0.0.1:5000/api/login 访问)
@app.route('/api/login', methods=['get','post'])
def first_flask():
return 'heelo world'
(3)用户密码实例
第五种示例:函数里面传参进来,接收参数
@app.route('/api/login', methods=['get','post'])
def login():
print(request.get_json())
print(request.get_data())
第六种示例:题目:传参数 登录(判断数据)
'''
1.先要获得postman传了什么数据?data
2.拿到对应的数据 去判断
3.如果传过来的数据是admin和123456 认为登录成功 否则认为登录失败
'''
@app.route('/api/login', methods=['get','post'])
def login():
# 从postman获得所有的数据
data = request.get_json()
# 把要判断的用户名和密码拿出来进行断言
username=data['username']
password=data['password']
if username=='admin' and password=='123456':
return '用例成功'
else:
return '用例失败'
第七种示例:题目:传参数 登录(判断长度)
'''
新增需求:用户名和密码的长度不能小于2且大于18,如何实现(再来一个if)
'''
@app.route('/api/login', methods=['get','post'])
def login():
# 从postman获得所有的数据
data = request.get_json()
# 把要判断的用户名和密码拿出来进行断言
username=data['username']
password=data['password']
if (2<len(username)<18 and (2<len(password)<18)):
if username=='admin' and password=='123456':
return '用例成功'
else:
return '用例失败'
else:
return '用户名或密码不符合要求'
第八种示例:题目:传参数 登录(返回真实数据)
'''
现状:返回数据(返回的是登录成功 登录失败)
新增需求:返回真实点数据
'''
@app.route('/api/login', methods=['get','post'])
def login():
# 从postman获得所有的数据
data = request.get_json()
# 把要判断的用户名和密码拿出来进行断言
username=data['username']
password=data['password']
if (2<len(username)<18 and (2<len(password)<18)):
if username=='admin' and password=='123456':
return jsonify({ "adress": { "city": "changsha" }, "httpstatus": 200, "info": { "age": 18, "name": "admin" }, "msg": "success", "token": "23657DGYUSGD126731638712GE18271H" })
else:
return jsonify({ "code": "001", "msg": "用户名或密码错误" })
else:
return '用户名或密码不符合要求'
(4)html代码实例
第九种示例:返回来的是html代码
@app.route('/api/login', methods=['get','post'])
def home():
# 返回html的代码
return '''
请输入用户名:<input type='text' name='username'>
请输入密码:<input type='password' name='password'>
'''
第十种示例:直接返回一个html页面
'''
(1)文件夹的名字不能错,而且要跟运行文件同层级,否则会报错
'''
@app.route('/api/login', methods=['get','post'])
def home():
return render_template('index2.html')
第十一种示例:页面中显示数据
'''
(1)index3.html:页面中要拿到传过来的数据(projects)进行循环
'''
@app.route('/api/login', methods=['get','post'])
def home():
projects = ['project1', 'project2']
return render_template('index3.html', projects=projects)
第十二种示例:练习扩展(触发)
'''
1.通过在页面上点击链接,能主动触发到我的项目,触发百度启动,传文件夹的名称
2.app.root_path: 代表根目录 class4
3.这个函数要实现的事情: 拿到workspace文件中的目录文件和文件夹名称
'''
@app.route('/api/login', methods=['get','post'])
def home():
# 拿到路径
workspace = Path(app.root_path)/'workspace'
# 列表推导式(拿到文件夹名称)
projects = [projects.name for projects in workspace.iterdir()]
return render_template('index3.html', projects=projects)
第十三种示例:跳转
'''
1.拿到文件名称之后,点击文件,点击request就运行百度,点击selenium就运行京东
2.在页面上面,点击request 跳转到build这个路由里面就用pytest触发百度执行和京东执行
'''
@app.route('/build', methods=['get','post'])
def build():
project_name = request.args.get('project')
pytest.main([f'workspace/{project_name}'])
return '构建成功'

workspace
request_test
test_baidu.py
import time
from selenium import webdriver

def test_baidu():
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
time.sleep(3)
driver.quit()
selenium_test
test_jd.py
import time
from selenium import webdriver

def test_baidu():
driver = webdriver.Chrome()
driver.get('http://www.jd.com')
time.sleep(3)
driver.quit()
templates
index2.html
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Refresh" content="30">
<meta charset="utf-8">
<title>登录界面</title>
<meta name="Keywords" content="用户登录界面" >
<meta name="Description" content="只需登录的时候输入正确,你就可以放心上网,玩得更嗨。">
<link rel="stylesheet" href="css/style.css" type="text/css">
</head>

<body>
<p>显示所有界面</p>

</body>
</html>
index3.html
<!doctype html>
<html lang="en">
<head>
<meta http-equiv="Refresh" content="30">
<meta charset="utf-8">
<title>登录界面</title>
<meta name="Keywords" content="用户登录界面" >
<meta name="Description" content="只需登录的时候输入正确,你就可以放心上网,玩得更嗨。">
<link rel="stylesheet" href="css/style.css" type="text/css">
</head>

<body>
<p>显示所有界面</p>
{% for project in projects %}
项目名称:
<a href="/build?project={{project}}">{{project}}</a>
{% endfor %}

</body>
</html>

《四》HTML前端和后端接口端关联
posted on   隆江猪脚饭  阅读(224)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示