SOAP(Simple Object Access Protocol)稱為簡單對象訪問協(xié)議, 是 W3C 定義的一種標(biāo)準(zhǔn)消息傳遞協(xié)議,而它通常被認(rèn)為是 Web Services 的事實(shí)標(biāo)準(zhǔn)。SOAP 協(xié)議使用 XML 語言來描述,SOAP 消息格式是由 XML Schema 模式定義,因而通過使用 XML 命名空間使得 SOAP 具有很強(qiáng)的可擴(kuò)展性。
SOAP 是在去中心化(Decentralized)分布式(Distributed)環(huán)境中用來信息交換的一個輕量級協(xié)議。SOAP 本身并不定義像程序模型或?qū)嵤┞暶鞯刃问降恼Z法,而只定義了一種簡單機(jī)制:通過提供模塊化的包裝模型編碼機(jī)制來傳輸應(yīng)用信息。
1) 信封 Envelope Envelope 元素是 SOAP 中的根元素,并且定義為在 SOAP 消息中必須出現(xiàn)。Envelope 元素中可以包含多可選的 Header 元素,但同時必須要包含一個 Body 元素。
2) 消息頭 Header Header 可能出現(xiàn)在 SOAP 消息中,是一個可選元素。如果出現(xiàn)在消息中,那么 Header 一定要是 SOAP 中的第一個元素。SOAP Header 在 Web Services 中的應(yīng)用越來越廣泛,例如在應(yīng)用程序的安全性事物中使用標(biāo)準(zhǔn)的消息頭文件,因而成為擴(kuò)展 SOAP 協(xié)議的一個非常有效的方法。
3)消息體 Body Body 元素是 SOAP 中必須出現(xiàn)的一個元素,它要包含應(yīng)用程序中的傳輸數(shù)據(jù)或者反饋消息。 應(yīng)用程序中的傳輸數(shù)據(jù)可以是任意形式的 XML 數(shù)據(jù)。SOAP 消息接收者最終來處理 SOAP Body 體。
SOAP 使用 RPC(遠(yuǎn)程過程調(diào)用)和消息傳遞來建立通信服務(wù),SOAP RPC 定義了用于表示遠(yuǎn)程過程調(diào)用和應(yīng)答的協(xié)議。SOAP 協(xié)議本身僅僅定義了消息的交換結(jié)構(gòu),它可以和許多現(xiàn)存因特網(wǎng)協(xié)議結(jié)合在一起使用,其中包括超文本傳輸協(xié)議( HTTP),多用途網(wǎng)際郵件擴(kuò)充協(xié)議(MIME),Java 消息服務(wù)(JMS)以及簡單郵件傳輸協(xié)議(SMTP)等。目前與 SOAP 應(yīng)用最為廣泛的是 HTTP 協(xié)議和 JMS 協(xié)議,而與之相對應(yīng)的兩種應(yīng)用就是 SOAP Over HTTP 和 SOAP Over JMS。
根據(jù) JMS 的規(guī)范,消息交換有 2 種方式:消息發(fā)布 / 訂閱方式和點(diǎn)對點(diǎn)方式。由這兩種交換方式所建立的消息收發(fā)系統(tǒng)都是異步的,即 JMS 客戶機(jī)可以發(fā)送消息而不必等待回應(yīng)。如果應(yīng)用程序測試者或測試腳本開發(fā)者希望每一條消息都能夠被處理并且消息總是能夠被傳送到指定的位置,那么應(yīng)該使用點(diǎn)對點(diǎn)消息模型而不是消息發(fā)布 / 訂閱模型。
HTTP(超文本傳送協(xié)議)是屬于應(yīng)用層的面向?qū)ο蟮膮f(xié)議,是萬維網(wǎng) (WWW) 的基礎(chǔ),由于其簡單快速、靈活、無連接、無狀態(tài)的方式,適用于分布式網(wǎng)絡(luò)信息系統(tǒng)。SOAP Over HTTP 應(yīng)用就是指的是遵守 SOAP 編碼規(guī)則的 HTTP 請求 / 響應(yīng),我們可以用簡單的公式來對此作一個描述:HTTP + XML = SOAP。
圖 1.JMeter 框架基于上述兩種不同的協(xié)議對 SOAP 消息的一次簡單調(diào)用機(jī)制流程
準(zhǔn)備測試環(huán)境
當(dāng)精心編寫好測試腳本滿懷信心的去運(yùn)行測試計劃時,發(fā)現(xiàn)所有的測試腳本都 failed 掉了,原因可能是你的測試環(huán)境中并沒有完全準(zhǔn)備好。下面給出了準(zhǔn)備測試環(huán)境的詳細(xì)步驟:
1.環(huán)境變量設(shè)置:JMeter 運(yùn)行在 JRE/JDK 之上,在所有開始之前要設(shè)置 JMeter 自動檢測的環(huán)境變量 JAVA_HOME=#JAVA INSTALL DIRECTORY#.
2.JMeter 安裝:本文下面下載欄提供了 Apache JMeter 下載地址,首先要取得最新版本的 JMeter 測試工具,JMeter 最新版本包含了構(gòu)建和運(yùn)行絕大部分測試類型的文件,包括 Web (HTTP/HTTPS), FTP, JDBC, LDAP, Java, 和 JUnit 等。
3.準(zhǔn)備 jar 包:JMeter 雖然提供了對 SOAP Over HTTP 以及 SOAP Over JMS 測試的 Sampler,但是出于對 licence 的考慮它本身并沒有提供 JMS 需要使用的 jar 包。因此,在運(yùn)行測試之前需要將這些包復(fù)制到 JMeter 的 lib 目錄下,下面列表對測試所需 jar 包作了詳細(xì)說明。
4.BeanShell 腳本處理:如果在測試用例中用到了 BeanShell 腳本,則需要將 BeanShell 包拷貝到 JMeter bin 目錄下。BeanShell 是一種兼容 Java 語言的輕量級腳本語言,JMeter 腳本中可能會經(jīng)常用它來做日志處理,正則表達(dá)式后處理(Post- Process)等。如果在測試用例中用到了 Mail Visualiser, Mail Reader 以及 Web Services (SOAP) sampler,則需要將 MAIL 包拷貝到 JMeter bin 目錄下。如果在測試用例中用到了 JMS 相關(guān)的 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
調(diào)試腳本中非常有用的信息日志:jmeter.log 在腳本的調(diào)試和運(yùn)行過程中,所以的日志信息都會記錄在 jmeter.log 中,因此你會在這個文件中找到比較有用的信息。
注意事項(xiàng)
如果 JMeter 在執(zhí)行測試腳本過程中應(yīng)該修改 jmeter.bat 文件中的一些參數(shù),參數(shù)大小可以根據(jù)測試計劃合理確定:
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
此外,在搭建測試環(huán)境時還需要更多注意的地方:
JMeter 使用兼容 JKD1.4 或者更高版本
JMeter 無法識別 zip 格式的包文件,所以需要的包文件均要求以 .jar 結(jié)尾
JMeter 會自動在 JMETER_HOME/lib 和 ext 目錄下尋找需要的類
對于使用 CSVDataSet, 那么不要勾選 "Memory Cache"否則數(shù)據(jù)無法迭代
使用 JMeter 連接 SOAP Over HTTP 服務(wù)
JMeter 提供了 Web Service (SOAP) sampler,用以調(diào)用基于 HTTP 的 Web 服務(wù)。下面詳細(xì)說明 SOAP Over HTTP 服務(wù)調(diào)用的各個屬性。
圖 2.SOAP Over HTTP 服務(wù)調(diào)用的各個屬性
SOAP Over HTTP 服務(wù)調(diào)用的各個屬性說明:
WSDL URL:指定 WSDL 文件的目標(biāo)地址
Web Methods:選擇本次請求調(diào)用的方法
Protocol:指定使用的協(xié)議,默認(rèn)為 HTTP
Server Name Or IP:服務(wù)的地址(服務(wù)器名或 IP 地址)
Path:調(diào)用方法所在的位置
Timeout:設(shè)置請求超時限制
SOAPAction:存在于 WSDL 文件中的調(diào)用方法,默認(rèn)不必填寫
Soap/XML-RPC Data:請求數(shù)據(jù)
下面是一次完整的 HTTP 請求與 HTTP 響應(yīng) SOAP 數(shù)據(jù):
HTTP Request <soapenv:Envelope> <soapenv:Body> <q0:getEndDate> <ip_id>12</ip_id> </q0:getEndDate> </soapenv:Body> </soapenv:Envelope> HTTP Response <soapenv:Envelope> <soapenv:Header/> <soapenv:Body> <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> </soapenv:Body> </soapenv:Envelope> |
使用 JMeter 連接 SOAP Over HTTP 服務(wù)
JMeter 提供了 Web Services (SOAP) sampler,用以調(diào)用基于 HTTP 的 Web 服務(wù)。下面詳細(xì)說明 SOAP Over HTTP 服務(wù)調(diào)用的各個屬性。
圖 3.SOAP Over HTTP 服務(wù)調(diào)用的各個屬性
SOAP Over JMS 服務(wù)調(diào)用的各個屬性說明:
QueueConnectionFactory:連接工廠的默認(rèn) JNDI 實(shí)體
JNDI name Request queue:JNDI 請求隊(duì)列名字
JNDI name Receive queue:JNDI 接收隊(duì)列名字
Timeout:請求超時設(shè)置
Communication style:通訊形式(包括僅僅請求和請求應(yīng)答)
Content:請求信封
JMS Properties:JMS 的一些屬性設(shè)置(對于 IBM WAS 必須要有 targetService 屬性)
Initial Context Factory:JNDI 的初始會話工廠
Provider URL:服務(wù)提供地址
下面是一次完整的 JMS 請求與 JMS 響應(yīng) SOAP 數(shù)據(jù):
JMS Request <soapenv:Envelope> <soapenv:Body> <tns0:getAuEmpPositionId> <ev_id>6098</ev_id> </tns0:getAuEmpPositionId> </soapenv:Body> </soapenv:Envelope> JMS Response <soapenv:Envelope> <soapenv:Header/> <soapenv:Body> <p150:getAuEmpPositionIdResponse> <getAuEmpPositionIdReturn xsi:nil="true"/> </p150:getAuEmpPositionIdResponse> </soapenv:Body> </soapenv:Envelope> |
設(shè)計高效的測試用例集
壓力測試或者系統(tǒng)測試不同于功能測試,測試的重點(diǎn)不在系統(tǒng)產(chǎn)品是不是滿足設(shè)計需求。它所看重的是系統(tǒng)在大的用戶量和負(fù)載情況下的可靠性以及系統(tǒng)響應(yīng) , 它目標(biāo)是測試系統(tǒng)的執(zhí)行效率,特別是在較短時間內(nèi)系統(tǒng)負(fù)載快速增長時系統(tǒng)的相應(yīng)速度。在實(shí)際的測試過程中,大量用戶同時訪問的系統(tǒng)節(jié)點(diǎn)也可能成為產(chǎn)品潛在的效率瓶頸。因此 , 壓力測試和系統(tǒng)測試也往往是在功能測試之后進(jìn)行。
對于普通的軟件系統(tǒng) , 產(chǎn)品的瓶頸可能會在數(shù)據(jù)庫服務(wù)器上,Web 服務(wù)器上,而對于 SOAP 服務(wù)系統(tǒng)測試,Web Services 服務(wù)器和 JMS 服務(wù)器是客戶端請求的主要節(jié)點(diǎn) , 同時,主要業(yè)務(wù)邏輯的處理也都分布在這些節(jié)點(diǎn)上,它們很有可能成為系統(tǒng)訪問的瓶頸,如果這些節(jié)點(diǎn)出現(xiàn)問題,那么對整個系統(tǒng)的效率會有致命的影響,也是壓力測試和系統(tǒng)測試要優(yōu)先考慮的。
改進(jìn)測試策略、測試方法、測試過程,使用高效的測試用例集,從而保證產(chǎn)品質(zhì)量。這個是主要目的,也是最直接的目的。一個高效的測試用例集應(yīng)包含以及適應(yīng)如下要素:
在什么時候確定要執(zhí)行系統(tǒng)測試
如何去檢測并解決系統(tǒng)性能和負(fù)載問題
收集監(jiān)視服務(wù)器性能數(shù)據(jù)(I/O,CPU,MEM)
盡量減少因?yàn)閭€人配置和某些測試用例而造成系統(tǒng)出現(xiàn)錯誤和瓶頸
所有測試工作都得到有效協(xié)調(diào)并目標(biāo)一致
當(dāng)已經(jīng)確定了所需的 JMeter Samplers,并且在此基礎(chǔ)上設(shè)計出一個通用的測試計劃,那么就可以構(gòu)建我們的測試腳本了。本文的測試用例以及最終的測試計劃也是建立在這些要素之上。
測試計劃(Test Plan)描述了測試運(yùn)行過程中 JMeter 的執(zhí)行順序、過程以及步驟,一個完整的測試計劃包括一個或者多個線程組 (Thread Groups)、循環(huán)控制器(Loop Controllers)、監(jiān)聽器 (Listener)、邏輯控制器(Logic Controller)、定時器(Timer)、斷言(Assertions)、配置信息(Config Elements)等。
在測試計劃中添加一個用戶定義變量配置元素(User Defined Variables), 可以在里面定義服務(wù)器地址,日志路徑,超時限制等變量,提供腳本重用。同時添加兩個用戶組,一個是 SOAP Over HTTP Group,一個是 SOAP Over JMS Group。在每個用戶組下面分別添加一個總的循環(huán)控制器(Loop Controller),用以控制腳本循環(huán)次數(shù)。在總循環(huán)控制器下面添加隨機(jī)選擇器(Random Selector)用以隨機(jī)選擇運(yùn)行測試腳本。下圖是我們整個的 Test Plan。

圖 4. 設(shè)計完成之后的 SOAP 測試計劃
啟動 SOAP 服務(wù)測試
當(dāng)準(zhǔn)備好我們的測試計劃之后就可以啟動執(zhí)行壓力測試了,為了記錄測試結(jié)果和信息,要增加 Listener 來完成這個任務(wù)。JMeter 提供了可視化的界面以及統(tǒng)計報表來供我們選擇。這里我們使用表格(Summary Report)的形式來查看和分析測試結(jié)果。
你可以通過下面的步驟來給每個 Group 增加 Summary Report 監(jiān)視器 :
1. 選中 Test Plan 中要添加 Listener 的 Group 節(jié)點(diǎn),這里我們選擇 SOAP Over JMS Group。
2. 右擊選擇 Add-->Listener-->Summary Report, 界面右邊會相應(yīng)的出現(xiàn)我們選擇的 Listener 的設(shè)置信息。
在經(jīng)過一系列工作之后,已經(jīng)完成了整個 Test Plan,現(xiàn)在可以選擇 JMeter 菜單 run-->start 來啟動我們的壓力測試了。下圖是運(yùn)行過程中測試統(tǒng)計數(shù)據(jù)的實(shí)時跟新信息。為了增加請求負(fù)載和獲得更有價值的數(shù)據(jù),我們可以更改線程數(shù)、等待時間和循環(huán)次數(shù)。
圖 5. 基于吞吐量的測試結(jié)果報表(Summary Report)
獲得的經(jīng)驗(yàn)
總結(jié):
使用 JMeter 來作為測試工具對 SOAP 協(xié)議的服務(wù)進(jìn)行壓力和系統(tǒng)測試是一個很好選擇,選擇 JMeter 來進(jìn)行 SOAP 測試具有以下顯著的優(yōu)點(diǎn):首先 JMeter 提供了強(qiáng)大全面的 SOAP 請求 / 接收以及監(jiān)視功能,允許你執(zhí)行、捕獲在客戶端和服務(wù)器端的 SOAP 流量分析。其次,可以使用 JMeter 可以設(shè)計出高效、易維護(hù)的測試用例甚至測試計劃。最后,我們可以選擇 JMeter 提供的符合我們情況的結(jié)果 Listener,并且可以從這些 Listener 中很容易的分析出系統(tǒng)或者是服務(wù)存在的問題和瓶頸。總體上講,我們在 JMeter 測試框架中構(gòu)建的 SOAP 測試計劃很好的完成了對 SOAP 協(xié)議的系統(tǒng)測試。下面詳細(xì)列出了我們在本次測試過程中獲得的技巧以及經(jīng)驗(yàn)。
測試工具的選擇
測試工具在軟件和產(chǎn)品測試中是必不可少的,包括系統(tǒng)測試,壓力測試,性能測試以及功能測試。它也會與要測試的產(chǎn)品,測試的領(lǐng)域以及測試的重點(diǎn)有很大的關(guān)系。因此,選擇一款合適的測試工具對高效的完成測試是至關(guān)重要的。
設(shè)計高效的測試計劃
一個高效的測試用例集可以快速的診斷出系統(tǒng)的性能瓶頸。 為此應(yīng)該全面的分析了解要測試系統(tǒng)的架構(gòu)與應(yīng)用,盡量避免盲目或者重復(fù)的測試用例,最終來構(gòu)建效率盡可能高的測試用例集。
盡量全面的系統(tǒng)監(jiān)控
軟件缺陷和系統(tǒng)性能瓶頸的診斷可能會需要各個方面的檢測數(shù)據(jù),它們對問題的解決會提供很大的幫助,因此測試過程中應(yīng)該有全面的系統(tǒng)監(jiān)控,包括服務(wù)器的各項(xiàng)數(shù)據(jù)(CPU,I/O,MEM), 后臺數(shù)據(jù)庫的各項(xiàng)數(shù)據(jù),相應(yīng)時間以及網(wǎng)絡(luò)流量等。
關(guān)注 SOAP 請求的超時(Timeout)
基于 SOAP 協(xié)議的請求,無論是 SOAP Over HTTP 還是 SOAP Over JMS 都會有請求超時(Timeout),引起請求超時的原因可能是多方面的(服務(wù)器的響應(yīng)速度,效率,網(wǎng)絡(luò)帶寬等),合理的分析以及設(shè)置請求超時能更準(zhǔn)確的掌握產(chǎn)品的性能情況。