| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发测试 -> 运用jmeter做接口与性能测试 -> 正文阅读 |
|
[开发测试]运用jmeter做接口与性能测试 |
目录 接口概念不同单元或某块之间进行通信的通道,他有一套规范一套标准(数据与数据之间的交互)(遵循既定规则,比如百度搜索的wd)接口规范会预定到文档,称之为api文档 接口的作用项目开发中,未采用接口时的缺点1、研发标准不统一,团队磨合难度高 2、研发周期短 3、可扩展性差 使用接口时带来的优点1、统一设计标准,更易于团队磨合 2、缩短研发周期 3、扩展性灵活 4、前后端都可以使用自己熟悉的技术,只需保证最终产出符合规范即可 接口测试的概念跨过前段,直接测试后端实现是否符合接口规范 作用1、更精准的定位bug 2、发现程序中的安全隐患 3、提高测试效率(项目越复杂越明显) ?接口测试流程1、定位接口资源 2、提交测试数据 3、查看响应结果 接口测试类型1、Web接口测试(b/s) * 服务器接口测试 * 外部第三方接口测试(别人的接口) 2、模块之间的接口测试(c/s) 安装XXX系统 安装接口测试环境必须要在XXXX当前目录下执行依赖程序代码(XXX系统的安装依赖模块:pip install -r XXXX.txt) 当前目录下使用python启动命令(启动命令:python run_server.py) 浏览器输入url:http://127.0.0.1:8000/api/XXX 数据库文件 使用第三方的数据库文件,将数据库要使用的数据文件放到文件中,查看表的结构 RESTful架构风格 RESTful架构风格:接口设计架构风格,对API文档规范作用,保证API文档的易读性(一人编写,多人阅读) 三要素:定位接口资源、提交测试数据、查看响应结果 Post方法和get方法区别1、提交方式不同(get提交的数据显示在地址栏,post时隐藏式的提交数据,后者更安全) 2、提交的数据量不同(get方法提交的数据量有限制,post没有) 3、执行效率不同(get方法要比post高) 4xx开头的基本上都是浏览器的资源请求错了(浏览器异常) 1xx开头的请求正常,服务器响应正常,浏览器无法正常显示(杜绝出现) 接口响应类型1、响应html文档,如访问百度首页 2、响应JSON数据,比如学生管理系统响应的数据 实现请求方式??? 定位资源?? 提交的数据??????????????????????????? 响应的数据 查? URL+DET???????? 一般键值对提交数据?????????????????? 响应码200 响应体:单条或多条查询信息 增? URL+POST?????? 一般键值对或者JSON提交数据???? 响应码201或200 响应体:新增后的数据 改? URL+PUT???????? 一般键值对或者JSON提交数据???? 响应码201或200 响应体:修改后的数据 删?? URL+DELETE? 一般键值对提交数据??????????????????? 响应码204 响应体:无 Jmeter作用1、接口测试 2、性能测试 3、压力测试 4、web自动化测试 5、数据库测试 6、java程序测试 优点1、开源、免费—>支持二次开发 2、跨平台 3、支持多协议 4、小巧—》50兆 不需要安装 5、功能强大 缺点1、不支持ip欺骗 2、使用jmeter无法验证JS程序,也无法验证页面ui,所以要需要和Selenium配合来完成Web2.0应用的测试 组件与元件组件:Jmeter中的功能点实现 元件:Jmeter中组件众多,为了方便管理,对于组建按照功能、性质分类归组,分组的结果就是元件,换言之,元件是组件的集合 进程、线程组、线程:一个进程包含多个线程组,一个线程组可以包含多个线程 进程:正在运行的程序 线程:进程中的执行线索 线程组:为了方便线程管理,对线程按照性质、作用,归类分组。 并发执行:多个线程同时执行 顺序执行:多个线程顺序执行 线程组的作用1、方便管理线程 2、可以通过一系列属性控制线程的执行 实现(重点)线程组的执行顺序及层级结构 测试计划(进程)-------------------?线程组---------------------线程 ? ? ? |? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?| 勾选每个线程组独立执行? ? ? ? ?多个线程组是并发执行 ? ? ? | 多个线程组按顺序执行(先执行线程组1、然后线程组2.。。。) 线程组常见属性设置线程数:如果设置成5,说明这个线程组有5个线程 Ramp-up时间(秒):如果设置成15,5个线程会在15秒内执行完成,每个线程执行间隔时间是均匀的3秒 循环次数:如果是2,当前5个线程会执行2次,相当于5个用户访问了两次。 ?????????????? 如果勾选永远,会一直执行,死循环,点击stop停止 调度器:使用调度器,建议循环次数勾选永远。 持续时间:如果设置成5,所有线程持续执行5秒 启动延迟:如果设置成3,所有线程在3秒后执行 特殊线程组setup线程组和tearDown线程组 ?setup线程组:最先执行 tearDown线程组:最后执行 http请求默认值当多条请求有相同请求内容可以通过http请求默认值封装起来,这样就不用在请求中重复编写了,可以提高脚本的编写效率。 例如:可以封装http协议、IP地址、端口号、编码集 Jmeter参数化动态的获取、设置或生成数据,以程序驱动代替人工驱动的数据设计模式 作用提高脚本的编写效率和编写质量 四种实现方案:四种方案是互补的,我们可以根据参数化具体场景,选择实现方案 A、jmeter参数化之用户定义的变量当http默认请求值无法封装资源路径下的相同部分,则可以使用用户自定义的变量设置 如:/api/XXX/—查、/api/XXX/T011/—改中的/api/XXX/部分则可以使用用户自定义的变量设置 B、jmeter参数化之CSV数据文件设置Csv文件:都还分搁值,是一种简洁且常见的数据储存格式,储存语法如下 T001,葫芦山,大娃,救爷爷 T002,西游记,猴哥,救师父 T003,水浒传,武松,救大郎 Csv文档中,一行对应着一条信息,一条信息的不同字段使用英文,分隔 ??实现思想: 1、使用Jmeter编写学院新增脚本模板<-----(写)------ 3、中间件关联程序与数据 ------(读)------> 2、使用csv文件储存测试数据 C、jmeter参数化之用户参数与csv是基本一样的,使用组件-用户参数,如果想用户循环数据,需要设置线程数为3。 D、jmeter参数化之函数第一步:方式一、打开函数助手对话框小图标 ??????????? 方式二、从程序选项里添加函数助手对话框 ??????????? 方式三、ctrl+shift+f1 第二步,生成所需函数 第三步,在需要添加函数的地方末尾加上生成的函数 常用函数__counter(计数器函数):参数true:每个用户都独立拥有一个计数器;falus:所有线程公用一个计数器 __Random (随机数函数):参数1、一个范围的最小值 ????????????????? 参数2、一个范围的最大值 例:参数1:1 ??? 参数2:10 则函数在1-10之间随机生成数字 __time(时间函数,生成当前时间):返回的是时间的毫秒值,距离1970/01/01 00:00:00的毫秒数 格式化设置:参数1:yyyy/MM/dd hh:mm:ss A、直连数据库作用:可以见接口响应的结果与直连数据库响应的结果做对比,判断接口实现是否符合预期 ?????? 较之于人工访问数据库,更加高效快捷 实现:Jmeter不具备直连数据库,需要第三方jar包 B、断言:让程序代替人工判断响应结果是否符合预期2、作用 1、更安全 2、更高效 3、功能更强大 实现: 响应断言=断言状态码和响应体(code(Equals)+body(substring)) 大小断言=判断响应内容的字节长度(size) 断言持续时间=响应时间 接口业务测试之逻辑控制器逻辑控制器控制取样器执行顺序的组件实现,之前添加的取样器是无差异的都执行,使用逻辑控制器之后,可以控制取样器的执行顺序(分支+循环) 作用: 组织业务,测试接口业务(逻辑) 举例:测试登陆业务,如果登陆成功,那么访问页面,有分支实现,就需要使用逻辑控制器 实现 1、如果(if)控制器 == 分支实现 2、forEach控制器 == 循环往复实现 3、循环控制器 == 循环往复实现(循环频率) 如果(if)控制器 == 分支实现 步骤: 1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量 2、核心:添加if控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系) 3、执行并查看结果 forEach控制器 == 循环往复实现步骤 1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量,存储一组数据 2、核心:添加forEach控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系) 3、执行并查看结果 循环控制器 == 循环往复实现(循环频率) 步骤 1、搭框架,测试计划,线程组,结果树 2、核心:添加while控制器,子级添加取样器(和之前实现不同,控制器和取样器存在父子级关系) 3、执行并查看结果 思考线程组属性可以控制循环次数,那循环控制器有何作用? 两者控制精度不一样,循环控制器更好 关联:上一个请求的结果作为下一个请求的参数 xpath提取器步骤: 1、搭框架,编写两个请求,传智播客+百度搜索 2、核心:取出传智播客页面源码的title值 3、传递给百度${变量名}的方式传值 正则表达式如“dep_name”:”(.*?)”(如果不加?就是贪婪式提取,会提取到最后一个) 模版$1$,调用第几个正则表达式就写几 匹配数字,响应调用第几个包裹的字段就写几 步骤 1、搭框架,编写两个请求,传智播客+百度搜索 2、核心:从学院查询结过中通过正则表达式提取学院信息 3、传递给百度${变量名}的方式传值 跨线程组关联1、线程组一的正则表达式出来的函数,想要在其他线程组中使用,需要使用函数_ setProperty导出到公共空间,相当于postman中设置环境变量 _ setProperty参数一:属性名称:out 参数二:正则表达式提取的变量用${myname}形式填写 2、添加专门组件beanshell取样器导入函数 在使用传参的线程中使用_Property函数 线程中传参应该是函数生成的变量 可以通过属性显示元件查看到处的变量 跨线程组关联与组内关联有啥区别?区别变量的作用域不一样 Jmeter性能测试性能测试:模拟各种正常的,峰值的测试环境,检测程序的各项性能指标是否能够达标 作用1、技术选型 2、测试当前程序所能支持的最大负载 3、发现程序中性能的瓶颈,提高资源的利用率。有助于提高优化 4、提升用户体验 …… 实现同时100个同时访问学生管理系统,统计高并发情况下平均响应时间以及错误率(高并发) 步骤1、搭框架,线程组,去延期,结果树(局限性),指定线程组的线程数属性值为100 2、核心:怎样实现100个用户同时访问?添加定时器的synchronizing time(集合点组件) 3、运行查看结果 运行过程阶段一:启动后,并不会马上访问服务器,而是创建线程且打包(耗时) 阶段二:打包完毕批量执行 结果查看聚合报告 同步定时器属性1、打包同步执行的用户数 属性2、超时时间以毫秒为单位,当总用户数不能整除并发用户数,设置此属性,当超过这时间则剩余用户继续会被执行 常量吞吐定时器QPS:query per seconds每秒查询数的查询率,每秒访问多少次服务器 属性一、公式QPS*60 分布式实现架构: 控制机:负责任务分配 执行机:负责任务的执行 工作流程1、控制机需要指定测试任务,并下发到执行机 2、执行机执行任务并将结果返回到控制机 3、控制机做结果汇总 演示前提:分布式环境已经搭建完毕了 1、控制集群(控制机、执行机) 控制机:ApacheJmeter.jar 执行机:jmeter-server。bat 2、编写策四计划 线程数=总线程数/执行机台数 3、将测试计划下发到执行机(执行机会将结果自动返回给控制机) 如何分布式远程启动1、执行机需要配置的端口号(server_port=1099) 2、控制机需要配置执行机的ip和端口号(格式,ip:端口号#remote_hosts=localhost:1099,localhost:2010) 3、无论控制机还是执行机都得设置远程访问相关属性: 将Jmeter配置信息server.rmi.ssl.disable=true 总结作用域:组件和控制器在添加位置的作用范围 执行顺序不同组件都有预定义的执行顺序(和添加位置无关) 各元件之间的执行顺序 1、配置元件? -两头 2、前置处理器 -核心 3、定时器 -核心 4、取样器 -中间 5、后置处理器 -核心 6、断言 -核心 7、监听器 -两头 先两头,再核心,最后中间 接口测试流程步骤 1、指定测试计划,分配任务 2、从api文档中提取接口清单 3、设计测试用例并参数化覆盖测试用例 4、编写脚本的实现,并导入设计的测试数据(csv数据文件设置) 5、测试结果汇总,bug提交 项目实现之功能测试功能测试:逐一测试所有接口,测试中模拟用户的多样性操作提交各种测试数据 1、覆盖所有的必选参数 2、组合可选参数 3、参数边界值 4、越界的数值 5、如果参数的取值范围是枚举变量,需要覆盖所有枚举值(性别,排序方式) 6、空数据 7、包含特殊的字符(敏感词汇) 8、错误数据(重复id,错误的数据格式、非法的常量值) 参数化覆盖测试用例根据测试用例设计的数据类型,设计具体的测试数据,逐条设计,逐条覆盖 测试脚本编写1、编写脚本模版 2、使用csv储存测试数据 路径使用相对路径 编码集UTF-8无BOM 关联脚本与数据1、解析csv文件 2、将数据设置进脚本模版 3、设置循环次数 生成测试报告逐条比对,找出与文档不符的数据,提交bug 项目实现之自动化测试在新版本会加入新功能测试原有的功能(接口是否受影响),是否正常运行 设计原则1、只需要测试重要的或者被重复调用的接口 2、只需设计正向用例 3、自动化脚本可以重复执行 4、一个线程组只设计一个取样器,方便单个接口测试 步骤1、选择被测试的接口 2、分析应用组件 性能测试设计原则1、线程组:增删改查每一个功能点,都需建立单独线程组,而避免在同一个线程组内添加多个取样器 2、参数化:参数化尽量避免采用外部读取参数(csv组件),而是使用前缀_函数生成测试数据 3、查看结果树:必须清除单个接口内或线程组内的查看结果树,建议一个测试计划就一个结果树 4、报告:性能报告可根据实际需求选择,建议保留添加聚合报告 5、分布式:如并发数量大,采用分布式测试 6、新增/修改/删除:建议不要采用时间模式(集合点、QPS…)来压测,直接使用线程数和循环 JMeter图形化生成报告命令:jmeter -n -t? 脚本文件 -l? hello.txt? -e? -o? 目录 注意,日志文件和目录必须为空 -n 无图形化 -t 被运行的脚本 -l 将运行信息写入日志文件 -e 生成测试报告 -o 指定报告输出目录 接口测试流程指定接口测试计划 从API文档提取接口清单 设计测试用例,并且参数化覆盖测试用例 编写脚本,并导入用例 执行并结果比对,生成测试报告 |
|
开发测试 最新文章 |
pytest系列——allure之生成测试报告(Wind |
某大厂软件测试岗一面笔试题+二面问答题面试 |
iperf 学习笔记 |
关于Python中使用selenium八大定位方法 |
【软件测试】为什么提升不了?8年测试总结再 |
软件测试复习 |
PHP笔记-Smarty模板引擎的使用 |
C++Test使用入门 |
【Java】单元测试 |
Net core 3.x 获取客户端地址 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/17 22:41:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |