性能测试工具 性能测试工具 K6 二【脚本编写 | 执行 | 输出】

TesterHome小助手 · 2023年08月28日 · 3595 次阅读

在编写测试脚本之前,我们先了解下 K6 测试生命周期的四个阶段。
测试脚本会以相同的顺序运行这四个阶段:

  • 准备阶段 初始化上下文中的代码,比如引用模块、加载文件、定义测试生命周期函数
  • 设置阶段 运行 setup 函数,通常用于设置测试环境、生成数据
  • 执行阶段 虚拟用户操作这部分代码位于 default 函数或场景函数中,根据选项的定义,模拟虚拟用户的操作
  • 结束阶段 运行 teardown 函数,通常用于虚拟用户结束后的清理操作。关闭连接、释放资源、清理数据等。

  • init 每个 VU 都会执行一次 (vu 表示虚拟用户)
  • setup 在测试开始前,只执行一次
  • vu code 每次迭代都执行一次,根据测试选项进行
  • teardown 在测试结束后,只执行一次 其中,setup、teardown 为可选函数

K6 测试脚本结构

K6 测试脚本遵循 JavaScript 模块化的结构。每个测试脚本都需要有一个或多个函数,用于定义测试场景、用户行为和性能指标等。
以下是一个典型的 K6 测试脚本结构示例

// 导入所需的模块
import http from 'k6/http';
import { sleep, check } from 'k6';

// 配置测试参数
export let options = {
    vus: 10,            // 虚拟用户数
    duration: '30s',    // 持续时间
};

// 定义测试场景
export default function () {
    // 用户行为逻辑
    let response = http.get('https://testerhome.com/');

    // 断言检查
    check(response, {
        '请求响应码是否为200': (r) => r.status === 200,
    });

    // 模拟用户等待时间
    sleep(1);
}

K6 测试脚本分为几个部分:

  • 引用模块: 使用 import 语句引用 K6 提供的模块,如 http 用于发送 HTTP 请求,sleep 用于模拟用户等待。
  • 配置测试参数: 使用 options 变量定义测试的配置参数,如虚拟用户数(vus)等。
  • 定义测试场景: 使用 export default function 来定义测试场景函数。在这里,编写模拟用户的行为逻辑,包括发送请求、处理响应和模拟等待。
  • 断言检查: 使用 check 函数来定义断言检查,以验证请求的响应是否满足特定条件。在示例中,我们检查响应的状态码是否为 200。
  • 模拟用户等待时间: 使用 sleep 函数来模拟虚拟用户之间的等待时间,以控制虚拟用户的并发程度

请求和响应处理

我们先来做两个虚拟的接口服务,方便我们后续调用和测试。这里使用了 Flask 搭建了一个 get 接口,一个 post 接口

from flask import Flask,request
from gevent import pywsgi
import json
app=Flask(__name__)
app.config['JSON_AS_ASCII'] = False

@app.route("/getdemo",methods=["GET"])
def getdemo():

    name = request.args.get('name')
    # 就认返回内答
    return_dic= {'return_code':'200','message': name + '  hello k6'}
    return json.dumps(return_dic, ensure_ascii=False)

@app.route('/postdemo', methods=['POST'])
def postdemo():

    name = request.form['name']
    passwrod = request.form['password']
    return_dic = {'return_code': '200', 'name': name,'passwrod':passwrod}
    return json.dumps(return_dic, ensure_ascii=False)

if __name__ == '__main__':
    server = pywsgi.WSGIServer(('0.0.0.0',5000),app)
    server.serve_forever()

发起 get 请求

import http from 'k6/http';

export default function () {

//发送 GET 请求
    let response = http.get('http://localhost:5000/getdemo?name=TesterHome');
    console.log('响应正文:', response.body);
    console.log('响应码:', response.status);
    console.log('获取返回json中的message:', response.json( 'message' ));
    console.log('请求响应时间:', response.timings);
}

  • 首先引用了 K6/http 模块用于发送 http 请求,
  • 使用 http.get() 方法,向 getdemo 接口发起请求
  • 最后输出响应正文、响应码、正文中的 message、请求响应时长

一起看一下执行结果

发起 post 请求

import http from 'k6/http';

export default function () {

// 发送 POST 请求
    let data = { 
    name: 'TesterHome' ,
    password:'TesterHomePasswrod'
    };

    let response = http.post('http://localhost:5000/postdemo', data);
    console.log('响应正文:', response.body);
    console.log('获取返回json结果中的name节点:', response.json().name);
    console.log('请求响应时间:', response.timings);
}

  • 引用 K6/http 模块用于发送 http 请求
  • 定义了请求参数对象 data
  • 使用 http.post() 方法,带请求参数向我们之前定义的 postdemo 接口发起请求
  • 最后输出响应正文、请求响应时长、以及返回的 json 结果读取 name 节点值

执行结果


返回与我们定义虚拟接口返回一致,name 以及 password 也赋值成了我们传入的参数

设定虚拟用户数量和持续时间

通过设置配置选项来指定虚拟用户数量和持续时间。

import http from 'k6/http';

// 配置选项
export let options = {
    vus: 2,         // 虚拟用户数量
    duration: '3s', // 持续时间
};

export default function () {

// 发送 GET 请求
    let response = http.get('http://localhost:5000/getdemo?name=TesterHome');

    console.log('响应正文:', response.body);
    console.log('响应码:', response.status);
    console.log('获取返回json中的message:', response.json( 'message' ));
    console.log('请求响应时间:', response.timings);
}

options 对象中的配置选项可以用来定义测试的行为、性能参数和其他设置

  • Vus:表示虚拟用户数量
  • Duration:表示持续时间

在这个例子中,调置了 2 个虚拟用户,并持续运行测试脚本 3 秒。
可以根据需要调整虚拟用户和持续时间,来满足性能测试需求

执行测试并生成报告

  • data_received: 接收的总数据量
  • data_sent: 发送的总数据量
  • http_req_blocked: 请求等待时长,即请求被阻塞的时间
  • http_req_connecting: 请求连接时间
  • http_req_duration: 请求的总时间,等于 http_req_sending + http_req_waiting + http_req_receiving
  • http_req_failed: 失败的 请求的数量
  • http_req_receiving: 响应接收时长
  • http_req_sending: 请求发送时长
  • http_req_waiting: 等待服务器响应时长
  • http_reqs: 测试执行期间发送的请求数量
  • iteration_duration: 每个测试迭代的持续时间
  • iterations: 已执行的测试迭代的总数量。每次测试脚本循环运行为一个迭代

输出 JSON 格式的颗粒度数据

通过命令

k6 run --out json=test_results.json **.js

生成 json 格式的颗粒度数据。

每行要么包含有关指标的信息,要么记录指标的数据点(样本)

行由三项组成:

  • type- 具有值 Metric 或 Point,其中 Metric 表示声明一个指标,Point 是指标的实际数据点(样本)。
  • data- 数据集合。
  • metric- 指标的名称。

后续也可以结合标签的功能,对 json 数据进行定制化报告开发。

生成易阅读的 html 报告

可以使用三方库 k6-reporter,来辅助生成 html 测试报告,一起来看下如何使用吧

import http from 'k6/http';
//引入 k6-reporter三方库
import { htmlReport } from "https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js";

export default function () {

    // 发送 GET 请求
        let response = http.get('http://localhost:5000/getdemo?name=TesterHome');

        console.log('响应正文:', response.body);
        console.log('响应码:', response.status);
        console.log('获取返回json中的message:', response.json( 'message' ));
        console.log('请求响应时间:', response.timings);

}

//使用handleSummary 将聚合数据传入htmlReposr,转换生成result.html
export function handleSummary(data) {
  return {
    "result.html": htmlReport(data),
  };
}

运行脚本生成 result.html 页面。

也可以使用 handleSummary 将数据转换为任何文本格式的文件,比如:JSON、HTML、XML 等。
结合标签的功能,可以更好的对数据进行定制化报告开发。

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册