介绍:K6是一款现代化的开源软件负载测试工具,它旨在帮助开发人员和测试人员快速有效地测试自己的网站和应用程序的负载能力。
K6的特点在于它具有强大的实时性能数据监控功能,而且使用简单,易于配置。在使用K6进行负载测试时,开发人员和测试人员可以很方便地模拟成千上万的用户同时访问目标网站,从而测试网站的负载能力、性能表现和稳定性。它被认为是目前最流行和最强大的开源负载测试工具之一。
在编写测试脚本之前,我们先了解下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,requestfrom gevent import pywsgiimport jsonapp=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.htmlexport function handleSummary(data) {
return {
"result.html": htmlReport(data),
};}
运行脚本生成result.html页面。
也可以使用handleSummary将数据转换为任何文本格式的文件,比如:JSON、HTML、XML等。
结合标签的功能,可以更好地对数据进行定制化报告开发。
最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。