当前位置: 首页 > news >正文

学习python自动化——pytest单元测试框架

一、什么是pytest

单元测试框架,unittest(python自带的),pytest(第三方库)。

用于编写测试用例、收集用例、执行用例、生成测试结果文件(html、xml)

1.1、安装pytest

pip install pytest

1.2、导入

import pytest

二、步骤

  2.1、TestCase(测试用例)

    2.1.1、创建测试类      

      1)类名要以Test开头

class TestData:
    2.1.2、测试用例函数      

      1)可以直接用函数、类的形式
      2)函数名必须是test_开头
      3)执行顺序,按照从上到下的代码顺序执行

def test_data():        #测试函数print("test_data")class TestData:def test_hello(self):    #测试函数print("test_hello")
    2.1.3、前置后置(fixture)
      前置:环境准备、数据准备后置:清理工作、数据清理

    pytest的fixture有2种实现方式:

      2.1.3.1、xunit-style

        跟unittest框架的机制非常相似,即setup/teardown系列

        1、测试函数/方法级别:每一个测试函数都会执行的前置和后置。

          1)测试类内部的测试方法:

            前置函数名称:setup_method

            后置函数名称:teardown_method

          2)模块下的测试函数:

            前置函数名称:setup_function

            后置函数名称:teardown_function

        2、测试类级别:一个测试类只执行一次前置和后置。

          前置函数名称:setup_class

          后置函数名称:teardown_class

          注意:用@classmethod装饰

        3、测试模块级别:一个测试模块只执行一次前置和后置。

          前置函数名称:setup_module

          后置函数名称:teardown_module

from selenium import webdriver
from time import sleep
from random import randintdef setup_module():print("====  模块级的 setup 操作  ====")def teardown_module():print("====  模块级的 teardown 操作  ====")def test_random():assert randint(1, 5) == 3class TestWeb:@classmethoddef setup_class(cls):print("====  测试类级的 setup 操作  ====")@classmethoddef teardown_class(cls):print("====  测试类级的 teardown 操作  ====")def setup_method(self):print("====  测试用例级的 setup 操作  ====")self.driver = webdriver.Chrome()def teardown_method(self):print("====  测试用例级的 teardown 操作  ====")self.driver.quit()def test_search(self):self.driver.get("https://www.baidu.com/")self.driver.find_element_by_id("kw").send_keys("柠檬班")self.driver.find_element_by_id("su").click()sleep(1)
      2.1.3.2、fixture机制

        通过@pytest.fixture装饰器来定义fixture

         1、fixture定义

          1)fixture通过函数实现

          2)使用@pytest.fixture进行装饰

          3)前置和后置都放在同一个函数当中,通过yeild关键字区分前置和后置,yeild前面的为前置,yeild后面的为后置

import pytest@pytest.fixture
def init():print("用例执行之前,执行的代码")  # 前置代码 yieldprint("用例执行之后,执行的代码")  # 后置代码@pytest.fixture
def init2():print("用例执行之前,执行的代码")  # 只有用例执行之前的前置准备代码@pytest.fixture
def init3():yieldprint("用例执行之后,执行的代码")  # 只有用例执行之后的后置清理代码

          4)fixture有4个作用域:测试会话(session)、测试模块(module)、测试类(class)、测试用例(function)

           设置fixture的作用域,通过@pytest.fixture(scope=作用域)来设置。默认情况下,scope=function

import pytest# 没有设置scope,默认为测试函数级别。即调用此fixture的测试类/模块/函数下,每个测试函数都会执行一次这个fixture
@pytest.fixture
def init():print("用例执行之前,执行的代码")  # 前置代码yieldprint("用例执行之后,执行的代码")  # 后置代码# 设置scope为class。调用此fixture的测试类下,只执行一次这个fixture.
@pytest.fixture(scope="class")
def init2():print("用例执行之前,执行的代码")  # 只有用例执行之前的前置准备代码# 设置scope为session。autouse表示自动使用。
# 那么在pytest收集用例后,开始执行用例之前会自动化执行这个fixture当中的前置代码,
# 当所有用例执行完成之后,自动化执行这个fixture的后置代码。
@pytest.fixture(scope="session",autouse=True)
def init3():yieldprint("用例执行之后,执行的代码")  # 只有用例执行之后的后置清理代

          5)fixture的返回值设置:yeild 返回值

            如果前置准备工作当中,有变量要传递给测试用例去使用的话,那么就需要返回这个变量,可以有多个返回值,返回值是个元组。

            yeild 返回值,返回值2,返回值3    

yield mysql_obj,True,123

        2、fixture调用

           2.1、自动调用:定义fixture有个参数:autouse,默认autouse=False

              自动调用时,所有的测试函数都会调用一次,所以只有session作用域时才适用。

import pytest@pytest.fixture(autouse=True)           #自动调用
def init():print("===我是前置准备工作===")yieldprint("***我是后置清理工作***")@pytest.fixture(scope="class")
def init_class():print("===我是测试类  前置准备工作===")yieldprint("***我是测试类  后置清理工作***")def test_hello():print("hello pytest!!")class Test_demo:def test_bey(self):print("bey pytest!!")

           2.2、主动调用:测试函数/测试类上加上:@pytest.mark.usefixtures("fixture的函数名称"),可以调用多个。

             当调用两个同级别的fixture函数时,按就近原则调用

            1)无需接收fixture返回值

import pytest
from random import randint#测试类级别
@pytest.fixture(scope="class")
def init_class():print("===我是 测试类  前置准备工作===")mysql_obj = "fixture要返回出去的数据库对象"yield mysql_obj,True,123  # 返回一个变量/对象print("***我是 测试类  后置清理工作***")# 测试函数级别
@pytest.fixture()
def init():print("===我是前置准备工作===")yieldprint("***我是后置清理工作***")# 测试函数级别
@pytest.fixture()
def init2():print("===我是前置准备工作2===")yieldprint("***我是后置清理工作2***")@pytest.mark.usefixtures("init")        #去执行名为init的fixture函数
@pytest.mark.usefixtures("init2")       #当调用两个同级别的fixture函数时,就近原则,先调用init2,再调用init
def test_hello():print("hello pytest!!")def test_demo():                        #无前置后置print("hello world")@pytest.mark.usefixtures("init_class")      #执行名为init_class测试类级别的前置后置
@pytest.mark.usefixtures("init")            #当调用两个不同级别的fixture函数时,先调用init_class,再每个函数调用init
class TestDemo:def test_random(self):assert randint(3, 3) == 3def test_abc(self):assert True@pytest.mark.usefixtures("init2")           #当类内部函数有调用时,就近原则,先调用init2,再调用initdef test_bey(self):print("bey pytest!!")

             2)要接收fixture返回值:fixture的函数名作为用例的参数,相当于fixture函数名 = fixture调用的返回值

              当fixture函数名作为测试用例参数时,在执行用例时,会自动寻找该函数的fixture,并执行。

              ps:pytest当中的测试用例,如果有参数,分为2种:

                1、fixture的名字

def test_random(self,init_class)pass

                2、参数化要传的参数

@pytest.mark.parametrize("case",datas)
def test_read_datas(case):pass
 
import pytest
from random import randint# 测试类级别
@pytest.fixture(scope="class")
def init_class():print("===我是 测试类  前置准备工作===")mysql_obj = "fixture要返回出去的数据库对象"yield mysql_obj,True,123  # 返回一个变量/对象print("***我是 测试类  后置清理工作***")#@pytest.mark.usefixtures("init_class")  # 当fixture函数名作为测试用例参数时,在执行用例时,会自动寻找该函数名并执行,所以这个可以不写
class TestDemo2:def test_random(self,init_class): # fixture的名字作为用例的参数,相当于fixture名字 = fixture调用的返回值mysql_obj, bool_obj, int_obj = init_classprint("从fixture当中接收的变量为:{}".format(init_class))assert randint(1, 5) == 3def test_abc(self):assert True

      2.1.3.3、conftest.py共享机制

       1、共享实现

        1)在项目根目录下,创建一个conftest.py文件。

        2)文件名必须是conftest.py,大小写敏感,不可改名字。

        3)conftest.py当中,可以编写多个fixture

        4)在测试用例文件当中,不需要引入conftest.py文件。直接调用fixture的函数名,会自动去conftest.py当中查找的。

        2、conftest.py层级作用域

         conftest.py在项目根目录下,则项目下的所有测试用例,均可使用conftest.py中定义的fixture。即项目根目录下的conftest.py,作用域是整个项目。

         根目录下的conftest.py里的fixture,无论项目下的哪个用例,都可以使用。

         子目录day3-login下的conftest.py里的fixture,只有day3-login下的用例可以使用。

         子目录day3-register下的conftest.py里的fixture,只有day3-register下的用例可以使用。

           测试用例在执行时,调用fixture的顺序,按 就近原则 调用。

           测试用例文件中的fixture > 当前目录中的fixture > 上级目录中的fixture > 根目录中的fixture

       2.1.3.4、fixture嵌套

        嵌套使用即:一个fixture,可以做另外一个fixture的参数,自动调用参数的fixture。

        注意:由于参数里的fixture要先执行,所以参数里的fixture的作用域 >= fixture的作用域。

@pytest.fixture
def init_class():print(" %%%% 我是 day3-login包下test_random模块的测试类  前置准备工作 %%%% ")yieldprint(" %%%% 我是 day3-login包下test_random模块的测试类  后置清理工作 %%%% ")@pytest.fixture
def init_case(init_class):      #init_class作为init_case的参数,当用例调用init_case时,init_case会自动调用init_classprint("测试用例级别 的前置")print("=================================")yieldprint("测试用例级别 的后置")print("===============用例  完结==================")

      2.1.3.5、session 和 module 级别的 fixture

       1)session 级别的 fixture

         从 pytest 开始收集用例,到执行用例完成的整个过程,为一次会话,可以设置 autouse=True 

import pytest@pytest.fixture(scope="session",autouse=True)
def fix_session():print("===  session级别的前置 ,只执行1次 ============")yield Trueprint("===  session级别的后置 ,只执行1次 ============")

                

       2)module 级别的 fixture

         module 是指测试 py 文件,夹具夹的是整个 test_*.py 文件里的测试用例。

         在 test_*.py 里,哪一行代码调用了 module 级别的 fixture,那么夹的就是那行代码之后的所有测试用例。

import pytest@pytest.fixture(scope="module")
def fix_module():print("===  module级别的 前置 ======")yieldprint("===  module级别的 后置 ======")

    2.1.4、断言

      将预期结果与实际结果进行对比
      assert 表达式(True表示断言为真,False表示断言失败)

assert a==b

  2.2、用例收集:自动收集

    1)pytest自动收集用例规则:在当前文件所在的目录下,收集文件名为test_*.py或*_test.py的测试文件中,以test_开头的测试用例或Test开头的测试类。

    2)pytest.main():以当前文件所在的目录下,收集用例并执行。

pytest.main(["-s","-v"])

    3)用例分类执行

pytest.main(["day1/test_case1.py"])      #只执行day1目录下test_case1.py文件的测试用例

  2.3、TestRunner(用例执行)

    1)需要配置执行器:File>>>Settings>>>Tools>>>Python Integrated Tools>>>Default test runner:pytest
    2)执行顺序:测试文件顺序按ASCII码,文件内部测试用例按代码顺序执行

    3)若py文件执行过一次后,会保留上一次执行的方式,需要清除上一次执行记录。右上角——Edit Configurations——Remove掉该py文件。

   2.4、生成测试报告

    2.4.1、生成JunitXML 格式的测试报告

      命令:--junitxml=path     

    2.4.2、生成result log格式的测试报告

      命令:--resultlog=report\log.txt     

    2.4.3、生成Html格式的测试报告 

      1)安装pytest-html插件

pip install pytest-html

      2)在pytest.main()的参数当中添加:--html=报告路径

pytest.main(["-s","-v","--html=report.html"])      #生成html格式的测试报告
    2.4.4、生成allure的测试文件 

      2.4.4.1、allure是依据测试结果文件,呈现更好看的更多维度的测试报告。
      注意:它不执行用例也不生成测试结果文件。所以,要使用allure的时候,一定要先生成测试结果文件。allure需要依赖测试框架,执行测试用例后,根据测试结果再生成测试报告。

      2.4.4.2、allure的使用

        1、安装allure命令行工具
          1)下载allure安装包。下载地址:https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/

          2)下载完成之后,解压到任意目录
          3)配置环境变量:allure的bin目录。比如D:\allure-2.12.1\bin

          4)在cmd当中,执行allure命令,不报错即allure安装成功。

        2、pytest在执行用例之后,要生成allure可以识别的测试结果文件。
          1)安装插件

pip install allure-pytest

          2)在pytest.main()的参数当中添加:--alluredir=allure生成的文件目录(手动创建一个)

pytest.main(["-s","-v","--alluredir=allure_file"])

pytest.main(["--alluredir=allure_file","--clean-alluredir"])      #每次运行前清除allure_file中的文件,为防止数据重复

        3、使用allure去解析2中的测试结果文件,再呈现最终的测试报告
          1)在cmd当中首先跳转到rootdir下面

          2)在cmd当中执行命令:allure serve 2中的测试结果文件目录

   2.5、参数化(数据驱动)

    1、@pytest.mark.parametrize("参数名",列表数据)

datas={"api":"login","url":"http://api.lemoban.com/futureloan/login","api":"register","url":"http://api.lemoban.com/futureloan/register","api":"recharge","url":"http://api.lemoban.com/futureloan/recharge","api":"withdraw","url":"http://api.lemoban.com/futureloan/withdraw"}@pytest.mark.parametrize("case",datas)
def test_read_datas(case):pass

    2、组合参数化:多组参数,依次组合。
      使用多个@pytest.mark.parametrize

#示例:用例有4个:0,2/0,3/1,2/1,3 迪卡尔积
@pytest.mark.parametrize("x", [0, 1])
@pytest.mark.parametrize("y", [2, 3])
def test_foo(x, y):pass

   2.6、重试机制(rerun)

1)安装插件:pytest-rerunfailures

pip install pytest-rerunfailures

2)命令

pytest --reruns 次数

pytest --reruns-delay  重运行次数之间的间隔时间(以秒为单位)

pytest.main(["--reruns","2","--reruns-delay","5"])

   2.7、筛选用例,mark一下

当我们想只运行诸多py文件当中的部分用例,需要过滤用例时,可以使用pytest.mark一下。

1)注册标签名

通过pytest.ini配置文件注册。在pytest.ini文件当中:

[pytest]   # 固定的section名

markers= # 固定的option名称

  标签名1: 标签名的说明内容。

  标签名2

  标签名N

 2)在测试用例/测试类中给用例打标记(只能使用已注册的标记名)

 在测试用例的前面加上:@pytest.mark.已注册标签名

 3)运行时,根据用例标签过滤(-m 标签名)

调用pytest.main()函数,将运行时的参数以列表传进去,同样也可以达到命令行运行的效果。可以使用逻辑运算符。

pytest.main(["-m","demo"])      #执行标签为demo的测试用例
pytest.main(["-m not demo"])    #执行标签不是demo的测试用例
pytest.main(["-m demo and test"])  #执行标签是demo又是test的测试用例

  【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)
》,以及配套的接口文档/项目实战【网盘资源】,需要的朋友可以下方视频的置顶评论获取。肯定会给你带来帮助和方向。

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)

 

相关文章:

学习python自动化——pytest单元测试框架

一、什么是pytest 单元测试框架,unittest(python自带的),pytest(第三方库)。 用于编写测试用例、收集用例、执行用例、生成测试结果文件(html、xml) 1.1、安装pytest pip instal…...

定位、地图建立及管理合集

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言机器人中常见的定位技术介绍一、直方图定位原理二、gnss、rtk定位原理三、【依赖二维激光雷达与全局地图的定位算法】amcl&am…...

uniAPP是否可以做php语言书写后端的前端开发?

UniAPP可以做PHP语言书写后端的前端开发。以下是关于这个问题的详细解答: 一、UniAPP与后端开发的关系 前后端分离:UniAPP作为一款跨平台开发框架,采用了前后端分离的开发模式。这意味着前端和后端的开发可以独立进行,互不影响。…...

柒拾伍- AI内容农场生产文章自动发布至公众号 (一)

一、内容农场 X AI 看过很多的新闻说 AI 产生 内容 污染网络,我也想试一下到底能污染成怎样。 然后为了编写爆款的内容,我选用这个 内容农场 的种子是来源于 微博热搜,让生长出来的垃圾文章更加火爆 涉及内容不能放 二、编写代码 关于代…...

java.util.function Function<T, R>

一、介绍 1、简介 Function<T, R> 是 Java 8 中的一个函数式接口&#xff0c;用于表示接受一个输入参数 T&#xff0c;并返回一个结果 R 的函数。Function接口中有一个抽象方法apply&#xff0c;用于定义函数的逻辑。Function接口通常用于将数据进行转换&#xff08;处…...

Allegro在PCB上开槽的三种方法操作指导

Allegro如何在PCB上开槽的三种方法操作指导 当PCB有特殊设计要求的时候&#xff0c;需要在PCB上开槽&#xff0c;Allegro支持在PCB上开槽操作&#xff0c;具体操作如下 以下图为例&#xff0c;需要在这个板框中间开槽 开方形槽 选择shape add rect命令 画在Board Geometry-o…...

Docker:快速部署

docker安装&#xff1a; ​‌​‬&#xfeff;​&#xfeff;⁠​‍‬​‍‬‬‌​‬‬‬​&#xfeff;⁠​‍​​‌‬‌&#xfeff;​​​​​​‌​​​​⁠​‍⁠‌安装Docker - 飞书云文档 (feishu.cn) docker命令解读 docker run -d \ > --name mysql \ > -p 33…...

如何指定this的值

1. 函数调用时指定 call -- 接收一个参数列表 apply -- 接收一个参数数组 2. 创建时指定this的值 bind -- 返回一个函数 传参方式与call相同 箭头函数 -- 其this值取决于上级作用域中的this值 <script>// 如何指定this的值// 1. 调用时指定this// 2. 创建时指定th…...

自动化分析背后,一站式数据分析平台!

自动化分析背后&#xff0c;一站式数据分析平台&#xff01; 前言一站式数据分析平台 前言 在如今的企业管理中&#xff0c;数据已经不再是简单的存储和备份&#xff0c;而是成为了决策的核心驱动力。尤其是在面对海量数据的情况下&#xff0c;企业急需一个能够高效处理、分析…...

掌握 WPF 开发:基础、数据绑定与自定义控件

WPF&#xff08;Windows Presentation Foundation&#xff09;是用于构建现代桌面应用程序的强大框架。它通过 XAML&#xff08;Extensible Application Markup Language&#xff09;与丰富的控件体系&#xff0c;提供了灵活的 UI 开发方式。本文将介绍 WPF 的基础知识、XAML 语…...

PostgreSQL:生成-唯一主键id

1. 通过时间戳和随机数拼接生成 select TO_CHAR(NOW(), YYYYMMDDHH24MISS) || LPAD(FLOOR(RANDOM() * 1000000)::TEXT, 6, 0) AS unique_id解析&#xff1a; TO_CHAR(NOW(), ‘YYYYMMDDHH24MISS’)&#xff1a;该部分将当前时间 (NOW()) 格式化为 YYYYMMDDHH24MISS 格式&#…...

Swift添加自定义字体

1. 在 Xcode 中添加自定义字体 首先&#xff0c;你需要将自定义字体文件&#xff08;如 .ttf 或 .otf 文件&#xff09;添加到项目中。 将字体文件拖放到项目的资源管理器中&#xff0c;确保选中了 "Copy items if needed"。打开 Info.plist 文件&#xff0c;添加一…...

Springboot 整合 Java DL4J 实现企业门禁人脸识别系统

&#x1f9d1; 博主简介&#xff1a;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编程&#xff0c;…...

SSTI模板注入+CTF实例

参考文章&#xff1a; 一文了解SSTI和所有常见payload 以flask模板为例-腾讯云开发者社区-腾讯云 (tencent.com) python-flask模块注入(SSTI) - ctrl_TT豆 - 博客园 (cnblogs.com) ssti详解与例题以及绕过payload大全_ssti绕过空格-CSDN博客 1. SSTI&#xff08;模板注入&…...

iPhone 16 Pro 拆解揭秘:设计改进与维修便利性

苹果最新推出的iPhone 16系列在许多方面都进行了更新和改进&#xff0c;而这次我们要聚焦的是其中的高端型号——iPhone 16 Pro。 这款手机不仅在性能上有所提升&#xff0c;在内部构造上也带来了不少变化&#xff0c;让我们一起来看看这些细节吧。 更容易进入的内部结构 对于…...

Java项目实战II养老||基于Java+Spring Boot+MySQL的社区智慧养老监护管理平台设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着老龄化…...

利用FnOS搭建虚拟云桌面,并搭建前端开发环境(二)

利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境 二 一、docker镜像二、环境配置三、核心环境配置流程文档 利用FnOS搭建虚拟云桌面&#xff0c;并搭建前端开发环境&#xff08;一&#xff09; 上一章安装了飞牛FnOS系统&#xff0c;界面如下&#xff0c;这一张配置前端…...

【Python】Qwen-VL-7B box

VLLM-Qwen2-VL-7B-Instruct import cv2# 读取图像 image_path haibaoA.png # 替换为图像的路径 image cv2.imread(image_path)# 定义框的坐标 (x1, y1) 是左上角&#xff0c;(x2, y2) 是右下角 x1, y1 200, 550 # 左上角坐标 x2, y2 799, 750 # 右下角坐标 h, w image.…...

echarts按需引入解决项目大小问题

背景&#xff1a; 按需加载缩减项目大小&#xff0c;提升项目性能和可用性 实现&#xff1a; 创建echarts.js main.js进行配置 页面中引用 效果 全量导入 按需加载&#xff1a;...

天气预报echarts

如上图&#xff0c;可以切换温度&#xff0c;降水量&#xff0c;风力风向和空气质量 <template><el-radio-group v-model"selectedData" change"updateChart"><el-radio-button label"temperature">温度</el-radio-butto…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...