基于k6和python进行自动化性能测试

本文介绍了开源性能测试工具k6,它基于JavaScript,用于测试Web应用和API的性能,支持多种协议,能模拟高负载场景。k6可在多个平台运行,提供如GET、POST请求,响应检查等功能,并详细列出测试指标,如VUs、RPS、错误数量等。此外,文章还展示了如何通过Python与k6结合,进行更高效的自动化测试,包括脚本编写、结果处理和输出到Excel。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

摘要:在性能测试中,达到相应的性能指标对于一个软件来说十分重要,在本文中,将介绍一种现代化性能测试工具k6。

当我们开发完成一个应用程序时,往往需要对其进行性能测试,以帮助我们更好的优化程序以及发现程序中的一些bug。在性能测试中,达到相应的性能指标对于一个软件来说十分重要,在本文中,将介绍一种现代化性能测试工具k6。

k6是一个开源工具,基于JavaScript可以编写k6的测试脚本,测试Web应用程序以及API的性能,支持HTTP等多种协议,可以很好地模拟各种高负载场景,充分验证程序稳定性和性能。k6支持Linux、MacOS等多个平台,通过k6官网根据提示即可在各个平台快速安装k6,终端输入k6 version出现如下显示说明安装成功。

以下是一个简单的k6测试脚本,通过k6的HTTP API模拟Get请求,并且休眠一秒钟:K

import http from 'k6/http';
import { sleep } from 'k6';
export default function () {
 http.get('https://test-api.com');
 sleep(1);
}

通过执行下面这行代码,运行脚本,即可对服务完成测试。

k6 run test-script.js

k6提供了丰富的功能,以下是k6常用的一些API,具体可以参考官网文档介绍:

- http.get(url, [options]):发送GET请求。
- http.post(url, body, [options]):发送POST请求。
- check(res, checks):检查响应是否符合预期。
- group(name, func):将一组请求分组并统计性能指标。
- sleep(duration):休眠指定的时间。

k6的测试结果包括以下一些指标,可以根据这些指标,更好的优化程序。

- VUs:虚拟用户的数量。
- Iterations:迭代次数。
- RPS:每秒钟的请求数。
- Duration:测试持续时间。
- Data Sent/Received:发送和接收的数据量。
- Checks:检查的数量。
- Status codes:响应状态码的数量。
- Errors:错误的数量。
- Latency distribution:延迟分布。

通过Python和k6你可以更加高效的完成符合自己要求的自动化测试,Python可以提供非常多的工具库,用来收集处理k6返回的结果。 我们可以编写以下k6测试脚本,并且通过Python去执行它,相关注释我已经标注出来,在handleSummary函数中,我们可以通过metrics来获取各种测试信息,具体如代码所示,可以参考官网关于metrics的介绍,同时自定义环境变量的使用也十分方便,可以参考代码中的使用方式。

import http from 'k6/http';
import { check, sleep} from 'k6';
import {Rate} from 'k6/metrics';
export default function() {
    #post请求所需要的body体
 let requestBody = {
 "xxx":[
 "xxxxx"
        ],
 "xxxx": __ENV.MyVar # MyVar为自定义的环境变量,可以通过__ENV调用,在执行脚本时可直接通过MyVar=xxx传值
    };
    #url
 const url = 'http://example.com';
 const payload = JSON.stringify(requestBody);
 const params = {
    headers: {
 'Content-Type': 'application/json',
        },
    timeout: '100s' #每个请求的超时时间
    };
 let res = http.post(url, payload, params);
    #检测结果是否是200OK
 check(res, { 'status is 200': (r) => r.status === 200 });
}
export function handleSummary(data) {
        #通过data.metrics中的字段可以获取你想要的一些信息,例如每个请求的持续时间和吞吐量
 const time = `${data.metrics.http_req_duration.values.avg.toFixed(3)}`;
 const rps = `${data.metrics.http_reqs.values.rate.toFixed(3)}`;
 const res = `${time} ${rps}`; 
        console.log(res); # 利用console.log可以将内容打印到控制台
 return {stdout : res}; #输出到标准输出
}

如下是一个Python代码示例,相关代码已经注释,通过Python中的subprocess模块执行k6脚本,并且捕获k6脚本的输出,通过pandas库进行整理输出到excel中。还可以通过argparse库解析命令行参数传入k6脚本中,更加灵活,高效。

# -*- coding: utf-8 -*-
import subprocess
from alive_progress import alive_bar # 非常丰富的进度条工具库
from tqdm import tqdm # 进度条工具库
import pandas as pd # 可以用来处理文本excel,csv等
from collections import OrderedDict
import argparse # 用来解析命令行参数 
import time
print('测试时间 : ', time.strftime('%b %d %Y %H:%M:%S', time.gmtime(time.time())))
print("************开始测试啦! 祈祷不出错!**************")
# 需要测试的测试语句集合
test_examples = [
 "aaaaaaa",
 "bbbbbbb",
 "ccccccc"
]
dataMap = {'test': test_examples}
parser = argparse.ArgumentParser()
parser.add_argument("-d", default="60s", help="duration time", dest="duration_time") #解析命令行参数,控制测试时间
args = parser.parse_args()
print("每条语句测试时间 : ", args.duration_time)
vus = ['10', '20', '30', '40'] # 并发数集合 ,分别测试并发数为10,20,30,40的场景
cols_name = ['1-avg/ms', '1-rps/s', '10-avg/ms', '10-rps/s','20-avg/ms', '20-rps/s','50-avg/ms', '50-rps/s'] # excel的列名
# 循环测试,可以将多个需要测试的语句集合放入到dataMap中
for (name, data) in dataMap.items(): 
 print("当前测试的项目为 :", name)
        res = OrderedDict()
        res['test_examples'] = []
 for n in cols_name:
                res[n] = []
        df = pd.DataFrame(res)
 excel_name = name + ".xlsx"
 df.to_excel(excel_name, index=False)
 for query in data:
 print("当前测试语句为 :", query)
                origin = pd.read_excel(excel_name)
 with alive_bar(len(vus)) as bar:
 temp_dict = {}
 temp_dict['test_examples'] = query
 for vu in vus:
 keyRps = vu + '-rps/s'
 keyTime = vu + '-avg/ms'
 MyVar='MyVar=' + query
 #通过Popen执行k6脚本,并且捕获它的标准输出
                                process = subprocess.Popen(['k6', 'run', '--quiet', 'script.js', '--env', MyVar, '--vus', vu, '--duration', args.duration_time], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
                                result = process.stdout.read()
                                temp = result.split()
 temp_dict[keyTime] = temp[0].decode();
 temp_dict[keyRps] = temp[1].decode();
 print("并发:", vu, temp[0].decode(), temp[1].decode())
 bar()
 #将脚本输出写到excel
 save_data = origin.append(temp_dict, ignore_index=True)
 save_data.to_excel(excel_name, index=False)

执行此Python脚本,可以得到类似以下输出:

1、k6官网文档链接:https://k6.io/docs/

2、k6安装链接:https://k6.io/docs/get-started/installation/

最后:下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

全部资料获取

<think>好的,用户之前问过产品测试岗位需要掌握的知识提升路径,现在又接着问自动化测试工具的学习。看来他对测试领域有持续的兴趣,特别是想深入自动化测试部分。首先,我需要确定用户的需求层次。他可能已经了解了基础,现在想具体学习工具,所以需要详细的指导。 用户可能是刚入行的测试人员,或者有一定经验想转向自动化测试。不管怎样,他需要明确的学习路线工具推荐。我需要分步骤介绍,从基础到进阶,涵盖不同的测试类型,比如Web、移动端、API、性能测试等,这样他能全面了解。 还要考虑不同工具的特点适用场景,比如Selenium适合Web,Appium适合移动端,PostmanJMeter分别用于API性能测试。同时,要强调编程语言的重要性,比如PythonJava,因为很多工具需要编程基础。 用户可能对如何开始学习感到困惑,所以需要推荐学习资源,比如官方文档、实战项目社区支持。此外,提供学习路径,分阶段从入门到精通,帮助他规划学习步骤。 另外,用户可能关心未来的趋势,比如AI在测试中的应用或者持续测试,所以加入新兴工具持续学习建议会更好。提醒他持续学习的重要性,并参与社区交流,保持技术更新。 需要避免使用专业术语过多,保持解释清晰易懂,结构分明。确保每个工具都有简要说明、学习重点示例,帮助用户理解如何应用。最后,总结关键点,强化他的学习信心,并鼓励实践项目经验积累。</think>#### 自动化测试工具学习指南 自动化测试工具学习需围绕 **工具选型→技术栈匹配→实战应用** 展开,以下是系统性学习路径: --- ### 一、核心工具分类与选型逻辑 | **测试类型** | **主流工具** | **适用场景** | |-----------------|---------------------------|--------------------------------| | **Web UI测试** | Selenium/Cypress/PlayWright | 浏览器兼容性测试、页面交互验证 | | **移动端测试** | Appium/Espresso/XCUITest | Android/iOS应用功能与性能测试 | | **API测试** | Postman/SoapUI/RestAssured | 接口功能验证、数据契约测试 | | **性能测试** | JMeter/LoadRunner/k6 | 高并发压测、系统瓶颈定位 | | **持续测试** | Jenkins/GitLab CI | 自动化流水线集成、测试任务调度 | **选型原则**: - 团队技术栈匹配(Java系选TestNG+RestAssured,Python系选Pytest+Requests) - 社区活跃度(GitHub Star数>10k优先) - 企业招聘需求(国内常用Selenium+Appium+JMeter组合) --- ### 二、技术栈能力构建 #### 1. **编程语言基础** - **Python**(推荐):语法简洁,生态丰富 ```python # Selenium示例 from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") assert "百度" in driver.title ``` - **Java**:企业级框架支持更完善 ```java // TestNG示例 @Test public void testLogin() { WebDriver driver = new ChromeDriver(); driver.get("https://example.com"); Assert.assertTrue(driver.getTitle().contains("Home")); } ``` #### 2. **工具深度掌握** - **Selenium**: - 掌握WebDriver原理(浏览器驱动通信) - 元素定位策略(XPath/CSS Selector优化) - 显式等待与隐式等待的区别 $$ \text{元素定位成功率} = 1 - \frac{\text{定位失败次数}}{\text{总操作次数}} $$ - **Appium**: - 理解ADB(Android Debug Bridge)指令 - 混合应用测试(WebView上下文切换) - Desired Capabilities配置(设备型号/系统版本) - **Postman**: - 脚本化测试(Pre-request Script/Test Script) - 环境变量与数据驱动(CSV/JSON文件导入) - Newman命令行执行 #### 3. **框架设计能力** - **分层架构**: ``` 测试数据层(Excel/YAML) → 核心逻辑层(Page Object模式) → 执行控制层(Pytest插件/TestNG.xml) ``` - **持续集成**: - Jenkins Pipeline脚本编写(并行测试任务配置) - Allure测试报告生成与可视化分析 --- ### 三、实战学习路径 #### 阶段1:工具基础(2-4周) 1. 完成Selenium官方文档的定位与操作练习 2. 使用Postman手动创建10个API测试用例 3. 在JMeter中实现HTTP请求压测(线程组+监听器配置) #### 阶段2:框架搭建(4-8周) 1. 使用Pytest+Allure构建Web自动化框架 ```python # 数据驱动示例 @pytest.mark.parametrize("username,password", [("admin", "123"), ("test", "456")]) def test_login(username, password): login_page.input_credentials(username, password) assert home_page.is_displayed() ``` 2. 实现Appium移动端多设备并行测试(Selenium Grid扩展) #### 阶段3:高阶应用(持续提升) 1. **精准测试**:覆盖率统计(JaCoCo/Cobertura) 2. **AI测试**:使用TensorFlow识别图像验证码 3. **混沌测试**:Chaos Monkey模拟服务器故障 --- ### 四、学习资源推荐 | **资源类型** | **推荐内容** | |------------|----------------------------------------| | 官方文档 | Selenium Docs / Appium GitHub Wiki | | 实战项目 | GitHub搜索「automation-framework」 | | 在线课程 | Udemy《Selenium WebDriver with Python》 | | 社区支持 | StackOverflow/TestAutomationU社区 | --- ### 五、避坑指南 1. **避免盲目追求新技术**:优先掌握企业主流工具链(如国内更倾向Selenium而非Cypress) 2. **性能测试误区**:TPS≠线程数,需理解 **Little's Law**: $$ \text{并发用户数} = \text{平均响应时间} \times \text{吞吐量} $$ 3. **移动端测试陷阱**:真机测试覆盖率需>80%,模拟器无法完全替代设备碎片化问题 --- ### 六、未来趋势 1. **低代码测试**:Katalon Studio/Tricentis Tosca 2. **智能断言**:基于Diffy的自动化结果验证 3. **云化测试**:Sauce Labs/BrowserStack云端设备农场 **建议**:每周投入10小时系统性学习,通过实际项目(如电商网站全流程测试)巩固技能,参与开源项目贡献(如Apache JMeter插件开发)提升工程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值