性能测试--Jmeter之wordpress示例
Jmeter之wordpress示例
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。也可以把 WordPress当作一个内容管理系统(CMS)来使用,Wordress安装。
一、用户登陆、多用户登陆
1、步骤详情
"""
单用户登陆:
1、用文本编辑器打开jmeter安装路径下bin/user.properties文件,在文件的最末尾处加上一行CookieManager.check.cookies=false(将jmeter的cookie检查机制给关闭掉了,这是因为wordpress设置登录的cookie时不符合jmeter的规范,jmeter会丢弃登录时的cookie,导致录制的结果在回放时无法正常登录)
2、打开jmeter的录制功能,浏览器输入your_ip_port/wp-login.php进行登陆操作
3、删除录制脚本的多余节点,将GET /wordpress/wp-login.php请求改名为的login form,将POST /wordpress/wp-login.php请求改名为的submit login form
4、点击运行 多用户登陆:
1、在上面脚本的基础上,增加用户自定义变量配置元件,在该元件中增加4个变量:(user1 = admin、password1 = amdin、user2 = test24、password2 = tes124)
2、修改事务控制器的名称为login user${__threadNum},修改GET /wordpress/wp-login.php请求的名称为login form user${__threadNum}
3、修改POST /wordpress/wp-login.php请求的名称为submit login form user${__threadNum},修改请求参数log的值为:${__V(user${__threadNum})},pwd的值为${__V(password${__threadNum})}
4、修改线程组,线程数修改为2,Ramp-up Period修改为2
5、运行
"""
2、登陆效果图:
三、增加断言(在真实的负载测试中,会禁用掉断言,因为断言会占用cpu和内存,从而影响jmeter的并发效率)
上面的示例可以通过响应数据里搜索登录用户的用户名的方式来判断用户是否登录成功的,当虚拟用户不多的时候,这样做是可以的。但是如果虚拟用户有成百上千个,就需要用断言来判断了
步骤详情:
1、在POST /wordpress/wp-login.php请求,也就是名称为submit login form user${__threadNum}的请求上点右键,选择添加 -> 后置处理器 -> CSS/JQuery Extractor。
- 引用名称设置为:user_name(变量名,后面需要通过这个变量名获取值)
- CSS/JQuery expression: #wp-admin-bar-my-account .ab-item (利用CSS选择器在HTML进行元素定位)
- 匹配数字:1 (如果有多个元素匹配,只取第一个元素的值)
2、在POST /wordpress/wp-login.php请求,也就是名称为submit login form user${__threadNum}的请求上点右键,选择添加 -> 断言 -> JSR223 Assertion。Language选择javascript, 在Script中输入下面的代码:
welcomeMessage = vars.get("user_name"); //获取刚刚后置处理器定义的变量值
username = welcomeMessage.split(",")[1].trim(); //根据逗号切片、去除空格,获取用户名
vars.put("username", username); //将用户名重新赋值,再放入jmeter的vars里
threadNum = ctx.getThreadNum() + 1; //返回当前线程num //如果从用户定义变量取出的用户名跟从登陆页面元素里面取出的用户名不一致,就判断没有登陆成功
AssertionResult.setFailure(!(vars.get("user" + threadNum) == username));
AssertionResult.setFailureMessage(username + " 用户登录失败");
升级版断言,能显示出明确登录失败的原因:
welcomeMessage = vars.get("user_name"); // 获取刚刚后置处理器定义的变量值 如嗨,admin的字符串
threadNum = ctx.getThreadNum() + 1; // 获取当前线程的序号
expectLoginUser = vars.get("user" + threadNum); // 获取用户自定义变量user1 if(welcomeMessage === null) { // 如果没有拿到登录后的欢迎消息,那么就是登录失败
AssertionResult.setFailure(true); //直接断言失败
AssertionResult.setFailureMessage(expectLoginUser + " 用户登录失败, 可能是用户名和密码不匹配"); // 设置断言失败的提示信息
} else { // 如果能获取到欢迎消息,证明登进了后台
username = welcomeMessage.split(",")[1].trim(); //根据逗号切片、去除空格,获取用户名
vars.put("username", username); // 调试用 AssertionResult.setFailure(!(expectLoginUser == username)); // 如果登进去的用户不是我们在表单中填入的用户,断言失败
AssertionResult.setFailureMessage(username + " 用户登录失败"); // 设置失败的提示信息
}
注:
jmeter特有变量释疑:
- vars: jmeter的变量,包含了用户自定义变量,文档在这里
- ctx: jmeter上下文,可以通过这个变量拿到当前进程的序号(从0开始,所以代码里都要threadmun+1),具体文档在这里
- AssertionResult: 断言结果,
AssertionResult.setFailure(true)
就会使断言失败,具体文档戳这里
四、含断言效果图:
注:Debug Sampler 这个采样器组件会将测试计划中的虽有变量名打印出来,提供调试
二、创建文章
使用jmeter来实现创建博客文章的功能
1、步骤详情:
"""
1、打开jmeter录制功能,浏览器打开wordpress/wp-admin/post-new.php页面,录制创建博客
2、录制完毕后,删除多余节点,保留login事务控制器、新建1个事务控制器,把上面2个请求拖到事务控制器下面去,将事务控制器的名称修改为create post user${__threadNum},将GET /wordpress/wp-admin/post-new.php的名称修改为create post form,将POST /wordpress/wp-admin/post.php的名称修改为submit create post form
在create post form节点上点右键,选择添加 -> 后置处理器 -> CSS/JQuery Extractor
(将名称修改为get user_id、引用名称设置为post_id、CSS/JQuery Expression:#post_ID、Attribute: value、匹配数字: 1、缺省值: NOT FOUND)
3、再新建1个CSS/JQuery Extractor,依然放在create post form下
(将名称修改为get user_id、引用名称设置为user_id、CSS/JQuery Expression:#user-id、Attribute: value、匹配数字: 1、缺省值: NOT FOUND)
4、修改POST /wordpress/wp-admin/post.php请求的请求参数(user_ID: ${user_id}、post_author: ${user_id}、post_title: ${__RandomString(10, abcdefghijklmnopqrstuvwxyz)}、content: ${__RandomString(10, abcdefghijklmnopqrstuvwxyz)}、post_ID: ${post_id}、post_author_override: ${user_id})
5、保存并运行
"""
2、效果图:
注:如果创建文章的时候,服务器给返回了403,这是因为:wordpress在处理创建文章请求时会检查1个名为_nonce
的请求参数,当我们在浏览器打开创建文章页面的时候_nonce
的值才会生成,也就是说如果我们通过jmeter回放请求的话,_nonce
的值是没办法跟服务器期望的值对上号的,这是wordpress防止Cross-Site Request Forgery (CSRF)的方式。
解决方式:
找到wordpress的安装目录,找到wp-includes/pluggable.php
文件,使用文本编辑器打开,在function wp_verify_nonce( $nonce, $action = -1 ) {
函数下,新增一行return 1;
,保存。
function wp_verify_nonce( $nonce, $action = -1 ) {
return 1;
$nonce = (string) $nonce;
$user = wp_get_current_user();
$uid = (int) $user->ID;
if ( ! $uid ) {
....
....
....
return 1,是让wordpress在校验_nonce的时候,永远返回true,暂时达到一个关闭防止CSRF的作用。
三、访问文章
模拟访客阅读blog里面的文章,实现的逻辑是让访客首先访问blog主页,然后在主页上随机选择一篇文章进行阅读
1、步骤详情:
- 1.1、新建1个build-web-test-plan测试计划
- 1.2、将线程组里面的循环次数换成:1
- 1.3、在home page http请求器中的IP和port换成博客首页地址
- 1.4、在home_page下新建1个CSS/JQuery Extractor,名称修改为
choose a post
- 引用名称:
rand_post_href
- CSS/JQuery expressions:
.entry-title>a
- Attribute:
href
- 匹配数字: 0
- 缺省值: NOT FOUND
- 引用名称:
- 1.5、在home_page下新建1个JSR223 PostProcessor,名称修改为
get post id
- Language:
javascript
- Script:
var href = vars.get('rand_post_href'); if(href) { var id = href.split('=')[1] vars.put("rand_id", id); }
- 1.6新建1个if控制器,名称修改为
if rand_id exists
条件:
${rand_id} != null //如果文章id不为空
- 1.7在if控制器下新建个http请求取样器,名称:
view post ${rand_id},请求器中的IP和port换成博客首页地址
- 请求参数:
p = ${rand_id}(如http://localhost/wordpress/?p=123)里抓取了123,这是随机访问文章的id里抓取了123,这是随机访问文章的id)
- 请求参数:
- 1.8、保存并运行。
2、效果图:
性能测试--Jmeter之wordpress示例的更多相关文章
- (转)使用JMeter对秒杀示例进行性能测试
背景 秒杀是我们ServiceComb开源团队以领域驱动设计(DDD)为背景,从零开始构建一个微服务架构的示例项目:在<秒杀开发历程>系列博文中提到它作为一个高并发压力场景的应用,采用了C ...
- jmeter 性能测试基本过程及示例
jmeter 为性能测试提供了一下特色: jmeter 可以对测试静态资源(例如 js.html 等)以及动态资源(例如 php.jsp.ajax 等等)进行性能测试jmeter 可以挖掘出系统最大能 ...
- 使用jmeter进行性能测试-Jmeter教程及技巧汇总 (转)
http://www.jmeter.cf/loadtesting-jmeter.html 为什么使用jmeter, 它免费开源, 不断发展, 功能逐渐强大. 可以做功能,负载, 性能测试.一套脚本可以 ...
- 性能测试—JMeter 常用元件(二)
性能测试—JMeter 常用元件(二) <零成本web性能测试>第三章 Web性能测试脚本录制与开发中JMeter常用测试元件 测试计划描述了JMeter运行时将会执行的一系列步骤,一个完 ...
- Jmeter接口测试图文示例
Jmeter接口测试图文示例 以getObjectByCode接口为例,用jmeter2.13来进行接口测试. 测试前准备: 测试工具及版本:jmeter 2.13 r1665067(须包含__MD5 ...
- Meter - 连续性能测试 - JMeter + ANT + Jenkins集成 - 第1部分
目标: 创建包含性能测试流程的持续交付管道, 以尽早检测任何与性能相关的问题. 通常,全面的性能测试将在分段/预生产环境中完成,该环境可能与您的生产环境相同.在完成QA功能/回归验证后,将代码推送到分 ...
- 性能测试--Jmeter录制、回放
Jmeter录制.回放 在jmeter2.1版本之前,jmeter应该是不支持录制和回放功能的,那时候如果需要录制jmeter的性能测试脚本的话,就需要使用第三方工具——badboy.现在jmeter ...
- (转)在Kubernetes集群中使用JMeter对Company示例进行压力测试
背景 压力测试是评估应用性能的一种有效手段.此外,越来越多的应用被拆分为多个微服务而每个微服务的性能不一,有的微服务是计算密集型,有的是IO密集型. 因此,压力测试在基于微服务架构的网络应用中扮演着越 ...
- 接口性能测试--JMeter
1.JMeter Java Sampler介绍 setupTest做些初始化的工作,每个线程只执行一次 teardownTest做些清理工作,每个线程只执行一次 1.JMeter Java Sampl ...
随机推荐
- ListView设置某一项item的文本居中
使用ListView和volley写了一个使用网络获取天气的demo ListView中Item的文本模式都是左侧对齐 我这边需要一些标题文本居中对齐 网上也找不到示例,不过找到了getView这个函 ...
- quick-cocos2d 设置横屏
quick cocos2d新建项目,在xcode中 起模拟器,默认的是竖屏,我想做一个横屏的游戏,前面已经说了 选中你的项目,在General这个标签内,Deoployment info的这个分组,有 ...
- 关于Web应用和容器的指纹收集以及自动化软件的制作
一次对Web应用的渗透,九成都是从信息收集开始,所以信息收集就显得尤为重要.关键信息的收集可以使你在后期渗透的时候更加的得心应手,把渗透比喻成走黑暗迷宫的话,那信息收集可以帮你点亮迷宫的大部分地图. ...
- 解决Linux下AES解密失败
前段时间,用了个AES加密解密的方法,详见上篇博客AES加密解密. 加解密方法在window上測试的时候没有出现不论什么问题.将加密过程放在安卓上.解密公布到Linuxserver的时候,安卓将加密的 ...
- HTML5 Canvas 绘制佛教万字
代码如下: <!DOCTYPE html> <html lang="utf-8"> <meta http-equiv="Content-Ty ...
- java中的值传递和引用传递区别
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响 ...
- 文件I/O之C标准库函数和系统库函数差别
1.首先C标准库函数是工作在系统库函数之上的.C标准库函数在读写文件时候都有一个文件流指针.FILE*fp=NULL;// fp=fopen(F_PATH,"r"); fp文件流指 ...
- 双向数据绑定---AngularJS的基本原理学习
Angular JS (Angular.JS) 是一组用来开发Web页面的框架.模板以及数据绑定和丰富UI组件.它支持整个开发进程,提供web应用的架构,无需进行手工DOM操作. AngularJS非 ...
- Xenomai 3 POSIX
Xenomai 3在架构设计上确实优先Xenomai 2,至少对开发者来说,少维护了不少东西,看下面两张图就知道了 第一张图是Xenomai2的,第二张图是Xenomai3的,Xenomai3在内核中 ...
- 关于HDFS NFS3的配置
1.在core-site.xml中配置 <property> <name>hadoop.proxyuser.root.groups</name> <value ...