jmeter非GUI运行接口自动化和性能自动化

一、 为什么要非GUI运行jmeter脚本?

在谈论为什么用非GUI运行jmeter脚本前,先看看GUI运行脚本会有什么缺点?

  1. GUI页面本身就是图形界面,会占用很多系统本身的资源,当长时间运行是,运行的结果占用的内存就会很高。
  2. 既然是GUI界面,那就需要有页面交互,如果没有页面交互,就没有办法运行,就会被限制
  3. 持续集成,当我们在jmeter中编写好脚本后,可以通过ant集成到jenkins集上,进而通过持续集成,持续部署。但是GUI界面无法做到。

基于以上几点,在运行脚本的时候,更多的时候选择用非GUI运行

二、在GUI界面编写脚本

虽说我们运行的时候往往采用在非GUI页面,但是在编写脚本的时候,还是会采用GUI界面,在我们启动jmeter的时候,dos窗口会弹出一句话Don't use GUI mode for load testing !, only for Test creation and Test debugging.,意思就是不要用GUI模式进行测试,他仅仅是编写和调试用的
在这里插入图片描述

  1. 启动jmeter
    这里讲的启动jmeter指的是在windows中,当我们下载好以后,不需要安装jmeter,直接选择目录下的jmeter.bat双击即弹出上图界面,如果看不到bat文件,请把文件扩展名打开在查看
    在这里插入图片描述
  2. 修改jmeter属性
    在jmeter的bin目录文件下面有一个文件jmeter.properties,该文件就是jmeter的属性文件,很多需要修改的属性都在该文件里面,比如我们刚打开的文件是英文的,将他修改为中文,只需要将language修改为language=zh_CN
    在这里插入图片描述
    还有如果需要继承到jenkins上的时候,需要修改输出文件的格式:
    在这里插入图片描述
  3. 认识jmeter元件
    (1)当我们打开jmeter的时候,默认的只有一个测试计划,测试计划可以理解成一个测试项目,整个项目的测试都可以包含在下面,有了测试计划我们需要创建线程组,线程组理解为要模拟的用户数组成的集合
    (2)创建线程组,选择测试计划,右击,选择添加,选择线程(用户),选择线程组,在最右边看到线程组上面有很多其他的,除了三个中文的是jemter自带的,其余几个线程组都是jmeter的扩展包引入进来的,setup线程组一般用来处理初始化的工作,比如登录,链接数据库等,teardown线程组用来做收尾工作,断开链接,退出登录等,其余的业务操作都在线程组里面,如果涉及到性能测试,一般选择名称为jp@gc - Stepping Thread Group线程组,本文采用第二种线程组
    在这里插入图片描述
    (3)添加完成线程组后,同样右击添加,可以看到很多组件,有取样器,逻辑控制器,前置处理器......一直到监听器,在每个组件下面有很多元件,比如取样器下面就有http请求,ftp请求,java请求,DebugSampler等等,在这些取样器中,带有jp@gc字样的都是通过扩展包引进来的,jmeter本身不带这些取样器
    在这里插入图片描述
    (4)元件作用域
    配置元件(config elements )
      元件会影响其作用范围内的所有元件。
    前置处理程序(Per-processors)
      元件在其作用范围内的每一个sampler元件之前执行。
    定时器(timers )
      元件对其作用范围内的每一个sampler 有效
    后置处理程序(Post-processors)
      元件在其作用范围内的每一个sampler元件之后执行。
    断言(Assertions)
      元件对其作用范围内的每一个sampler 元件执行后的结果执行校验。
    监听器(Listeners)
      元件收集其作用范围的每一个sampler元件的信息并呈现
    元件作用域满足的原则
    1、取样器元件单独存在,不和其他元件相互作用
    2、逻辑控制器元件只对其子节点中的取样器 和 逻辑控制器作用,就是他只管控他下面的部分
    3、除取样器 和逻辑控制器 元件外,其他6类元件,如果是某个sampler的子节点,则该元件公对其父子节点起作用
    (5)元件执行顺序
    在同一作用域的条件下满足如下要求
    (1)配置元件(config elements )
    (2)前置处理程序(Per-processors)
    (3)定时器(timers )
    (4)取样器(Sampler)
    (5)后置处理程序(Post-processors
    (6)断言(Assertions)
    (7)监听器(Listeners)
    如果在同一作用域范围内有多个同一类型的元件,则这些元件按照它们在测试计划中的上下顺序一次执行。
    (6)脚本编写
    脚本编写,我们以3D投注作为实例,涉及到接口有:登录获取新期获取playid投注等4个接口,其中前三个接口互不关联,第四个接口需要前三个接口的返回值作为入参
    a、在线程组右击选择取样器,然后选择http请求,添加请求后,可以看到什么都没有,需要我们自己输入接口信息,包括请求方式,请求路径,请求内容,如下:
    在这里插入图片描述
    b、再新建一个http请求,输入我们的获取新期的接口
    在这里插入图片描述
    c、再次新建一个http请求,获取playid的接口
    在这里插入图片描述
    d、最后我们添加投注的接口
    在这里插入图片描述
    在上面接口中,我们一定看到一些参数是由${}样式组成的,这就是下面要讲到的参数化
    (7)参数关联
    登录接口不管在任何系统中,都是我们的入口,往往会返回一个token,或者类似token的值给我们,以方便后续接口拿token去用,运行登录接口,观察返回值看到有一个data的值,这个值就需要我们把它取出来保存起来,方便后面接口调用
    (8)接口用例的维度
    在这里插入图片描述
    那么如何取出这个data呢?取出data值的方法有很多种,比如json提取器,边界提取器,正则表达式等等。这里用的是json提取器
    在这里插入图片描述
    在这里插入图片描述
    本例中json提取器:
    在这里插入图片描述
    为了验证json表达式写的是否对,能否正确提出data的值保存到token中,可以添加调试取样器
    在这里插入图片描述
    在调试取样器中发现token有值,经核实可以确定就是我们登陆返回的data值,
    jsonpath语法
    在这里插入图片描述
    (9)断言
    jmeter中断言也有很多种方法,最常用的断言就是json断言,断言主要从两方面去考虑
    1、响应码断言,响应断言就是断言协议码,例如响应正确200等
    2、业务码断言,例如添加成功的后台断言码是1001,则需要断言响应结果中是否含有1001
    3、业务断言,添加一本书籍,则需要断言这本书籍是否添加成功,就需要查询数据库等验证
    (10)非GUI界面运行
    通过GUI界面运行脚本,一般是在命令行中输入命令来运行,命令格式为:
    jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
    但是如果用上述命令运行jmeter,首先必须得配置jmeter的环境变量。
    环境变量添加方法:
    1、在系统变量中添加JMETER_HOME
    JMETER_HOME=D:\Downloads (就是jmeter保存的路径)
    2、在系统变量中添加CLASSPATH
    CLASSPATH=%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar;
    3、在用系统变量path后面加上%JMETER_HOME%\bin ,保存即可
    配置好jmeter的环境变量后,则可以通过jmeter直接在命令行启动jmeter,前提是已配置好JDK环境
    -n: non gui mode,代表非命令行模式
    -t:testplan,代表测试计划,-t后面的参数就是jmeter脚本文件
    -l:保存测试结果的文件和路径
    -e:测试结束后,生成测试报告
    -o:指定测试报告的存放位置,必须不存在 ,否则执行会失败
    实例:
    jmeter -n -t D:\Downloads\apache-jmeter-5.3\tests\niriliya.jmx -l D:\Downloads\apache-jmeter-5.3\tests\report\jtl\result.jtl -e -o D:\Downloads\apache-jmeter-5.3\tests\report\html
    (11)持续集成
    持续集成需要ant和jenkins工具,ant的环境配置参考文章链接: Jmeter之ant环境配置,接下来就是集成到jenkins中,这里需要用到build.xml文件,不再赘述

期待各位支出文章的不足之处,忘各位小伙伴不吝赐教,一起探索测试之旅,vx:806026945

posted @ 2022-12-08 15:57  竹狼  阅读(119)  评论(0编辑  收藏  举报
<style id="ceshicss"> @media (max-width: 767px){ #set_btn_box {width: 100vw;left: 0;right: 0;bottom: 0;background: hsla(0,0%,100%,.6);height: 49px;display: flex;justify-content: space-between;align-items: center;padding: 12px 40px;border-top: 1px solid #e8e8e8;box-sizing: border-box;} .set_btn {margin-top: 0;} .set_btn.fly_top.fadeIn.animated {position: absolute;right: 10px;bottom: 60px;} .container{bottom:50px}} #mainContent{width:90%} </style> <link href="https://blog-static.cnblogs.com/files/miluluyo/tippy.min.css" rel="stylesheet"> <script src="https://unpkg.com/@popperjs/core@2.4.2/dist/umd/popper.min.js"></script> <script src="https://blog-static.cnblogs.com/files/miluluyo/tippy.js"></script> <link rel='stylesheet' href='https://cdn.bootcss.com/animate.css/3.7.2/animate.min.css'> <script src="https://at.alicdn.com/t/font_1825850_klax1ao4o6.js"></script> <script src="https://blog-static.cnblogs.com/files/miluluyo/three.min.js"></script> <script src='https://blog-static.cnblogs.com/files/miluluyo/star.js'></script> <link rel="stylesheet" href="https://blog-static.cnblogs.com/files/miluluyo/OwO.min.css" /> <script src="https://blog-static.cnblogs.com/files/miluluyo/OwO2.min.js"></script> <script src="https://blog-static.cnblogs.com/files/miluluyo/cute-cnblogs2.js"></script> <script src="https://blog-static.cnblogs.com/files/miluluyo/monitoring2.js"></script> <script> miluframe({ Youself:'https://www.cnblogs.com/faith007/', /*个人的博客园链接*/ /*博客园导航信息*/ custom:[{ name:'首页', link:'https://www.cnblogs.com/faith007/', istarget:false },{ name:'联系', link:'https://msg.cnblogs.com/send/%E7%AB%B9%E7%8B%BC', istarget:true },{ name:'留言板', link:'https://www.cnblogs.com/faith007/p/11578505.html', istarget:false },{ name:'相册', link:'https://www.cnblogs.com/faith007/gallery.html', istarget:false },{ name:'管理', link:'https://i.cnblogs.com/', istarget:true }], /*向别人展示自己的友链信息*/ resume:{ "name":"竹狼", "link":"https://www.cnblogs.com/faith007/", "headurl":"https://files-cdn.cnblogs.com/files/blogs/436273/VCG211321527184.bmp", "introduction":"大道至简,知易行难。" }], /*友链表格头信息,这个可以忽略*/ details:[{ field: 'name', literal: '昵称', },{ field: 'introduction', literal: '标语', },{ field: 'url', literal: '链接地址', },{ field: 'headurl', literal: '头像地址', }], /*浏览器顶部小图标*/ logoimg:'https://images.cnblogs.com/cnblogs_com/miluluyo/1765646/o_200519070633f12.png', /*文章页面标题前的图标,此处图标有扩展,下面会提到图标*/ cuteicon:['icon-caomei','icon-boluo','icon-huolongguo','icon-chengzi','icon-hamigua','icon-lizhi','icon-mangguo','icon-liulian','icon-lizi','icon-lanmei','icon-longyan','icon-shanzhu','icon-pingguo','icon-mihoutao','icon-niuyouguo','icon-xigua','icon-putao','icon-xiangjiao','icon-ningmeng','icon-yingtao','icon-taozi','icon-shiliu','icon-ximei','icon-shizi'], /*赞赏,若true则显示此按钮,false则不显示*/ isGratuity:false, /*赞赏按钮焦点显示赞赏内容,内容可自行更改*/ gratuity:'<div class="popper_box"><p><b>要请我喝奶茶吗 (づ。◕ᴗᴗ◕。)づ</b> </p><div class="popper_box_con"><div class="popper_box_con_li"><img src="https://images.cnblogs.com/cnblogs_com/miluluyo/1765646/o_200521053817wx.png" alt="">微信扫码</div><div class="popper_box_con_li"><img src="https://images.cnblogs.com/cnblogs_com/miluluyo/1765646/o_200521053827zfb.png" >支付宝扫码</div></div><p><b>留下一句你觉得很励志与美的话给我吧~</b>&nbsp;&nbsp;<b><a href="https://www.cnblogs.com/miluluyo/p/12930946.html">GO</a></b></div>' }) </script> <!-- 点赞 --> <canvas width="1777" height="841" style="position: fixed; left: 0px; top: 0px; z-index: 2147483647; pointer-events: none;"></canvas><script src="https://blog-static.cnblogs.com/files/miluluyo/mouse-click.js"></script> <!-- 以下内容是否添加你随意 --> <script> /*在文章页面添加古诗词*/ $("#navigator").after('<div class="poem-wrap"><div class="poem-border poem-left"></div><div class="poem-border poem-right"></div><h1>念两句诗</h1><div id="poem_sentence"></div><div id="poem_info"></div></div>') </script> <script src="https://sdk.jinrishici.com/v2/browser/jinrishici.js" charset="utf-8"></script> <script type="text/javascript"> jinrishici.load(function(result) { var sentence = document.querySelector("#poem_sentence") var info = document.querySelector("#poem_info") sentence.innerHTML = result.data.content info.innerHTML = '【' + result.data.origin.dynasty + '】' + result.data.origin.author + '《' + result.data.origin.title + '》' }); </script> <script type="text/javascript"> /* 鼠标特效,我觉得太花哨了就注释了,喜欢的自己打开注释就可以 */ /*var a_idx = 0; jQuery(document).ready(function($) { $("body").click(function(e) { var a = new Array("❤去活出你自己。❤","❤今天的好计划胜过明天的完美计划。❤","❤不要轻言放弃,否则对不起自己。❤","❤紧要关头不放弃,绝望就会变成希望。❤","❤如果不能改变结果,那就完善过程。❤","❤好好活就是干有意义的事,有意义的事就是好好活!❤","❤你真正是谁并不重要,重要的是你的所做所为。❤","❤你不想为你的信仰冒一下险吗?难道想等你老了,再后悔莫及吗?❤","❤有些鸟儿是关不住的,它的每一根羽毛都闪耀着自由的光辉。❤","❤决定我们成为什么样人的,不是我们的能力,而是我们的选择。❤","❤掉在水里你不会淹死,呆在水里你才会淹死,你只有游,不停的往前游。❤","❤有些路,只能一个人走。❤","❤希望你眼眸有星辰,心中有山海。❤","❤从此以梦为马,不负韶华。❤","❤人的成就和差异决定于其业余时间。❤","❤佛不要你皈依,佛要你欢喜。❤","❤ダーリンのこと 大好きだよ❤","❤小猫在午睡时,地球在转。❤","❤我,混世大魔王,申请做你的小熊软糖。❤","❤决定好啦,要暗暗努力。❤","❤呐,做人呢最紧要开心。❤","❤好想邀请你一起去云朵上打呼噜呀。❤","❤永远年轻,永远热泪盈眶。❤","❤我生来平庸,也生来骄傲。❤","❤我走得很慢,但我从不后退。❤","❤人间不正经生活手册。❤","❤我是可爱的小姑娘,你是可爱。❤","❤数学里,有个温柔霸道的词,有且仅有。❤","❤吧唧一口,吃掉难过。❤","❤你头发乱了哦。❤","❤健康可爱,没有眼袋。❤","❤日月星辰之外,你是第四种难得。❤","❤你是否成为了了不起的成年人?❤","❤大家都是第一次做人。❤","❤何事喧哗?!❤","❤人间有味是清欢。❤","❤你笑起来真像好天气。❤","❤风填词半句,雪斟酒一壶。❤","❤除了自渡,他人爱莫能助。❤","❤昨日种种,皆成今我。❤","❤一梦入混沌 明月撞星辰❤","❤保持独立 适当拥有❤","❤谢谢你出现 这一生我很喜欢❤","❤做自己就好了 我会喜欢你的❤","❤太严肃的话,是没办法在人间寻欢作乐的❤","❤愿你余生可随遇而安,步步慢。❤","❤黄瓜在于拍,人生在于嗨❤","❤奇变偶不变,符号看象限。❤","❤从来如此,便对么?❤","❤今天我这儿的太阳,正好适合晒钙 你呢❤","❤未来可期,万事胜意。❤","❤星光不问赶路人 时光不负有心人❤","❤我当然不会试图摘月,我要月亮奔我而来❤","❤女生要修炼成的五样东西: 扬在脸上的自信,长在心底的善良, 融进血里的骨气,刻进命里的坚强,深到骨子里的教养❤","❤燕去燕归,沧海桑田。纵此生不见,平安惟愿❤","❤我想认识你 趁风不注意❤","❤我一直想从你的窗子里看月亮❤","❤长大应该是变温柔,对全世界都温柔。❤","❤别在深夜做任何决定❤","❤山中何事,松花酿酒,春水煎茶。❤","❤桃李春风一杯酒,江湖夜雨十年灯。❤","❤欲买桂花同载酒,终不似,少年游。❤"); var le = Math.ceil(Math.random()*a.length); var $i = $("<span></span>").text(a[le]);/*a[a_idx]*/ /*a_idx = (a_idx + 1) % a.length; var x = e.pageX, y = e.pageY; $i.css({ "z-index": 999999999999999999999999999999999999999999999999999999999999999999999, "top": y - 20, "left": x, "position": "absolute", "font-weight": "bold", "color": "rgb("+~~(255*Math.random())+","+~~(255*Math.random())+","+~~(255*Math.random())+")" }); $("body").append($i); $i.animate({ "top": y - 180, "opacity": 0 }, 2000, function() { $i.remove(); }); }); });*/ </script> <!--音乐,只在PC端宽度>1000px时显示--> <!-- <link rel="stylesheet" href="https://blog-static.cnblogs.com/files/miluluyo/APlayer.min.css"> <div id="player" class="aplayer aplayer-withlist aplayer-fixed" data-id="3116636104" data-server="netease" data-type="playlist" data-order="random" data-fixed="true" data-listfolded="true" data-theme="#2D8CF0"></div> <script src="https://blog-static.cnblogs.com/files/miluluyo/APlayer.min.js"></script> <script src="https://blog-static.cnblogs.com/files/miluluyo/Meting.min.js"></script> --> <!--猫,只在PC端显示,移动端不加载了,因为会卡顿页面--> <!-- <script src="https://eqcn.ajz.miesnfu.com/wp-content/plugins/wp-3d-pony/live2dw/lib/L2Dwidget.min.js"></script> <script> var mobile_flag = isMobile(); if(mobile_flag){ //console.info("移动端") }else{ //console.info("PC端") L2Dwidget.init({ "model": { "jsonPath": "https://unpkg.com/live2d-widget-model-hijiki/assets/hijiki.model.json", "scale": 1 }, "display": { "position": "left", "width": 100, "height": 200, "hOffset": 70, "vOffset": 0 }, "mobile": { "show": true, "scale": 0.5 }, "react": { "opacityDefault": 0.7, "opacityOnHover": 0.2 } }); window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") } } </script> --> <script> <script language="javascript" type="text/javascript"> // 生成目录索引列表 // ref: http://www.cnblogs.com/wangqiguo/p/4355032.html // modified by: zzq function GenerateContentList() { var mainContent = $('#cnblogs_post_body'); var h3_list = $('#cnblogs_post_body h3');//如果你的章节标题不是h2,只需要将这里的h2换掉即可 if(mainContent.length < 1) return; if(h3_list.length>0) { var content = '<a name="_labelTop"></a>'; content += '<div id="navCategory" style="color:#152e97;">'; content += '<p style="font-size:18px;"><b>目录</b></p>'; content += '<ul>'; for(var i=0; i<h3_list.length; i++) { var go_to_top = '<div style="text-align: right;"><a href="#_labelTop" style="color:#f68a33">回到顶部</a><a name="_label' + i + '"></a></div>'; $(h3_list[i]).before(go_to_top); var h4_list = $(h3_list[i]).nextAll("h4"); var li3_content = ''; for(var j=0; j<h4_list.length; j++) { var tmp = $(h4_list[j]).prevAll('h3').first(); if(!tmp.is(h3_list[i])) break; var li3_anchor = '<a name="_label' + i + '_' + j + '"></a>'; $(h4_list[j]).before(li3_anchor); li3_content += '<li><a href="#_label' + i + '_' + j + '">' + $(h4_list[j]).text() + '</a></li>'; } var li3_content = ''; if(li3_content.length > 0) li3_content = '<li><a href="#_label' + i + '">' + $(h3_list[i]).text() + '</a><ul>' + li3_content + '</ul></li>'; else li3_content = '<li><a href="#_label' + i + '">' + $(h3_list[i]).text() + '</a></li>'; content += li3_content; } content += '</ul>'; content += '</div><p>&nbsp;</p>'; content += '<hr style="height:1px;border:none;border-top:1px dashed #0066CC;"/>'; if($('#cnblogs_post_body').length != 0 ) { $($('#cnblogs_post_body')[0]).prepend(content); } } } GenerateContentList(); </script>