k6 是 GitHub 上提供的开源负载测试工具. 它是用 Go 编写的, 并运行用 JavaScript 编写的测试脚本. 它受到了开发人员, 测试人员和 DevOps 团队的强烈兴趣, 并拥有超过 4400 名 GitHub 明星. k6 是命令行驱动的, 测试结果输出到 stdout 或结果分析工具, 如 Load Impact Insights.
JMeter 也是一个开源负载测试工具, 已存在多年. 它非常受欢迎, 拥有数千名用户. 它是一个 Java 应用程序, JMeter GUI 用于创建测试脚本. 此外, 一些脚本语言可用于编写 JMeter 函数, 包括 Java,Groovy 和 JavaScript.Groovy 已成为推荐的默认选项. 但是, 只能从命令行执行负载测试运行.
在 "大卫与歌利亚" 的方式中, 让我们看一下在 k6 中比在 JMeter 中更容易做的事情的几个例子.
1. 在变量中保存 HTTP 响应
在 JMeter 中:
添加 Beanshell Postprocessor 作为请求的子项, 返回您要查找的响应.
将代码 vars.put("response", new String(data)); 放入 PostProcessor 的 "脚本" 区域.
请根据 ${response} 需要参考提取的值 .
在 k6 中, 使用以下测试脚本代码:
let response = http.get("http://javame.cnblogs.com/");
在这两种情况下, 数据最终都在响应变量中. 主要区别在于您必须在 JMeter 中向请求添加 Beanshell PostProcessor, 然后才能添加代码段.
2. 测试预期的 404 响应
在 JMeter 中:
在测试下创建一个新的 Response Assertion. 在断言的 "要测试的响应字段" 部分中, 确保选中 "忽略状态" 框.
然后, 您可以添加其他断言, 例如将 "要测试的响应字段" 中的无线电设置为 "响应代码", 并将 "要测试的模式" 设置为 404.
图 1: 显示如何设置响应断言的 JMeter GUI.
在 k6 中, 使用以下测试脚本代码:
- let response = http.get("http://some.url/");
- check(res, {
- "Status is 404": (r) => r.status === 404
- });
这里的主要区别在于, 在 JMeter 中执行此操作需要您单击 GUI 并在输入字段中填入值, 而使用 k6 则需要编写几行代码. 您可以在版本控制系统 (VCS) 中轻松跟踪和管理 k6 JavaScript 加载测试代码, 就像您的应用程序代码一样.
3. 在不同的测试中重用自定义测试代码
例如, 假设您要调用 logTransaction() 150 个不同测试配置中的一个文件中定义的 函数.
在 JMeter 中:
将该行添加 beanshell.sampler.init=BeanShellSampler.bshrc 到 user.properties 文件(位于 JMeter 安装的 "bin" 文件夹中).
将 logTransaction 函数放在 BeanShellSampler.bshrc 文件中(相同位置, JMeter 的 "bin" 文件夹).
下次启动 JMeter 时, 您可以在任何脚本中从任何 Beanshell Sampler 调用该函数.
在 k6:
将 logTransaction()函数放在 JavaScript 文件中, 例如 "logTransaction.js"
使用以下语句在任何脚本中导入该函数: 从 "/path/to/logTransaction.js" 导入{logTransaction};
在 k6 中, 任何 JavaScript 文件都可以直接用作可导入模块, 它允许您以任何方式组织文件. 您还可以直接通过网络导入模块:
import { logTransaction } from "s3.amazonaws.com/path/to/logTransaction.js";
除了标准的 ES6 JavaScript API 之外, k6 还捆绑了 API 来处理 Cookie, 加密, 编码, 环境变量, html 表单, HTML 解析, 多部分请求, TLS 客户端证书, TLS 密码和版本等等.
4. 实现嵌套循环
例如, 您可能希望使用两个参数测试 servlet:X 和 Y, 其中 X 和 Y 是 0 到 100 之间的随机数. 您需要一个嵌套循环, 如下所示:
- for(int x = 0 ; x <= 100 ; x ++)
- for(int y = 0 ; y <= 100 ; y ++)
servlet ?param1 = x &param2 = y
在 JMeter 中:
您的架构可能如下所示:
- Thread Group
- User Defined Variables
- maxX = 100
- maxY = 100
- Loop Controller X
- Loop Count: ${
- __BeanShell(Integer.parseInt(vars.get("maxX"))+1)
- }
- Counter X
- Start: 0
- Increment: 1
- Maximum: ${
- maxX
- }
- Reference Name: loopX
- Loop Controller Y
- Loop Count: ${
- __BeanShell(Integer.parseInt(vars.get("maxY"))+1)
- }
- Counter Y
- Start: 0
- Increment: 1
- Maximum: ${
- maxY
- }
- Reference Name: loopY
- YOUR HTTP Request
- servlet?param1=${
- loopX
- }¶m2=${
- loopY
- }
. . .
在 k6:
使用以下脚本代码:
- for(var x = 0 ; x <= 100 ; x ++)
- for(var y = 0 ; y <= 100 ; y ++)
- http.get("http://some.domain/servlet?param1 ="+ x +"¶m2="+ y);
当然, 执行更复杂的逻辑分支是基于 GUI 的方法与直接在代码中编写逻辑相比经常变得非常笨重的地方. k6 解决方案与用于描述问题的伪代码非常相似.
5. 进行并行请求
我们通常希望并行发出多个请求, 就像浏览器在获取网页时所做的那样. 这使得服务器上的压力比每个虚拟用户一次只发出一个请求要多得多.
在 JMeter 中:
JMeter 提供同步计时器, 允许对请求进行分组, 以便它们可以在同一时刻执行. 只需在测试计划中添加同步计时器, 并确保:
它在两个请求中都处于同一级别
线程组中的虚拟用户数> = = 同步计时器中设置的数量
在 k6:
使用此 http.batch() 功能可并行发出多个请求. 例如:
- http.batch([
- "http://test.loadimpact.com",
- "http://test.loadimpact.com/style.CSS",
- "http://test.loadimpact.com/images/logo.png"
- ]);
上述 "解决方案" 不具有 100%的可比性. 在 JMeter 情况下, 我们仍然只允许每个虚拟用户 (VU) 一次发出一个请求. 这意味着 JMeter VU 不是 "真实用户" 的完全准确模型. 单个人类用户将使用他们的 web 浏览器同时发出多个请求, 而 JMeter VU 一次只发出一个请求.
相反, JMeter 所做的是同步 VU, 以便它们在同一时间发出请求.(对我来说似乎不太有用 - 总吞吐量可能会下降, 因为某些 VU 必须等待其他 VU 完成请求).
另一方面, 在所示的示例中, k6 将允许每个 VU 打开三个并发 TCP 连接, 因此能够并行获取这三个项目, 就像 Web 浏览器一样. 这意味着在 k6 情况下, 100 个 VU 可以并行获取 300 个项目. 在 Jmeter 情况下, 100 VU 将并行获取 100 个项目.(注意: 还有一个名为 Parallel Controller 的 JMeter 扩展可用于创建并行请求).
来源: http://www.bubuko.com/infodetail-2883587.html