这是今年1月24日的旧文,发现没在这里发过,就搬运过来了。

声明

  1. 本文讨论的使用场景主要为使用已有的 jmx 脚本,并配合 json 对 jmx 脚本进行部分参数的动态修改
  2. 只补充一些官方文档上没有提到的使用注意事项,所以官网上阐述得比较清楚的点,文章里就不再赘述。

什么是 bzt?

bzt,全名是Blazemeter taurus,是Blazemeter旗下的一款开源组件,官方宣称此组件的底层依赖于JMeterGatlingLocust.ioSelenium WebDriver,并且经过了自动化程度高、可操作性好的封装,使得性能测试与功能测试的过程变得更加简单。

使用 bzt 压测的基本流程

使用 bzt 中的jmeter引擎压测,有两种方式:

  1. 直接运行已有的 jmx 文件
    bzt example.jmx
  2. 利用yaml或者json生成一个 jmx 脚本并运行
    bzt example.yaml / bzt example.json

可以发现,其实jmeter里运行的始终是 jmx 文件,只不过 bzt 对 jmx 文件做了一层包装,使得没有接触过 jmeter 的用户也可以根据官方文档的指引用yaml/json生成较为简单的 jmx 脚本。

编写脚本的注意事项

本文主要讨论的使用场景来源于我们所开发的 TCPS 平台——用户上传自己的 jmx 脚本,而用户每次运行脚本时都可能会修改这几个值:①需要压测的线程、②并发数和③压测时长;另外在运行脚本前,用户还需要调试脚本,并得到请求的 response 数据。

1. 如何修改已有脚本的某项参数值

通过 bzt 所提供的set-prop参数,可以动态修改已有脚本的某些参数值,如图:



但是官方文档中没有提到的事情有:

  1. 只能通过节点的 testname 识别到该节点。
  2. 当有多个节点的 testname 相同时,会修改所有拥有相同 testname 的节点的值
  3. 没有办法识别 jmx 的层级,如果需要区分两个不同层级的节点,建议修改 testname

2. 如何选择性地执行已有脚本的线程组?

图中的红框部分就是启用部分线程组,禁用另一部分线程组,以达到动态选择线程组去执行的目的。



语法格式很好明白,但是有那么几点注意事项:

  1. 通过 ThreadGroup 的 testname 去识别线程组,并且把该 ThreadGroup 节点的enable值设置为true 或者 false,如图:

  2. 在设置enable的线程组数组时,如果脚本里有多个 testname 相同的线程组,有以下几种情况:

    (1)这几个线程组节点的 enable 值都为false;bzt 不会运行任何一个线程组

    (2)这几个线程组节点的 enable 值有些为false,有些为true;bzt 只会运行enable值为true的线程组

    (3)这几个线程组节点的 enable 值都为true;bzt 会运行全部线程组

  3. 在设置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(默认值) 、fullnone三种,以下依次介绍三种情况。

  1. write-xml-jtl的值为error

    设置完成并运行后,会从项目文件夹里得到error.jtlkpi.jtl两个结果文件,如图



    查看这两个文件,里面的内容分别是这是因为我测试的两个接口都返回了404,而write-xml-jtl的值为error则表示把错误日志以xml格式输出。

  2. write-xml-jtl的值为full

    运行后,会从项目文件夹里得到trace.jtlkpi.jtl两个结果文件,如图

    查看这两个文件的内容,会得到



    因为我们把write-xml-jtl的值设置为full,那么 bzt 就把所有的日志都以xml格式打印在了 trace.jtl这个文件里了。

  3. 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,有两点需要注意

  1. 当使用csv-jtl-flags的时候,xml属性必须为false,不然会得到Error: Could not determine delimiter报错,如图

  2. 当使用xml-jtl-flags的时候,如果xml属性为false,bzt 不会报错,但是生成的所有结果文件都会是csv格式,如图

    (1)只打印错误信息

    (2)打印所有信息

编写 bzt 脚本的正确姿势的更多相关文章

  1. (转)Git 提交的正确姿势:Commit message 编写指南

    Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交. $ git commit -m "hello world" 上面代码的-m参数,就是用来 ...

  2. Git 提交的正确姿势

    Git 提交的正确姿势:Commit message 编写指南 SCOP范围 middleware core config plugin test type范围 Git 每次提交代码,都要写 Comm ...

  3. 解锁redis锁的正确姿势

    解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...

  4. Redis实现分布式锁的正确姿势

    分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKeeper的分布式锁.本篇博客将介绍第二种方式,基于Redis实现分布式锁.虽然网上已经有各种介绍Re ...

  5. 开发函数计算的正确姿势 —— 使用 Fun Local 本地运行与调试

    前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...

  6. 【分布式缓存系列】Redis实现分布式锁的正确姿势

    一.前言 在我们日常工作中,除了Spring和Mybatis外,用到最多无外乎分布式缓存框架——Redis.但是很多工作很多年的朋友对Redis还处于一个最基础的使用和认识.所以我就像把自己对分布式缓 ...

  7. Taro 多端开发的正确姿势:打造三端统一的网易严选(小程序、H5、React Native)

    笔者所在的趣店 FED 早在去年 10 月份就已全面使用 Taro 框架开发小程序(当时版本为 1.1.0-beta.4),至今也上线了 2 个微信小程序.2 个支付宝小程序. 之所以选用 Taro, ...

  8. linux 的基本操作(编写shell 脚本)

    终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要.下面笔者就带你正式进入shell脚本的世界吧. 到现 ...

  9. 编写Shell脚本的最佳实践

    编写Shell脚本的最佳实践 http://kb.cnblogs.com/page/574767/ 需要记住的 代码有注释 #!/bin/bash # Written by steven # Name ...

随机推荐

  1. Redis 笔记 01:入门篇

    Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  2. Java开发学习(十)----基于注解开发定义bean 已完成

    一.环境准备 先来准备下环境: 创建一个Maven项目 pom.xml添加Spring的依赖 <dependencies>    <dependency>        < ...

  3. electron+vue 环境搭建

    一.环境介绍及会遇到的困难 electron是一款比较流行的桌面可视化开发工具,通过html+js+css实现桌面应用,优点就是多平台开发以及UI好看.缺点是外网npm仓库速度慢.话不多说开始我的教程 ...

  4. IDEA 开发工具-插件{[转载]

    00 idea 开发工具使用技巧 01 idea插件推荐-- 02 IDEA插件 03 IDEA值得推荐的20款优秀的插件 04 IDEA插件精选」安利一个IDEA骚操作:一键生成方法的序列图

  5. Spring Data JPA 在 @Query 中使用投影的方法

    Spring Data JPA 在 @Query 中使用投影的方法 关于投影的基本使用可以参考这篇文章:https://www.baeldung.com/spring-data-jpa-project ...

  6. NOI / 1.4编程基础之逻辑表达式与条件分支讲解-02:输出绝对值

    02:输出绝对值 总时间限制: 1000ms 内存限制: 65536kB 题目: 描述 输入一个浮点数,输出这个浮点数的绝对值. 输入 输入一个浮点数,其绝对值不超过10000. 输出 输出这个浮点数 ...

  7. 数据结构(C语言版)严蔚敏->排序

    @ 目录 1. 插入排序 1.1 直接插入排序 1.2 折半插入排序 1.3 希尔排序(Shell Sort) 2.交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 简单选择排序 ...

  8. Logo小变动,心境大不同,SVG矢量动画格式网站Logo图片制作与实践教程(Python3)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_207 曾几何时,SVG(Scalable Vector Graphics)矢量动画图被坊间称之为一种被浏览器诅咒的技术,只因为糟糕 ...

  9. V8中的快慢数组(附源码、图文更易理解😃)

    接上一篇掘金 V8 中的快慢属性,本篇分析V8 中的快慢数组,了解数组全填充还是带孔.快慢数组.快慢转化.动态扩缩容等等.其实很多语言底层都采用类似的处理方式,比如:Golang中切片的append操 ...

  10. Ubuntu 20.04安装Docker

    Docker学习系列文章 入门必备:十本你不容错过的Docker入门到精通书籍推荐 day1.全面的Docker快速入门教程 day2.CentOS 8.4安装Docker day3.Windows1 ...