产品性能测试入门秘籍

前言
在《一体化测试指标可视工程实践》中,我们分享了以趣链BaaS系统为例的测试实践路径,在后台收到读者们关于性能测试的留言。为此,本期将围绕如何进行产品性能测试这一话题,展开详细描述。

众所周知,一个优秀的系统/产品必然是极其注重用户体验的,因此在任意运行环境内,提供流畅、丝滑、平稳的服务能力至关重要,而性能测试则是实现上述能力的重要途径。在实践中,我们可以从如何设计全面的性能测试采集指标?如何实现性能可视化?这两个关键问题出发。

在采集指标方面,常见的有接口响应时间、TPS、成功率、接口请求总数、网络进出等等。但是性能问题又与CPU、内存、磁盘等数据资源的使用情况息息相关,例如常见的内存泄漏/内存溢出会导致系统崩溃卡顿,而网络传输过慢则容易影响接口请求速度,因此定位性能问题需要全方位排查各类影响因素。

一体化核心框架
产品性能测试入门秘籍_第1张图片
上图所示,一体化测试中不同测试类型、测试实施均可抽象为:数据生成、数据存储、数据展示三个部分,下面将以性能测试实施为例,详细介绍上述三个核心环节的设计。

性能测试关键能力设计

数据生成

数据生成指通过采集器配合性能测试脚本进行压测生成数据,采集器即为性能测试的压测工具,目前,市面上已有大量优秀的开源性能测试工具,如:Apache JMeter,Gatling,Locust。那么我们该如何选取压测工具呢?笔者认为可从以下几方面考虑:
(1)是否支持被测系统运营的平台(软硬件环境、数据库环境);
(2)是否支持监控以及数据传输;
(3)是否能满足系统自定义的测试场景;
(4)维护成本;

数据存储

数据存储指将采集到的数据存储到数据库内,鉴于性能测试的特殊性,需要选用时序数据库,实现高性能地查询与存储时序型数据。当前市场上典型的时序数据库包括InfluxDB,KDB+,Prometheus,Graphite等。其中, InfluxDB被广泛应用于存储平台/系统的监控数据、实时数据等场景,该数据库支持任意类型的事件数据,也可对海量数据进行实时计算,是较为不错的数据存储工具。

数据展示

数据可视化展示的核心是:希望所有信息尽可能透明,并帮助测试人员直观展示产品的实际性能结果,便于产品研发及缺陷排查定位。可将数据展示与数据存储的数据源结合,借助自定义的数据查询语句生成数据展示模板,用于创建、共享、浏览结果数据。市场上此类开源可视化亦是非常丰富,但各产品的侧重点不同, 有以查询为主、报表为主,或可视化为主等不同类型。以Grafana为例,其作为可视化大型测量数据的开源程序,提供强大的可视化面板(Dashboard)并支持自定义图表和布局展示,包含度量仪表盘和图形编辑器,且支持Graphite、Zabbix、InfluxDB、Prometheus和OpenTSDB等数据源。

性能测试一体化实施衔接

为了实现性能测试一体化实施,数据生成模块需要具备数据采集和传输等能力,目前市面上的压测工具有Load Runner、Jmeter、Loadster、WebLoad等,从压测场景和可维护性等方面考虑,jmeter的可移植性、多线程更符合压测的场景,因此可通过jmeter脚本等工具进行自定义测试指标采集。

例如,在BaaS平台性能指标采集时,针对BaaS特有功能模块涉及到的服务进行服务资源使用情况的数据采集,结合性能基础指标采集tps、响应时间、接口请求数、网络传输速率等指标,通过后置监听器实时传输数据至数据存储模块;

数据存储模块需要具备实时存储海量数据的能力,考虑到性能测试的数据存储量较大,为了达到性能测试数据实时传输实时可视化展示的效果,需选择时序数据库以存储数据,目前市场上典型的时序数据库有prometheus、influxdb、KDB+等。在实践中,可针对数据采集层进行扩展,借助自定义配置实现数据采集模块灵活兼容上述不同类型的数据库,实现数据库选择的多样性可;

最后是数据展示模块,可充分借助各类开源可视化工具实现查询能力的扩展,适配数据存储层的各类数据查询语句,针对特定的测试场景自定义查询语句进行可视化图表展示。以Grafana适配为例,其提供大量的dashboard面板,具有简单、高效、易操作等特点,可通过自定义Json文件构造符合特定测试场景的dashboard展示,满足性能测试结果直观展示,此外还可支持指标面板变更、多集群共享面板等能力。
产品性能测试入门秘籍_第2张图片

性能测试一体化实操

以Baas测试为例,数据压测选取jmeter作为压测工具,测试脚本按照Baas功能模块划分:主机管理、联盟链管理、监控模块,区块浏览器模块等分别运行各功能模块脚本进行压测,数据存储选取选择influxdb时序数据库,数据展示则选用对应支持influxdb数据源可视化的grafana。

▲jmeter压测并实时传输数据

jmeter的【后置监听器】负责将jmeter压测过程中数据进行实时传输至influxdb,整个数据传输的过程是如何实现的呢?具体的数据生成逻辑如下:

private void addMetrics(String transaction, SamplerMetric metric) {
// FOR ALL STATUS
addMetric(transaction, metric.getTotal(), metric.getSentBytes(), metric.getReceivedBytes(), TAG_ALL, metric.getAllMean(), metric.getAllMinTime(),
metric.getAllMaxTime(), allPercentiles.values(), metric::getAllPercentile);
// FOR OK STATUS
addMetric(transaction, metric.getSuccesses(), null, null, TAG_OK, metric.getOkMean(), metric.getOkMinTime(),
metric.getOkMaxTime(), okPercentiles.values(), metric::getOkPercentile);
// FOR KO STATUS
addMetric(transaction, metric.getFailures(), null, null, TAG_KO, metric.getKoMean(), metric.getKoMinTime(),
metric.getKoMaxTime(), koPercentiles.values(), metric::getKoPercentile);


metric.getErrors().forEach((error, count) -> addErrorMetric(transaction, error.getResponseCode(),
error.getResponseMessage(), count));
}

如下图,展示了后端监听器的参数信息。
产品性能测试入门秘籍_第3张图片

以下针对后端监听器设计的关键参数信息进行了简要说明,便于大家理解相关过程。

(1)后端监听器实现选择:org.apache.jmeter.visualizers.backend.influxdbBackendListenerClient;
(2)influxdburl填写influx URL地址以及数据库名,eg:http://influxdb.performance.blocface.BaaS.hyperchain.cn/write?db=$数据库名;
(3)application:变量名;
(4)measurement:数据库表名,默认情况下会自动生成表名,不需要在数据库内单独建立;
(5)summaryonly:为true的情况下只输出所有请求的集合数据报告。为false的情况下,输出每条数据的详细报告,我们测试中选择为false;
(6)summaryRegex:正则表达式将与样本名称匹配并发送到后端,默认匹配所有;
(7)testtitle:测试名称,默认设置的是 Test Name;
(8)percentiles:要发送到后端的百分位数,多个值已 ;分割。填写:90;95;99;
(9)eventTags:自定义标签,测试填写参数为:1;

▲数据实时存储

jmeter实时传输的数据均会被存储至influxdb。需要注意的是,该过程会生成两个Measurements,分别为jmeter和events,其中jmeter表内存储了压测过程中生成的所有数据指标,而events则负责记录过程中的事件信息(在本过程中不是重点环节,不做详细展开)。

▲数据可视化展示

Grafana可直接将influxdb作为数据采集的数据源,支持通过自定义SQL按需查询各类指标。实践中, 可先执行添加数据源的操作:数据源(data source)进入数据库资源页面,测试人员通过添加数据源(add data source),输入数据库信息(influxdb url、database)。

随后,进行可视化页面编辑操作:例如,按需编辑dashboard、添加panel,grafana的panel支持表格(table)、列表(alert list)、热图(Heatmap)等多种可视化展示的方式,充分满足各类展示需求。

此外,测试人员还可以通过自定义编写查询语句来控制面板展示不同的图表。需要注意的是,不同的数据源可对应不同的Query Editor。假设 Grafana 与另一个时序数据库(Prometheus) 结合使用时,对应的查询语句时就换成了PromQL。

如下图所示,其application即为jmeter后置监听器内的application参数,transaction为jmeter脚本内的所有请求名称。
产品性能测试入门秘籍_第4张图片
最终本例的性能一体化测试的结果节选如下:
产品性能测试入门秘籍_第5张图片
总结
本文介绍了性能可视化测试的基本工具与路径,但这还远远不够,实践中往往需要根据不同的性能测试指标持续优化可视化页面,提升测试数据透明性,缩短测试问题定位排查时间,欢迎大家留言讨论。

你可能感兴趣的:(区块链技术,联盟链,测试工具,数据库,压力测试)