接口自动化Requests+Pytest基础实现

目录

  • 1. 数据库以及数据库操作
    • 1.1 概念
    • 1.2 分类
    • 1.3 作用
  • 2 python操作数据库的相关实现
    • 2.1 背景
    • 2.2 相关实现
  • 3. pymysql基础
    • 3.1 整个流程
    • 3.2 案例
    • 3.3 Pymysql工具类封装
  • 4 事务
    • 4.1 案例
    • 4.2 事务概念
    • 4.3 事务特征
  • 5. requests库
    • 5.1 概念
    • 5.2 角色定位
    • 5.3 安装
    • 5.4 校验
    • 5.5 requests之GET请求
    • 5.6 requests之POST请求
    • 5.7 requests之PUT请求
    • 5.8 requests之DELETE请求
    • 5.9 补充
    • 5.10 响应
    • 5.11 登录案例
      • 5.11.1实现思路
      • 5.11.2 实现
  • 6. PyTest基础
    • 6.1 pytest的配置文件
    • 6.2 setup和teardown
    • 6.3 实现
    • 6.4 数据参数化
    • 6.5 测试报告插件
    • 6.6 集成思路
  • 7. 接口自动化实现
    • 7.1 自动化流程
    • 7.2 设计接口测试用例
    • 7.3 框架架构的图解
    • 7.4 项目架构目录
    • 7.5 项目框架的实现
  • 8 总结

1. 数据库以及数据库操作

1.1 概念

是存储数据的仓库,程序中数据的载体

1.2 分类

  • 关系型数据库:安全
    • 例如:MySQL、Oracle、SQLite
    • database
      • tables
        • 行+列
  • 非关系型数据库:高效
    • 例如:Redis、MongODB
    • 数据存储的多样性:键值对、列表、字符串…

1.3 作用

数据库和变量都可以存储数据,二者的区别是

持久性不同:数据库可以持久性能够存储数据(数据被写入磁盘中),变量不能(运行在内存中)

2 python操作数据库的相关实现

2.1 背景

python(等不同语言)本身不具备直连数据库的功能,必须导入第三方包

2.2 相关实现

数据库驱动

  • MySQLdb
  • MySQLClientt
  • (重点)Pymysql

3. pymysql基础

3.1 整个流程

  1. 创建连接connection
  2. 获取游标cursor
  3. 执行SQL语句
    1. 执行查询语句
    2. 执行增删改语句
      1. 判断是否出现异常
        • 否(没有出现异常)–>提交事务
        • 是(出现异常)–>回滚事务
  4. 关闭游标cursor
  5. 关闭连接connection
#  连接pymysql# 1. 导包
import pymysql# 2. 创建游标
con = pymysql.connect(host='127.0.0.1', port=3306, database='test', user='root', password='123456', charset='utf8')
# 3. 创建链接
cur = con.cursor()
# 4. 执行sql
# 编写sql
# sql = "select * from t_area"
sql = "insert into t_area(area_name, priority) values('西安', '1')"
# 执行SQL
cur.execute(sql)
# 逐行获取数据
# result = cur.fetchone()
# print(result)
# 获取素有数据
result = cur.fetchall()
for row in result:print(row[3])
# 影响的行数
print("影响行数:", cur.rowcount)
# 提交事务
con.commit()
# 5. 释放资源
cur.close()
con.close()

注意:

  • 增删改执行完毕后,需要执行提交操作,否则执行失败
  • 提交方式:
    • 手动提交:连接对象.commit()
    • 自动提交:autocommit = True (默认提交)

3.2 案例

# 1. 创建连接connection
# 2. 获取游标cursor
# 3. 执行SQL语句
#    1. 执行查询语句
#    2. 执行增删改语句
#       1. 判断是否出现异常
#          - 否(没有出现异常)-->提交事务
#          - 是(出现异常)-->回滚事务
# 4. 关闭游标cursor
# 5. 关闭连接connection
import pymysqlcon = pymysql.connect(host='127.0.0.1', port=3306, database='test', user='root', passwd='123456', charset='utf8')
cur = con.cursor()
try:sql = "select * from t_area"cur.execute(sql)result = cur.fetchall()for row in result:print(row)# 在添加和修改的时候需要提交事务# con.commit()except Exception as e:# 回滚事务cur.rollback()cur.close()con.close()

3.3 Pymysql工具类封装

import pymysqlclass DBUtil:# 获取连接@classmethoddef get_connect(cls):# 创建连接return pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd=123456, charset='utf8')# 获取游标@classmethoddef get_cursor(cls, con):# 创建连接return con.cursor()# 释放资源@classmethoddef close(cls, cur, con):if cur:cur.close()if con:con.close()

案例

# 获取连接
from demo.utils.DBUtil import DBUtilcon = DBUtil.get_connect()
# 创建游标
cur = DBUtil.get_cursor(con)
# 编写和执行sql
sql = "select * from t_aera"
# 执行sql
result = cur.execute(sql)
# 查看结果
for row in result:print(row[3])
# 关闭资源
DBUtil.close(con, cur)

在这里插入图片描述

4 事务

4.1 案例

银行转账:

  1. 假如用户A给用户B转账300,用户A-300,用户B+300;转账成功(提交事务:commit)
  2. 假如用户A转账300,而用户B没有增加300,转账失败,这个事务不予提交,回滚事务(rollback)

4.2 事务概念

事务:是一套完整的业务逻辑,在业务逻辑中,困难包含多条sql语句,在这些sql执行的时候,要么都成功,要么都失败

4.3 事务特征

  1. 原子性:事务中的操作被看作一个单元,要么都成功,要么都失败
  2. 一致性:逻辑单中的每个操作不应该一部分操作一部分失败
  3. 隔离性:事务的中间状态对其他事务时不可见的(每个事务之间时互不影响的)
  4. 持久性:事务提交成功后,它会永久性保存在数据库中

5. requests库

5.1 概念

requests库是使用python编写的,可以调用该库的函数直接向服务器发送请求,并接收响应

5.2 角色定位

类似于Jmeter中http请求

5.3 安装

pip install requests

5.4 校验

在命令行输入pip list命令查找requests的名称和对应的版本号

5.5 requests之GET请求

import requests as requests# 请求
response = requests.get("https://api-v2.xdclass.net/api/rank/v1/hot_product")print("状态码:", response.status_code)
print("响应体:", response.text)

在这里插入图片描述

5.6 requests之POST请求

import requests as requestsdata = {"page": 1, "size": 4}
response = requests.post("https://api-v2.xdclass.net/api/play_record/v1/page", data=data)print("状态码:", response.status_code)
print("响应体:", response.text)

在这里插入图片描述

5.7 requests之PUT请求

import requests as requests# 请求
myJson = {"areaId": 55,"areaName": "上海","priority": "111"
}response = requests.put("http://localhost:8080/sa/modifyarea", json=myJson)print("状态码:", response.status_code)
print("响应体:", response.text)

5.8 requests之DELETE请求

import requests as requests# 请求
response = requests.delete("http://localhost:8080/sa/removearea", params={"areaId": "40"})print("状态码:", response.status_code)
print("响应体:", response.text)

5.9 补充

  • 四种操作代码结构基本一致
    • 导包
    • 操作
    • 获取响应
  • 区别
    1. 函数名不同(对应的请求方式也不同)
    2. 提交数据的参数名不同
      • get和delete使用params提交数据
      • post和put使用
        • data提交键值对数据
        • json提交JSON格式数据
  • 为什么get/delete和post/put提交数据使用的参数不一致?
    • get/delete请求格式在请求行,使用params
    • post/put请求格式在请求体,使用data/json

5.10 响应

import requestsresponse = requests.get("https://www.baidu.com")
# 响应行
print("url", response.url)
print("状态码", response.status_code)
print("-"*100)# 响应头
print("获取所有响应体头", response.headers)
print("获取所有cookie", response.cookies)
print("获取所有编码集", response.encoding)
print("-"*100)# 响应体
print("以文本的方式获取响应体", response.text)
# print("以二进制的方式获取响应体", response.content)
# print("以JSON的方式获取响应体", response.json())
print("-"*100)

在这里插入图片描述

5.11 登录案例

5.11.1实现思路

  1. 需求案例:先登录,登陆成成功后获取“订单页面”

    • login接口(post)–键值对提交数据(username和password)
    • order_list接口(get)
  2. cookie:

    • 例如:使用jmeter请求百度搜索接口时,会经常跳转到安全认证页面,原因是没有cookie,服务器识别不了身份,不认识
    • 解决方式:从浏览器中拿到一个BAIDUID,并使用cookie管理器组件进行管理
    • 存在的问题:获取cookie后,后面每一个接口实现都需要提交cookie,过程高度重复,requests库内置了相关实现的封装,封装了对cookie 的处理
    # 核心知识点:关联
    # 获取登录接口响应的 cookie,提取出来作为查询订单接口要提交的参数
    import requests
    # 访问接口1:访问登录接口
    response1 = requests.post("login接囗", data={"username": “xxx", "password":"yyy"})
    # 获取 cookie,再获取 cookie 中的 xXID 形式类似于{“xxID":“zzz"}
    id= response1.cookies.get("xxID")
    # 访问接口2:订单查询接口
    requests.get("查询订单接口",cookies={“xxID":id})
    
  3. Session:

    • 注意点: requests中的session是对 cookie的封装,并不是服务器端的 session,两者无关,只是重名
    import requests
    # 获取 session 对象
    mySession =requests.session()
    # 请求1:使用 session 登录
    #requests.post(...)
    response1 = mysession.post("1ogin接囗",data={"username":"xxx","password": "yyy"})
    # 请求2:使用 session 获取订单
    response2 = mysession.get("查询订单接口")
    

5.11.2 实现

  1. 需求:使用 requests库调用 tpshop登录功能的相关接口,完成登录操作,登录成功后获取“我的订单"页面(访问订单列表接口)

    相关接口:1.获取验证码:http://localhost/index.php?m=Home&c=User&a=verify GET(此接口返回验证码 和 cookie)
    2.登录:http://localhost/index.php?m=Home&c=User&a=do_login POST参数: {"username":"xxxxx","password":"yyyy","verify_code":"zzzz"},非 JSON 提交
    3.我的订单:http://localhost/Home/Order/order_list.html GET
    
  2. Cookie实现

import requests
# 请求
cookieId_response = requests.get("http://192.168.157.130/index.php?m=Home&c=User&a=verify")
print("状态码:", cookieId_response.status_code)
print("Cookie对象", cookieId_response.cookies)
# 获取cookies,PHPSESSID
id = cookieId_response.cookies.get("PHPSESSID")
print("Cookie=", id)
print("-"*100)
# 请求登录接口
data = {"username": "13012345678","password": "123456","verify_code": "8888"
}
# 获取cookie的ID的值
cookie = {"PHPSESSID": id}# 登录接口
res_login = requests.post("http://192.168.157.130/index.php?m=Home&c=User&a=do_login", data=data, cookies=cookie)
print("登录状态码:", res_login.status_code)
print("登录响应体:", res_login.text)
print("-"*100)
# 订单接口
order_login = requests.get("http://192.168.157.130/Home/Order/order_list.html", cookies=cookie)
print("订单状态码:", order_login.status_code)
print("订单响应体:", order_login.text)

在这里插入图片描述

  1. Session实现
import requests
# 创建session对象
sesion = requests.session()
print("-"*100)
# 请求登录接口
data = {"username": "13012345678","password": "123456","verify_code": "8888"
}# 登录接口
res_login = sesion.post("http://192.168.157.130/index.php?m=Home&c=User&a=do_login", data=data)
print("登录状态码:", res_login.status_code)
print("登录响应体:", res_login.text)
print("-"*100)
# 订单接口
order_login = sesion.get("http://192.168.157.130/Home/Order/order_list.html")
print("订单状态码:", order_login.status_code)
print("订单响应体:", order_login.text)

在这里插入图片描述

6. PyTest基础

pytest是python第三方的单元测试框架

6.1 pytest的配置文件

概述:

  • 不用配置文件的方式:
    1. pytest会找到项目下的test_xxx开头的py文件
    2. 以及该文件群下的Test开头的类
    3. 以及类下面test开头的函数
    4. 符合要求的测试函数都会被执行
  • 使用配置文件:可以通过配置来选择执行那些目录下的模块【更灵活】
    1. 项目下新建一个script模块
    2. 将测试脚本放在sccript目录中
    3. pytest的配置文件放在自动化项目目录下
    4. 配置文件名称为pytest.ini
    5. pytest.ini第一行的内容为【pytest】,后面逐行写具体的配置参数
    6. 美丽运行时会使用该配置文件中的配置

6.2 setup和teardown

概念

运行于测试方法的始末, 运行一次测试函数会执行一次 setup 和 teardown

有多少个测试函数就会运行多少次的 setup 和 teardown方法

代码

test_xxx.py

class TestLogin:# 函数级初始化方法def setup(self):print("---setup---")# 函数级结束def teardown(self):print("---teardown---")def test_a(self):print("test_a")assert 1    # 断言成功def test_b(self):print("test_b")assert 0    # 断言失败

结果

test_setup和teardown[39].py ---setup---	# 第1次运行 setup
test_a
.---teardown---	# 第1次运行 teardown
---setup---	# 第2次运行 setup
test_b
F---teardown---	# 第2次运行 teardown

应用场景

使用配置文件, 可以通过配置项来选择执行哪些目录下的哪些测试模块

使用方式

  1. 项目下新建一个 scripts 模块
  2. 将测试脚本放到 scripts 中
  3. pytest 的配置文件放在自动化项目目录下
  4. 配置文件名称为 pytest.ini
  5. pytest.ini 第一行的内容为 [pytest] , 后面逐行写具体的配置参数
  6. 命令行运行时会使用该配置文件中的配置

6.3 实现

示例

[pytest]
addopts = -s
testpaths = ./scripts
python_files = test_*.py
python_classes = Test*
python_functions = test_*

你写的时候可以直接拿来复制粘贴

参数解释:

addopts = -s 表示命令行参数

testpaths, python_files, python_classes, python_functions

表示执行哪一个包下面的哪些.py结尾的文件, 以及哪些前缀开头的类, 以及哪些前缀开头的测试函数

注意点

  1. 怎么确认配置文件被加载?
    • 通过控制台的 inifile 进行查看
  2. windows 可能出现 “gbk” 错误
    • 删除 ini 文件中的所有中文
  3. 在工作中这个文件也需要复制粘贴?
    • 是的, 一个项目只会用一个pytest.ini 文件, 只需要理解, 会修改就可以了

6.4 数据参数化

方法

@pytest.mark.parametrize("参数名", 参数值)参数对应的值: 类型必须为可迭代的类型, 一般使用 list

示例

    import pytestclass TestLogin:@pytest.mark.parametrize("params", [{"username": "zhangsan", "password": "111"}, {"username": "lisi", "password": "222"}])def test_a(self, params):print(params)print(params["username"])print(params["password"])

结果

test_login[43].py {'username': 'zhangsan', 'password': '111'}
zhangsan
111
.{'username': 'lisi', 'password': '222'}
lisi
222
.

参数化后, 有几组参数, 测试函数就会执行几次

6.5 测试报告插件

安装

# [推荐安装1.21.1的版本]命令行输入
pip install pytest-html==1.21.1

校验方式 pip list

使用

在配置文件中的命令行参数增加 --html=用户路径/xxx.html

6.6 集成思路

伪代码

在 scripts 包下的文件 test_xxx.py

# 测试类
class TestDemo:# 初始化函数def setup(self):self.session = requests.Session()# 资源销毁函数def teardown(self):self.session.close()# 测试函数1: 登录def test_login(self):写登录相关代码# 测试函数2: 我的订单def test_order(self):# 1.登录# 2.获取订单...如, # 3.断言

存在的问题

  • 参数化: 没有使用参数化动态导入数据
  • 封装: 测试函数中和请求业务相关的实现高度重复

在这里插入图片描述

7. 接口自动化实现

7.1 自动化流程

  1. 需求分析
  2. 挑选出需要做自动化测试的功能接口(编写测试计划)
  3. 设计测试用例
  4. 搭建测试环境(可选)
  5. 执行测试用例(执行前需要编写代码)
  6. 生成测试报告并分析结果

7.2 设计接口测试用例

  1. 功能描述
  2. url和请求方式
  3. 需要提交的数据
  4. 状态码和响应体

7.3 框架架构的图解

在这里插入图片描述

7.4 项目架构目录

  • api------>封装请求
  • scripts------>编写测试脚本
  • data------>存放测试数据
  • untils------>存放工具类
  • report------>测试报告
  • app.py------>存放常量
  • pytest.ini------>pytest配置文件

7.5 项目框架的实现

  1. 创建项目
  2. 创建pytest.ini(pytest的配置文件)
[pytest]
addopts = -s --html=report/report.html   # 将测试报告放入到report/report.htm的文件
testpath = ./scripts	# 放入测试脚本
python_files = test_*.py	# 以test_开头的脚本进行读取
python_classes = Test*	# 将Test开头的类文件读取
python_function = test_*	# 将test_开头的方法读取3. 
  1. 创建app.py(放入重复性常量)
BASE_URL = "127.0.0.1:8080"		# 基础地址:IP:端口号
AREA_URL = "/sa"	# 接口地址
  1. script(创建脚本目录)

创建test_area.py文件

import requestsfrom api.AreaAPI import AreaAPI
from api.AreaDBAPI import AreaDBAPIclass TestArea:def setup(self):self.session = requests.Session()self.area_api = AreaAPI(self.session)def teardown(self):self.session.close()# 测试查询列表接口def test_list_area(self):response = self.area_api.area_list_url()print("状态码 = ", response.status_code)print("响应体 = ", response.text)# 测试新增接口def test_add_area(self):data = {"areaName": "12","priority": "321"}response = self.area_api.add_area(data=data)print("状态码 = ", response.status_code)print("响应体 = ", response.text)# 测试修改接口def test_update_area(self):id = AreaDBAPI.select_id_by_name("12")json = {"areaId": id,"areaName": "123"}response = self.area_api.update_area(json=json)print("状态码 = ", response.status_code)print("响应体 = ", response.text)# 测试删除接口def test_remove_area(self):id = AreaDBAPI.select_id_by_name("123   ")# 需要删除的变量params = {"areaId": id}# 响应结果response = self.area_api.removeArea_url(params=params)print("状态码 = ", response.status_code)print("响应体 = ", response.text)
  1. 创建api目录(放入请求地址)

创建AreaAPI.py

from app import BASE_URL, AREA_URLclass AreaAPI:def __init__(self, session):self.session = sessionself.area_list_url = BASE_URL + AREA_URL + "/listarea"self.addArea_url = BASE_URL + AREA_URL + "/addArea"self.updateArea_url = BASE_URL + AREA_URL + "/updateArea"self.removeArea_url = BASE_URL + AREA_URL + "/removeArea"# 1查询areadef area_list(self):response = self.session.get(self.area_list_url)return response# 2新增areadef add_area(self, data):response = self.session.post(self.addArea_url,  data=data)return response# 3修改areadef update_area(self, json):response = self.session.put(self.updateArea_url, json=json)return response# 4删除areadef remove_area(self, params):response = self.session.delete(self.removeArea_url, params=params)return response

创建AreaDBAPI.py文件【用于数据库查询】

from utils.DBUtils import DBUtilsclass AreaDBAPI:@classmethoddef select_id_by_name(cls, area_name):# 获取连接con = DBUtils.get_connect()# 获取游标cur = DBUtils.get_cursor(con)# 编写sqlsql = "select area_id from area where area_name = `%s`" % (area_name)# 执行sqlcur.execute(sql)# 获取所有数据row = cur.fechall()# 释放资源DBUtils.close_res(con, cur)# 返回第一行第一列return row[0][0]
  1. 创建工具类目录(utils)

创建DBUtils.py

import pymysqlclass DBUtils:@classmethoddef get_connect(cls):# 获取连接return pymysql.Connect(host="127.0.0.1", user="root", password="123456", database="test", port=3306, charset="utf8")@classmethoddef get_cursor(cls, con):# 获取游标return con.cursor()@classmethoddef close_res(cls, con, cursor):# 释放资源if cursor:cursor.close()if con:con.close()

结果截图

在这里插入图片描述

8 总结

总结接口自动化各个目录之间的互相调用

以脚本为基础【test_area.py】

  1. 测试脚本[scripts]会调用api目录里面的文件
  2. api里面的文件会含有一些常量,它会调用app.py里面的数据
  3. 在进行修改或者删除数据的时候,一般会调用ID来进行修改或者删除,这时候test_area.py文件会先调用api里面的AreaDBAPI.py进行查询数据,在AreaDBAPI.py文件会调用DBUtils.py文件,先进行连接数据库,然后才根据sql查询数据,最后才会获得响应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/24955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“中新美”三重身份,能帮SHEIN解决上市问题吗?

一家公司的海外上市之路能有多复杂?辗转多地的SHEIN,可能是当前最有话语权回答这个问题的公司。最近,它又有了新消息。 在上市信息多次更改后,伦敦正在成为SHEIN最有可能的“着陆”点。巴伦周刊援引英国天空新闻报道称&#xff0…

Python01 -分解整包数据到各个变量操作和生成器

Python 的星号表达式可以用来解决这个问题。比如,你在学习一门课程,在学期末的时候,你想统计下家庭作业的平均成绩,但是排除掉第一个和最后一个分数。如果只有四个分数,你可能就直接去简单的手动赋值,但如果…

5、搭建前端项目

5.1 使用vite vue搭建 win r 打开终端 切换到你想要搭建的盘 npm init vitelatest跟着以下步骤取名即可 cd fullStackBlognpm installnpm run dev默认在 http://localhost:5173/ 下启动了 5.2 用vscode打开项目并安装需要的插件 1、删除多余的 HelloWorld.vue 文件 2、安装…

【Vue3】理解toRef() 和 toRefs()

历史小剧场 知道可能面对的困难和痛苦,在死亡的恐惧中不断挣扎,却仍然能战胜自己,选择这条道路,这才是真正的勇气。----《明朝那些事儿》 前言 toRef 和 toRefs 是Vue3中的响应式转换工具函数 toRef: 不影响源对象的情况下&#x…

【数据结构】AVLTree实现详解

目录 一.什么是AVLTree 二.AVLTree的实现 1.树结点的定义 2.类的定义 3.插入结点 ①按二叉搜索树规则插入结点 ②更新平衡因子 更新平衡因子情况分析 ③判断是否要旋转 左单旋 右单旋 左右单旋 右左双旋 4.删除、查找和修改函数 查找结点 三.测试 1.判断是否是搜索树 …

面试题-Vue2和Vue3的区别

文章目录 1. 响应式系统2. 组合式 API (Composition API)3. Fragment (碎片)4. Teleport (传送门) 5. 性能改进6. 移除或改变的功能7. 构建工具8. TypeScript 支持 Vue 2 和 Vue 3 之间存在许多重要的区别,这些区别涵盖了性能、API 设计、组合式 API(Com…

AndroidStudio无法识别连接夜神模拟器

方法一(无法从根本上解决) ①进入夜神模拟器安装路径下的bin路径(安装路径可以带有中文路径) ②打开cmd窗口,输入以下代码(一定要打开模拟器) nox_adb.exe connect 127.0.0.1:62001 方法二(根本上解决) 原因:Android Studio的adb版本与夜神模拟器的adb版本不一致 ①打开And…

技术架构的发展

技术架构的演进 主要方向: ​ 1.提高单位时间内的吞吐量,提高并发度; ​ 2.对应用服务代码进行解耦合,使得开发效率得到提高; ​ 3.运维成本降低; ​ 4.成本降低,如购买云厂商资源&#xf…

Cortex-M7——NVIC

Cortex-M7——NVIC 小狼http://blog.csdn.net/xiaolangyangyang 一、NVIC架构 二、中断及异常编号 三、中断屏蔽寄存器(__disable_irq和__enable_irq操作的是PRIMASK寄存器) 四、中断分组寄存器(SCB->AIRCR[10:8]) 五、NVIC寄…

常用的Linux命令,linux下文件的读、写、打开、关闭append用法

vim demoq.c打开写的.c文件 内容为 按a可以编辑页面代码。按ESC退出编辑然后按shift:wq保存文件并退出 Linux 系统中采用三位十进制数表示权限,如0755, 0644.7 124(可读、可写、可执行) 5 14(可读、不可写、可执行) …

苹果手机微信如何直接打印文件

在快节奏的工作和生活中,打印文件的需求无处不在。但你是否曾经遇到过这样的困扰:打印店价格高昂,让你望而却步?今天,我要给大家介绍一款神奇的微信小程序——琢贝云打印,让你的苹果手机微信直接变身移动打…

Docker配置Redis集群以及主从扩容与缩容

基础镜像拉取 docker run -p 6379:6379 -d redis:6.0.8 配置文件以及数据卷挂载 # 开启密码验证(可选) requirepass 1234 # 允许redis外地连接,需要注释掉绑定的IP # bind 127.0.0.1 # 关闭保护模式(可选) protected-m…

6.18云服务器大促盘点,错过一次,再等一年!

随着云计算技术的飞速发展,云服务器已成为企业和个人构建和扩展在线业务的首选平台。特别是在大型促销活动如618年中大促期间,云服务提供商纷纷推出极具吸引力的优惠,以降低用户上云的门槛。以下是对当前市场上几个主流云服务提供商的优惠活动…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第六周) - 预训练模型

预训练模型 1. 预训练模型介绍 1.1. ELMo1.2. GPT1.3. BERT 2. Seq2Seq 2.1. T52.2. BART 3. Tokenization 1. 预训练模型介绍 在预训练语言模型出现之前,统计语言模型(如N-gram模型)是主流方法。这些模型利用统计方法来预测文本中的下一个…

设计模式-外观(门面)模式(结构型)

外观模式 外观模式又称门面模式(结构型模式),它是一个可以屏蔽系统复杂性的设计模式。俗话说没有什么问题是加一层“介质”解决不了的,如果有那就在加一层。在开发过程中肯定封装过Utils类,我认为这就是一种门面模式&…

亘古真知

目录 一,概述 二,个人面板 三,科技面板 四,手牌 五,回合 1,行动 (1)打造 (2)学习 (3)归档 (4)挖掘 …

Java——数组排序和查找

一、排序介绍 1、排序的概念 排序是将多个数据按照指定的顺序进行排列的过程。 2、排序的种类 排序可以分为两大类:内部排序和外部排序。 3、内部排序和外部排序 1)内部排序 内部排序是指数据在内存中进行排序,适用于数据量较小的情况…

【SQLAlChemy】如何连接数据库?

使用SQLAlChemy连接数据库 导入包 首先,导入创建数据库引擎的包。 from sqlalchemy import create_engine编写数据库配置 SQLALCHEMY_DATABASE_URL "mysql://root:123456789127.0.0.1:3306/tortoise"字段解释: mysql::这是数…

持续警惕火灾风险:学校可燃气体报警器的定期校准检验

可燃气体报警器在学校中的安装、检验和校准对于保护师生生命安全至关重要。 接下来,佰德将探讨可燃气体报警器在学校中的必要性,以及相关实际案例和数据,为您呈现一个安全的学习环境。 一、学校安全不能掉以轻心 学校是培养未来的摇篮&…

【CS.SE】端午节特辑:Docker容器化技术详解与实战

端午节, 先祝愿大家端午安康,阖家幸福, 哈哈!这篇讲下Docker这一现代软件开发中不可或缺的技术。软件工程涉及软件开发的整个生命周期,包括需求分析、设计、构建、测试、部署和维护。Docker作为一种容器化技术,直接关联到软件部署…