天天看點

使用JMeter對SOAP應用進行壓力或性能測試

appache jmeter 以及 soap 協定簡述

  消息傳遞協定:soap

  soap(simple object access protocol)稱為簡單對象通路協定, 是 w3c 定義的一種标準消息傳遞協定,而它通常被認為是 web services 的事實标準。soap 協定使用 xml 語言來描述,soap 消息格式是由 xml schema 模式定義,因而通過使用 xml 命名空間使得 soap 具有很強的可擴充性。

  soap 是在去中心化(decentralized)分布式(distributed)環境中用來資訊交換的一個輕量級協定。soap 本身并不定義像程式模型或實施聲明等形式的文法,而隻定義了一種簡單機制:通過提供子產品化的包裝模型編碼機制來傳輸應用資訊。

  soap 基本結構:

  1) 信封 envelope envelope 元素是 soap 中的根元素,并且定義為在 soap 消息中必須出現。envelope 元素中可以包含多可選的 header 元素,但同時必須要包含一個 body 元素。

  2) 消息頭 header header 可能出現在 soap 消息中,是一個可選元素。如果出現在消息中,那麼 header 一定要是 soap 中的第一個元素。soap header 在 web services 中的應用越來越廣泛,例如在應用程式的安全性事物中使用标準的消息頭檔案,因而成為擴充 soap 協定的一個非常有效的方法。

  3)消息體 body body 元素是 soap 中必須出現的一個元素,它要包含應用程式中的傳輸資料或者回報消息。 應用程式中的傳輸資料可以是任意形式的 xml 資料。soap 消息接收者最終來處理 soap body 體。

  jmeter 調用 soap 架構機制

  soap 使用 rpc(遠端過程調用)和消息傳遞來建立通信服務,soap rpc 定義了用于表示遠端過程調用和應答的協定。soap 協定本身僅僅定義了消息的交換結構,它可以和許多現存網際網路協定結合在一起使用,其中包括超文本傳輸協定( http),多用途網際郵件擴充協定(mime),java 消息服務(jms)以及簡單郵件傳輸協定(smtp)等。目前與 soap 應用最為廣泛的是 http 協定和 jms 協定,而與之相對應的兩種應用就是 soap over http 和 soap over jms。

  根據 jms 的規範,消息交換有 2 種方式:消息釋出 / 訂閱方式和點對點方式。由這兩種交換方式所建立的消息收發系統都是異步的,即 jms 客戶機可以發送消息而不必等待回應。如果應用程式測試者或測試腳本開發者希望每一條消息都能夠被處理并且消息總是能夠被傳送到指定的位置,那麼應該使用點對點消息模型而不是消息釋出 / 訂閱模型。

  http(超文本傳送協定)是屬于應用層的面向對象的協定,是網際網路 (www) 的基礎,由于其簡單快速、靈活、無連接配接、無狀态的方式,适用于分布式網絡資訊系統。soap over http 應用就是指的是遵守 soap 編碼規則的 http 請求 / 響應,我們可以用簡單的公式來對此作一個描述:http + xml = soap。

使用JMeter對SOAP應用進行壓力或性能測試

  圖 1.jmeter 架構基于上述兩種不同的協定對 soap 消息的一次簡單調用機制流程

  準備測試環境

  當精心編寫好測試腳本滿懷信心的去運作測試計劃時,發現所有的測試腳本都 failed 掉了,原因可能是你的測試環境中并沒有完全準備好。下面給出了準備測試環境的詳細步驟:

  1.環境變量設定:jmeter 運作在 jre/jdk 之上,在所有開始之前要設定 jmeter 自動檢測的環境變量 java_home=#java install directory#.

  2.jmeter 安裝:本文下面下載下傳欄提供了 apache jmeter 下載下傳位址,首先要取得最新版本的 jmeter 測試工具,jmeter 最新版本包含了建構和運作絕大部分測試類型的檔案,包括 web (http/https), ftp, jdbc, ldap, java, 和 junit 等。

  3.準備 jar 包:jmeter 雖然提供了對 soap over http 以及 soap over jms 測試的 sampler,但是出于對 licence 的考慮它本身并沒有提供 jms 需要使用的 jar 包。是以,在運作測試之前需要将這些包複制到 jmeter 的 lib 目錄下,下面清單對測試所需 jar 包作了詳細說明。

  4.beanshell 腳本處理:如果在測試用例中用到了 beanshell 腳本,則需要将 beanshell 包拷貝到 jmeter bin 目錄下。beanshell 是一種相容 java 語言的輕量級腳本語言,jmeter 腳本中可能會經常用它來做日志處理,正規表達式後處理(post- process)等。如果在測試用例中用到了 mail visualiser, mail reader 以及 web services (soap) sampler,則需要将 mail 包拷貝到 jmeter bin 目錄下。如果在測試用例中用到了 jms 相關的 sampler,則需要将 jms 包拷貝到 jmeter bin 目錄下。

  下面的清單列出了不同的測試用例所需要的 jar 包,以及其下載下傳位址:

  bsh-2.0b4.jarhttp://www.beanshell.org/

  mail.jar http://java.sun.com/products/javamail/index.jsp

  jms.jarhttp://java.sun.com/products/jms/docs.html

  調試腳本中非常有用的資訊日志:jmeter.log 在腳本的調試和運作過程中,是以的日志資訊都會記錄在 jmeter.log 中,是以你會在這個檔案中找到比較有用的資訊。

  注意事項

  如果 jmeter 在執行測試腳本過程中應該修改 jmeter.bat 檔案中的一些參數,參數大小可以根據測試計劃合理确定:

  heap=-xms256m – xmx1024m

  new=-xx:newsize=128m -xx:maxnewsize=128m

  tenuring=-xx:maxtenuringthreshold=2

  evacuation=-xx:maxliveobjectevacuationratio=20%

  perm=-xx:permsize=64m -xx:maxpermsize=64m

  debug=-verbose:gc -xx:+printtenuringdistribution

  此外,在搭建測試環境時還需要更多注意的地方:

  jmeter 使用相容 jkd1.4 或者更高版本

  jmeter 無法識别 zip 格式的封包件,是以需要的封包件均要求以 .jar 結尾

  jmeter 會自動在 jmeter_home/lib 和 ext 目錄下尋找需要的類

  對于使用 csvdataset, 那麼不要勾選 "memory cache"否則資料無法疊代

  使用 jmeter 連接配接 soap over http 服務

  jmeter 提供了 web service (soap) sampler,用以調用基于 http 的 web 服務。下面詳細說明 soap over http 服務調用的各個屬性。

使用JMeter對SOAP應用進行壓力或性能測試

圖 2.soap over http 服務調用的各個屬性

 soap over http 服務調用的各個屬性說明:

  wsdl url:指定 wsdl 檔案的目标位址

  web methods:選擇本次請求調用的方法

  protocol:指定使用的協定,預設為 http

  server name or ip:服務的位址(伺服器名或 ip 位址)

  path:調用方法所在的位置

  timeout:設定請求逾時限制

  soapaction:存在于 wsdl 檔案中的調用方法,預設不必填寫

  soap/xml-rpc data:請求資料

  下面是一次完整的 http 請求與 http 響應 soap 資料:

http request

<soapenv:envelope>

<soapenv:body>

<q0:getenddate>

<ip_id>12</ip_id>

</q0:getenddate>

</soapenv:body>

</soapenv:envelope>

http response

<soapenv:header/>

<p928:getenddateresponse>

dstsavings=3600000,usedaylight=true,startyear=0,startmode=3,startmonth=2,

startday=8,startdayofweek=1,starttime=7200000,starttimemode=0,endmode=3,

endmonth=10,endday=1,enddayofweek=1,endtime=7200000,endtimemode=0]],

firstdayofweek=1,minimaldaysinfirstweek=1,era=1,year=2005,month=8,

week_of_year=37,week_of_month=2,day_of_month=7,day_of_year=250,day_of_week=4,

day_of_week_in_month=1,am_pm=0,hour=0,hour_of_day=0,minute=0,second=0,

millisecond=0,zone_offset=-18000000,dst_offset=3600000]

</p928:getenddateresponse>

  jmeter 提供了 web services (soap) sampler,用以調用基于 http 的 web 服務。下面詳細說明 soap over http 服務調用的各個屬性。

使用JMeter對SOAP應用進行壓力或性能測試

圖 3.soap over http 服務調用的各個屬性

 soap over jms 服務調用的各個屬性說明:

  queueconnectionfactory:連接配接工廠的預設 jndi 實體

  jndi name request queue:jndi 請求隊列名字

  jndi name receive queue:jndi 接收隊列名字

  timeout:請求逾時設定

  communication style:通訊形式(包括僅僅請求和請求應答)

  content:請求信封

  jms properties:jms 的一些屬性設定(對于 ibm was 必須要有 targetservice 屬性)

  initial context factory:jndi 的初始會話工廠

  provider url:服務提供位址

  下面是一次完整的 jms 請求與 jms 響應 soap 資料:

  jms request

  <soapenv:envelope>

  <soapenv:body>

  <tns0:getauemppositionid>

  <ev_id>6098</ev_id>

  </tns0:getauemppositionid>

  </soapenv:body>

  </soapenv:envelope>

  jms response

  <soapenv:header/>

  <p150:getauemppositionidresponse>

  <getauemppositionidreturn xsi:nil="true"/>

  </p150:getauemppositionidresponse>

  設計高效的測試用例集

  壓力測試或者系統測試不同于功能測試,測試的重點不在系統産品是不是滿足設計需求。它所看重的是系統在大的使用者量和負載情況下的可靠性以及系統響應 , 它目标是測試系統的執行效率,特别是在較短時間内系統負載快速增長時系統的相應速度。在實際的測試過程中,大量使用者同時通路的系統節點也可能成為産品潛在的效率瓶頸。是以 , 壓力測試和系統測試也往往是在功能測試之後進行。

  對于普通的軟體系統 , 産品的瓶頸可能會在資料庫伺服器上,web 伺服器上,而對于 soap 服務系統測試,web services 伺服器和 jms 伺服器是用戶端請求的主要節點 , 同時,主要業務邏輯的處理也都分布在這些節點上,它們很有可能成為系統通路的瓶頸,如果這些節點出現問題,那麼對整個系統的效率會有緻命的影響,也是壓力測試和系統測試要優先考慮的。

  改進測試政策、測試方法、測試過程,使用高效的測試用例集,進而保證産品品質。這個是主要目的,也是最直接的目的。一個高效的測試用例集應包含以及适應如下要素:

  在什麼時候确定要執行系統測試

  如何去檢測并解決系統性能和負載問題

  收集監視伺服器性能資料(i/o,cpu,mem)

  盡量減少因為個人配置和某些測試用例而造成系統出現錯誤和瓶頸

  所有測試工作都得到有效協調并目标一緻

  當已經确定了所需的 jmeter samplers,并且在此基礎上設計出一個通用的測試計劃,那麼就可以建構我們的測試腳本了。本文的測試用例以及最終的測試計劃也是建立在這些要素之上。

  測試計劃(test plan)描述了測試運作過程中 jmeter 的執行順序、過程以及步驟,一個完整的測試計劃包括一個或者多個線程組 (thread groups)、循環控制器(loop controllers)、監聽器 (listener)、邏輯控制器(logic controller)、定時器(timer)、斷言(assertions)、配置資訊(config elements)等。

  在測試計劃中添加一個使用者定義變量配置元素(user defined variables), 可以在裡面定義伺服器位址,日志路徑,逾時限制等變量,提供腳本重用。同時添加兩個使用者組,一個是 soap over http group,一個是 soap over jms group。在每個使用者組下面分别添加一個總的循環控制器(loop controller),用以控制腳本循環次數。在總循環控制器下面添加随機選擇器(random selector)用以随機選擇運作測試腳本。下圖是我們整個的 test plan。

使用JMeter對SOAP應用進行壓力或性能測試

  圖 4. 設計完成之後的 soap 測試計劃

啟動 soap 服務測試

  當準備好我們的測試計劃之後就可以啟動執行壓力測試了,為了記錄測試結果和資訊,要增加 listener 來完成這個任務。jmeter 提供了可視化的界面以及統計報表來供我們選擇。這裡我們使用表格(summary report)的形式來檢視和分析測試結果。

  你可以通過下面的步驟來給每個 group 增加 summary report 螢幕 :

  1. 選中 test plan 中要添加 listener 的 group 節點,這裡我們選擇 soap over jms group。

  2. 右擊選擇 add-->listener-->summary report, 界面右邊會相應的出現我們選擇的 listener 的設定資訊。

  在經過一系列工作之後,已經完成了整個 test plan,現在可以選擇 jmeter 菜單 run-->start 來啟動我們的壓力測試了。下圖是運作過程中測試統計資料的實時跟新資訊。為了增加請求負載和獲得更有價值的資料,我們可以更改線程數、等待時間和循環次數。

使用JMeter對SOAP應用進行壓力或性能測試

  圖 5. 基于吞吐量的測試結果報表(summary report)

  獲得的經驗

  總結:

  使用 jmeter 來作為測試工具對 soap 協定的服務進行壓力和系統測試是一個很好選擇,選擇 jmeter 來進行 soap 測試具有以下顯著的優點:首先 jmeter 提供了強大全面的 soap 請求 / 接收以及監視功能,允許你執行、捕獲在用戶端和伺服器端的 soap 流量分析。其次,可以使用 jmeter 可以設計出高效、易維護的測試用例甚至測試計劃。最後,我們可以選擇 jmeter 提供的符合我們情況的結果 listener,并且可以從這些 listener 中很容易的分析出系統或者是服務存在的問題和瓶頸。總體上講,我們在 jmeter 測試架構中建構的 soap 測試計劃很好的完成了對 soap 協定的系統測試。下面詳細列出了我們在本次測試過程中獲得的技巧以及經驗。

  測試工具的選擇

  測試工具在軟體和産品測試中是必不可少的,包括系統測試,壓力測試,性能測試以及功能測試。它也會與要測試的産品,測試的領域以及測試的重點有很大的關系。是以,選擇一款合适的測試工具對高效的完成測試是至關重要的。

  設計高效的測試計劃

  一個高效的測試用例集可以快速的診斷出系統的性能瓶頸。 為此應該全面的分析了解要測試系統的架構與應用,盡量避免盲目或者重複的測試用例,最終來建構效率盡可能高的測試用例集。

  盡量全面的系統監控

  軟體缺陷和系統性能瓶頸的診斷可能會需要各個方面的檢測資料,它們對問題的解決會提供很大的幫助,是以測試過程中應該有全面的系統監控,包括伺服器的各項資料(cpu,i/o,mem), 背景資料庫的各項資料,相應時間以及網絡流量等。

  關注 soap 請求的逾時(timeout)

  基于 soap 協定的請求,無論是 soap over http 還是 soap over jms 都會有請求逾時(timeout),引起請求逾時的原因可能是多方面的(伺服器的響應速度,效率,網絡帶寬等),合理的分析以及設定請求逾時能更準确的掌握産品的性能情況。

最新内容請見作者的github頁:http://qaseven.github.io/