【六:pytest框架介绍】
常见的请求对象requests.get()requests.post()requests.delete()requests.put()requests.request()常见的响应对象rep=requests.request()//返回字符串格式数据print(req.text)//返回字节格式数据print(req.content)//返回字典格式数据print(req.json)#状态码print(req.status_code)#返回状态信息print(req.reason)print(req.cookies)print(req.encoding)print(req.headers)
pytes用例框架
pytes用例框架默认规则:1、py文件必须以test_开头,或者_test结尾2、类名必须以Test开头3、测试用例必须以test_开头总结:文件名,类名,方法名,必须符合规则post请求参数到底是传data还是json,此时要看请求头里的content-type类型请求头中content-type为application/json, 为json形式,post请求使用json参数请求头中content-type为application/x-www-form-urlencoded为表单形式,post请求时使用使用data参数json.dumps(data) 将字典格式转换成str格式json.loads(data) 将str格式转换成字典格式pytest用例管理框架的作用发现用例:从多个py文件中找执行测试用例:升序条件判断测试结果:断言生成测试报告:html测试框架python: unittest或者pytestjava: junit,testng————————————————# 只执行冒烟用例#addopts = -vs -m "smoke"命令执行:pytest -vs (-v:输出详细信息 -s:输出调试信息 -n 多线程执行
pytest插件的用法
pytest强大的插件 pytestpip install pytest-ordering 控制用例的执行顺序(重点)pip install pytest-xdist 分布式并发执行测试用例(重点)pip install pytest-dependency 控制用例的依赖关系 (了解)pip install pytest-rerunfailures 失败重跑(了解)pip install pytest-assume 多重较验(了解)pip install pytest-random-order 用例随机执行(了解)pip install pytest-html 测试报告(了解)pip install -r requests.txt
pytest-ordering 用法
没加排序
"""pytest 调整测试用例执行顺序
"""def test_01():print("test 01")def test_02():print("test 02")def test_03():print("test 03")def test_04():print("test 04")E:\Home_Work\Home_Work2\pytest01\test>pytest test_oder.py
collected 4 items
=========================执行结果================================
test_oder.py::test_01 test 01
PASSED
test_oder.py::test_02 test 02
PASSED
test_oder.py::test_03 test 03
PASSED
test_oder.py::test_04 test 04
PASSED========================================================= 4 passed in 0.54s =========================================================E:\Home_Work\Home_Work2\pytest01\test>
加了排序
"""pytest 调整测试用例执行顺序
"""
import pytest@pytest.mark.run(order=4)
def test_01():print("test 01")@pytest.mark.run(order=2)
def test_02():print("test 02")@pytest.mark.run(order=3)
def test_03():print("test 03")@pytest.mark.run(order=1)
def test_04():print("test 04")E:\Home_Work\Home_Work2\pytest01\test>pytest test_oder.py
collected 4 items
========================执行结果=================================test_oder.py::test_04 test 04
PASSED
test_oder.py::test_02 test 02
PASSED
test_oder.py::test_03 test 03
PASSED
test_oder.py::test_01 test 01
PASSED========================================================= 4 passed in 0.61s =========================================================E:\Home_Work\Home_Work2\pytest01\test>
pytest-xdist 用法
PYTEST 多进程并行与分布式执行 (PS:分布式采用的是多进程)
"""pytest 分布式执行测试用例
"""
import timeimport pytest@pytest.mark.run(order=4)
def test_01():time.sleep(1)print("test 01")@pytest.mark.run(order=2)
def test_02():time.sleep(1)print("test 02")@pytest.mark.run(order=3)
def test_03():time.sleep(1)print("test 03")@pytest.mark.run(order=1)
def test_04():time.sleep(1)print("test 04")==============================执行结果==========================E:\Home_Work\Home_Work2\pytest01\test>pytest -n 8 test_oder.py
testconfig-0.2.0, xdist-2.3.0
[gw0] win32 Python 3.8.7 cwd: E:\Home_Work\Home_Work2\pytest01\test
[gw1] win32 Python 3.8.7 cwd: E:\Home_Work\Home_Work2\pytest01\test
[gw2] win32 Python 3.8.7 cwd: E:\Home_Work\Home_Work2\pytest01\test
[gw3] win32 Python 3.8.7 cwd: E:\Home_Work\Home_Work2\pytest01\test
[gw4] win32 Python 3.8.7 cwd: E:\Home_Work\Home_Work2\pytest01\test
[gw5] win32 Python 3.8.7 cwd: E:\Home_Work\Home_Work2\pytest01\test
[gw6] win32 Python 3.8.7 cwd: E:\Home_Work\Home_Work2\pytest01\test
[gw7] win32 Python 3.8.7 cwd: E:\Home_Work\Home_Work2\pytest01\test
[gw0] Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
[gw1] Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
[gw2] Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
[gw3] Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
[gw4] Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
[gw5] Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
[gw6] Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
[gw7] Python 3.8.7 (tags/v3.8.7:6503f05, Dec 21 2020, 17:59:51) [MSC v.1928 64 bit (AMD64)]
gw0 [4] / gw1 [4] / gw2 [4] / gw3 [4] / gw4 [4] / gw5 [4] / gw6 [4] / gw7 [4]
scheduling tests via LoadSchedulingtest_oder.py::test_02
test_oder.py::test_04
test_oder.py::test_03
test_oder.py::test_01
[gw1] PASSED test_oder.py::test_02
[gw3] PASSED test_oder.py::test_01
[gw0] PASSED test_oder.py::test_04
[gw2] PASSED test_oder.py::test_03======================================================== 4 passed in 14.16s =========================================================E:\Home_Work\Home_Work2\pytest01\test>pytest -n 8 test_oder.py
pytest.ini
pytest.ini:
pytest.ini 可以修改 pytest 的默认行为注意: pytest.ini 不能使用任何中文符号,包括汉字、空格、引号、冒号等等;更改默认命令行参数:
将常用的命令行参数设置为默认,省去重复输入的工作;# pytest.ini[pytest]addopts = -rsxX -l -strict --tb=short==========================================================================================
注册 mark 标记:
# pytest.ini[pytest]markers =demo : marks tests as demosmoke: marks tests as smoketest : marks tests as test切记,添加这个需要在每个用例的签名添加@pytest.markers.smoke(order=2)
==========================================================================================
控制台实时输出日志:
# pytest.ini[pytest]log_cli = 1==========================================================================================
指定 pytest 最低版本号:
# pytest.ini[pytest]minversion = 3.0==========================================================================================
指定 pytest 忽略某些目录:
pytest 收集测试用例时,会递归遍历所有子目录,包括某些你明知道没必要遍历的目录,遇到这种情况,可以使用 norecursedirs 参数简化 pytest 的搜索工作;norecursedirs 默认的设置是:.* build dist CVS _darcs {arch} *.egg ,多个路径用空格隔开。# pytest.ini[pytest]norecursedirs = .* build dist CVS _darcs {arch} *.egg venv src==========================================================================================
指定测试目录:
testpaths 限定测试用例的搜索范围,只有在 pytest 范围指定文件目录参数或测试用例标识符时,该选项才会启用;testpaths 指定的路径是以 testpaths 所在的目录为基准的相对路径;# pytest.ini[pytest]testpaths = test_path==========================================================================================
更改测试用例收集规则:
pytest 默认的用例收集规则:1、测试模块必须以 test_ 开头或以 _test 结尾;
2、测试类必须以 Test 开头,且不能有 __init__() ;
3、测试方法必须以 test_ 开头;下面我们来添加自己的收集规则:1、添加 check_ 开头的测试模块;
2、添加 Check 开头的测试类;
3、添加 check_ 开头的测试方法;
# pytest.ini[pytest]python_files = test_* *_test check_*
python_classes = Test* Check*
python_functions = test_* check_*==========================================================================================
禁用 XPASS:
将标记为 @pytest.mark.xfail 但实际通过的测试用例报告为失败;# pytest.ini[pytest]xfail_strict = true==========================================================================================
避免文件名冲突:
为所有的测试目录添加 __init__.py,当多个测试目录拥有重名文件时,__init__.py 可以避免文件名冲突;==========================================================================================
动态添加及获取 ini 配置参数:
# conftest.pyimport pytestdef pytest_addoption(parser):parser.addini('nice', type='bool', default=True, help='添加 ini 参数')@pytest.fixture(autouse=True)
def get_ini(pytestconfig):"""获取 ini 参数"""nice = pytestconfig.getini('nice')print(nice)执行时,只需要在相应的用例文件中输入执行命令pytest.main()
前后置夹具:
def setup(self):print("在每个用例前执行一次")def teardown(self):print("在每个用例后执行一次")setup_class/teardown_class 在每个类之前或者之后执行一次实现部分前置 如果想在其中一个用例做数据库的验证 @pytest.fixtrue(scope="作用域",params="数据驱动",autouse="自动执行",ids="自定义参数",name="重命名") 一般回合conftest.py一起使用作用域: 可以是个 function ,class,模块,或者是个包conftest.py 名称是固定的 功能强大conftest.py 文件是单独存放@pytest.fixtrue方法的,用处是可以在读个py文件中共享前置的配 conftest.py里面的方法调用时不需要导入,可以直接使用
用法:
# coding=utf-8
import json
import re
import pytest as pytest
import requests@pytest.fixture(scope="function")
def conn_databases():print("连接数据库的操作在里面")yieldprint("关闭数据库")# 发送 按住ctrl+鼠标左键
class TestSecondRequest:# 类变量,通过类名来访问access_token = ""csrf_token = ""cookies = ""session = requests.session()def test_get_toke(self, conn_databases):url = "https://api.weixin.qq.com/cgi-bin/token"data = {"grant_type": "client_credential","appid": "wx4a6bb065c448f76f","secret": "e2219aa93e7e2c788961be3edfe7654e"}# self.get_session()# 发送get请求 ,直接使用session来发送请求,这样会话就不会断# 原来 rep = requests.request('get',url=url, params=data)rep = TestSecondRequest.session.request('get', url=url, params=data)print(rep.json())# 通过key取value值TestSecondRequest.access_token = rep.json()['access_token']if __name__ == '__main__':pytest.main(['-vs'])def test_get_toke(self, conn_databases): 只有这个用例才会去执行链接数据库
执行结果:
conftest.py文件
@pytest.fixtrue()一般回和contftest文件一起使用
1.上面一个案例是在同一个.py文件中,多个用例调用一个登陆功能,如果有多个.py的文件都需要调用这个登陆功能的话,那就不能把登陆写到用例里面去了。
此时应该要有一个配置文件,单独管理一些预置的操作场景,pytest里面默认读取conftest.py里面的配置
conftest.py配置需要注意以下点:
- conftest.py配置脚本名称是固定的,不能改名称
- conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
- 不需要import导入 conftest.py,pytest用例会自动查找
1、作用是可以在多个文件中共享前置配置
2、contftest.py调用时不需要导入
3、contftest可以有多个,或者多个层级
目录结构
接口关联的封装
生成allure-pytest级别的报告
接口自动化测试框架yaml数据驱动封装
@pytest.mark.parametrize(args_name,args_value)
列表-基础用法
import pytestclass TestApi:@pytest.mark.parametrize('args',['百里','一新','娜扎'])def test_api(self,args):print(args)if __name__ == '__main__':pytest.main(['test_api.py'])
元组-相当于解剖
import pytestclass TestApi:@pytest.mark.parametrize('name,age',[['百里',10],['一新',11],['娜扎',12]])def test_api2(self,name,age):print(name,age)if __name__ == '__main__':pytest.main(['test_api.py'])
YAML详解
主要作用:
1、配置文件
2、测试用例
数据包的组成
1、map对象 : 键值 name:号的
2、列表,用- 开头
get_token.yml
msxy- name1:1- name2:2- name3:3
基础结构:
-name: 获得统一鉴权码tokenrequest:method:geturl:https://api.weixin.qq.com/cgi-bin/tokendata:grant_type: client_credentialappid: wx4a6bb065c448f76fsecret: "e2219aa93e7e2c788961be3edfe7654evalidate:None
一个接口就用一个yaml文件
pytest运行的几种方式
运行用例的几种方式:主函数模式:1、运行所有: pytest.main()2、指定模块:pytest.main(['vs','test_login.py'])3、指定目录:pytest.main(['vs','./test_login.py'])4、通过nodeid指定运行用例:pytest.main(['vs','./文件夹名/test_login.py::test+04_fun']) 通过函数名称执行命令模式:1、运行所有:pytest2、指定模块:pytest -vs test_login.py3、指定目录:pytest -vs ./test_login.py
实战训练
目录结构
common.yaml_util.py
import os
import yamlclass YamlUtil:# 读取extract_yml文件 access_token值的获取def read_extract_yaml(self, key):with open(os.getcwd() + "/extract.yml", mode='r', encoding='utf-8')as f:value = yaml.load(stream=f, Loader=yaml.FullLoader)return value[key];# 写入extract_yml文件def write_extract_yaml(self, data):with open(os.getcwd() + "/extract.yml", mode='w', encoding='utf-8')as f:yaml.dump(data=data, stream=f, allow_unicode=True)def clear_yaml(self):with open(os.getcwd() + "/extract.yml", mode='w', encoding='utf-8')as f:f.truncate()# 读取测试用例的get_token/根据文件名而来的ymal文件def read_testcase_yaml(self,yaml_name):with open(os.getcwd() + "/testDemo/"+yaml_name, mode='r', encoding='utf-8')as f:value = yaml.load(stream=f, Loader=yaml.FullLoader)return value;
common.requests_util.py
import jsonimport requestsclass RequestsUtil:#类变量,通过session =requests.session()def send_request(self,method,url,data,**keyword):method = str(method).lower()rep =Noneif method == 'get':rep = RequestsUtil.session.request(method, url=url, params=data, **keyword)else:data=json.dumps(data)rep = RequestsUtil.session.request(method, url=url, data=data, **keyword)return rep.text
reports
报告的生成文件
temp
临时文件
testDemo.conftest 前置文件
import pytestfrom common.yaml_util import YamlUtil@pytest.fixture(scope="function")
def conn_databases():print("连接数据库的操作在里面")yieldprint("关闭数据库")# 自动清除会话,就不需要在方法里面加
@pytest.fixture(scope="session",autouse=True)
def clear_all_yaml():YamlUtil().clear_yaml()
testDemo.get_token.ymal 用例文件,一个接口一个用例
-name: 获得统一鉴权码tokenrequest:method: geturl: https://api.weixin.qq.com/cgi-bin/tokendata:grant_type: client_credentialappid: wx4a6bb065c448f76fsecret: e2219aa93e7e2c788961be3edfe7654evalidate: None
testDemo.post_edit_id.ymal
-name: 编辑接口用例request:method: posturl: https://api.weixin.qq.com/cgi-bin/tags/updatedata: {"tag": {"id": 134, "name": "广东人"}}validate: None
testDemo.test_second_request.py
# coding=utf-8
import json
import re
from unittest import resultimport pytest as pytest
import requests# @pytest.fixture(scope="function")
# def conn_databases():
# print("连接数据库的操作在里面")
# yield
# print("关闭数据库")# 发送 按住ctrl+鼠标左键
from common.requests_util import RequestsUtil
from common.yaml_util import YamlUtilclass TestSecondRequest:@pytest.mark.parametrize('caseinfo',YamlUtil().read_testcase_yaml('get_token.yml'))def test_get_toke(self, caseinfo):print(caseinfo['name'])print(caseinfo['request']['method'])print(caseinfo['request']['url'])print(caseinfo['request']['data'])print(caseinfo['validate'])method=caseinfo['request']['method']url = caseinfo['request']['url']data = caseinfo['request']['data']# 请求result=RequestsUtil().send_request(method,url,data)# self.get_session()# 发送get请求 ,直接使用session来发送请求,这样会话就不会断# 原来 rep = requests.request('get',url=url, params=data)# result = TestSecondRequest.session.request(method, url=url, params=data)result=json.load(result)print(result)if 'access_token' in result:# 通过key取value值 把access_token写入yaml中YamlUtil().write_extract_yaml({'access_token': result['access_token']})# 是否有返回这个字符船assert 'access_token' in resultelse:print("异常用例")# assert result['errcode'] == 200
all.py
import osimport pytestif __name__ == '__main__':pytest.main()# os.system("allure generate temp -o reports --clear")// 生成allure报告
pytest.ini
[pytest]
addopts=-vs --alluredir ./temp
testpaths=./testDemo
python_classes=Test*
python_functions=test_*markers =smoke:maoyan
问题:
在yml文件没法打实现动态参数
在yml没法实现动态上传
在yml没法实现断言
在yml文件里面数据量太大了怎么办
相关文章:

【六:pytest框架介绍】
常见的请求对象requests.get()requests.post()requests.delete()requests.put()requests.request()常见的响应对象reprequests.request()//返回字符串格式数据print(req.text)//返回字节格式数据print(req.content)//返回字典格式数据print(req.json)#状态码print(req.status_c…...

提升医院安全的关键利器——医院安全(不良)事件报告系统源码
医院是人们寻求医疗服务和康复的场所,安全是医院运营的基石。然而,医疗过程中不可避免地会出现不良事件,如药物错误、手术事故等。为了及时发现、评估和解决这些问题,医院安全(不良)事件报告系统应运而生。…...

【瑞吉外卖部分功能补充】
瑞吉外卖部分功能补充 菜品的启售和停售 在浏览器控制台点击对应功能后可以看到前端发送的请求是:http://localhost:9999/dish/status/1?ids1413342036832100354,请求方式为POST。 接收到前端参数后,进行controller层代码补全,…...

react的setState做了什么
1、为什么需要setState setState的作用是帮助我们更改数据的同时并且通知视图进行渲染。因为React并不会绑定视图和state,需要我们手动去更新视图。 2、setState什么时候是同步的,什么时候是异步的 setState这个方法在调用的时候是同步的,…...

ubuntu18.04 RTX3060 rangnet++训练 bonnetal语义分割
代码链接: https://github.com/PRBonn/lidar-bonnetal 安装anaconda环境为 CUDA 11.0(11.1也可以) anaconda环境如下 numpy1.17.2 torchvision0.2.2 matplotlib2.2.3 tensorflow1.13.1 scipy0.19.1 pytorch1.7.1 vispy0.5.3 opencv_python…...

Linux:权限是什么
本篇文章来简单介绍一下Linux操作系统中权限的基本概念和一些操作方法,对Linux权限有一个基本的了解,希望对大家学习Linux有所帮助。 目录 1.权限的概念 2.Linux权限管理 2.1 文件访问者的分类 2.2 文件类型与访问权限(事物属性ÿ…...
uni-app yrkDataPicker 日期和时间选择控件
uni-app 选择日期时间控件有 2 月份有 31 天的问题,一直没有修复,uni-calendar 苹果有选择年份和月份后无法显示问题。自己写了一个,只支持 H5 和微信小程序,其他没有试过。 <template><view class"yrk-data-picke…...

PAM从入门到精通(十九)
接前一篇文章:PAM从入门到精通(十八) 本文参考: 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构: 更加形象的形式: 六、整体流程示例 2.…...

apache httpd 多后缀解析漏洞
形成原因 Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令 在有多个后缀的情况下,只要一个文件含有.php后缀的文件即将被识别成PHP文件,没必要是最后一个后缀。利用这个特性,将会造成一个可以绕过上传白名单…...
Flutter ☞ 数据类型
数值类型 int、double、num int 整型,取值通常在 -253 ~ 253 之间 int class double 64-bt(双精度)浮点数,符合 IEEE 754 标准。 double class num 数值类型的基类,int 和 double 都继承自num。 num class 数值转换 // String -> …...

MyBatis-Plus 实战教程一
这里写目录标题 简介快速上手数据库建立创建实体类修改参数引入依赖测试常见注解介绍TableNameTableIdTableField 常见配置仓库地址 简介 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,…...

闭包(函数)
把内部函数通过return扔出去 必要条件...

Go包介绍与初始化:搞清Go程序的执行次序
Go包介绍与初始化:搞清Go程序的执行次序 文章目录 Go包介绍与初始化:搞清Go程序的执行次序一、main.main 函数:Go 应用的入口函数1.1 main.main 函数1.2 main.main 函数特点 二、包介绍2.1 包介绍与声明2.2 非 main包的 main 函数2.3 包的命名…...

Python教程(15)——Python流程控制语句详解
目录 if语句else if语句for循环遍历类型range关键字 while循环break语句continue语句 Python流程控制是Python编程中非常重要的一部分,它用于控制程序的执行流程。Python提供了多种流程控制语句,包括if语句、while循环、for循环、break和continue语句等。…...

JavaScript基础知识16——分支语句
哈喽,大家好,我是雷工。 今天学习JavaScript基础知识的分支语句,以下为学习笔记。 1、程序三大流程控制语句 ○写几句就从上往下执行几句,这种叫做顺序结构; ○有时要根据条件选择执行代码,这种叫分支结构…...

web开发初级工程师学习笔记
web开发初级工程师学习笔记 前端开发工具实验1 VS Code 初体验介绍 前端开发工具 实验1 VS Code 初体验 介绍 VS Code 环境提供的是一个可以在浏览器中使用原生 VS Code 编辑代码的程序。在该环境中,你可以使用到与本地安装近乎一致的 VS Code 程序来编辑代码文件…...

Linux下Samba服务安装及启用全攻略
Linux下Samba服务安装及启用全攻略 前言一、安装SSH Server二、安装Samba Server1.安装net-tool2.建立账号的samba3.windows通过Samba与linux共享文件4.使用远程工具登录Linux 总结 前言 提示:本文详解了在Linux系统下如何安装和启用Samba服务,涵盖了从…...

【C++】引用’‘的深入解析
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
java链式编程对象序列化问题
在使用 openfeign 进行服务之间数据传输时发现了一个问题,数据在下游正常处理,响应到调用端数据也读取到了,但是就是 jackson 转对象序列化时出了问题,异常如下 Failed to complete request: feign.codec.DecodeException: Type d…...
关于Redis(Redisson)超时问题的分析
概述 生产环境中流量高峰期会出现短时间的redis异常,主要报错如下: Redis server response timeoutRedisTimeoutException: Command execution timeout for command: (PING)Command still hasn’t been written into connection! 根据redisson官方所述…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...