pytest基本应用

文章目录

  • 1.pytest安装
  • 2.用例运行规则
  • 3.常用参数
    • 断言
    • 运行参数
    • 用例控制
    • setup和teardown
    • ini配置文件
  • 4.常用插件
  • 5.pytest高阶用法
    • 用例跳过
    • 参数化
  • 6.pytest之Fixture使用
    • fixture使用
    • 装饰器usefixtures
  • 7.pytest之conftest.py
  • 8.conftest+fixture+yield
    • yield介绍
    • 前后置使用

1.pytest安装

pip install pytest

环境配置:需要设置项目的默认运行方式为unittest

image-20240219173134149

2.用例运行规则

  • pytest将在当前目录及其子目录中运行所有格式为test_*.py开头或*_test.py结尾的文件
  • 测试方法/测试函数 默认必须是test开头
  • 测试类必须是Test开头
  • 测试类不能有构造方法 __init__

示例:
image-20240219174600866

运行时可以扫描到当前目录和当前子目录下的用例:

image-20240219175351372

3.常用参数

断言

断言借助Python中的运算符号和assert关键字实现;

# -*- coding: utf-8 -*-
# @Time    : 2024/2/19 17:56
# @Author  : 居里夫人吃橘子
# @File    : test_demo03.py
# @Software: PyCharm
import pytest"""测试不相等 !=<=>=测试包含 in测试不包含 not in判断是否为true: is True判断是否不为true: is not True/is Falseandor
"""def test_demo03():print('kkkkkkk')# assert 1 == 1# assert 1 != 2# assert 1 < 2# assert 1 > 2# assert 'a' in 'abc'# assert 'a' not in 'abc'# assert True# assert False# assert 1 == 1 and 1 < 2assert 1 == 2 or 1 < 2if __name__ == '__main__':pytest.main(['-s'])

运行参数

“-s” 参数 用于关闭捕捉,从而输出打印信息到控制台

image-20240219181159678

“-v” 参数 用于显示具体的用例执行信息‘

image-20240219181223263

“-k” 运行名称中包含某字符串的测试用例,类似于模糊查找

image-20240219181253437

‘-q’ 简化输出信息

image-20240219181513726

‘-x’ 如果出现一条测试用例失败,则退出测试

image-20240219181740670

指定运行测试文件中的方法或特定的类

pytest.main([‘-s’, ‘./son_dir/test_son01.py::TestDemo01’])

image-20240220094429285

用例控制

  • 在第N个用例失败后,结束测试;
pytest.main(['-s','test_demo03.py','--maxfail=1'])

image-20240220094942836

  • 失败用例重跑

安装插件pytest-rerunfailures,注意Python版本需要>3.5;pytest>5.0

pip install pytest-rerunfailures

# '--reruns'表示重跑次数;'--reruns-delay'表示失败后间隔几秒
pytest.main(['--reruns', '3', '--reruns-delay', '1', 'test_demo03.py'])  

image-20240220104339361

  • 通过标记表达式执行指定的用例

通过@pytest.mark.标记名装饰器标记指定的测试用例,使用pytest.main(['-m', '标记名'])执行;

注:标记名需要提前注册,创建pytest.ini文件;标记名称冒号后面的为注释,最好使用英文;

[pytest]
markers =ma: marks tests as smokeslow: slow testcase
@pytest.mark.slow
def test_demo05():print('5555555555')if __name__ == '__main__':pytest.main(['-s', 'test_demo03.py', '-m', 'slow'])

image-20240220095951444

  • 多进程执行测试用例

安装插件pytest-xdist;

pip install pytest-xdist

pytest.main(['-n', 'auto', 'test_demo03.py']) #auto为自动分配与计算机相匹配的进程;也可以指定数字

image-20240220103619825

setup和teardown

  • 不含有类的用例前置和后置

1.setup_module/teardown_module: 在当前文件中,在所有测试用例执行之前与之后执行
2.setup_function/teardown_function:在每个测试函数之前与之后执行

# -*- coding: utf-8 -*-
# @Time    : 2024/2/20 10:49
# @Author  : 居里夫人吃橘子
# @File    : test_set01.py
# @Software: PyCharm# 功能函数,相乘
import pytestdef multiply(a, b):return a * b"""不含有类的用例预置和后置函数第一批次:setup_module/teardown_module: 在当前文件中,在所有测试用例执行之前与之后执行第二批次:setup_function/teardown_function:在每个测试函数之前与之后执行,不能在类中使用ps:执行的顺序按优先级来的,改变方法位置结果也一样
"""# 在当前文件前置后置
def setup_module(module):print("setup_module===================")def teardown_module(module):print("teardown_module================")# 每个用例前置后置
def setup_function(function):print("setup_function===================")def teardown_function(function):print("teardown_function================")# ========测试用例=========
def test01():print("第一个用例")print(multiply(3, 4))def test02():print("第二个用例")print(multiply(4, 4))if __name__ == '__main__':pytest.main(['-s', 'test_set01.py'])

image-20240220142300991

  • 含有类的用例前置和后置

1.setup_class/teardown_class:在当前的测试类的开始和结束时执行
2.setup_method/teardown_method:在每个测试方法开始与结束时执行
ps:执行的顺序按优先级来的,改变方法位置结果也一样

# -*- coding: utf-8 -*-
# @Time    : 2024/2/20 14:23
# @Author  : 居里夫人吃橘子
# @File    : test_set02.py
# @Software: PyCharm# 功能函数
import pytestdef multiply(a, b):return a * bclass TestCase:"""第一批次:setup_class/teardown_class:在当前的测试类的开始和结束时执行第二批次:setup_method/teardown_method:在每个测试方法开始与结束时执行ps:执行的顺序按优先级来的,改变方法位置结果也一样"""# 每个测试类前置后置@classmethoddef setup_class(cls):print("setup_class========================")@classmethoddef teardown_class(cls):print("teardown_class======================")# 每个测试方法前置后置def setup_method(self, method):print("setup_method===================")def teardown_method(self, method):print("teardown_method================")# ============测试用例============def test01(self):print("类里的第一条用例")print(multiply(2, 2))def test02(self):print("类里的第二条用例")print(multiply(4, 4))if __name__ == '__main__':pytest.main(['-s', 'test_set02.py'])

image-20240220153317481

ini配置文件

  • ini配置文件可以配置一次后运行文件默认生效,注意文件名必须为pytest.ini

pytest.ini

[pytest]
# 01 命令行参数,默认加到执行过程中
addopts = -s -v
# 02 指定要运行的测试目录
testpaths = ./son_dir
# 03 指定要运行的测试文件规则
python_files = auto_*.py
# 04 指定要运行的类名规则
python_classes = A* B*
# 05 指定要运行的测试用例方法/函数名
python_functions = ff*

image-20240220164238799

image-20240220164250253

4.常用插件

插件列表网址:https://docs.pytest.org/en/latest/reference/plugin_list.html

5.pytest高阶用法

用例跳过

  • 有条件跳过测试用例:@pytest.mark.skipif(condition=3 > 2, reason='不想执行了')
  • 无条件跳过测试用例:@pytest.mark.skip
# -*- coding: utf-8 -*-
# @Time    : 2024/2/19 17:30
# @Author  : 居里夫人吃橘子
# @File    : test_01.py
# @Software: PyCharm
import pytestdef test_demo01():print('第一条测试用例')def test_demo02():print('第二条测试用例')# 如果condition中的条件为Ture,则跳过用例
@pytest.mark.skipif(condition=3 > 2, reason='不想执行了')
def test_demo03():print('第三条测试用例')# 无条件跳过测试用例
@pytest.mark.skip(reason='不想跑了')
def test_demo04():print('第四条测试用例')if __name__ == '__main__':pytest.main(['-s', 'test_01.py'])

参数化

pytest中的参数化使用装饰器@pytest.mark.parametrize

  • 多参数化
import pytest
import math# pytest 参数化
# "base, exponent, expected"用来定义参数名,通过数组定义时,每一个元组都是一条测试用例使用的数据;ids默认为None代表用例名称
@pytest.mark.parametrize("base, exponent, expected", [(2, 2, 4), (2, 3, 8), (1, 9, 1), (0, 9, 0)],ids=["case1", "case2", "case3", "case4"])
def test_pow(base, exponent, expected):assert math.pow(base, exponent) == expectedif __name__ == '__main__':pytest.main(['-s', '-v', 'test_fuc.py'])

image-20240220165829952

  • 函数参数化
import pytestdef return_data():return [('zz', '123456'), ('xz', '123456'), ('qs', '123456')]# 把函数return_data()的值都赋给'data'上;
@pytest.mark.parametrize('data', return_data())
def test_01(data):print(data[0], data[1])if __name__ == '__main__':pytest.main(['-s', 'test_func02.py'])
  • yaml文件驱动参数化

demo01.yaml

-name : '小李'sex : '男'-name: '小王'sex: '女'
import yaml
import pytestdef pase_yaml():with open('./file/demo01.yaml', 'r', encoding='utf-8') as f:data = yaml.load(f, Loader=yaml.FullLoader)return data@pytest.mark.parametrize('data', pase_yaml())
def test_demo01(data):print(data['name'])print(data['sex'])if __name__ == '__main__':pytest.main(['-s', '-v', 'test_fuc02.py'])

输出:

image-20240220172020943

6.pytest之Fixture使用

在测试中,fixture为测试提供了已定义的,可靠的和一致的上下文。这可能包括环境(例如,通过已知的参数配置数据库)或内容(例如,数据集)。Fixtures定义了构成测试准备阶段的步骤和数据。在pytest中,它们是为这些目的而定义的函数。它们也可以用来定义测试执行阶段;这是一个设计复杂用例的强大技术。测试功能通过参数访问由fixtures设置的服务,状态或其他操作环境。对于测试功能使用的每个fixture,通常在测试功能的定义中都有一个参数(在 fixture后命名)。
我们可以通过用修饰器@pytest.fixture来告诉pytest某个特定函数是一个fixture 。

fixture使用

  • 单个fix使用
import pytest@pytest.fixture
def fix01():print('这是fix01开始运行了')print('fix01运行结束')def test_demo01(fix01):print('测试用例1')if __name__ == '__main__':pytest.main(['-s', 'test_fix_demo01.py'])

image-20240221101756912

  • 多个fix使用,并接受fix中的数据
import pytest@pytest.fixture
def fix01():print('这是fix01开始运行了')print('fix01运行结束')@pytest.fixture
def fix02():print('这是fix02开始运行了')data = ['小王', '小李']return datadef test_demo01(fix01, fix02):print('测试用例1')print(fix02[0])if __name__ == '__main__':pytest.main(['-s', 'test_fix_demo02.py'])

image-20240221102330997

  • 多个fix之间互相调用
import pytest@pytest.fixture
def first_fix():return "a"@pytest.fixture
def order(first_fix):return [first_fix]# 测试用例
def test_string(order):order.append("b")print(order)if __name__ == '__main__':pytest.main(['-s', 'test_fix_demo03.py'])

image-20240221102654055

装饰器usefixtures

说明
@pytest.mark.usefixtures是Pytest调用fixture的方法之一,与直接传入fixture不同的是,它无法获取到被fixture装饰的函数的返回值。
@pytest.mark.usefixtures的使用场景是被测试函数需要多个fixture做前后置工作时使用,个人感觉没啥大用,因为fixture也可以同时传入多个fixture

示例

import pytest@pytest.fixture
def fix01():print('这是fix01开始运行了')print('fix01运行结束')@pytest.fixture
def fix02():print('这是fix02开始运行了')data = ['小王', '小李']return data@pytest.fixture
def fix03():print('这是fix03开始运行了')print('fix03运行结束')# @pytest.mark.usefixtures('fix01', 'fix03')
# # @pytest.mark.usefixtures('fix01','fix02') # 如果使用userfixtures('fix02')则会报错,因为userfixtures无法获取fix中的返回数据
# def test_demo01():
#     print('测试用例1')@pytest.mark.usefixtures('fix03')
@pytest.mark.usefixtures('fix01')
def test_demo01():print('测试用例1')if __name__ == '__main__':pytest.main(['-s', 'test_fix_demo04.py'])

注:@pytest.mark.usefixtures('fix01', 'fix03')叠加使用时按照就近原则执行,先在前的先执行,先在下的先执行;

7.pytest之conftest.py

介绍

conftest.py是fixture函数的一个集合,可以理解为公共的提取出来放在一个文件里,然后供其它模块调用。不同于普通被调用的模块,conftest.py使用时不需要导入,Pytest会自动查找。并且支持多个py文件同时调用其中的fixture

规则

  • 文件名必须为conftest.py;
  • conftest.py文件必须与测试用例在同一个包下

示例

conftest.py文件

import pytest@pytest.fixture
def fix01():print('这是fix01开始运行了')print('fix01运行结束')

test_conftest01.py

import pytest# 测试用例
def test_conf01(fix01):print('开始运行测试用例1')if __name__ == '__main__':pytest.main(['-s', 'test_conftest01.py'])

输出:

image-20240221133639842

示例2

conftest.py文件中可以设置@pytest.fixture(scope='',autouse='')中的参数:

  • scope表示在什么时候执行:

    session:表示在所有测试文件执行前执行一次

    package:在所有包执行前执行一次

    module:在每一个py文件前执行一次

    class:在每个测试类前执行一次

    function:在每个测试用例前执行一次

  • autouse=Ture表示测试用例中不需要写fixture的名称,自动生效,默认为False

conftest.py

import pytest@pytest.fixture(scope='session', autouse=True)
def fix01():print('开始执行session')@pytest.fixture(scope='package', autouse=True)
def fix2():print('开始执行package')@pytest.fixture(scope='module', autouse=True)
def fix3():print('开始执行module')@pytest.fixture(scope='class', autouse=True)
def fix4():print('开始执行class')

test_conftest01.py

import pytest# 测试用例
def test_conf01():print('开始运行测试用例1')# 当测试用例没有在class中时,也会默认执行一次class层级的fixture
def test_conf02():print('开始运行测试用例2')class TestDemo:def test_conf03(self):print('开始运行测试用例3')if __name__ == '__main__':pytest.main(['-s', 'test_conftest01.py'])

输出:

C:\Users\11361\AppData\Local\Programs\Python\Python38\python.exe D:\PythonTest\Study\class_pytest02\test_conftest_demo01\test_conftest01.py 
============================= test session starts =============================
platform win32 -- Python 3.8.7, pytest-8.0.1, pluggy-1.4.0
rootdir: D:\PythonTest\Study\class_pytest02\test_conftest_demo01
plugins: anyio-3.6.2, dependency-0.6.0, rerunfailures-13.0, xdist-3.5.0
collected 3 itemstest_conftest01.py 开始执行session
开始执行package
开始执行module
开始执行class开始执行function
开始运行测试用例1
.开始执行class开始执行function
开始运行测试用例2
.开始执行class开始执行function
开始运行测试用例3
.============================== 3 passed in 0.05s ==============================进程已结束,退出代码0

8.conftest+fixture+yield

yield介绍

"""1.程序开始执行以后,因为test函数终有yield关键字,所以test函数并不会真正的执行,而是先得到一个生成器g2.直到调用next方法,test函数正式开始执行,先执行test函数中的print方法,然后进入while循环3.程序遇到yield关键字,然后把yield相当于是return,return了一个8之后,程序停止,并没有执行赋值给a操作,此时next(g)语句执行完成,所以输出前面两行(第一行是while上面的print的结果,第二行是return出来的结果)4.程序执行print("=====================")5.又开始执行下面的print(next(g)),这个时候是从刚才next程序停止的地方开始执行,也就是要执行a的赋值操作,这个时候因为赋值操作的右边是没有值的,已经被return出去了这个时候a的值是none,所以接下来的输出是a:none6.程序会继续在whili里执行,又一次碰到yield,这个时候同样return出8,然后程序停止。print函数输出的8就是这次return出的8
"""def test():print("begin....")while True:a = yield 8print("a:", a)g = test()
print(next(g))
print("=====================")
print(next(g))
print("=====================")
print(next(g))#输出
begin....
8
=====================
a: None
8
=====================
a: None
8

前后置使用

conftest.py

import pytest@pytest.fixture
def fix1():print('conftest里的fix1')yieldprint("用例执行完成,我来扫尾")

test_yeild01.py

import pytestdef test_case(fix1):print("测试用例一")if __name__ == '__main__':pytest.main(['-s'])

输出:

C:\Users\11361\AppData\Local\Programs\Python\Python38\python.exe D:\PythonTest\Study\class_pytest02\test_yeild_demo01\test_yeild01.py 
============================= test session starts =============================
platform win32 -- Python 3.8.7, pytest-8.0.1, pluggy-1.4.0
rootdir: D:\PythonTest\Study\class_pytest02\test_yeild_demo01
plugins: anyio-3.6.2, dependency-0.6.0, rerunfailures-13.0, xdist-3.5.0
collected 1 itemtest_yeild01.py conftest里的fix1
测试用例一
.用例执行完成,我来扫尾============================== 1 passed in 0.06s ==============================进程已结束,退出代码0

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

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

相关文章

LVGL8.1在Windows显示图片

1、将这些宏的值改成1&#xff0c;以便支持这些格式&#xff1a; 2、 这两个地方&#xff1a; LV_USE_FS_WIN32 设置符号&#xff0c;大小写字母、“\”、“”等符号都可以。 LV_FS_WIN32_PATH 为一个目录&#xff0c;图片放入此目录。 3、载入图片&#xff1a; “M:color.pn…

TestNG与ExtentReport单元测试导出报告文档

TestNG与ExtentReport集成 目录 1 通过实现ITestListener的方法添加Reporter log 1.1 MyTestListener设置 1.2 输出结果 2 TestNG与ExtentReporter集成 2.1 项目结构 2.2 MyExtentReportListener设置 2.3 单多Suite、Test组合测试 2.3.1 单Suite单Test 2.3…

问题:Spark SQL 读不到 Flink 写入 Hudi 表的新数据,打开新 Session 才可见

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

k8s版本升级后,pod一直无法被调度

故障现象&#xff1a;升级完k8s后&#xff0c;部署pod时发现pod无法被调度到node节点&#xff0c;pod的状态一直是pending状态。 报错内容&#xff1a;User-scheduler pods fail with “no kind “KubeSchedulerConfiguration” is registered for version “kubescheduler.co…

HCIP---OSPF综合实验

一&#xff1a;实验要求 1、R4为ISP&#xff0c;其上只能配置IP地址&#xff0c;R4与其所有直连设备间均使用公有IP 2、R3-R5/6/7为MGRE环境&#xff0c;R3为中心站点 3、整个OSPF环境IP基于R4的环回 4、所有设备均可访问R4的环回 5、减少LSA的更新量&#xff0c;加快收敛…

怿星科技测试实验室(EPT LABS)服务介绍

据中国汽车工业协会数据&#xff0c;2023年我国汽车产销量分别达3016.1万辆和3009.4万辆&#xff0c;年产销量双双创历史新高&#xff0c;汽车行业进入了新时代。新汽车时代下的OEM竞争更激烈&#xff0c;汽车电子架构更复杂&#xff0c;研发周期更短&#xff0c;软件迭代更快&…

Cesium 问题:加载 gltf 格式的模型之后太小,如何让相机视角拉近

文章目录 问题分析问题 刚加载的模型太小,如何拉近视角放大 分析 在这里有两种方式进行拉近视角, 一种是点击复位进行视角拉近一种是刚加载就直接拉近视角// 模型三加载 this.damModel = new Cesium.Entity({name: "gltf模型",position:</

【AI大语言模型】ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮&#xff0c;可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

Maven私服搭建Nexus3

第一部分&#xff1a;仓库部署 下载地址&#xff1a;https://help.sonatype.com/en/download.html 备用下载链接&#xff0c;部分已经失效了 解压后会有两个文件夹&#xff1a; nexus-3.20.1-01 sonatype-work 访问地址配置路径 \nexus-3.20.1-01\bin\nexus.vmoptions -Xms1…

【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子

作者推荐 视频算法专题 涉及知识点 广度优先搜索 网格 割点 并集查找 LeetCode:1263. 推箱子 「推箱子」是一款风靡全球的益智小游戏&#xff0c;玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 m x n 的网格 grid 表示&#xff0c;其中每个元素可以是墙、地板或…

Android13 针对low memory killer内存调优

引入概念 在旧版本的安卓系统中&#xff0c;当触发lmk&#xff08;low memory killer&#xff09;的时候一般认为就是内存不足导致&#xff0c;但是随着安卓版本的增加lmk的判断标准已经不仅仅是内存剩余大小&#xff0c;io&#xff0c;cpu同样会做评判&#xff0c;从而保证设备…

挑战杯 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

阿里巴巴中国站获得淘口令真实url API(1688.item_password)

阿里巴巴&#xff08;1688.com&#xff09;是一个B2B电商平台&#xff0c;而淘口令&#xff08;或称为淘宝口令&#xff09;是一种在阿里巴巴集团旗下的淘宝和天猫平台中分享商品或活动链接的特殊形式。淘口令通常包含一串字符&#xff0c;用户可以复制这串字符并在淘宝或天猫的…

YOLOv5代码解读[02] models/yolov5l.yaml文件解析

文章目录 YOLOv5代码解读[02] models/yolov5l.yaml文件解析yolov5l.yaml文件检测头1--->耦合头检测头2--->解耦头检测头3--->ASFF检测头Model类解析parse_model函数 YOLOv5代码解读[02] models/yolov5l.yaml文件解析 yolov5l.yaml文件 # YOLOv5 &#x1f680; by Ult…

Maven 私服 Nexus3

一、Maven和Nexus3 简介 Maven是一个采用纯Java编写的开源项目管理工具&#xff0c;采用一种被称之为Project Object Model(POM)概念来管理项目&#xff0c;所有的项目配置信息都被定义在一个叫做POM.xml的文件中, 通过该文件Maven可以管理项目的整个生命周期&#xff0c;包括…

Unity xLua开发环境搭建与基础进阶

Unity是一款非常流行的游戏开发引擎&#xff0c;而xLua是一个为Unity开发者提供的Lua框架&#xff0c;可以让开发者使用Lua语言来进行游戏开发。在本文中&#xff0c;我们将介绍如何搭建Unity xLua开发环境&#xff0c;并进行基础进阶的学习。 环境搭建 首先&#xff0c;我们需…

华为算法题 go语言

1 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返…

Internet Download Manager 6.42.3 (IDM) 中文免激活绿色版

相信很多网友都遇到过一种情况&#xff0c;网页有些视频资源或者音频资源不知道如何下载&#xff0c;一直不知道如何解决&#xff0c;为此小编特意带来了这款&#xff1a;Internet Download Manager电脑版&#xff0c;这是一款非常专业且十分好用的下载工具&#xff0c;也就是大…

Mysql系列之命令行登录、连接工具登录、数据库表常用命令

登录与常用命令 连接工具登录命令行登录数据库1、查看数据库2、指定数据库3、查看当前数据库4、建库语句 数据表1、查看数据表2、查看表结构信息3、查看建表语句4、建表语句 连接工具登录 首先下载mysql连接工具&#xff0c;解压后直接打开软件&#xff0c;按以下步骤操作&…

单调栈总结以及Leetcode案例解读与复盘

单调栈总结以及Leetcode案例解读与复盘 一、单调栈是什么&#xff1f; 单调栈&#xff08;monotonous stack&#xff09;是指栈的内部从栈底到栈顶满足单调性的栈结构。 二、如何维护单调性 新元素入栈时&#xff0c;会与栈顶元素进行比较&#xff0c;使得栈始终保持单调性…