【背景】
最近在做一个系统的性能压测遇到一个问题,某接口的一个字段值是通过AES加密的,而且每次请求要求这个字段值不能相同。
由于这个加密后的值的字长特别长,已经远远超出csv文件1个单元格所能包含的字符,所以参数化这个值就不能用常规的csv data set config组件
那么如何解决这个问题呢?
【技术难点】
由于百度上没有找到同样的问题,我就想着通过AI去寻找答案,可是AI对话几次得到的方法都不完全正确,通过多达20多次与AI磨合沟通,最终得到一个方法并加以调整,终于成功实现了我的需求,简直是柳暗花明!
【解决方案】
可以使用BeanShell预处理程序来实现每次请求都取不同的txt文件。以下是使用BeanShell预处理程序的步骤:
- 在你的测试计划中,添加一个"Thread Group"来定义并发用户的数量和循环次数。
- 在"Thread Group"下添加一个"HTTP Request Defaults"元件,用于设置默认的HTTP请求参数。
- 在"Thread Group"下添加一个"BeanShell PreProcessor"元件。
- 编写BeanShell脚本来读取txt文件并设置请求参数。例如:
import org.apache.commons.io.FileUtils; String fileName = "data_" + (ctx.getThreadNum() + 1) + ".txt"; String fileContent = FileUtils.readFileToString(new File(fileName)); vars.put("parameterName", fileContent);
- 通过
ctx.getThreadNum()
获取当前线程的编号(从0开始)。 - 使用
String
拼接来构建txt文件的文件名。 - 使用Apache Commons IO库的
FileUtils.readFileToString()
方法来读取txt文件的内容。 - 将文件内容保存到JMeter变量中,以供后续请求使用。
- 通过
- 在上述脚本中,将
parameterName
替换为实际的参数名,并根据你的实际情况进行修改。
- 编写BeanShell脚本来读取txt文件并设置请求参数。例如:
- 在"Thread Group"下添加一个"HTTP Request"元件。
- 你可以在请求中使用
${parameterName}
引用上一步中设置的参数变量。
- 你可以在请求中使用
- 设置"Thread Group"的循环次数,确保能够请求到所有的txt文件。
通过以上步骤,每次请求时,BeanShell预处理程序会根据当前线程的编号动态构建txt文件的文件名,并读取对应文件的内容。然后,将文件内容保存为JMeter变量,供后续请求使用。
【实际操作截图】
我这里是设置了5个线程并发,通过jmeter日志我们不难看出,每个线程都是取的不同文件里的AES加密值,我们的目的实现了!