测试入门篇
测试:
这里写目录标题
- 测试:
- 基础概念:
- BUG:
- 创建一个合理的bug:
- bug 的级别:
- 跟开发争执如何解决:
- 测试用例:
- 编写测试用例的万能公式:
- 案例: 登录功能的测试:
- 设计测试用例的方法:
- 进阶篇(主要介绍测试方法):
- 自动化测试:
- 自动化测试的分类:
- selenium( web 自动化测试工具 )
- 环境部署:
- 什么是驱动:
- 使用selenium实现web自动化测试实例:
- selenium常用方法:
- 常见元素操作方法:
- 窗口:
- 等待:
- 浏览器操作:
- 弹窗:
- 选择框:
- 执行脚本:
- 文件的上传:
- 浏览器的参数设置
- Junit
- 注解:
- 断言:
- 用例的执行顺序:
- 参数化:
- 测试套件
基础概念:
-
什么是需求
-
用户需求: 简单可以理解为甲方的需求,程序员需要完成的用户需求
-
软件需求: 也就是功能需求,该需求会详细描述开发人员需要实现的功能.
软件需求是测试人员进行测试的基本依据.
测试人员根据软件需求文档来设计测试用例
用户需求不能作为开发和测试的基本依据,因为用户需求不一定合理,需要将用户需求转为软件需求
-
-
什么是测试用例:
测试人员在执行之前需要编写测试用例.测试用例的好怀与产品的测试质量有很大的关联关系.
测试用例是实施测试而向测试的系统提供的一组集合,这组集合包括
-
测试环境.
-
测试步骤.
-
测试数据.
-
预期结果.
现在测试用例都是使用思维导图的方式来编写
-
-
什么是BUG
也就是软件错误:当且仅当规格说明是存在的并且正确,程序与规格说明之间的不匹配才是错误。当需求规格说明书没有提到的功能,判断标准以最终用户为准:当程序没有实现其最终用户合理预期的功能要求时,就是软件错误。
也就是功能不符合软件需求说明书或者需求说明书没有说明.但是功能不符合用户需求功能的就是软件错误也就是BUG.
-
开发模型:
就是开发流程或者项目的推进流程(软件的生命周期)
-
需求分析.(需求是否合理)
-
计划,(什么时候开始,整个流程多久,什么时候结束)
-
设计(将需求细化,进行技术设计(使用什么框架,设计哪些接口,采用什么技术))
-
编码(参照需求文档编码)
-
测试 (编写测试用例并根据测试用例进行测试)
-
运行与维护
瀑布模型:
线性结构: 意味着前一个阶段结束后下一个阶段才能开始.可能会导致风险在后期的测试阶段才暴露,失去提前纠正的机会.
螺旋模型:
在瀑布模型的基础上增加了风险分析,测试随着开发的迭代而迭代
增量模型:
将项目进行模块化,使得每个模块能够进行独立开发与测试.
迭代模型:
迭代模型会先完成基础功能的版本,再经历一起一起的迭代优化,慢慢完善.
敏捷模型:
不重视开发的流程,重视开发的效率.
- 敏捷宣言:
-
强调团队内部人员尽可能的进行高效的沟通,
-
敏捷模型最终的标准就是可交付的软件
-
敏捷宣言的特点: 轻流程, 轻文档, 重目标, 重产出
敏捷模型scrum:
每个迭代周期为1 - 4 周, 一般为一周
了解三个重要的角色和五个重要会议:
三个重要角色:
-
-
产品经理
-
项目经理
-
研发团队
五个重要会议:
-
需求发布会议 : 确定本次迭代要实现的需求
-
迭代计划会议 : 明确需求拆分成一个个任务,明确每个任务对应的责任人.初步评估工时.
-
每日会议: 研发团员需要回答三个问题: 昨天做了什么,今天要做什么.遇到了什么问题.每日会议结束之后的产物就是可交付的软件
-
演示会议: 每日会议结束之后的产物: 用户的需求
-
回顾会议: 回顾之前开发的可取点以及需要改进点
-
测试流程.
-
需求分析
-
测试计划
-
测试设计与开发
-
执行测试
-
测试评估
测试V模型:
明确测试有不同的类型 而且每个类型与前期开发工作之前的队友关系
缺陷就是测试后置
测试W模型:
测试与开发是同步进行的.能够全面,尽快地发现问题.
开发和测试虽然是同步的,但是仍然存在前后关系.
-
BUG:
创建一个合理的bug:
创建bug的目标是为了能够让其他人尝试复现.
创建bug的要素:
-
问题的版本
-
发现问题的环境
-
发现问题的步骤
-
预期结果
-
实际结果
bug 的级别:
-
崩溃 : 一般是系统崩溃,死机,数据库数据丢失等.
-
严重 : 主要功能丧失,用户数据丢失,功能设计与需求严重不符等.
-
一般 : 功能没有完全实现但是不影响使用,查询时间长等.
-
次要 : 功能已经实现,但是界面或者性能缺陷,一般是建议优化类问题.
bug的什么周期:
-
new: 新发现的bug.
-
open: 确认是bug,并且认为需要进行修改
-
Rejected: 认为不是bug,拒绝修改
-
delay: 延迟修改.
-
fixed: 立即修改.
-
closed: 认为bug已经修改并且验证成功, bug关闭
-
reopen: 验证失败,需要重新修改.
跟开发争执如何解决:
-
检查自身,检查bug是否描述不清楚
-
对于等级低的bug,要劝说开发站在用户的角度考虑问题
-
BUG的定级要有理有据.
-
不光能提出bug,最好也能提出解决方案.
-
组织bug评审: 邀请代表参加(产品代表,开发代表,测试代表等)
bug评审会议要解决以下问题:
-
如何修改bug
-
如何避免类似的问题发生
-
-
对事不对人.
测试用例:
编写测试用例的万能公式:
功能测试+性能测试+界面测试+兼容性测试+易用性测试+安全测试
-
功能测试: 对产品的功能设计测试用例 (来源是需求文档 / 日常经验)
-
性能测试: 功能没有问题不代表性能好.所以需要进行性能的测试
-
界面测试: 大小,颜色,材质,形状等等
-
兼容性测试: 软件的不同版本是否兼容.不同的系统版本,不同浏览器,数据兼容性等.
-
易用性测试: 产品是否具备简单易上手的属性,
-
安全测试: 用户的隐私数据是否加密,SQL注入,越权问题
案例: 登录功能的测试:
设计测试用例的方法:
-
等价类:
也就是当我们需要测试的数据特别多时,我们可以将测试数据分为两个等价类: 有效等价类和无效等价类, 有效等价类中是针对需求文档有意义的测试数据,无效等价类是针对需求文档无意义的测试数据,从有效等价类和无效等价类中选出一个测试用例作为代表,如果这个测试用例正确,则认为等价类中的测试用例都正确.
例如密码的测试: 要求为6 - 18位:
有效等价类 : 6-18位 (代表 10位)
无效等价类 : 小于6位 ( 代表 1 位) 大于18位(代表 20 位)
-
边界值: 依据边界值测试.
同样以密码的测试为例:
有效边界: 6 和 18
无效边界: 5 和 19
-
判定表(因果图)
使用场景: 输入条件的组合对应不同的结果
判定表设计测试用例的步骤:
-
确认输入条件和输出条件
-
找出输入条件和输出条件之间的关系
-
画判定表
-
根据判定表编写测试用例
案例:
判定表:
根据判定表编写测试用例:
-
-
场景设计法:
分为基本事件流和备选事件流
以ATM取钱为例: 先设计基本事件流和备选事件流,再根据事件流编写测试用例.
如何确定边界值:
-
正交法:
allpairs
案例: 测试:
-
找出因素数和水平数
-
使用allparis生成正交表
命令为: allpairs.exe 0109.txt>0109jg.txt
-
根据正交表编写测试用例:
-
补充重要的测试用例:
如何使用allparis生成正交表
-
-
错误猜测法:
依赖个人经验来编写测试用例.
进阶篇(主要介绍测试方法):
-
可靠性测试:
可靠性 = 正常运行时间 / ( 正常运行时间+ 非正常运行时间 )
可靠性指标一般要达到4个9或者5个9(99.99% 99.999% )
如何进行可靠性测试:
-
容错性测试:
系统能够接受的错误,也就是虽然发生了错误但是不影响使用.
可靠性与容错性的区别:
案例: 有一架飞机,有4个引擎,其中一个引擎坏了,但是飞机能飞行,那么说明这个飞机的可靠性差,但是容错性好.
-
安装卸载测试:
测试安装卸载功能.
-
内存泄漏测试:
造成内存泄漏的常见原因:
-
分配完内存没有回收
-
程序的写法有问题,内存没有正常回收
-
使用的API函数有问题,造成内存泄漏
如何测试:
-
人工检查: 人工地查找没有回收的内存
-
自动工具: 借助测试内存泄漏的工具
-
-
弱网测试:
在网络情况不好的情况下,可能会造成客户端频繁地发送请求.
如何实施弱网测试: 借助工具模拟弱网环境 (Fiddler)
-
打开弱网设置
-
打开设置弱网的脚本
-
-
设置上行速率和下行速率
注意英文解释: 单位为多少ms消耗1KB 注意速率的换算.
速率参考:
对于B 与 b: 1B = 8b
-
黑盒测试:
纯功能测试.不关心具体怎么实现,(功能测试)
-
白盒测试:
关注程序的内部实现,(单元测试)
-
灰盒测试:
介于黑盒和白盒之间. (集成测试)
为什么灰盒测试不能取代黑盒测试和白盒测试:
灰盒测试没有白盒测试详尽,灰盒测试没有黑盒测试覆盖产品的广度大.
-
冒烟测试:
测试的第一步,评估软件,系统是否具备可测试的条件.
-
回归测试;
对于历史版本,历史功能进行测试,保证功能都是符合要求的. (借助自动化来进行回归测试)
对于自动化测试:
自动化测试是具有局限性的,只是协助测试人员进行测试的工具.
自动化测试:
自动化测试的分类:
-
接口自动化测试
-
UI自动化测试
-
移动端自动化测试
-
web端自动化测试
selenium( web 自动化测试工具 )
优点:
-
开源免费,
-
支持多浏览器,(如Chrome,Firefox,IE)
-
支持多系统(如Linux,Windows,MacOS)
-
支持多语言(如Java,Python)
-
selenium包提供了很多提供可测试使用的API
环境部署:
Chrome浏览器
Chrome驱动
selenium工具包
什么是驱动:
驱动计算机和设备工作起来.
人工测试的情况下,人手动打开浏览器,那么驱动是人力.
对于自动化来说,代码无法直接打开浏览器,这个时候就需要借助驱动程序来打开浏览器
selenium编写的脚本是如何打开浏览器的:
使用selenium实现web自动化测试实例:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;public class Main {public static void main(String[] args) throws InterruptedException {ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");ChromeDriver chromeDriver = new ChromeDriver(options);Thread.sleep(5000);chromeDriver.get("https://www.baidu.com");Thread.sleep(5000);chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");Thread.sleep(5000);chromeDriver.findElement(By.cssSelector("#su")).click();Thread.sleep(5000);chromeDriver.quit();}
}
注意这里,一开始并没有使用第一二句代码.出现了禁止访问403.,而加上之后就没有403禁止访问的问题了.
selenium常用方法:
常见元素操作方法:
-
查找页面元素:
findElement()
参数: By类 ( 提供通过什么方式来查找元素 )
返回值: List< webElement >
对于内容则需要遍历打印出来
-
By.cssSelector(“id”) 来查找
当元素在页面能找到,则正常退出
当元素在页面不能找到,则程序执行 报错
-
By.Xpath:
语法: 层级:/ 子级 //跳级
属性: @
函数: contains()
通过前端copy xpath就可以了
但是xpath有时候的定位不唯一,则需要手动修改,
修改实例:
-
-
输入文本 sendKeys()
找到需要输入文本的页面元素,再使用sendKeys() 传输文本
-
点击 click()
-
提交 submit() 通过回车键提交
对于submit,selenium官方更推荐使用click来完成提交.
-
清除 clear()
-
获取文本 getText() 返回值是String
并不是所有的标签都能获得到文本,例如百度一下的按钮的文本就不能通过getText获得,
这是因为"百度一下"是按钮的value属性,并不是文本.
-
获取属性的值 getAttribute()
示例:
String bottonText = driver.findElement(By.cssSelector("#su" )).getAttribute( name: "value");
-
获取URL getCurrentUrl()
-
获取标题 getTitle()
窗口:
窗口大小的设置: 最大化,最小化,全屏窗口,手动设置窗口大小.
示例:
//最大窗口chromeDriver.manage().window().maximize();//最小窗口chromeDriver.manage().window().minimize();//全屏chromeDriver.manage().window().fullscreen();//自定义窗口大小chromeDriver.manage().window().setSize(new Dimension(1024,1024));
获取所有的句柄:
失败案例讲解:
-
为什么我们通过百度首页点击进入百度图片,再输入"迪丽热巴" 百度一下会失败?
这是因为我们驱动的句柄并没有发生转换,驱动依然停留在百度首页,所以我们需要转换句柄.
-
为什么通过百度首页搜索"迪丽热巴"再点击搜索,查找网页元素会显示报错: “没有这个元素”
chromeDriver.get("https://www.baidu.com");chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");chromeDriver.findElement(By.cssSelector("#su")).click();chromeDriver.findElement(By.cssSelector("#\\31 > div > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > div.title-wrapper_XLSiK > a > div > p > span > span")).click();chromeDriver.quit();
这是因为页面渲染的速度远远不如代码执行的速度.所以代码查找这个元素的时候页面还没有渲染成功,所以失效.
解决方法: 当程序执行的时候我们需要在代码里添加等待机制.
等待:
-
强制等待 : 程序阻塞等待
Thread.sleep()
-
隐式等待 :
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(秒数));
//隐式等待chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));chromeDriver.get("https://www.baidu.com");chromeDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");chromeDriver.findElement(By.cssSelector("#su")).click();chromeDriver.findElement(By.cssSelector("#\\31 > div > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > div.title-wrapper_XLSiK > a > div > p > span > span")).click();chromeDriver.quit();
隐式等待会作用于driver的整个生命周期 , 隐式等待会一直轮询判断元素是否存在,如果不存在就等待设置好的时间里不断的进行轮询,直到元素能够被找到
-
显式等待 :
与隐式等待不同, 这个只轮询等待这一条语句
new WebDriverWait(driver,Duration.ofSeconds(5)).until(driver->driver.findElement(By.cssSelector("#kw")));
new WebDriverWait(chromeDriver,Duration.ofSeconds(5)).until(driver->driver.findElement(By.cssSelector("#\\\\31 > div > div > div > div > div > div.cos-row.row-text_Johh7.row_5y9Az > div > div.title-wrapper_XLSiK > a > div > p > span > span")));
浏览器操作:
回退前进刷新操作:
//浏览器操作://后退chromeDriver.navigate().back();//前进chromeDriver.navigate().forward();//刷新chromeDriver.navigate().refresh();
弹窗:
弹窗类型:
切换弹窗: (创建弹窗对象)
Alert alert = driver.switchTo().alert();
确认:
alert.accept();
取消:
alert.dismiss();
输入文本:
alert.sendkeys();
虽然警告弹窗只有确认按钮, 注意 accept 和 dismiss 都能够处理
虽然警告弹窗和确认弹窗都没有输入文本的地方,但是如果要执行alert.sendkeys() , 代码也不会报错, 只是没有效果.
选择框:
选项的选择方式:
-
创建选择框对象:
Select select = new Select(new WebElement);
-
根据文本选择
select.selectByVisibleText(文本内容);
-
根据属性值选择
select.selectByValue(属性值);
-
根据序号选择
select.selectByIndex(序号);
执行脚本:
执行js代码:
driver.executeScript(脚本代码);
文件的上传:
driver.findElenment(By.cssSector(元素)).sendkeys("文件路径 + 文件")
浏览器的参数设置
在实际的工作中,测试人员将自动化部署在机器上自动执行,并不会查看自动化执行的过程,而是查看自动化执行的结果.
ChromeOptions options = new ChromeOptions();//参数 //无头模式options.addArguments("-headless");
无头模式是指一种特殊的浏览器模式,这种模式下,浏览器并没有提供可视化用户界面(GUI)。这意味着当浏览器处于无头模式时,它不显示任何图形界面元素,如菜单、工具栏或浏览器窗口。无头模式特别适合于需要自动化访问网页或在服务器端执行的任务,如网络爬虫、数据抓取、自动化测试以及网页截图等。
Junit
junit是java的单元测试工具
注解:
-
@ Test
表示这个方法是测试方法, 执行当前这个类,会自动执行该类的所有@ Test 注解的方法
-
@ BeforeEach
当前的方法需要在每个用例之前都要执行一次
-
@ BeforeAll
当前的方法需要在用例之前执行一次
被修饰的方法必须为静态方法
-
@ AfterEach
当前的方法需要在每个用例之后都要执行一次
-
@ AfterAll
当前的方法需要在用例之后执行一次
被修饰的方法必须为静态方法
断言:
Assertions
-
assertEquals(期望值,实际值) 判断期望值与实际值是否相等
-
assertNotEquals(期望值,实际值) 判断期望值与实际值是否不相等
-
assertTrue(条件) 判断条件是否为true
-
assertFalse(条件) 判断条件是否为false
-
assertNull(值) 判断值是否为空
-
assertNotNull(值) 判断值是否不为空
用例的执行顺序:
手动控制用例的执行顺序
@ TestMethodOrder()
示例:
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JunitTest {@Test@Order(1)void loginTest() {System.out.println("login");}@Test@Order(2)void editTest() {System.out.println("edit");}@Test@Order(3)void AindexTest() {System.out.println("Aindex");}
}
参数化:
@ ParameterizedTest
单参数示例 :
@ValueSource(strings = {"lucy","mary","haitaos"})void SparamsTest(String name){System.out.println(name);}
多参数示例 :
@CsvSource({"mary,20,女","lucy,25,女","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男","bob,50,男"})void muchParamsTest(String name,int age,String sex){System.out.println("name:"+name+",age:"+age+",性别:"+sex);}
使用Excel文件示例:
@ParameterizedTest@CsvFileSource(files = "D:\\file\\other\\mycsv.csv")void csvfileParamsTest(String name , int age){System.out.println("name:"+name+",age:"+age);}//不使用系统自带的EXCEL文件就会报乱码的错误@CsvFileSource(files = "D:\\file\\other\\aaaa.csv")void csvWrongTest(String name,int age){System.out.println("name:"+name+",age:"+age);}
动态方法:
//通过动态方法来提供数据源@MethodSourcevoid dynamicmethodPramsTest(String name,int age){System.out.println("name:"+name+",age:"+age);}static Stream<Arguments> dynamicmethodPramsTest() throws InterruptedException {//构造动态参数String[] arr = new String[5];for (int i = 0; i< arr.length;i++){Thread.sleep(500);arr[i] = System.currentTimeMillis()+"";}return Stream.of(Arguments.arguments(arr[0],20),Arguments.arguments(arr[1],20),Arguments.arguments(arr[2],20),Arguments.arguments(arr[3],20),Arguments.arguments(arr[4],20));}
测试套件
创建一个类 ,通过@ Suite 标识该类为特殊套件类,不是测试类
-
指定类来运行
类下想要运行的用例需要被@Test注解
@Suite @SelectClasses({aaaTest.class,bbbTests.class}) public class runSuite { }
-
指定包来运行
对于使用包名来指定的运行范围,那么该包下的所有的测试类的命名需要以Test/Tests结尾
@Suite @SelectPackages("com.autoTest0212“) public class runSuite { }
throws InterruptedException {
//构造动态参数
String[] arr = new String[5];
for (int i = 0; i< arr.length;i++){
Thread.sleep(500);
arr[i] = System.currentTimeMillis()+“”;
}
return Stream.of(
Arguments.arguments(arr[0],20),
Arguments.arguments(arr[1],20),
Arguments.arguments(arr[2],20),
Arguments.arguments(arr[3],20),
Arguments.arguments(arr[4],20)
);
}
#### 测试套件创建一个类 ,通过@ Suite 标识该类为特殊套件类,不是测试类1. 指定类来运行类下想要运行的用例需要被@Test注解```java@Suite@SelectClasses({aaaTest.class,bbbTests.class})public class runSuite {}
-
指定包来运行
对于使用包名来指定的运行范围,那么该包下的所有的测试类的命名需要以Test/Tests结尾
@Suite @SelectPackages("com.autoTest0212“) public class runSuite { }
本章总结了测试方法,BUG,测试用例编写,selenium自动化测试.
相关文章:

测试入门篇
测试: 这里写目录标题 测试:基础概念:BUG:创建一个合理的bug:bug 的级别:跟开发争执如何解决: 测试用例:编写测试用例的万能公式:案例: 登录功能的测试:设计测试用例的方法: 进阶篇(主要介绍测试方法):自动化测试:自动化测试的分类:selenium( web 自动化测试工具 )环境部署:什么…...

b站小土堆pytorch学习记录—— P25-P26 网络模型的使用和修改、保存和读取
文章目录 一、修改1.方法2.代码 二、保存和读取1.方法2.代码(1)保存(2)加载 3.陷阱 一、修改 1.方法 add_module(name: str, module: Module) -> None name 是要添加的子模块的名称。 module 是要添加的子模块。 调用 add_m…...

[数据结构]OJ用队列实现栈
225. 用队列实现栈 - 力扣(LeetCode) 官方题解:https://leetcode.cn/problems/implement-stack-using-queues/solutions/432204/yong-dui-lie-shi-xian-zhan-by-leetcode-solution/ 首先我们要知道 栈是一种后进先出的数据结构,…...
「优选算法刷题」:最长回文子串
一、题目 给你一个字符串 s,找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba"…...

Java项目:41 springboot大学生入学审核系统的设计与实现010
作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本大学生入学审核系统管理员和学生。 管理员功能有个人中心,学生管理,学籍信息管理,入学办理管理等。 学生功能有…...

【数据结构与算法】常见排序算法(Sorting Algorithm)
文章目录 相关概念1. 冒泡排序(Bubble Sort)2. 直接插入排序(Insertion Sort)3. 希尔排序(Shell Sort)4. 直接选择排序(Selection Sort)5. 堆排序(Heap Sort)…...

Unity3D学习之XLua实践——背包系统
文章目录 1 前言2 新建工程导入必要资源2.1 AB包设置2.2 C# 脚本2.3 VSCode 的环境搭建 3 面板拼凑3.1 主面板拼凑3.2 背包面板拼凑3.3 格子复合组件拼凑3.4 常用类别名准备3.5 数据准备3.5.1 图集准备3.5.2 json3.5.3 打AB包 4 Lua读取json表及准备玩家数据5 主面板逻辑6 背包…...

前端技术研究越深入,越觉得技术不是决定录用唯一条件。
一、拒绝抬杠 我说技能不是唯一条件,不是说技能不重要,招聘前端条件是1X,其中1是技能,X是其他条件。 如果X条件很优秀,1这个条件可以降格为0.8、0.5,甚至更低。 有人就抬杠,那为啥不招聘清洁工来干前端&…...
vue组件的重新渲染的问题
目录 1.方式1 2.方式2 1.方式1 修改组件上的key属性 Vue是通过diffing算法比较虚拟DOM和真实DOM,来判断新旧 DOM 的变化。key是虚拟DOM对象的标识,在更新显示时key表示着DOM的唯一性。 DOM是否变化的核心是通过判断新旧DOM的key值是否变化,…...

opengl 学习(二)-----你好,三角形
你好,三角形 分类demo效果解析 分类 opengl c demo #include "glad/glad.h" #include "glfw3.h" #include <iostream> #include <cmath> #include <vector>using namespace std;/** * 在学习此节之前,建议将这…...
mongodb4.2升级到5.0版本,升级到6.0版本, 升级到7.0版本案例
今天一客户想把自己当前使用的mongodb数据库4.2版本升级到7.0版本。难道mongodb能直接跳跃升级吗? 经过几经查找资料,貌似真不行呀。确定升级流程如下: 还得从mongo4.2升级到5.0。其次再从5.0升级到6.0。最后再从6.0升级到7.0。 开始升级之前将数据进行备份 这一步…...
CPU处理器模式与异常
ARM架构中的Exception Level(EL) 在ARM架构中,Exception Level(EL)是一个关键概念,它表示了处理器当前处理异常或中断的层次。ARMv8-A架构定义了四个Exception Levels:EL0、EL1、EL2和EL3&…...
Day 53 |● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和
1143.最长公共子序列 class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>> dp(text1.size()1,vector<int>(text2.size()1,0));int res 0;for(int i 1; i < text1.size(); i){for(int j 1; j <…...

ant-desgin charts双轴图DualAxes,柱状图无法立即显示,并且只有在调整页面大小(放大或缩小)后才开始显示
摘要 双轴图表中,柱状图无法立即显示,并且只有在调整页面大小(放大或缩小)后才开始显示 官方示例代码 在直接复制,替换为个人数据时,出现柱状图无法显示问题 const config {data: [data, data],xFiel…...

获取别人店铺的所有商品API接口
使用淘宝淘口令接口的步骤通常包括: 注册成为淘宝开放平台的开发者:在淘宝开放平台网站上注册账号并完成认证。 创建应用以获取API密钥:在您的开发者控制台中创建一个应用,并获取用于API调用的密钥,如Client ID和Clie…...

成都正信:亲戚借了钱一直不还怎么委婉的说
在中国传统文化中,亲情关系往往被视为最为重要和敏感的部分。当亲戚间发生借贷时,若出现拖欠不还的情形,处理起来尤为棘手。面对这样的尴尬局面,采取委婉而有效的沟通方式至关重要。 张华最近就遇到了这样的困扰。他的表弟去年因急…...

Truenas入门级教程
Truenas入门教程 前言:系统相关配置 采用I3 4160,采用了2块500G的硬盘,内存为8G,两个网卡只用了其中一个,系统安装的是core版本 硬件采用DELL3020MT机箱,自带3个SATA网口,后期网口不够&#…...
窗口函数dense() over(条件)
力扣题目连接 https://leetcode.cn/problems/rank-scores/ 在 SQL 中,DENSE_RANK() 是一个窗口函数,用于计算结果集中每行的稠密排名(dense rank)。DENSE_RANK() 函数会为具有相同排序字段值的行分配相同的排名,但不会…...

蓝牙APP开发实现汽车遥控钥匙解锁汽车智能时代
在现代社会,随着科技的不断发展,汽车已经不再是简单的交通工具,而是与智能科技紧密相连的载体。其中,通过开发APP蓝牙程序实现汽车遥控钥匙成为了一种趋势,为车主带来了便捷与安全的体验。虎克技术公司作为行业领先者&…...

第三天 Kubernetes进阶实践
第三天 Kubernetes进阶实践 本章介绍Kubernetes的进阶内容,包含Kubernetes集群调度、CNI插件、认证授权安全体系、分布式存储的对接、Helm的使用等,让学员可以更加深入的学习Kubernetes的核心内容。 ETCD数据的访问 kube-scheduler调度策略实践 预选与…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill
视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...