性能測試--Jmeter之wordpress示例

Jmeter之wordpress示例

WordPress是使用PHP語言開發的博客平臺,用戶能夠在支持PHP和MySQL數據庫的服務器上架設屬於本身的網站。也能夠把 WordPress看成一個內容管理系統(CMS)來使用,Wordress安裝javascript

1、用戶登錄、多用戶登錄

一、步驟詳情php

"""
單用戶登錄:
一、用文本編輯器打開jmeter安裝路徑下bin/user.properties文件,在文件的最末尾處加上一行CookieManager.check.cookies=false(將jmeter的cookie檢查機制給關閉掉了,這是由於wordpress設置登陸的cookie時不符合jmeter的規範,jmeter會丟棄登陸時的cookie,致使錄製的結果在回放時沒法正常登陸)
二、打開jmeter的錄製功能,瀏覽器輸入your_ip_port/wp-login.php進行登錄操做
三、刪除錄製腳本的多餘節點,將GET /wordpress/wp-login.php請求更名爲的login form,將POST /wordpress/wp-login.php請求更名爲的submit login form
四、點擊運行

多用戶登錄:
一、在上面腳本的基礎上,增長用戶自定義變量配置元件,在該元件中增長4個變量:(user1 = admin、password1 = amdin、user2 = test2四、password2 = tes124)
二、修改事務控制器的名稱爲login user${__threadNum},修改GET /wordpress/wp-login.php請求的名稱爲login form user${__threadNum}
三、修改POST /wordpress/wp-login.php請求的名稱爲submit login form user${__threadNum},修改請求參數log的值爲:${__V(user${__threadNum})},pwd的值爲${__V(password${__threadNum})}
四、修改線程組,線程數修改成2,Ramp-up Period修改成2
五、運行
"""

二、登錄效果圖:html

3、增長斷言(在真實的負載測試中,會禁用掉斷言,由於斷言會佔用cpu和內存,從而影響jmeter的併發效率)java

上面的示例能夠經過響應數據裏搜索登陸用戶的用戶名的方式來判斷用戶是否登陸成功的,當虛擬用戶很少的時候,這樣作是能夠的。可是若是虛擬用戶有成百上千個,就須要用斷言來判斷了python

步驟詳情:web

    一、在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 (若是有多個元素匹配,只取第一個元素的值)

    二、在POST /wordpress/wp-login.php請求,也就是名稱爲submit login form user${__threadNum}的請求上點右鍵,選擇添加 -> 斷言 -> JSR223 Assertion。Language選擇javascript, 在Script中輸入下面的代碼:express

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 + " 用戶登陸失敗");

升級版斷言,能顯示出明確登陸失敗的緣由:apache

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 + " 用戶登陸失敗"); // 設置失敗的提示信息
}

注: api

jmeter特有變量釋疑:

  • vars: jmeter的變量,包含了用戶自定義變量,文檔在這裏
  • ctx: jmeter上下文,能夠經過這個變量拿到當前進程的序號(從0開始,因此代碼裏都要threadmun+1),具體文檔在這裏
  • AssertionResult: 斷言結果,AssertionResult.setFailure(true)就會使斷言失敗,具體文檔戳這裏

4、含斷言效果圖:

注:Debug Sampler 這個採樣器組件會將測試計劃中的雖有變量名打印出來,提供調試

 

2、建立文章

使用jmeter來實現建立博客文章的功能

一、步驟詳情:

"""
一、打開jmeter錄製功能,瀏覽器打開wordpress/wp-admin/post-new.php頁面,錄製建立博客
二、錄製完畢後,刪除多餘節點,保留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、匹配數字: 一、缺省值: NOT FOUND)
三、再新建1個CSS/JQuery Extractor,依然放在create post form下
(將名稱修改成get user_id、引用名稱設置爲user_id、CSS/JQuery Expression:#user-id、Attribute: value、匹配數字: 一、缺省值: NOT FOUND)
四、修改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})
五、保存並運行
"""

二、效果圖:

 注:若是建立文章的時候,服務器給返回了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的做用。

 

3、訪問文章

模擬訪客閱讀blog裏面的文章,實現的邏輯是讓訪客首先訪問blog主頁,而後在主頁上隨機選擇一篇文章進行閱讀

一、步驟詳情:

  • 1.一、新建1個build-web-test-plan測試計劃
  • 1.二、將線程組裏面的循環次數換成:1
  • 1.三、在home page http請求器中的IP和port換成博客首頁地址
  • 1.四、在home_page下新建1個CSS/JQuery Extractor,名稱修改成choose a post
    1. 引用名稱: rand_post_href
    2. CSS/JQuery expressions: .entry-title>a
    3. Attribute: href
    4. 匹配數字: 0
    5. 缺省值: NOT FOUND
  • 1.五、在home_page下新建1個JSR223 PostProcessor,名稱修改成get post id
  1. Language: javascript
  2. 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換成博客首頁地址 
    1. 請求參數:p = ${rand_id}(如http://localhost/wordpress/?p=123)裏抓取了123,這是隨機訪問文章的id裏抓取了123,這是隨機訪問文章的id)
  • 1.八、保存並運行。

 

二、效果圖:

相關文章
相關標籤/搜索