接口用法(以后陆续会有增加)

本文介绍了Java接口如何自动创建static和final类型的常量,并通过一个示例展示了如何使用接口来定义一组枚举型的常量。

(1)

java接口中的所有数据成员会自动成为static和final类型数据,所以对于常量群的产生,接口是个十分便利的工具;

例:

public interface Weeks{

 

int 

Monday = 1,Tuesday = 2,Wednesday = 3,Thursday = 4,Friday = 5,Saturday = 6,Sunday = 7;

}

 

interface中数据成员会自动成为public类型,其中数据必须被初始化,不能为blank finals。

 

<think>我们根据用户需求编写JMeter脚本。需求如下: - 模拟3000个终端程序(即3000个独立用户) - 每个终端每30秒调用两个接口: 1. /api/locker/v1/terminal/device-status/upload 2. /api/locker/v1/terminal/task/fetch - 每个请求的请求头中需要设置变量 `X-LOCKER-ACCESS-KEY`,代表每个终端程序的token(每个终端token不同) - 首次调用时,终端是随机分批启动(避免同时启动对服务器造成瞬间压力) - 后续每隔30秒再次调用(即每个终端每30秒执行一次这两个接口的调用) - 测试时长不定(即脚本需要一直运行直到手动停止) 设计思路: 1. 使用线程组模拟终端程序,设置线程数为3000。 2. 每个线程(终端)需要有自己的token,我们可以使用CSV文件存储3000个token,然后在脚本中通过CSV Data Set Config来读取。 3. 首次随机分批启动:可以通过设置线程组的“Ramp-Up Period”(启动时间)来实现。例如,设置Ramp-Up Period为300秒(5分钟),那么3000个线程将在5分钟内陆续启动,达到随机分批的效果。 4. 每个终端每30秒调用一次两个接口使用固定定时器(Constant Timer)设置在两个接口请求之间?注意,这里要求的是每个终端每30秒调用一次两个接口,即每个终端执行一次循环(两个接口调用)后等待30秒。因此,我们需要在循环控制器内添加两个HTTP请求和一个固定定时器(等待30秒)。但是注意:定时器的作用域是它所在的控制器内的每一个取样器之前。因此,我们可以将两个HTTP请求放在一个循环控制器中,然后在循环控制器内添加一个固定定时器(设置等待30000毫秒)。但是这样会导致每次循环中,在第一个请求前等待30秒?这不符合要求。 正确的做法: 每个终端需要循环执行:调用接口1 -> 调用接口2 -> 等待30秒 -> 再次调用接口1 -> ... 如此循环。 因此,我们可以: - 使用一个循环控制器(Loop Controller),循环次数设置为“无限”(即勾选“永远”) - 在循环控制器内,依次添加两个HTTP请求(分别对应两个接口) - 然后在两个HTTP请求之后添加一个固定定时器(Constant Timer),设置等待30000毫秒(30秒) 但是注意:定时器是在每个取样器执行之前等待,所以如果放在两个HTTP请求之后,实际上是在下一次循环的第一个请求前等待。这样,第一次执行两个请求时没有等待,然后在执行完两个请求后,等待30秒再进行下一次循环。这样符合要求吗? 我们期望的是:第一次启动后立即执行两个请求,然后等待30秒,再执行两个请求,再等待30秒...。所以上面的结构是符合的。 但是,我们还需要考虑首次启动是随机分批的,这个由线程组的Ramp-Up Period控制。每个线程启动后立即进入循环,执行两个请求然后等待30秒,再执行两个请求,如此往复。 5. 请求头设置:在HTTP请求中,通过添加HTTP信息头管理器,设置`X-LOCKER-ACCESS-KEY`为变量(从CSV文件中读取的变量)。 6. 由于测试时长不定,我们将线程组的循环次数设置为永远(实际上是在循环控制器里设置永远),这样每个线程会一直执行直到手动停止。 7. 为了避免察看结果树等监听器在压测时消耗资源,我们只在调试时使用,压测时禁用或删除。在正式压测时,可以使用聚合报告等监听器,或者使用命令行运行并将结果保存到文件。 8. 关于CSV文件:需要准备一个包含3000个token的CSV文件(例如tokens.csv),每行一个token。然后在测试计划中添加一个CSV Data Set Config,设置文件名、变量名(如TOKEN)等。 步骤: 1. 创建线程组: 线程数:3000 Ramp-Up Period:300(5分钟,即300秒内启动所有线程,达到分批启动效果) 循环次数:1(注意:这里循环次数设为1,因为我们内部用了循环控制器来循环执行,所以线程组只需要执行一次循环控制器内的内容,而循环控制器内是无限循环,这样每个线程启动后就会一直循环执行下去) 调度器:不勾选(因为我们需要每个线程启动后一直运行,直到手动停止) 2. 添加CSV Data Set Config: 文件名:tokens.csv 的路径(建议使用相对路径,放在脚本同一目录) 变量名:TOKEN(或其他变量名) 其他默认 3. 在线程组下添加循环控制器(Loop Controller): 循环次数:勾选“永远”(Infinite) 4. 在循环控制器内添加两个HTTP请求: 第一个HTTP请求:/api/locker/v1/terminal/device-status/upload 第二个HTTP请求:/api/locker/v1/terminal/task/fetch 注意:填写正确的协议、服务器地址、端口、路径等。 5. 在每个HTTP请求中,添加HTTP信息头管理器(可以分别添加,也可以将共用的信息头管理器添加到循环控制器级别,这样两个请求都会应用): 添加一个HTTP信息头管理器,设置请求头:`X-LOCKER-ACCESS-KEY`,值为`${TOKEN}`(从CSV文件读取的变量) 6. 在循环控制器内,两个HTTP请求之后(即第二个HTTP请求的下方)添加一个固定定时器(Constant Timer): 线程延迟:30000毫秒(即30秒) 7. 添加必要的监听器:比如聚合报告(Aggregate Report),但注意:在正式压测时,如果使用GUI模式,监听器会消耗较多资源,所以建议使用命令行模式运行测试,并将结果输出到文件。 注意:如果接口需要特定的参数或方法(GET/POST),需要在HTTP请求中设置。 另外,关于CSV文件的编码问题:根据引用[3],JMeter的CSV读取默认编码是ISO-8859-1,可能导致乱码。如果token中包含非ASCII字符,需要确保CSV文件保存为UTF-8编码,并在CSV Data Set Config中设置文件编码为UTF-8(参数:File Encoding)。但是,token一般是字符串,可能不需要特殊字符,但以防万一。 如果遇到乱码,可以尝试: - 将CSV文件另存为UTF-8编码(无BOM) - 在CSV Data Set Config中设置File Encoding为UTF-8 但是根据引用[3],JMeter读取CSV时默认使用ISO-8859-1,即使文件是UTF-8也会乱码,所以必须显式设置编码为UTF-8。 总结脚本结构: - 测试计划 线程组(3000线程,300秒启动,循环1次) 循环控制器(永远循环) HTTP请求1(上传设备状态) HTTP请求2(获取任务) 固定定时器(30000毫秒) 配置元件:CSV Data Set Config(在循环控制器外部,线程组内,这样每个线程只读取一次token,然后在整个循环中重复使用) 配置元件:HTTP信息头管理器(在循环控制器内部,这样每次请求都会使用,但变量TOKEN不变,因为每个线程只读取一次) 注意:CSV Data Set Config应该放在线程组内,循环控制器的外面。这样每个线程在启动时从CSV文件中读取一行(即一个token),然后在循环中反复使用这个token。因为每个终端程序使用一个固定的token。 如果CSV文件中的token数量少于3000,则JMeter会循环读取(默认设置),所以我们可以准备3000个token,然后设置CSV Data Set Config的“Recycle on EOF”为False(即读取到文件末尾就停止),这样如果线程数多于token数量,多余的线程将无法获取token。因此,我们需要确保token数量>=线程数(3000)。 另外,如果测试时间很长,我们可能还需要考虑token失效的问题。现实场景中token可能会过期,需要重新获取。但这里用户没有提到,我们假设token长期有效。 根据以上设计,我们开始编写JMeter脚本。由于无法直接给出可运行的脚本(环境不同),我将给出关键步骤的截图描述和配置说明。 步骤详细配置: 1. 测试计划:默认,可以添加用户定义的变量(如果需要)等。 2. 线程组: - 线程数:3000 - Ramp-Up Period:300(秒) - 循环次数:1 3. 添加配置元件 -> CSV Data Set Config: - 文件名:tokens.csv(完整路径或相对路径) - 变量名称:TOKEN(或其他变量名) - 文件编码:UTF-8(如果文件是UTF-8编码) - 其他默认(分隔符用逗号,Recycle on EOF: False, Stop thread on EOF: False? 注意:我们要求3000个线程,所以应该有3000个token,因此不会遇到EOF,所以设置Recycle on EOF为False即可,如果线程数超过token数,则超出的线程会取不到值,所以一定要保证token数量足够) 4. 添加循环控制器(Loop Controller): - 勾选“永远”(Infinite) 5. 在循环控制器下添加第一个HTTP请求: - 名称:上传设备状态 - 协议:http 或 https - 服务器名称或IP:填写被测系统的域名或IP - 端口号:如果使用http默认80,https默认443,可以不填,否则填写 - 方法:根据接口文档,假设是POST(按照实际填写) - 路径:/api/locker/v1/terminal/device-status/upload - 参数:如果需要,在参数或消息体数据中填写 6. 在循环控制器下添加第二个HTTP请求: - 名称:获取任务 - 同上,路径为:/api/locker/v1/terminal/task/fetch 7. 在循环控制器下(两个HTTP请求之后)添加固定定时器(Constant Timer): - 线程延迟:30000(毫秒) 8. 在循环控制器下添加HTTP信息头管理器(放在循环控制器下,这样两个HTTP请求都会应用): - 添加一个请求头:名称:X-LOCKER-ACCESS-KEY,值:${TOKEN} 9. 添加监听器:聚合报告(Aggregate Report)等(用于查看结果) 注意事项: - 调试时,可以先用少量线程(如10个)测试脚本是否正确。 - 正式测试时,建议使用非GUI模式运行(命令行模式),以减少资源消耗。 命令:jmeter -n -t [脚本文件名.jmx] -l [结果文件.jtl] - 如果被测系统有防护(如限制同一IP连接数),可能需要使用分布式测试(多台压力机)或使用IP欺骗,但本脚本未涉及。 关于首次随机分批启动:通过设置Ramp-Up Period为300秒,3000个线程在300秒内启动,平均每秒启动10个线程。这样,每个线程的启动时间是随机的(均匀分布),因此达到了随机分批启动的效果。 最后,每个线程(终端)启动后,会立即执行两个请求(因为循环控制器内第一个请求前没有定时器),然后执行第二个请求,然后等待30秒,再进入下一次循环(再次执行两个请求,再等待30秒,如此往复)。 这样设计符合用户需求。 问题:如果两个请求执行时间超过30秒怎么办? 实际上,定时器设置的30秒是上一次循环结束(即第二个请求完成)后等待30秒再开始下一次循环。如果两个请求执行时间很长(比如超过30秒),那么下一次循环会在上一次循环结束(包括等待)后才开始。因此,每个终端调用两个接口的实际间隔是(两个请求执行时间+30秒)。如果希望严格每30秒调用一次(无论请求执行时间多长),则需要调整。但用户需求是“每30秒调用一次”,通常是指上一次调用结束到下一次调用开始间隔30秒,所以这样设置是合理的。 如果希望固定频率(比如每30秒执行一次,不管上一次执行了多久),可以用固定吞吐量定时器(Constant Throughput Timer)或精确的调度器,但这里不展开。 根据用户需求,我们按照上述设计即可。 相关问题: 1. 如何准备3000个终端程序的token? 2. 在非GUI模式下运行JMeter测试时,如何监控测试状态? 3. 如何分析JMeter生成的结果文件? 4. 在分布式测试中如何部署这个脚本? 5. 如何动态调整测试负载(比如逐渐增加终端数)? 6. 测试过程中token过期如何处理? 7. 如何验证接口响应是否正确(添加断言)? 8. 如何模拟终端程序的地理位置分布(不同网络延迟)? </think>### JMeter脚本设计:3000终端压力测试 根据您的测试场景,JMeter脚本设计如下: #### 1. 核心组件结构 ```markdown 测试计划 └─ 线程组(3000终端模拟) ├─ HTTP信息头管理器(设置X-LOCKER-ACCESS-KEY) ├─ CSV数据文件设置(token参数化) ├─ 随机定时器(首次分批启动) └─ 循环控制器(永久循环) ├─ HTTP请求1(/device-status/upload) ├─ HTTP请求2(/task/fetch) └─ 固定定时器(30秒间隔) ``` #### 2. 关键配置说明 1. **线程组设置**: - 线程数:3000(模拟终端数) - Ramp-Up时间:600秒(10分钟分批启动) - 循环次数:勾选"永远" 2. **CSV数据配置**[^1][^3]: ```markdown 配置元件 → CSV Data Set Config: - 文件名:tokens.csv(存储3000个token) - 变量名称:TERMINAL_TOKEN - 文件编码:UTF-8(避免乱码) - 遇到文件结束符:停止线程(避免重复使用token) ``` 3. **HTTP信息头管理器**: ```markdown 名称:X-LOCKER-ACCESS-KEY 值:${TERMINAL_TOKEN}(引用CSV变量) ``` 4. **首次随机分批控制**: ```markdown 前置处理器 → Gaussian Random Timer: - 偏差:20000毫秒(20秒随机范围) - 固定延迟:10000毫秒(基础10秒) ``` 5. **接口请求示例(/device-status/upload)**: ```markdown HTTP请求: - 协议:HTTPS - 服务器:your-api-domain.com - 路径:/api/locker/v1/terminal/device-status/upload - 方法:POST(根据实际修改) ``` 6. **30秒循环控制器**: ```markdown 逻辑控制器 → Loop Controller: - 循环次数:-1(永久循环) 添加定时器 → Constant Timer: 线程延迟:30000毫秒(30秒) ``` #### 3. 注意事项 1. **Token文件准备**: - 创建`tokens.csv`文件,包含3000行独立token - 示例内容: ```csv token1 token2 ... token3000 ``` 2. **资源优化建议**[^1]: - 禁用图形监听器(如:查看结果树) - 使用聚合报告+保存结果到JTL文件 - 命令行执行:`jmeter -n -t test.jmx -l result.jtl` 3. **乱码解决方案**[^3]: - 在CSV配置中显式设置编码:`File Encoding: UTF-8` - 添加HTTP请求默认值管理器设置编码
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值