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

pytest与testNg自动化框架

一.pytest

1.安装pytest: pip install pytest
2.编写用例 - 收集用例 - 执行用例 - 生成报告
3.pytest如何自动识别用例

 识别规则如下:
1、搜索根目录:默认从当前目录中搜集测试用例,即在哪个目录下运行pytest命令,则从哪个目录当中搜索;
2、搜索规则:
1)搜索文件:符合命名规则 test_*.py 或者 *_test.py 的文件
2)在满足1)的文件中识别用例的规则:
2.1)以test_开头的函数名;
2.2)以Test开头的测试类(没有__init__函数)当中,以test_开头的函数
4.根据标记名运行测试用例
在pytest当中,先给用例打标记,在运行时,通过标记名来过滤测试用例。
1)注册标签名
通过pytest.ini配置文件注册。在pytest.ini文件当中:
[pytest] # 固定的section名
markers= # 固定的option名称
  标签名1: 标签名的说明内容。
  标签名2
  标签名N
2)在测试用例/测试类中给用例打标记(只能使用已注册的标记名)
在 测试用例的前面加上:@pytest.mark.已注册标签名
3)调用pytest.main()函数,将运行时的参数以列表传进去
根据标签名过滤用例的参数为:-m 标签名
5.fixture用法
我们在编写测试用例,都会涉及到用例执行之前的环境准备工作,和用例执行之后的环境清理工作。
用例执行之前的环境准备工作代码(前置工作代码)
用例执行之后的环境清理工作(后置工作代码)
通常,在自动化测试框架当中,都叫做fixture。
通过@pytest.fixture装饰器来定义fixture。一个函数被@pytest.fixture装饰,那么这个函数就是fixture。
使用fixture时,分为二个部分:fixture定义、fixture调用。
除此之外,还有fixture的共享机制,嵌套调用机制。
1)定义fixture
前置准备工作代码和后置清理工作代码,都写在一个函数里面。通过yeild关键字,区分前置代码和后置代码 。yeild之前的代码为前置代码,yeild之后的代码为后置代码,在实际应用场景当中,可以只有前置准备工作代码,也可以只有后置清理工作代码。
fixture有4个作用域:测试会话(session)、测试模块(module)、测试类(class)、测试用例(function)
通过@pytest.fixture(scope=作用域)来设置。默认情况下,scope=function
session:pytest执行测试用例的整个过程,称为会话
设置scope为session。autouse表示自动使用,一般 function、class、module 级别的 fixture,都不会去开启 autouse=True
@pytest.fixture(scope=“session”,autouse=True)
def init3():
yield
print(“用例执行之后,执行的代码”) # 只有用例执行之后的后置清理代
2)fixture的返回值设置:yeild 返回值(前置代码里的变量,要传递给测试用例去使用。那么首先,就得fixture函数返回变量才行。)
3)调用fixture
调用方法有2种:

  • 在测试用例/测试类上面加上:@pytest.mark.usefixture(“fixture的函数名字”)
  • 将fixture函数名,作为测试用例函数的参数(当用这一种时,第一种可不用)
    6.conftest.py共享机制
    在某些大的业务场景下,很多用例当中,会使用相同的前置准备工作,和后置清理工作。
    pytest框架提供了一个fixture共享的机制 ,可以让不同的用例模块,使用同一个fixture。这就是conftest.py文件。在测试用例文件当中,不需要引入conftest.py文件。直接调用fixture的函数名,会自动去conftest.py当中查找的。
    1)conftest.py层级作用域
    conftest.py 在哪个目录下,此目录下(包含子目录)的所有用例可使用其中的fixture
    根目录下的conftest.py,作用域是整个项目。
    某个python包内,作用域就是该包内
    那么有个问题,如果出现了同名fixture怎么办呢?
    这里涉及到了,测试用例在执行时,调用fixture的顺序。一般来讲,按 就近原则 调用。
    测试用例文件中的fixture > 当前目录中的fixture > 上级目录中的fixture > 根目录中的fixture
    7.fixture嵌套
    嵌套使用即:一个fixture,可以做另外一个fixture的参数,即 init()可作为ini_req_assert函数的入参
    如果用例当中,调用了func_fix3,那么执行顺序为:
    【低级别可调用高级别或同级别 ,反之则不行】
    func_fix的前置
    func_fix3的前置
    ----测试用例----
    func_fix3的后置
    func_fix的后置
@pytest.fixture(scope="class")
def func_fix():print("---- 注册帐号 开始1 -----")yield Trueprint("---- 注册帐号 结束4 -----")@pytest.fixture
def func_fix3(func_fix):print("****  登陆账号2 ****")print(func_fix)yield func_fixprint("****  登陆完成3 ****")

8.数据驱动
在测试用例方法上打标签@pytest.mark.parametrize(“case”, cases)
9.并发测试
一般是利用第三方插件pytest-xdist,前提是用例之间没有依赖关系且执行是没有顺序的,所以不适合接口自动化
10.失败重试
有利于提高自动化用例的稳定性,可以通过pytest的pytest-rerunfailures插件来实现用例重跑,具体有两种形式,一种是全局通过命令行: Pytest --reruns 2 --reruns-delay 5,一种是局部在案例方法上打标记@pytest.mark.flaky(reruns=2, reruns_delay=1)

11.pytest跳过测试用例

1.无条件跳过------@pytest.mark.skip()
在测试方法或类前面加上装饰器@pytest.mark.skip(reason=None),表示该条测试用例不执行,参数reason代表跳过的原因,reason可省略
2.有条件跳过------@pytest.mark.skipif()
@pytest.mark.skipif(condition, reason=“xxx”)
说明:condition—跳过的条件,如果为True则跳过该函数,如果为False则不跳过
12.pytest执行顺序
利用pytest-ordering插件,通过装饰器@pytest.mark.run(order=1)来进行控制,数字越小,越前执行

13.pytest参数化作用域
@pytest.mark.parametrize()装饰器方式进行参数化
pytest.fixture()方式进行参数化,fixture装饰的函数可以作为参数传入其他函数
conftest.py文件中存放参数化函数,可作用于模块内的所有测试用例
14.为测试用例设置超时时间
可以使用pytest-timeout插件来为测试用例设置超时时间
15.pytest优势
直接使用assert进行断言
失败用例提供非常详细的错误信息
自动发现和收集测试模块和用例
灵活的fixture管理
mark用例标记
丰富的插件系统
支持失败重试
兼容了unittest
16.unittest和pytest的区别
1.用例设计规则
unittest:
(1)试类必须继承unittest.TestCase
(2)测试函数必须以”test_”开头
pytest:
(1)测试文件的文件名必须以”test_”开头,或者以”_test”结尾
(2)测试类命名必须以”Test”开头
(3)测试函数名必须以”test”开头
2.断言
unittest:
assertXXX
pytest:
直接使用assert进行断言
3.用例前置和后置
unittest:
(1)通过setup每个用例执行前执行,teardown每个用例执行后执行
(2)通过setupclass类里面所有用例执行前执行,teardownclass类里面所有用例执行后执行
每个测试文件必须单独设置前后置
pytest:
通过fixture夹具可以自定义pytest的前置和后置,yield之前是为前置,yield之后为后置,格式@pytest.fixture(scope=“XXX”),scope:有四个级别,function(默认),class,module,session
创建conftest.py文件,当前目录下所有的测试文件都能自动调用该夹具
4.参数化
unittest:参数化需要依赖第三方库,使用ddt去做参数化
pytest:通过装饰器@pytest.mark.parametrize来实现
5.报告展示
unittest:通过HTMLTestRunner生成
pytest:可以集成allure插件生成
6.失败重运行
unittest:不支持
pytest:pytest --reruns=2(2表示重运行2次)
7.挑选用例执行
unittest:不支持
pytest:
(1)创建一个pytest.ini文件,
[pytest]
markers = demo(标记名) : just for display(备注名,如果不写 可以不加冒号)
(2) 在要执行的测试用例/测试类前面加上: @pytest.mark.标记名
(3)main.py文件中添加[-m ,‘要执行用例的标签名’] 根据标签名筛选用例并执行
8.安装需求不同
pytest为第三方单元测试库,需额外安装;unittest为标准库,无需额外安装

二:TestNg

概述:TestNg是Java中的一个测试框架,可以用来做单元测试和集成测试,它可以用注解来强化测试,测试人员一般用它来进行自动化测试用例的执行。
testng.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<!-- 套件 -->
<!-- TestNG的执行用例的方式:先是把每个测试类文件下找到添加了@Test注释的方法,然后把这些测试方法添加到一个测试套件(Test Suite),然后去执行这个Test Suit
从宏观上解释测试用例的执行就是这么一个过程。从配置文件上来看,就是执行TestNG.xml文件。直接执行时使用的是默认的testng.xml,我们可以通过自己编写TestNG.xml来运行脚本
TestNG通过设置testng.xml文件能做以下事情:
1.创建来源不同的包,类,方法的测试套件
2.包括一些选项,例如失败的用例可以重跑
3.支持正则表达式
4.运行把外部参数传入测试方法
5.支持配置多线程的执行环境--><!-- suite管理多个test,而test管理多个class,最小单元是一个class文件-->
<suite name="Default Suite"><parameter name = "browser" value = "firfox"></parameter><parameter name="server" value="172.18.40.37"></parameter><test name ="Java_Learn" ><!-- 分组测试:分组测试类似于加标签,每个测试方法给一个标记,当运行时可以根据组来区分运行,如仅运行某组的用例 --><!--<groups><run><include  name = "API Test"/><include name ="Function Test"/> --><!--excloude标签实现除了这个标签以外的方法  --><!--<exclude   name = "API Test"/><exclude  name ="Function Test"/> </run> --><!-- 组依赖 --><!-- <dependencies><group name="app" depends-on="tomcat" /></dependencies></groups>--><classes><!--<class name = "com.gfapp.test.TestGroupsDemo" /><class name = "com.gfapp.test.TestDependenceDemo" />--><class name = "com.gfapp.test.Testparam" /><listener class-name="com.lemon.listener.AllureReportListener"/><listener class-name="com.gfapp.common.TestngListener" />	</classes></test>
</suite>

(1)一个suite(套件)由一个或多个测试(test)构成
(2)一个test(测试)是由多个类(class)组成
(3)一个class(类)是由一个或多个方法(method)组成
是testng.xml的根标记
name:套件的名称,这是一个强制属性
parallel:TestNG是否运行不同的线程来运行这个套件,默认为none,其他级别为methods、tests、classes、instances
thread-count:如果启用并行模式(忽略其他方式),则为使用的线程数

<!--多线程的数量是2:thread-count="2"-->
<!--tests级别:不同的test tag 下的用例,可以在不同的线程下执行;相同的test tag下的用例,只能在同一个线程中执行thread-count:代表最大并发线程数
-->

1.常用注解
@BeforeMethod:注释方法将在每个测试方法之前运行
@AfterMethod:注释方法将在每个测试方法之后运行
@BeforeClass:在某个测试类(class)所有测试方法执行开始之前开始执行,注释方法仅运行一次
@AfterClass:在某个测试类(class)所有测试方法执行结束之后开始执行,注释方法仅运行一次
@BeforeTest:在某个测试(test)所有测试方法执行开始之前开始执行
@AfterTest:在某个测试(test)所有测试方法执行结束之后开始执行
@BeforeSuite:在某个测试套件(suite)所有测试方法执行开始之前执行
@AfterSuite:在某个测试套件(suite)所有测试方法执行结束之后执行
@DataProvider:数据提供者,提供数据的方法,dataProvider作为数据提供者只能返回Object[][]和Iterator<Object[]>类型的数据,要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称
@Parameters:描述如何将参数传递给@Test方法
@Test:测试方法
注意:除了@Parameters注解的方法中可以有形参,其他注解的方法均是空
@Tes中常用的参数:
@Test(enabled = false):用例就不会运行
@Test(timeOut = 5000):超时测试
@Test(groups=“group2”):分组测试
@Test(expectedExceptions = ArithmeticException.class):预期异常测试
@Test(dependsOnMethods= {“TestNgLearn1”}):依赖测试(硬依赖)
分为hard依赖和soft依赖
hard依赖:默认为此依赖方式,即其所有依赖的methods或者groups必须全部pass,否则被标识依赖的类或者方法将会被略过,在报告中标识为skip,此为默认的依赖方式;
soft依赖:此方式下,其依赖的方法或者组有不是全部pass也不会影响被标识依赖的类或者方法的运行,注意如果使用此方式,则依赖者和被依赖者之间必须不存在成功失败的因果关系,否则会导致用例失败。此方法在注解中需要加入alwaysRun=true即可,如@Test(dependsOnMethods= {“TestNgLearn1”}, alwaysRun=true);
2.testNg常用监听器
IAnnotationTransformer
IAnnotationTransformer2
IHookable
IInvokedMethodListener
IMethodInterceptor
IReporter
ISuiteListener
ITestListener
3.Testng的监听器是怎么使用的?TestNg的数据驱动返回的是什么?
Testng的监听器在自动化中的使用主要集中在失败截图和失败重试
失败重试的需要实现两个接口IRetryAnalyzer、IAnnotationTransformer
失败截图的需要实现ITestListener
实现后需要在testng的配置文件中增加监听标签
Testng的数据驱动返回结果是一个二维数组,因此在做数据驱动时,不管我们的数据是存在excel、xml
或者数据库等存储介质中,最终我们都需要将他们转换成二维数组
4.失败重试
分为局部和全局
局部:a.新建一个类FaileRetry实现IRetryAnalyzer接口,重写retry方法
b.新建一个测试类,在测试方法中加上 @Test(retryAnalyzer = FaileRetry.class)注解
全局:a.跟局部一样先新建一个类FaileRetry实现IRetryAnalyzer接口,重写retry方法,区别是当前正在运行的次数的变量要是公共静态的共享变量
b.新建一个类RetryListener实现IAnnotationTransformer接口,重写transform方法,该类的作用是用来监听所有的测试方法是否有retryAnalyzer注解属性,如果有该属性则不会执行我们设定的重跑机制(局部重跑的优先级比全局的高)
c.第一条案例失败重试次数到达最大值时,后面的案例则永远不会进入重跑机制,所以在每条案例重跑完后,需要重置当前正在运行的次数为初始值
d.有了重试以后,发现重试执行的用例,全部记录到跳过(skipped)里面了,这样会影响我们的测试总数,测试结束后把重试的用例结果从skipped中去掉
e.将监听类添加到testng.xml文件中
注意点:testng版本尽量用高版本,不然可能会出现死循环等其他问题,我用6.14.3版本
具体代码参考:https://blog.csdn.net/Caoqingqing521/article/details/110792727

5.TestNG多线程测试时
a、测试方法中的并发
在测试方法上加入@Test(threadPoolSize = 5,invocationCount = 10)
说明: threadPoolSize 表明用于调用该方法的线程池容量,该例就是同时起 5 个线程并行执行该方法;invocationCount 表示该方法总计需要被执行的次数。
b. test, class, method级别的并发,可以通过在 testng.xml 中的 suite tag 下设置



它们的区别如下:
tests 级别:不同 test tag 下的用例可以在不同的线程执行,相同 test tag 下的用例只能在同一个线程中执行。
classes 级别:不同 class tag 下的用例可以在不同的线程执行,相同 class tag 下的用例只能在同一个线程中执行。
methods 级别:所有用例都可以在不同的线程去执
6.参数传递方式
a.通过parameter传参
直接在测试方法上加上@Parameters({ “browser”, “server” }) //
xml文件里


b.通过dataprovider传参
// 注解的方法必须返回一个Object[][]和Iterator<Object[]>类型的数据
// 提供数据的一个测试方法。注解的方法返回一个Object[][],其中每个对象[]的测试方法的参数列表中可以分配。该@Test方法
// 希望从这个DataProvider的接收数据,需要使用一个dataProvider名称等于这个注解名的名字
@DataProvider(name = “user”)
public Object[][] getstr() {
return new Object[][] { { “admin”, “123456”, “登录成功” }, { “admin”, “12345”, “密码错误” },
};
}
// DataProvider返回的是一个Object的二维数组,二维数组中的每个一维数组都会传递给调用函数,作为参数使用。运行的时候会发现
// @Test 标识的test
// method被执行的次数和object[][]包含的一维数组的个数是一致的,而@Test标识的函数的参数个数,也和object内一维数组内的元素数是一致的
@Test(dataProvider = “user”)
private void sout(String uname, String pword, String msg) {
System.out.println(uname + “->” + pword + “->” + msg);
}

相关文章:

pytest与testNg自动化框架

一.pytest 1.安装pytest&#xff1a; pip install pytest 2.编写用例 - 收集用例 - 执行用例 - 生成报告 3.pytest如何自动识别用例  识别规则如下&#xff1a; 1、搜索根目录&#xff1a;默认从当前目录中搜集测试用例&#xff0c;即在哪个目录下运行pytest命令&#xff0c;…...

数据库安全:Hadoop 未授权访问-命令执行漏洞.

数据库安全&#xff1a;Hadoop 未授权访问-命令执行漏洞. Hadoop 未授权访问主要是因为 Hadoop YARN 资源管理系统配置不当&#xff0c;导致可以未经授权进行访问&#xff0c;从而被攻击者恶意利用。攻击者无需认证即可通过 RESTAPI 部署任务来执行任意指令&#xff0c;最终完…...

前端---认识HTML

文章目录 什么是HTML&#xff1f;HTML的读取、运行HTML的标签注释标签标题标签段落标签换行标签格式化标签图片标签a标签表格标签列表标签表单标签form标签input标签文本框单选框复选框普通按钮提交按钮文件选择框 select标签textarea标签特殊标签div标签span标签 什么是HTML&a…...

竞赛 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…...

保姆级jupyter lab配置清单

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…...

数据结构预算法--链表(单链表,双向链表)

1.链表 目录 1.链表 1.1链表的概念及结构 1.2 链表的分类 2.单链表的实现(不带哨兵位&#xff09; 2.1接口函数 2.2函数的实现 3.双向链表的实现&#xff08;带哨兵位&#xff09; 3.1接口函数 3.2函数的实现 1.1链表的概念及结构 概念&#xff1a;链表是一种物理存储结…...

数据结构线性表——栈

前言&#xff1a;哈喽小伙伴们&#xff0c;今天我们将一起进入数据结构线性表的第四篇章——栈的讲解&#xff0c;栈还是比较简单的哦&#xff0c;跟紧博主的思路&#xff0c;不要掉队哦。 目录 一.什么是栈 二.如何实现栈 三.栈的实现 栈的初始化 四.栈的操作 1.数据入栈…...

自定义 springboot 启动器 starter 与自动装配原理

Maven 依赖 classpath 类路径管理 Maven 项目中的类路径添加来源分为三类 自定义 springboot starter starter 启动器定义的规则自定义 starter 示例 自动装配 文章链接...

16 _ 二分查找(下):如何快速定位IP对应的省份地址?

通过IP地址来查找IP归属地的功能,不知道你有没有用过?没用过也没关系,你现在可以打开百度,在搜索框里随便输一个IP地址,就会看到它的归属地。 这个功能并不复杂,它是通过维护一个很大的IP地址库来实现的。地址库中包括IP地址范围和归属地的对应关系。 当我们想要查询202…...

vb.net圣经带快捷键,用原装的数据库

Imports System.Data.SqlServerCe Imports System.Text.RegularExpressions Imports System.Data.OleDbPublic Class Form1Dim jiuyue As String() {"创", "出", "利", "民", "申", "书", "士", "…...

Unity中Shader的雾效

文章目录 前言一、Unity中的雾效在哪开启二、Unity中不同种类雾的区别1、线性雾2、指数雾1&#xff08;推荐用这个&#xff0c;兼具效果和性能&#xff09;3、指数雾2&#xff08;效果更真实&#xff0c;性能消耗多&#xff09; 三、在我们自己的Shader中实现判断&#xff0c;是…...

企业微信开发教程一:添加企微应用流程图解以及常见问题图文说明

最近在前辈的基础上新添加了一个企微应用&#xff0c;过程中遇到了一些卡点&#xff0c;这里一一通过图片标注与注释的方式记录一下&#xff0c;希望能给后来人提供一些清晰明了的帮助&#xff0c;话不多说&#xff0c;大家直接看图吧。 &#xff08;文中包括一些本项目独有的配…...

【LeetCode】67. 二进制求和

67. 二进制求和 难度&#xff1a;简单 题目 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a "11", b "1" 输出&#xff1a;"100"示例 2&#xff1a; 输入&#xff1a;a "…...

【LeetCode刷题笔记】二叉树(一)

102. 二叉树的层序遍历 解题思路: 1. BFS广度优先遍历 ,使用队列,按层访问 解题思路: 2. 前序遍历 , 递归 ,在递归方法参数中,将 层索引...

NativeScript开发ios应用,怎么生成测试程序?

在 NativeScript 中&#xff0c;要部署 iOS 应用程序&#xff0c;你需要遵循以下一般步骤&#xff1a; 1、确保开发环境&#xff1a; 确保你的开发环境中已经安装了 Xcode&#xff0c;并且你有一个有效的 Apple 开发者账号。 2、构建 iOS 应用&#xff1a; 在你的 NativeScri…...

Js面试题:说一下js的模块化?

作用&#xff1a; 一个模块就是实现某个特定功能的文件&#xff0c;在文件中定义的变量、函数、类都是私有的&#xff0c;对其他文件不可见。 为了解决引入多个js文件时&#xff0c;出现 命名冲突、污染作用域 等问题 AMD&#xff1a; 浏览器端模块解决方案 AMD即是“异步模块定…...

媒体转码软件Media Encoder 2024 mac中文版功能介绍

Media Encoder 2024 mac是一款媒体转码软件&#xff0c;它可以将视频从一种格式转码为另一种格式&#xff0c;支持H.265、HDR10等多种编码格式&#xff0c;同时优化了视频质量&#xff0c;提高了编码速度。此外&#xff0c;Media Encoder 2024还支持收录、创建代理和输出各种格…...

整治PPOCRLabel中cv2文件读取问题(更新中)

PPOCRLabel 使用PPOCRLabel对ocr预标注结果进行纠正由于PaddleOCR代码库十分混乱,路径经常乱调pip和代码库的代码&#xff08;pip库和源码冲突&#xff09;,经常报错&#xff0c;因此paddleocr和ppocrlabel都是使用pip包;PPOCRLabel中使用了cv2进行图片数据的读取&#xff0c;…...

网络运维Day09-补充

文章目录 rsync增量同步scp与rsync的区别rsync常用选项 rsync本地实验rsync远程同步实验练习上传练习下载 总结 rsync增量同步 rsync是增量同步的一种工具&#xff0c;可以实现本地目录之间数据同步&#xff0c;也可以实现远程跨主机之间数据同步 scp与rsync的区别 scp属于全…...

【C++】【Opencv】minMaxLoc()函数详解和示例

minMaxLoc&#xff08;&#xff09;函数 是 OpenCV 库中的一个函数&#xff0c;用于找到一个多维数组中的最小值和最大值&#xff0c;以及它们的位置。这个函数对于处理图像和数组非常有用。本文通过参数和示例详解&#xff0c;帮助大家理解和使用该函数。 参数详解 函数原型…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

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

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

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

OCR MLLM Evaluation

为什么需要评测体系&#xff1f;——背景与矛盾 ​​ 能干的事&#xff1a;​​ 看清楚发票、身份证上的字&#xff08;准确率>90%&#xff09;&#xff0c;速度飞快&#xff08;眨眼间完成&#xff09;。​​干不了的事&#xff1a;​​ 碰到复杂表格&#xff08;合并单元…...