测试需求如下:该网站的免费下载软件许可接口进行了账号与IP的双重下载限制,即一个IP或者一个账号一天内只允许下载十次软件许可。本次利用Jmeter的IP欺骗在内网环境下对该接口进行测试,本次使用了四个账号与内网下的四个虚拟IP进行测试,以下是本次测试的总结与记录
2. 将CSV数据文件设置和登录接口都放在仅一次控制器中的作用:因为本次测试中的account_and_pwd.txt文件中存在4行三列参数,本次测试的线程数为4,且线程组中的“Same user on each iteration”选项不勾选,我在测试中的所看到的效果就是四个线程每个线程都对应txt文件中的一行数据,且仅取了一次,并将数据带进每个取样器中,直到到达所设置的测试时间。
Groovyimport org.apache.jmeter.services.FileServer import java.net.InetAddress import java.text.SimpleDateFormat /* 导入 JMeter 提供的 FileServer 类,用于处理文件操作。 导入 Java 标准库中的 InetAddress 类,用于获取 IP 地址。 导入 Java 标准库中的 SimpleDateFormat 类,用于格式化日期和时间。 */ // 获取 CSV Data Set Config 中的账号和 IP 参数 String username = vars.get("account") String ip = vars.get("ips") /* 从 JMeter 变量中获取名为 account 的变量值。vars 是 JMeter 中的一个内置对象,用于获取和设置 JMeter 变量。 从 JMeter 变量中获取名为 ips 的变量值 */ // 获取当前时间并格式化 String currentTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) /* new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"): 创建一个 SimpleDateFormat 对象,并指定日期和时间格式。 .format(new Date()): 将当前时间(new Date() 创建的对象)格式化为指定格式的字符串。 */ // 构建要写入的日志内容 String logContent = "Time: " + currentTime + " | Thread: " + ctx.getThread().getThreadName() + " | Username: " + username + " | IP Address: " + ip // 定义日志文件路径 String logFilePath = FileServer.getFileServer().getBaseDir() + "/ip_log.txt" // 尝试将内容追加到日志文件中,并处理可能的异常 //try { ... } catch (Exception e) { ... }: 尝试执行 try 块中的代码,如果发生异常则捕获并处理。 try { new File(logFilePath).withWriterAppend('UTF-8') { writer -> writer.writeLine(logContent) //使用 withWriterAppend 方法以追加模式打开日志文件,并将 logContent 写入文件。 } log.info("Successfully wrote to log file: " + logFilePath) //将成功写入日志文件的消息记录到 JMeter 日志中。 } catch (Exception e) { log.error("Failed to write to log file: " + logFilePath, e) //将写入日志文件失败的消息和异常信息记录到 JMeter 日志中。 } //将 logContent 的内容记录到 JMeter 日志中 log.info(logContent)
Groovy// 获取提取的code变量 int code = vars.get("code") as Integer /* int code:声明一个名为 code 的整数变量。 vars.get("code"):从 vars 对象(JMeter 中的变量集合)中获取键为 "code" 的值。 as Integer:将获取到的值强制转换为 Integer 类型。这是 Groovy 中的类型转换语法。 */ // 获取响应数据 String response = prev.getResponseDataAsString() /* String response:声明一个名为 response 的字符串变量。 prev.getResponseDataAsString():调用 prev 对象(JMeter 中表示上一个采样器的结果)的 getResponseDataAsString 方法,获取响应数据并将其作为字符串返回。 */ // 根据code的值进行断言 if (code > 0 && code <= 10) { if (!response.contains("Data inserted successfully")) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("Expected 'Data inserted successfully' in response but not found.") } } else if (code == 0) { if (!response.contains("Number error")) { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("Expected 'Number error' in response but not found.") } } else { AssertionResult.setFailure(true) AssertionResult.setFailureMessage("Unexpected code value: " + code) }
本文作者:精卫
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!