编写 bzt 脚本的正确姿势
这是今年1月24日的旧文,发现没在这里发过,就搬运过来了。
声明
- 本文讨论的使用场景主要为使用已有的 jmx 脚本,并配合 json 对 jmx 脚本进行部分参数的动态修改。
- 只补充一些官方文档上没有提到的使用注意事项,所以官网上阐述得比较清楚的点,文章里就不再赘述。
什么是 bzt?
bzt,全名是Blazemeter taurus
,是Blazemeter旗下的一款开源组件,官方宣称此组件的底层依赖于JMeter
、Gatling
、Locust.io
和Selenium WebDriver
,并且经过了自动化程度高、可操作性好的封装,使得性能测试与功能测试的过程变得更加简单。
使用 bzt 压测的基本流程
使用 bzt 中的jmeter
引擎压测,有两种方式:
- 直接运行已有的 jmx 文件
bzt example.jmx
- 利用
yaml
或者json
生成一个 jmx 脚本并运行bzt example.yaml / bzt example.json
可以发现,其实jmeter
里运行的始终是 jmx 文件,只不过 bzt 对 jmx 文件做了一层包装,使得没有接触过 jmeter 的用户也可以根据官方文档的指引用yaml/json
生成较为简单的 jmx 脚本。
编写脚本的注意事项
本文主要讨论的使用场景来源于我们所开发的 TCPS 平台——用户上传自己的 jmx 脚本,而用户每次运行脚本时都可能会修改这几个值:①需要压测的线程、②并发数和③压测时长;另外在运行脚本前,用户还需要调试脚本,并得到请求的 response 数据。
1. 如何修改已有脚本的某项参数值
通过 bzt 所提供的set-prop
参数,可以动态修改已有脚本的某些参数值,如图:
但是官方文档中没有提到的事情有:
- 只能通过节点的 testname 识别到该节点。
- 当有多个节点的 testname 相同时,会修改所有拥有相同 testname 的节点的值
- 没有办法识别 jmx 的层级,如果需要区分两个不同层级的节点,建议修改 testname
2. 如何选择性地执行已有脚本的线程组?
图中的红框部分就是启用部分线程组,禁用另一部分线程组,以达到动态选择线程组去执行的目的。
语法格式很好明白,但是有那么几点注意事项:
通过 ThreadGroup 的 testname 去识别线程组,并且把该 ThreadGroup 节点的
enable
值设置为true
或者false
,如图:
在设置
enable
的线程组数组时,如果脚本里有多个 testname 相同的线程组,有以下几种情况:
(1)这几个线程组节点的 enable 值都为false
;bzt 不会运行任何一个线程组(2)这几个线程组节点的 enable 值有些为
false
,有些为true
;bzt 只会运行enable
值为true
的线程组(3)这几个线程组节点的 enable 值都为
true
;bzt 会运行全部线程组在设置
disable
的线程组数组时,不管线程组原本的enable
值为true
或者false
,都会被设置为false
3. 如何查看具体的测试结果?
bzt 提供两种查看结果的方式,分别是xml
格式和csv
格式。
查看xml
结果
如果想得到xml
格式的结果,具体的脚本设置如下:
{
"execution": [
{
"write-xml-jtl": "error",
"scenario": "example"
}
],
"scenarios": {
"example": {
"script": "example.jmx"
}
},
"modules": {
"jmeter": {
"xml-jtl-flags": {
"xml":`true`,
"fieldNames":`true`,
"time":`true`,
"timestamp":`true`,
"latency":`true`,
"connectTime":`true`,
"success":`true`,
"label":`true`,
"code":`true`,
"message":`true`,
"threadName":`true`,
"dataType":`true`,
"encoding":`true`,
"assertions":`true`,
"subresults":`true`,
"responseData":`false`,
"samplerData":`false`,
"responseHeaders":`true`,
"requestHeaders":`true`,
"responseDataOnError":`true`,
"saveAssertionResultsFailureMessage":`true`,
"bytes":`true`,
"threadCounts":`true`,
"url":`true`
}
}
}
}
其中write-xml-jtl
的值有error
(默认值) 、full
、 none
三种,以下依次介绍三种情况。
当
write-xml-jtl
的值为error
时
设置完成并运行后,会从项目文件夹里得到error.jtl
和kpi.jtl
两个结果文件,如图
查看这两个文件,里面的内容分别是这是因为我测试的两个接口都返回了404,而
write-xml-jtl
的值为error
则表示把错误日志以xml
格式输出。当
write-xml-jtl
的值为full
时
运行后,会从项目文件夹里得到trace.jtl
和kpi.jtl
两个结果文件,如图
查看这两个文件的内容,会得到
因为我们把
write-xml-jtl
的值设置为full
,那么 bzt 就把所有的日志都以xml
格式打印在了trace.jtl
这个文件里了。当
write-xml-jtl
的值为none
时
运行后,项目文件夹里只有kpi.jtl
这个结果文件,如图
查看这个文件的内容,如图
这意味着如果我们把
write-xml-jtl
的值设置为none
,它不会打印任何值,项目里只有默认生成的结果文件。
查看csv
结果
如果想得到csv
格式的结果,脚本设置如下:
{
"modules": {
"jmeter": {
"csv-jtl-flags": {
"xml": false,
"fieldNames": true,
"time": true,
"timestamp": true,
"latency": true,
"connectTime": true,
"success": true,
"label": true,
"code": true,
"message": true,
"threadName": true,
"dataType": false,
"encoding": false,
"assertions": false,
"subresults": false,
"responseData": false,
"samplerData": false,
"responseHeaders": false,
"requestHeaders": false,
"responseDataOnError": false,
"saveAssertionResultsFailureMessage": false,
"bytes": true,
"hostname": true,
"threadCounts": true,
"url": false
}
}
}
}
用同样的接口测试后,会得到一个kpi.jtl
文件,如图
查看文件,可以看到刚才设置的值都被打印出来了,如图
如果把所有的属性值都设置成true
,那么会得到下面这个文件
注意事项
无论是使用xml
还是csv
,有两点需要注意
当使用
csv-jtl-flags
的时候,xml
属性必须为false
,不然会得到Error: Could not determine delimiter
报错,如图当使用
xml-jtl-flags
的时候,如果xml
属性为false
,bzt 不会报错,但是生成的所有结果文件都会是csv
格式,如图(1)只打印错误信息
(2)打印所有信息
编写 bzt 脚本的正确姿势的更多相关文章
- (转)Git 提交的正确姿势:Commit message 编写指南
Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交. $ git commit -m "hello world" 上面代码的-m参数,就是用来 ...
- Git 提交的正确姿势
Git 提交的正确姿势:Commit message 编写指南 SCOP范围 middleware core config plugin test type范围 Git 每次提交代码,都要写 Comm ...
- 解锁redis锁的正确姿势
解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...
- Redis实现分布式锁的正确姿势
分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介绍Re ...
- 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...
- 【分布式缓存系列】Redis实现分布式锁的正确姿势
一.前言 在我们日常工作中,除了Spring和Mybatis外,用到最多无外乎分布式缓存框架——Redis.但是很多工作很多年的朋友对Redis还处于一个最基础的使用和认识.所以我就像把自己对分布式缓 ...
- Taro 多端开发的正确姿势:打造三端统一的网易严选(小程序、H5、React Native)
笔者所在的趣店 FED 早在去年 10 月份就已全面使用 Taro 框架开发小程序(当时版本为 1.1.0-beta.4),至今也上线了 2 个微信小程序.2 个支付宝小程序. 之所以选用 Taro, ...
- linux 的基本操作(编写shell 脚本)
终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要.下面笔者就带你正式进入shell脚本的世界吧. 到现 ...
- 编写Shell脚本的最佳实践
编写Shell脚本的最佳实践 http://kb.cnblogs.com/page/574767/ 需要记住的 代码有注释 #!/bin/bash # Written by steven # Name ...
随机推荐
- 『现学现忘』Git后悔药 — 27、版本回退介绍
目录 1.什么版本回退 2.需要了解两个知识点 (1)HEAD是什么 (2)HEAD指针用法 3.git reflog命令介绍 1.什么版本回退 版本回退也可以叫回滚. 若修改过的文件,不仅添加到了暂 ...
- 跨平台(32bit和64bit)的 printf 格式符 %lld 输出64位的解决方式
问题描述 在 C/C++ 开发中,使用 printf 打印 64 位变量比较常用,通常在 32 位系统中使用 %lld 输出 64 位的变量,而在 64 位系统中则使用 %ld: 如果在 32 位系统 ...
- 腾讯云数据库公有云市场稳居TOP 2!
7月4日,国际权威机构IDC发布的<2021年下半年中国关系型数据库软件市场跟踪报告>显示,腾讯云数据库在关系型数据库软件市场(公有云模式)中,位列第二. IDC报告显示,2021下半年中 ...
- antd vue 折叠面板 v-for 循环点击无效
问题描述 实现一个折叠面板点击展开,但是必须点击两次才能展开,第一次无效 <a-collapse-panel v-for="(item, index) in dataMap" ...
- 5-18 Nacos配置中心 | RestTemplate
配置中心 什么是配置中心 所谓配置中心:将项目需要的配置信息保存在配置中心,需要读取时直接从配置中心读取,方便配置管理的微服务工具 我们可以将部分yml文件的内容保存在配置中心 一个微服务项目有很多子 ...
- P3622 [APIO2007]【一本通提高状态压缩类动态规划】动物园
广告 绿树公司 - 官方网站:https://wangping-lvshu.github.io/LvshuNew/ 绿树智能 - 官方网站:https://wangping-lvshu.github. ...
- 超小体积单键/1路1感应通道触摸触控检测IC-VKD233HS DFN6 2*2mm,常用于TWS蓝牙耳机入耳检测、运动手环等小体积单键触摸产品
产品品牌:永嘉微电/VINKA 产品型号:VKD233HS 封装形式:DFN6 产品年份:新年份 概述: VKD233HS DFN6具有1个触摸按键,可用来检测外部触摸按键上人手的触摸动作.该芯片具 ...
- 2022-07-25 第四组 java之抽象、接口
目录 一.抽象类 1.概念 2.抽象类以及抽象方法格式定义 3.抽象类总结规定 二.接口 1.什么是接口 2.接口的定义 3.接口特性 4.抽象类和接口的区别 5.继承抽象类和实现接口的异同 6.规则 ...
- [b01lers2020]Welcome to Earth-1
1.打开之后界面如下,查看源代码信息,发现chase文件,结果如下: 2.访问chase文件会一直跳转到die界面,那就只能抓包进行查看,发现leftt文件,结果如下: 3.访问leftt文件并查看源 ...
- Vue el与data的两种写法 && Object.defineProperty方法
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8" /> 5 & ...