【PyRestTest】进行Benchmarking测试
PyRestTest支持通过Curl请求本身收集比较差的网络环境下的性能指标。
基准测试:它们扩展了测试中的配置元素,允许你进行相似的REST调用配置。然而,它们不对HTTP响应情况进行验证,它只收集指标数据。
下列选项被指定用于benchmark:
- warmup_runs:如果没有指定该选项,默认为10。在开始收集数据之前,多次运行这个基准测试调用,以允许JVM warmup、缓存等。
- benchmark_runs: 如果没有指定该选项,默认为100。运行基准测试的次数。
- output_file: 如果没有指定该选项,默认为None。要写入基准输出的文件名,每次运行都会被覆盖,如果没有给定,则只会写入终端
- output_format:如果没有指定该选项,默认为CSV。将结果写入(‘json’或’csv’)的格式。
- metrics: 必须指定要收集的指标(如下所述),否则基准测试将不起作用。
Metrics(指标)
收集性能指标的方法有两种:原始数据(Raw Data)、聚合统计值(Aggregates)。
每一个指标可以生出原始数据(Raw Data)、一个或多个聚合(Aggregates)值:
- Raw Data: 返回值是一个数组,一个基准每运行一次都会参数一个数组。
- Aggregates: 运行一个缩减(reduction)函数,在整个基准运行期间返回单个值(中值、平均值等)。
为获取原始数据,在“metrics”配置元素中,只需在“metrics”配置元素值列表中输入度量名称。示例如:
- benchmark: # create entity
- name: "Basic get"
- url: "/api/person/"
- warmup_runs: 7
- 'benchmark_runs': '101'
- output_file: 'miniapp-benchmark.csv'
- metrics:
- total_time
- size_download
上述示例,会返回运行101次之后,每组元素数值总时间、下载大小。
Aggregates are pretty straightforward:
聚合数值更直观,下面给出常用的聚合数值指标:
- mean/mean_arithmetic: 算术平均数(通常是作为平均值)
- mean_harmonic: 调和平均值(等于两数乘积的二倍被两数之和除) (有助于衡量速率)
- median: 数值中位数
- std_deviation: 标准偏差, 有助于衡量它们的一致性
- total/sum: 给定值之和
通常支持下述给定的指标,这些是Curl get_info变量的子集。关于这些变量的解释说明(这些变量移除了CURLINFO_ 前缀):https://curl.haxx.se/libcurl/c/curl_easy_getinfo.html。支持指标如下:
‘appconnect_time’, ‘connect_time’, ‘namelookup_time’, ‘num_connects’, ‘pretransfer_time’, ‘redirect_count’, ‘redirect_time’, ‘request_size’, ‘size_download’, ‘size_upload’, ‘speed_download’, ‘speed_upload’, ‘starttransfer_time’, ‘total_time’
报告格式
默认报告格式是CSV,输出报告包括如下内容:
- Benchmark name:名称
- Benchmark group:所属组,默认为default
- Benchmark failure count (raw HTTP failures):失败次数
- Raw data arrays:作为一个表,头是度量名称,按字母顺序排序
- Aggregates: 格式为(metricname,aggregate_name,result)的结果表
以JSON格式输出,数据结构会有一些不同,下方式给出的json格式输出样例:
{"failures": 0,
"aggregates":
[["metric_name", "aggregate", "aggregateValue"] ...],
"failures": failureCount,
"group": "Default",
"results": {"total_time": [value1, value2, etc], "metric2":[value1, value2, etc], ... }
}
Benchmark样例:
---
- config:
- testset: "Benchmark tests using test app"
- benchmark: # create entity
- name: "Basic get"
- url: "/api/person/"
- warmup_runs: 7
- 'benchmark_runs': '101'
- output_file: 'miniapp-benchmark.csv'
- metrics:
- total_time
- total_time: mean
- total_time: median
- size_download
- speed_download: median
- benchmark: # create entity
- name: "Get single person"
- url: "/api/person/1/"
- metrics: {speed_upload: median, speed_download: median, redirect_time: mean}
- output_format: json
- output_file: 'miniapp-single.json'