性能测试之jmeter的基本使用
简介
Jmeter是Apache的开源项目,基于Java开发,主要用于进行压力测试。
优点:开源免费、支持多协议、轻量级、功能强大
官网:https://jmeter.apache.org/index.html
安装
安装步骤:
- 下载:进入jmeter的官网,进入Download页面,因为是基于Java开发的,所以不分平台,下载二进制文件即可,
- 解压安装包
- 修改配置文件:这是为了处理可能出现的中文乱码问题,在bin目录下打开jmeter.properties,将sampleresult.default.encoding的值改为UTF-8
- 配置环境变量
- 启动jmeter:进入bin目录,在Windows平台下,点击 jmeter.bat文件,启动jmeter
- 修改语言为中文:点击 Options - choose language - Chinese(Simplified)
用户界面:
修改语言:
性能测试和相关指标
jmeter主要是用于做性能测试的,所以这里了解一下性能测试的相关指标
测试的分类:测试可以简单地分为功能测试和性能测试两种,还有自动化测试,不过它更多是一种测试技巧。
功能测试:测试单个接口的功能
-
单元测试:是程序员来操作的,测试程序中的单个单元
-
冒烟测试:测试程序最基本的功能是否正常
-
回归测试:修改了旧代码后,重新进行测试以确认修改没有引入新的错误或导致其他代码产生错误。
性能测试:
- 基准测试:单用户测试,测试环境确定后,对业务模型中的重要业务做单独的测试,获取单用户运行时的各项性能指标。在某个时刻,通过基准测试,建立一个已知的性能基准线,当系统的软硬件环境发生变化之后再进行一次基准测试,以确定变化对性能的影响
- 负载测试:通过逐步增加系统负载,确定在满足系统的性能指标情况下,找出系统能够承受的最大负载量的测试
- 稳定性测试:在服务器稳定运行的情况下,进行长时间测试,并最终保证服务器能满足线上业务需求。
- 并发测试:在极短的时间内,发送多个请求,来验证服务器对并发的处理能力
- 压力测试:在强负载下的测试,查看系统在峰值情况下,是否功能隐患、系统是否具有良好的容错能力和可恢复能力
- 性能测试:通过特定的方式对被测试系统按照一定测试策略施加压力,获取该系统的响应时间、TPS、吞吐量、资源利用率等性能指标,来检测系统上线后能否满足用户需求的过程。
自动化测试:编写测试脚本,通过逻辑控制器和关联等功能,测试一系列接口的功能。
性能测试的相关指标:
- QPS:Queries Per Second,每秒查询率,一台服务器每秒钟能够执行的查询次数,代表了最大吞吐量
- TPS:Transactions Per Second,吞吐量,每秒事务数,一个事务指客户端发送请求并且接收到响应的过程,客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
- 并发数:指系统同时能处理的请求数量,同时反应了系统的负载能力。这个数值可以分析机器1秒内的访问日志数量来得到
衡量网站的性能指标
- 响应时间:从开始发送请求到接收到响应所花费的时间
- 并发数:系统同时能处理的请求数量
- 并发连接数:每秒钟服务器连接的总TCP数量
- 请求数:Query Per Second,每秒多少请求
- 事务数:TPS,每秒事务数
- 并发用户数:单位时间内有多少用户
- 吞吐量:单位时间内系统能处理的请求数量
大型互联网项目架构目标
- 高性能:提供快速的访问体验
- 高可用:网站服务一直可以正常访问
- 可伸缩:通过增加硬件,来提升处理能力
- 可扩展:模块间的耦合度低,
- 安全性:网站能够承受住外部攻击
性能测试的两件事情:模拟巨大负载、生成测试报告
入门案例
在这里,通过一个入门案例来了解jmeter的基本使用。
准备工作
编写一个springboot项目,作为本次测试的目标。
pom.xml:
<groupId>org.example</groupId>
<artifactId>learn_jmeter</artifactId>
<version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><!--springboot工程需要继承的父工程-->
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.8.RELEASE</version><relativePath />
</parent><dependencies><!--web开发的起步依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
</dependencies>
控制器:
@RestController
@RequestMapping("/hello")
public class HelloController {private static final Logger LOG = LoggerFactory.getLogger(HelloController.class);private static int i = 1;@GetMapping("/h1")public String s1() {LOG.info("第 {} 次请求", i++);return "success";}
}
开始测试
jmeter中的两个基本概念:
- 测试计划:jmeter中所有的测试内容都要放在测试计划之下
- 线程组:一个线程就代表一个用户。
配置测试计划:
- 在测试计划内添加线程组:右击测试计划,点击 添加 - 线程(用户) - 线程组,线程组用于发起请求,配置线程组可以设定发起请求的次数。
- 线程组内添加取样器:右击线程组 - 添加 - 取样器 - HTTP请求,将之前准备好的接口的相关信息填写进去。取样器表示发起什么样的请求,在这里选择发起http请求。
- 线程组内添加查看结果树:右测试计划 - 添加 - 监听器 - 查看结果树,不需要配置查看结果树
开始测试:点击左上角菜单栏中的运行按钮,开启测试,点击查看结果树,可以看到每个请求的统计数据
保存测试计划:点击 文件 - 保存,测试计划会被保存为jmx文件,下次直接从文件中打开即可。实际上开始测试的时候,jmeter就会提醒用户保存测试计划。
springboot中接收到的请求:
总结:
- jmeter中所有的测试内容都需要放到测试计划中
- 线程组是测试计划的基本单位,线程组的一个线程代表一个用户,可以配置线程数和每个线程的循环次数,也就是用户执行几次操作
- 每一个测试计划都必须有一个取样器和监听器:取样器用于发送请求并且接收响应,监听器用于查看结果,http请求组件是一个取样器,查看结果数树组件是一个监听器
查看性能测试的相关结果
之前的测试流程,只是简单地使用jmeter发送了一个http请求,并且可以查看结果,接下来,使用jmeter来做压力测试,并且查看压力测试的相关结果指标。
第一步:配置线程组:线程数设置为10个,循环100次
第二步:添加监听器 - 聚合报告,这是最简单的监听器,可以查看性能测试的相关指标。
第三步:开始测试。
第四步:查看结果
结果分析:
- Label:采样器的名称,例如HTTP请求的Name;
- 样本:发送请求的数量
- 平均值:平均响应时间(单位:ms);默认是单个Request的平均响应时间,当使用了Transaction Controller时,也可以以Transaction为单位显示平均响应时间;
- 中位数:50%的用户响应时间小于这个值;
- 95%百分位:95%的用户响应时间小于这个值;
- 99%百分位:99%的用户响应时间小于这个值;
- 最小值:用户响应时间最小值;
- 最大值:用户响应时间最大值;
- 异常%:测试出现的错误请求数量百分比;请求的错误率 = 错误请求的数量/请求的总数;若出现错误就要看服务端的日志查找定位原因;
- 吞吐量:Throughput简称TPS,吞吐量,默认情况下表示每秒处理的请求数,也就是指服务器处理能力,TPS越高说明服务器处理能力越好;
- KB/sec:每秒从服务器端接收到的数据量;
jmeter中的核心概念
测试计划和线程组
测试计划:存放所有的测试内容,相当于一个项目的根目录
线程组:对于线程进行分类,线程组是测试计划的基本单位,线程组中的每一个线程都代表一个用户
- 线程组的属性
- 名称
- 注释
- 在取样器错误后要执行的动作:默认选择继续,还有启动下一进程循环、停止线程、停止测试
- 线程数
- Ramp-Up时间:准备时长,设置的线程数需要多长时间全部启动。如果线程数为10,准备时长为2,那么需要2秒钟启动10个线程,也就是每秒钟启动5个线程。
- 循环次数:1个线程执行几次
- 延迟创建线程直到需要
- 调度器
- 持续时间:如果循环次数是永远,持续时间会被应用,表示持续多少秒后线程结束
- 启动延迟:线程在几秒之后启动
- 线程组的执行顺序
- 并发执行:多个线程同时执行,默认是并发执行
- 顺序执行:多个线程顺序执行,在最顶层的测试计划界面,勾选独立运行每个线程组,就可以开启顺序执行
- 特殊的线程组
- setUp线程组:最优先执行的线程组,创建方式也是 右击 执行计划,点击 添加 - 线程(用户)- setUp线程组
- tearDown线程组:最后执行的线程组,创建方式类似于setUp线程组
组件和元件
组件:实现单独的某个功能,有取样器、监听器等。
元件:多个类似功能组件的容器。元件也可以理解为组件的一种,下面把它们统称为组件
jmeter中的组件
在之前的入门案例中,接触了取样器和监听器,它们是jmeter中发送请求和分析响应的基本组件,jmeter还提供了许多其它组件,支持把一系列的请求组合起来,模拟用户的行为。
jmeter中的基本组件:
-
取样器:向服务器发送请求并接收响应的最小单位,jmeter支持不同的取样器,通过这些取样器,jmeter可以支持多种协议,常用的取样器有HTTP取样器、JDBC取样器、FTP取样器
-
监听器:对测试结果进行处理和可视化展示的一系列组件,常用的监听器有查看结果树、聚合报告
用于增强取样器的组件:
-
配置元件:配置其它组件的相关信息,常见的配置元件:HTTP信息头管理器、CSV数据配置、用户自定义变量
-
逻辑控制器:控制取样器执行顺序的组件,常用的逻辑控制器:if控制器、foreach控制器、循环控制器
-
定时器:在操作之前设置等待时间,常见的定时器:同步定时器、常量和吞吐量定时器
-
前置处理器:用于取样器执行之前对请求进行处理
-
后置处理器:用于取样器执行之后对得到的响应进行处理,常见的后置处理器:JSON提取器、正则表达式提取器、Xpath提取器
用于增强监听器的组件:
- 断言:对响应结果进行判断,场景的断言组件:响应断言、大小断言、JSON断言、
组件的作用域:组件可以被配置到测试计划下,也可以被配置到线程组下,被配置到哪里,作用域就是哪里。
组件的执行顺序
-
同一作用域下不同组件执行顺序:配置元件 --> 前置处理器 --> 定时器 --> 取样器 --> 后置处理器 --> 断言 --> 监听器
-
同一作用域下相同组件的执行顺序:从上到下依次执行
使用案例
在这里,通过实际的需求来学习jmeter中的常用组件
需求1:为HTTP请求添加请求头
这个需求需要使用http信息头管理器来完成。
http信息头管理器:配置元件的一种,配置HTTP协议的请求头
- 作用域:如果位于测试计划目录内,作用于测试计划下的所有线程组,如果位于线程组内,作用于线程组
案例:
需求2:把多个http请求的相同信息提取出来,集中管理
实现这个功能,需要使用“http请求默认值”组件
http请求默认值:配置元件的一种,作用是管理多个http请求的相同信息。
- 使用步骤:把多个http请求的相同信息写入到当前组件中,然后,在同一个测试计划下,新创建的HTTP请求就不再需要填写公共信息
案例:
需求3:把多处使用到的数据提取为变量,集中管理
这个需求使用“用户自定义变量”来实现。
用户自定义变量:配置元件的一种,在当前组件中配置键值对,在其它地方,使用 ${变量名} 的方式来引用变量
- 优点:通过用户自定义变量,来实现参数化。参数化是指动态地获取、设置或生成数据,是一种由程序驱动代替人工驱动的数据设计方案,提高脚本的编写效率和编写质量
案例:
- 配置变量:
- 使用变量:
需求4:发送10个请求,要求每个请求都有自己独立的数据
实现这个功能,需要从csv文件中读取数据,这需要使用“CSV 数据文件设置”
CSV数据文件设置:配置元件的一种,用户如果想要把数据放到csv文件中,需要使用当前组件。
-
使用方式:配置csv文件的文件名、文件编码、字段名称、分隔符,然后线程每执行一次,就会去csv文件中读取一行数据,用户再使用 ${变量名} 来引用csv文件中的数据。
-
优点:通过从csv文件中读取数据,把测试数据和测试脚本分离,使得测试用例更加灵活,并且可以实现参数化
案例:
- 设置csv文件的属性
- csv文件中的内容
- 引用csv文件中的数据
注意:
- 编写csv文件:文件中不能有表头,第一行就是数据,字段之间以逗号分割,文件使用utf-8编码。也可以使用txt文件来代替,因为csv文件本身就是普通的文本文件
- csv文件的局限性:字段中不能出现分隔符,使用反斜杠转义也不可以
- 配置线程的运行次数:线程运行一次,读取jmeter中的一行数据,下一次运行时读取下一行,所以运行次数最好和csv文件中的行数相对应,
使用csv文件时线程组的配置方式
在上面的案例中,需要把csv文件中的行数和线程的运行次数对应起来,才能保证线程正好能读取完csv文件中的数据,但是这样在实际使用过程中会很麻烦,所以现在提供一种方式,使得线程组可以在读取完csv文件后自动结束。
配置方式:
-
第一步:在线程组界面:配置线程的循环次数为永远
-
第二步:在CSV数据文件设置界面:
- 配置”遇到文件结束符再次循环“为false,表示只读取一次;
- 配置”遇到文件结束符停止线程“ 为true,因为之前已经配置了线程的循环次数为永远,所以在这里,当csv文件被读取完时,线程就会停止循环
案例:
- 线程组界面
- csv设置界面
需求5:判断请求结果是否正确
这个需要需要使用“断言”来实现。
断言:用于判断请求结果的组件。断言和取样器类似,它们是平级关系,断言功能包含一系列组件,每个组件都可以执行不同类型的断言,包括JSON断言、大小断言等
案例:配置一个json断言,判断返回值中code字段的值是200.
- 配置方式:
- 断言结果
需求6:获取上一个请求返回的数据
需求:用户成功登录后,服务器会返回一个token,用户使用这个token,可以查看当前用户的详细信息。
实现这个需求,需要使用后置处理器下的JSON提取器。
后置处理器:在请求完成之后对响应结果进行处理。
案例:在这里使用后置处理器中的JSON提取器,提取服务端返回的json数据,把数据放到变量中,然后在下一个请求中引用变量。
第一步:配置请求的后置处理器,需要在取样器节点下添加后置处理器,只有这样后置处理器才能作用于取样器
第二步:在第二个请求中引用后置处理器中的变量
需求7:如果上一个请求不正确,下一个请求不执行
需求:用户登录成功后会返回一个token,在这里需要判断,如果用户没有登录成功,那么就不执行下一个请求。
实现这个功能,需要使用逻辑控制器。
逻辑控制器:控制它内部所有取样器的执行流程,取样器需要是逻辑控制器的子节点,然后才能生效。
案例:在这里选择使用逻辑控制器中的IF控制器来实现这个功能,将下一个请求放到IF控制器之中。
- 配置IF控制器:
注意,要取消勾选Interpret选项,在案例中使用到的变量是上一个节点的JSON提取器中提取出来的。
需求8:上传文件
需求:使用jmeter的http取样器,发送上传文件的请求
实现这个需求,需要使用http取样器中的“文件上传”tab,输入文件名、http请求中文件对应的参数即可。
案例:
需求9:后置处理器之正则表达式
需求:在http请求的响应中,会返回一个url,现在需要解析出这个url中的路径信息。
实现这个需求,需要使用后置处理器中的正则表达式提取器,配置正则表达式,提取数据中的内容
案例:
案例讲解:
- 第一步:配置需要从响应的哪部分中提取数据
- 第二步:配置提取出的数据存储到哪个变量中
- 第三步:配置正则表达式,要注意,提取的数据是正则表达式中被括号包裹的数据,相当于分组匹配,在这里的正则表达式是
https?://[^/]+(/[^?]+)
,这个正则表达式用于提取url中的路径部分 - 第四步:模板,表示提取正则表达式中第几个分组的数据,在这里是
$1$
,表示提取正则表达式中第一个括号中的数据。
扩展:提取正则表达式中的最后一节路径:https?://[^/]+/?.*/([^?]+)
需求10:if控制器 判断变量是10的倍数
在if控制器中写上表达式:${__jexl3(${pageNo} % 10 == 0)}
,在这里,pageNo就是变量
需求11:循环控制器和计数器
循环控制器是逻辑控制器的一种,计数器是配置元件的一种,联合使用,可以有for循环的效果,但是要注意,计数器必须放在循环控制器中才会在循环控制器的范围内生效。
需求12:跨线程共享变量
实现这个需求的步骤:
- 第一步:添加一个后置处理器,叫做BeanShell,在里面写入代码:
${__setProperty(var, ${var})}
,在这里,var是要被跨线程共享的变量 - 第二步:在其它线程中引用当前变量:
${__P(var)}
原理:在jmeter中,变量是线程共享的,属性是全局共享的,这里把变量设置为一个属性了。
需求13:每两秒钟发送一次请求
使用 定时器 - 固定定时器
来做
需求14:从json中提取出一个数组然后遍历这个数组
实现这个需求的步骤:
- 第一步:配置一个JSON提取器,难点在与JSON提取器中路径的配置,这里提供一个案例:
$.data[*].avatar
,表示提取data中所有名为avatar
的变量,并且注意Match No
输入-1,表示提取所有变量。 - 第二步:配置ForEach控制器,有几个输入性:
- 变量前缀:JSON提取器中设置的变量,
- 开始循环字段:0
- 结束循环字段:
${__javaScript(${变量名_matchNr})}
,这是jmeter提供的变量 - 输出变量名称:forEach控制器输出的变量名称
- 第三步:在ForEach控制器的内部使用变量。
其它常用组件
定时器:可以实现时间模式相关的性能测试。
- 同步定时器:Synchronized Timer,用来保证取样器在同一时刻向服务器发起负载
- 常量吞吐量定时器:高频率的访问服务器,1s钟访问多少次,持续多少秒,
取样器:
- 数据库取样器:直连数据库,向数据库发送请求并接收响应
在命令行运行脚本
Jmeter有两种运行模式:
- GUI模式:主要用来编写和调试测试脚本
- 命令行模式:对负载机的资源消耗会更小,用来实现高并发和压力测试
在命令行执行测试脚本:jmeter -n -t ${scriptFile} -l ${logFile} -e -o ${dir}
- 参数讲解
- -n 无图形化运行
- -t 被运行的脚本
- -l 将运行信息写入日志文件
- -e 生成测试报告
- -o 指定报告输出目录
案例:jmeter -n -t blog-api_最热文章.jmx -l j.log -e -o output
,在output目录下可以查看jmeter生产的html文件。
D:\apache-jmeter-5.5>jmeter -n -t blog-api_最热文章.jmx -l j.log -e -o output
Creating summariser <summary>
Created the tree successfully using blog-api_.jmx
Starting standalone test @ April 6, 2024 4:41:58 PM CST (1712392918522)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 121 in 00:00:01 = 101.8/s Avg: 53 Min: 10 Max: 155 Err: 0 (0.00%) Active: 10 Started: 10 Finished: 0
summary + 879 in 00:00:04 = 201.7/s Avg: 47 Min: 6 Max: 127 Err: 0 (0.00%) Active: 0 Started: 10 Finished: 10
summary = 1000 in 00:00:06 = 180.2/s Avg: 47 Min: 6 Max: 155 Err: 0 (0.00%)
Tidying up ... @ April 6, 2024 4:42:04 PM CST (1712392924365)
... end of run
性能测试结果报表:html文件
message on port 4445
summary + 121 in 00:00:01 = 101.8/s Avg: 53 Min: 10 Max: 155 Err: 0 (0.00%) Active: 10 Started: 10 Finished: 0
summary + 879 in 00:00:04 = 201.7/s Avg: 47 Min: 6 Max: 127 Err: 0 (0.00%) Active: 0 Started: 10 Finished: 10
summary = 1000 in 00:00:06 = 180.2/s Avg: 47 Min: 6 Max: 155 Err: 0 (0.00%)
Tidying up … @ April 6, 2024 4:42:04 PM CST (1712392924365)
… end of run
性能测试结果报表:html文件[外链图片转存中...(img-Qb2zCm3f-1743754695159)]
相关文章:
性能测试之jmeter的基本使用
简介 Jmeter是Apache的开源项目,基于Java开发,主要用于进行压力测试。 优点:开源免费、支持多协议、轻量级、功能强大 官网:https://jmeter.apache.org/index.html 安装 安装步骤: 下载:进入jmeter的…...
常见的微信个人号二次开发功能
一、常见开发功能 1. 好友管理 好友列表维护 添加/删除好友 修改好友信息(备注、标签等) 分组管理 创建/编辑/删除标签 好友分类与筛选 2. 消息管理 信息发送 支持多类型内容:文本、图片、视频、文件、小程序、名片、URL链接等 附加功…...
Muduo网络库实现 [十三] - HttpRequest模块
目录 设计思路 成员设计 模块实现 设计思路 首先我们要先知道HTTP的请求的流程是什么样子的,不然我们会学的很迷糊。对于HTTP请求如何到来以及去往哪里,我们应该很清楚的知道 HTTP请求在服务器系统中的传递流程是一个多层次的过程: 客户端发起请求…...
探索C++11:解锁现代编程(3)
1.包装器 1.1function std::function 是 C 标准库中的一个模板类,位于 <functional> 头文件中。它用于封装可调用对象,包括普通函数、Lambda 表达式、函数对象、成员函数等。std::function 提供了极大的灵活性,使得你可以将不同类型的…...
软件工程(应试版)图形工具总结(二)
遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。 教材参考《软件工程导论(第六版)》 七、 层次图(H图)与HIPO图 1、概述 1.1、层次图(Hierarchy Chart / H图) 核心…...
人工智能在前端开发中的应用探索
一、人工智能在前端开发中的应用场景 人工智能(AI)技术的快速发展为前端开发带来了新的机遇和挑战。AI在前端开发中的应用主要集中在以下几个方面:智能代码生成、自动化测试、个性化推荐、智能交互设计以及性能优化。这些应用场景不仅提高了…...
木马学习记录
一句话木马是什么 一句话木马就是仅需要一行代码的木马,很简短且简单,木马的函数将会执行我们发送的命令 如何发送命令&发送的命令如何执行? 有三种方式:GET,POST,COOKIE,一句话木马中用$_G…...
WebSocket 也有跨域问题?如何让 Spring Boot WebSocket 允许跨域连接?
前言 在现代 Web 开发中,跨域问题一直是开发者必须面对的挑战。无论是传统的 HTTP 请求还是实时通信的 WebSocket,浏览器的同源策略(Same-Origin Policy)都可能成为功能实现的拦路虎。许多开发者对 HTTP 的跨域解决方案ÿ…...
音视频入门基础:MPEG2-PS专题(8)——使用Wireshark分析GB28181的PS流
音视频入门基础:MPEG2-PS专题系列文章: 音视频入门基础:MPEG2-PS专题(1)——MPEG2-PS官方文档下载 音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件 音视频入门基础…...
Bash详解
各类资料学习下载合集 https://pan.quark.cn/s/8c91ccb5a474 Bash详解 Bash(Bourne Again SHell)是Linux和Unix系统中最常用的命令行解释器之一。它不仅提供了强大的命令行操作功能,还支持脚本编程,使得用户能够自动化任务和实现复杂的操作。本文将详细介绍Bash…...
WORD+VISIO输出PDF图片提高清晰度的方法
WORDVISIO输出PDF图片提高清晰度的方法 part 1: visio 绘图part 2: word 导出 part 1: visio 绘图 先在visio中把图片和对应的文字调整为适合插入到文章中的尺寸; 在visio中把所有元素进行组合; 把组合后的图片长和宽等比例放缩,如放大10倍…...
springMVC--Controller配置总结
控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方式 控制器负责解析客户的请求并转换成一个模型 在springMVC中,一个控制器类可以包含多种方法 在springMVC中,对于controller的配置有多种 实现Contr…...
JavaScript BOM核心对象、本地存储
目录 BOM 核心对象详解 一、location 对象 1. 常用属性 2. 常用方法 3. 应用场景 二、navigator 对象 1. 核心属性 2. 常用方法 3. 应用场景 三、history 对象 1. 核心属性和方法 2. 应用场景 四、兼容性与注意事项 五、总结 本地存储与复杂数据类型处理 一、本…...
单元测试之测试覆盖率-jacoco基本使用
简介 免费的、开源的、针对java的单元测试覆盖率工具。基于字节码,无需源码也可以工作。 代码覆盖率:用来衡量测试代码对功能代码的测试情况,量化说明测试的充分度。通过执行测试用例,功能代码中的哪些行被执行了,哪…...
css3.31面试题
CSS 相关的面试题一般围绕基础知识、布局、性能优化、兼容性、深入原理等几个方向。以下是一些常见的面试题总结: CSS 基础知识 盒模型(Box Model)是什么?有哪些类型? px、em、rem、vw、vh、% 的区别? …...
Nature Electronics|一种透气、可拉伸的液态金属基3D电子皮肤系统(健康监测/可穿戴电子/透汗透气性电子/电子皮肤/柔性电子/集成电路)
一、 摘要 穿戴式和皮肤电子设备的发展要求高密度可伸展电子系统能够与软组织共形,持续运行并提供长期的生物相容性。大多数可拉伸电子系统的集成密度低,并且与外部印刷电路板连接,这限制了功能,降低了用户体验并阻碍了长期可用性。在此,作者提出了一种可渗透的三维集成电…...
【家政平台开发(15)】解锁Spring Boot:家政平台后端开发全攻略
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化…...
AI Agent设计模式二:Parallelization
概念 :并行任务执行引擎 ✅ 优点:提升吞吐量,充分利用多核资源❌ 缺点:复杂度高,存在竞态条件风险 from langchain_openai import ChatOpenAI from langgraph.graph import StateGraph, START, END from typing impor…...
Upload-labs靶场通关
之前搭好了靶场,Upload-labs 靶场搭建 及一句话木马的原理与运用-CSDN博客 今天开始通关并写详细流程 Pass-1 来到靶场的第一关 先随便上传php 代码 点击上传 发现文件类型被限制了 方法1: 改文件后缀为合法文件(.jpg .png .gif…...
Python数据结构之有序列表
一.基本介绍 在有序列表中,元素的相对位置取决于它们的基本特征。它们通常以升序或者降序排列,并且我们假设元素之间能进行有意义的比较。有序列表和无序列表(链表)的许多操作都是相同的。 二.代码实现 class OrderedList:"""有序列表类…...
LMK04828使用指南-01-简介与引脚功能描述
简介 LMK0482x系列是业界性能最高的时钟调节器,支持JEDEC JESD204B。 PLL2的14个时钟输出可以配置为使用设备和SYSREF时钟驱动七个JESD204B转换器或其他逻辑设备。可以使用直流和交流耦合提供SYSREF。不限于JESD204B应用,14个输出中的每一个都可以单独…...
统计学基本原理
目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况:中位数、众数、平均值统计数据的离散程度:极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…...
日常真实工作环境,Mysql常用操作命令,笔记!
1、开放增删改查权限,不开放表结构修改权限 有许多生产环境是不需要修改表结构的,也是为了防止SQL注入。 创建用户 mysql> grant all on *.* to ie% identified by test1设置权限 1.首先我们先回收所有权限。 revoke all on *.* from ie% ;2.设…...
洛谷题单3-P1307 [NOIP 2011 普及组] 数字反转-python-流程图重构
题目描述 给定一个整数 N N N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。 输入格式 一个整数 N N N。 …...
洛谷题单3-P1420 最长连号-python-流程图重构
题目描述 输入长度为 n n n 的一个正整数序列,要求输出序列中最长连号的长度。 连号指在序列中,从小到大的连续自然数。 输入格式 第一行,一个整数 n n n。 第二行, n n n 个整数 a i a_i ai,之间用空格隔开…...
PostgreSQL:表分区与继承
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【NLP 55、投机采样加速推理】
目录 一、投机采样 二、投机采样改进:美杜莎模型 流程 改进 三、Deepseek的投机采样 流程 Ⅰ、输入文本预处理 Ⅱ、引导模型预测 Ⅲ、候选集筛选(可选) Ⅳ、主模型验证 Ⅴ、生成输出与循环 骗你的,其实我在意透了 —— 25.4.4 一、…...
CSS 创建与使用学习笔记
一、CSS 的作用 CSS(层叠样式表)用于控制 HTML 文档的样式和布局。当浏览器读取一个样式表时,它会根据样式表中的规则来格式化 HTML 文档,从而实现页面的美化和布局调整。 二、插入样式表的方法 CSS 可以通过以下三种方式插入到…...
CSS Id 和 Class 选择器学习笔记
一、概述 在 CSS 中,id 和 class 选择器是用于为 HTML 元素指定样式的强大工具。它们可以帮助我们精确地控制页面中元素的样式,让页面设计更加灵活和高效。 二、id 选择器 1. 定义和使用 定义:id 选择器用于为具有特定 id 属性的 HTML 元素…...
从小米汽车事故反思 LabVIEW 开发
近期,小米汽车的一起严重事故引发了社会各界的广泛关注。这起事故不仅让我们对智能汽车的安全性产生了深深的思考,也为 LabVIEW 开发领域带来了诸多值得汲取的知识与领悟。 在智能汽车领域,尤其是涉及到智能驾驶辅助系统时,安全是…...
解锁工业通信:Profibus DP到ModbusTCP网关指南!
解锁工业通信:Profibus DP到ModbusTCP网关指南! 在工业自动化领域,随着技术的不断进步和应用场景的日益复杂,不同设备和系统之间的通讯协议兼容性问题成为了工程师们面临的一大挑战。尤其是在Profibus DP和Modbus/TCP这两种广泛应…...
web漏洞靶场学习分享
靶场:pikachu靶场 pikachu漏洞靶场漏洞类型: Burt Force(暴力破解漏洞)XSS(跨站脚本漏洞)CSRF(跨站请求伪造)SQL-Inject(SQL注入漏洞)RCE(远程命令/代码执行)Files Inclusion(文件包含漏洞)Unsafe file downloads(不安全的文件下载)Unsafe file uploads(不安全的文…...
【C++学习笔记】十三、速通笔记
完整的C编程教程 目录 开发环境配置C知识体系现代C特性设计模式数据结构CMake项目构建调试技巧进阶主题学习资源 1. 开发环境配置 1.1 安装编译器 sudo apt-get install g build-essential1.2 安装构建工具 sudo apt-get install cmake1.3 VS Code配置 安装C扩展配置调试…...
硬件电路(23)-输入隔离高低电平有效切换电路
一、概述 项目中为了防止信号干扰需要加一些隔离电路,而且有时传感器的信号是高有效有时是低有效,所以基于此背景,设计了一款方便实现高低电平有效检测切换电路。 二、应用电路...
基于深度学习的多模态癌症数据集调研
基于深度学习的多模态癌症数据集调研 关键词: 癌症、分割、多模态、radiology、pathology、深度学习 目录: 一、 数据集总结 二、 胶质瘤/脑肿瘤(glioma) 三、 肺癌/非小细胞肺癌(NSCLC) 四、 乳腺癌&am…...
Logo语言的系统监控
Logo语言的系统监控 引言 在信息技术飞速发展的时代,系统监控成为了确保计算机系统和网络平稳运行的重要手段。系统监控不仅可以实时跟踪系统的性能、资源使用情况和安全风险等,还能够在出现问题时及时发出警报,从而避免潜在的故障和损失。…...
Go语言-初学者日记(八):构建、部署与 Docker 化
🧱 一、go build:最基础的构建方式 Go 的构建工具链是出了名的轻量、简洁,直接用 go build 就能把项目编译成二进制文件。 ✅ 构建当前项目 go build -o myapp-o myapp 指定输出文件名默认会构建当前目录下的 main.go 或 package main &a…...
青少年编程与数学 02-015 大学数学知识点 08课题、信息论
青少年编程与数学 02-015 大学数学知识点 08课题、信息论 一、信息论基础二、熵与信息量三、信源编码四、信道编码五、率失真理论六、信息论的应用七、网络信息论八、信息论与统计学习九、量子信息论十、信息论的前沿研究总结 信息论是研究信息传输、存储和处理的数学理论&…...
【已解决】Webstorm 每次使用 git pull/push 都要输入令牌/密码登录
解决办法:勾上【使用凭据帮助程序】(英文:Use credential helper)...
FreeRTOS:嵌入式实时操作系统的轻量化解决方案
一、FreeRTOS 的核心定位 FreeRTOS(Free Real-Time Operating System)是一款专为微控制器及资源受限的嵌入式设备设计的开源实时操作系统内核。自2003年由Richard Barry发布以来,其以轻量化、高实时性、低资源占用的特点,成为物…...
Linux操作系统 4.Linux实用操作
一、各类小技巧(快捷键) 强制停止 退出、登出 历史命令搜索 光标移动 1.CTRL C 强制停止 1.Linux某些程序的运行,如果想要强行停止它,可以使用ctrlc 2.命令输入错误,也可以通过快捷键ctrl c,退出当前输入࿰…...
学透Spring Boot — 010. 单元测试和Spring Test
系列文章目录 这是CSDN postnull 博客《学透Spring Boot》系列的一篇,更多文章请移步:Postnull - 学透Spring Boot系列文章 文章目录 系列文章目录前言1. 基本概念UT 单元测试TDD 测试驱动开发UT测试框架Mock框架 3. Spring Test为什么要用Spring Test引…...
Perl语言的文件系统
Perl语言中的文件系统操作 引言 在软件开发中,文件系统操作是一个不可或缺的部分。无论是简单的文件读取、写入,还是复杂的文件管理,合理的文件系统操作都能极大提升程序的效率和可维护性。Perl语言是一种强大的文本处理语言,凭…...
ffmpeg基础指令学习
文章目录 1. **基本的 FFmpeg 语法**2. **常见的 FFmpeg 基础指令****1. 转换视频格式****2. 视频剪切****3. 转换视频的编码****4. 提取音频****5. 改变视频分辨率****6. 改变音视频的比特率****7. 合并音视频****8. 提取视频中的一帧图片****9. 提取视频的帧速率(…...
英国电商物流变革:ebay私人卖家如何借势简易配送提升履约效率?
近年来,英国电商物流正在经历一场不小的变革。从“等待5-7个工作日”到如今“次日达”成为常态,市场和用户对配送效率的要求越来越高。对于在 eBay 平台上的私人卖家来说,这既是挑战,也是机会。如何用有限的资源跟上平台和消费者对…...
第15周:注意力汇聚:Nadaraya-Watson 核回归
注意力汇聚:Nadaraya-Watson 核回归 Nadaraya-Watson 核回归是一个经典的注意力机制模型,它展示了如何通过注意力权重来对输入数据进行加权平均。以下是该内容的核心总结: 关键概念 注意力机制框架:由查询(自主提示…...
批量图片文本识别重命名,批量ocr识别图片重命名,基于WPF和腾讯OCR云部署实,现批量对图片局部提取文字后重命名的操作详细步骤
1. 项目背景 在日常工作中,我们经常需要处理大量图片文件,这些图片可能包含重要的文字信息。为了提高工作效率,我们需要一种自动化的方式,从图片中提取文字,并根据提取的文字对图片进行重命名。 本项目基于 WPF 框架开发桌面应用程序,结合 腾讯 OCR…...
26考研——排序(8)
408答疑 文章目录 一、排序的基本概念二、插入排序三、交换排序四、选择排序五、归并排序、基数排序和计数排序六、排序的代码实操七、各种内部排序算法的比较及应用八、外部排序九、参考资料鲍鱼科技课件26王道考研书 十、总结基本排序算法希尔排序快速排序、堆排序和归并排序…...
KUKA机器人导入设备说明文件
KUKA机器人在应用中需要进行通讯配置,通讯前需要导入设备说明文件,比如常用的倍福设备说明文件。在Workvisual软件上通过以下步骤即可导入设备说明文件。 一、打开Workvisual软件,在选项卡【File】下找到【Import/Export】输入/输出并点击打…...
ssl.SSLCertVerificationError报错解决方案
这个错误 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate 指出 Python 在尝试建立安全的 HTTPS 连接时,无法验证远程服务器(在此案例中是 GitHub 或 Hugging Face…...