posts - 97,  comments - 5,  trackbacks - 0
          @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); @import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

          如何進(jìn)行Web服務(wù)的性能測(cè)試?《轉(zhuǎn)載》

            隨著瀏覽器功能的不斷完善,用戶量不斷的攀升,涉及到web服務(wù)的功能在不斷的增加,對(duì)于我們測(cè)試來(lái)說(shuō),我們不僅要保證服務(wù)端功能的正確性,也要驗(yàn)證服務(wù)端程序的性能是否符合要求。那么性能測(cè)試都要做些什么呢?我們?cè)撛鯓舆M(jìn)行性能測(cè)試呢?
            性能測(cè)試一般會(huì)圍繞以下這些問(wèn)題而進(jìn)行:
            1. 什么情況下需要做性能測(cè)試?
            2. 什么時(shí)候做性能測(cè)試?
            3. 做性能測(cè)試需要準(zhǔn)備哪些內(nèi)容?
            4. 什么樣的性能指標(biāo)是符合要求的?
            5. 性能測(cè)試需要收集的數(shù)據(jù)有哪些?
            6. 怎樣收集這些數(shù)據(jù)?
            7. 如何分析收集到的數(shù)據(jù)?
            8. 如何給出性能測(cè)試報(bào)告?
            性能測(cè)試的執(zhí)行過(guò)程及要做的事兒主要包含以下內(nèi)容:
            1. 測(cè)試評(píng)估階段
            在這個(gè)階段,我們要評(píng)估被測(cè)的產(chǎn)品是否要進(jìn)行性能測(cè)試,并且對(duì)目前的服務(wù)器環(huán)境進(jìn)行粗估,服務(wù)的性能是否滿足條件。
            首先要明確只要涉及到準(zhǔn)備上線的服務(wù)端產(chǎn)品,就需要進(jìn)行性能測(cè)試。其次如果產(chǎn)品需求中明確提到了性能指標(biāo),那也必須要做性能測(cè)試。
            測(cè)試人員在進(jìn)行性能測(cè)試前,需要根據(jù)當(dāng)前的收集到的各種信息,預(yù)先做性能的評(píng)估,收集的內(nèi)容主要包括帶寬、請(qǐng)求包大小、并發(fā)用戶數(shù)和當(dāng)前web服務(wù)的帶寬等
            2. 測(cè)試準(zhǔn)備階段
            在這個(gè)階段,我們要了解以下內(nèi)容:
            a. 服務(wù)器的架構(gòu)是什么樣的,例如:web服務(wù)器是什么?是如何配置的?數(shù)據(jù)庫(kù)用的是什么?服務(wù)用的是什么語(yǔ)言編寫的?;
            b. 服務(wù)端功能的內(nèi)部邏輯實(shí)現(xiàn);
            c. 服務(wù)端與數(shù)據(jù)庫(kù)是如何交互的,例如:數(shù)據(jù)庫(kù)的表結(jié)構(gòu)是什么樣的?服務(wù)端功能是怎樣操作數(shù)據(jù)庫(kù)的?
            d. 服務(wù)端與客戶端之間是如何進(jìn)行交互的,即接口定義;
            通過(guò)收集以上信息,測(cè)試人員整理出服務(wù)器端各模塊之間的交互圖,客戶端與服務(wù)端之間的交互圖以及服務(wù)端內(nèi)部功能邏輯實(shí)現(xiàn)的流程圖。
            e. 該服務(wù)上線后的用戶量預(yù)估是多少,如果無(wú)法評(píng)估出用戶量,那么可以通過(guò)設(shè)計(jì)測(cè)試執(zhí)行的場(chǎng)景得出這個(gè)值;
            f. 上線要部署到多少臺(tái)機(jī)器上,每臺(tái)機(jī)器的負(fù)載均衡是如何設(shè)計(jì)的,每臺(tái)機(jī)器的配置什么樣的,網(wǎng)絡(luò)環(huán)境是什么樣的。
            g. 了解測(cè)試環(huán)境與線上環(huán)境的不同,例如網(wǎng)絡(luò)環(huán)境、硬件配置等
            h. 制定測(cè)試執(zhí)行的策略,是需要驗(yàn)證需求中的指標(biāo)能否達(dá)到,還是評(píng)估系統(tǒng)的最大處理能力。
            i. 溝通上線的指標(biāo)
            通過(guò)收集以上信息,確定性能測(cè)試用例該如何設(shè)計(jì),如何設(shè)計(jì)性能測(cè)試用例執(zhí)行的場(chǎng)景,以及上線指標(biāo)的評(píng)估。
            3. 測(cè)試設(shè)計(jì)階段
            根據(jù)測(cè)試人員通過(guò)之前整理的交互圖和流程圖,設(shè)計(jì)相應(yīng)的性能測(cè)試用例。性能測(cè)試用例主要分為預(yù)期目標(biāo)用戶測(cè)試,用戶并發(fā)測(cè)試,疲勞強(qiáng)度與大數(shù)量測(cè)試,網(wǎng)絡(luò)性能測(cè)試,服務(wù)器性能測(cè)試,具體編寫的測(cè)試用例要更具實(shí)際情況進(jìn)行裁減。
            用例編寫的步驟大致分為:
            a. 通過(guò)腳本模擬單一用戶是如何使用這個(gè)web服務(wù)的。這里模擬的可以是用戶使用web服務(wù)的某一個(gè)動(dòng)作或某幾個(gè)動(dòng)作,某一個(gè)功能或幾個(gè)功能,也可以是使用web服務(wù)的整個(gè)過(guò)程。
            b. 根據(jù)客戶端的實(shí)際情況和服務(wù)器端的策略,通過(guò)將腳本中可變的數(shù)據(jù)進(jìn)行參數(shù)化,來(lái)模擬多個(gè)用戶的操作。
            c. 驗(yàn)證參數(shù)化后腳本功能的正確性。
            d. 添加檢查點(diǎn)
            e. 設(shè)計(jì)腳本執(zhí)行的策略,如每個(gè)功能的執(zhí)行次數(shù),各個(gè)功能的執(zhí)行順序等
            4. 測(cè)試執(zhí)行階段
            根據(jù)客戶端的產(chǎn)品行為設(shè)計(jì)web服務(wù)的測(cè)試執(zhí)行場(chǎng)景及測(cè)試執(zhí)行的過(guò)程,即測(cè)試執(zhí)行期間發(fā)生的事兒。通過(guò)監(jiān)控程序收集web服務(wù)的性能數(shù)據(jù)和web服務(wù)所在系統(tǒng)的性能數(shù)據(jù)。
            在測(cè)試執(zhí)行過(guò)程中,還要不斷的關(guān)注以下內(nèi)容:
            a. web服務(wù)的連接速度如何?
            b. 每秒的點(diǎn)擊數(shù)如何?
            c. Web服務(wù)能允許多少個(gè)用戶同時(shí)在線?
            d. 如果超過(guò)了這個(gè)數(shù)量,會(huì)出現(xiàn)什么現(xiàn)象?
            e. Web服務(wù)能否處理大量用戶對(duì)同一個(gè)頁(yè)面的請(qǐng)求?
            f. 如果web服務(wù)崩潰,是否會(huì)自動(dòng)恢復(fù)?
            g. 系統(tǒng)能否同一時(shí)間響應(yīng)大量用戶的請(qǐng)求?
            h. 打壓機(jī)的系統(tǒng)負(fù)載狀態(tài)。
            5. 測(cè)試分析階段
            將收集到的數(shù)據(jù)制成圖表,查看各指標(biāo)的性能變化曲線,結(jié)合之前確定的上線指標(biāo),對(duì)各項(xiàng)數(shù)據(jù)進(jìn)行分析,已確定是否繼續(xù)對(duì)web服務(wù)進(jìn)行測(cè)試,結(jié)果是否達(dá)到了期望值。
            6. 測(cè)試驗(yàn)證階段
            在開發(fā)針對(duì)發(fā)現(xiàn)的性能問(wèn)題進(jìn)行修復(fù)后,要再執(zhí)行性能測(cè)試的用例對(duì)問(wèn)題進(jìn)行驗(yàn)證。這里需要關(guān)注的是開發(fā)在解決問(wèn)題的同時(shí)可能無(wú)意中修改了某些功能,所以在驗(yàn)證性能的同時(shí),也要關(guān)注原有功能是否受到了影響


               性能測(cè)試 是一項(xiàng)浩大的工程,若你只想隨便找臺(tái)機(jī)器裝上ld后,造幾條數(shù)據(jù),弄幾個(gè)并發(fā)用戶簡(jiǎn)單跑一下出來(lái)結(jié)果就可以萬(wàn)事大吉了,那你就大錯(cuò)特錯(cuò)了!(這樣得出的測(cè)試結(jié)果沒有任何價(jià)值和意義,當(dāng)然更無(wú)法依此評(píng)估出你貴公司系統(tǒng)的性能了。

          真正開始執(zhí)行之前除了編寫詳細(xì)的性能測(cè)試計(jì)劃【所需的資源(軟件+硬件+人力)】、設(shè)計(jì)測(cè)試腳本、準(zhǔn)備測(cè)試數(shù)據(jù)、搭建測(cè)試環(huán)境外,還需要注意一下細(xì)節(jié):

          如何保證性能測(cè)試的順利開展和執(zhí)行?

          1. 首先考慮你性能測(cè)試的目標(biāo)是什么,需要哪些人員協(xié)助你才能完成,然后協(xié)調(diào)相關(guān)人員(DBA、網(wǎng)管、開發(fā)人員等),保證在真正開展過(guò)程中能有效得到他們的協(xié)助和支持(性能測(cè)試不是一個(gè)人就能完成的,除非你“全才”啦);

          2. 你計(jì)劃中需要申請(qǐng)的資源,比如運(yùn)行contoller的機(jī)器,是否符合你的預(yù)期要求,Cpu是否有足夠的處理能力,安裝的操作系統(tǒng)是否符合你的要求(loadrunner9.5除load Generator外都不能安裝在64位機(jī)操作系統(tǒng)下,若沒看清楚安裝文件(安裝程序下help\install.pdf)中system requirements for installing說(shuō)明的話,你安裝完成會(huì)發(fā)現(xiàn)自己白忙活了,還得重裝OS,然后重來(lái)一次);

          3. 你要測(cè)試的程序是否功能都沒問(wèn)題了,若程序還有變更,請(qǐng)千萬(wàn)不要在錄制部分后又變更了,你需要的版本是一個(gè)功能穩(wěn)定的版本,能順利錄制腳本的的版本);

          4. 在測(cè)試執(zhí)行前你是否召集開發(fā)和相關(guān)人員對(duì)程序中明顯需要優(yōu)化的地方(你功能測(cè)試執(zhí)行時(shí)系統(tǒng)有些功能就無(wú)法忍受的慢)進(jìn)行了優(yōu)化,這樣可以大大縮短你的性能測(cè)試周期;

          5. 在選擇loadrunner工具前,一定要慎重,你的程序設(shè)計(jì)語(yǔ)言和架構(gòu)及其所運(yùn)用的技術(shù),此工具是否都支持,不然后續(xù)你需要自行開發(fā)的腳本就太多了,可能面臨重新選擇測(cè)試工具的嚴(yán)重問(wèn)題);

          6. 分險(xiǎn)分析:技術(shù)風(fēng)險(xiǎn)、風(fēng)險(xiǎn)分析、分險(xiǎn)應(yīng)對(duì)措施和風(fēng)險(xiǎn)監(jiān)控方法。

          設(shè)計(jì)測(cè)試腳本?

          1. 識(shí)別可能的系統(tǒng)性能問(wèn)題,多與相關(guān)人員分析討論。
          2. 你所測(cè)系統(tǒng)的重點(diǎn)業(yè)務(wù)是什么?都有哪些角色參與?業(yè)務(wù)邏輯是什么樣的?用戶頻繁使用的功能是否都考慮周全了?
          3. 參數(shù)化數(shù)據(jù)的來(lái)源?都需要哪些檢查點(diǎn)?腳本的精簡(jiǎn)程度?

          準(zhǔn)備測(cè)試數(shù)據(jù)?

          1. 基礎(chǔ)數(shù)據(jù):要更符合實(shí)際需求,人員、角色、初始化數(shù)據(jù)等;
          2. 業(yè)務(wù)數(shù)據(jù);要更符合實(shí)際業(yè)務(wù),數(shù)據(jù)最好不要相同的數(shù)據(jù),無(wú)效的數(shù)據(jù),要類別豐富、覆蓋所有業(yè)務(wù)邏輯的基礎(chǔ)數(shù)據(jù);可以通過(guò)自動(dòng)化工具直接生成;數(shù)據(jù)庫(kù)腳本生成(單一數(shù)據(jù),關(guān)聯(lián)幾個(gè)表的數(shù)據(jù)最好不用腳本生成);用ld生成。

          搭建測(cè)試環(huán)境?

          1. 網(wǎng)絡(luò)(帶寬、可使用的有效ip地址個(gè)數(shù));
          2. 服務(wù)器的配置;
          3. 當(dāng)前測(cè)試環(huán)境的局限性(無(wú)法模擬的測(cè)試環(huán)境都有哪些)。

          需求分析和需求轉(zhuǎn)化

          客戶的性能需求不可測(cè)試、沒有需求、需求模糊,要通過(guò)與客戶、開發(fā)人員的溝通獲得可測(cè)試、可衡量和可量化的性能需求

          1.8/2原則

          2.經(jīng)驗(yàn)值

          3.平均并發(fā)用戶數(shù)C=nL/T(n:用戶數(shù)量[login session的數(shù)量],L:用戶平均使用時(shí)長(zhǎng)[login session的時(shí)長(zhǎng)],T:考察的時(shí)間段)

          4.并發(fā)用戶峰值:C1=C+3√C

          1、從hp官方網(wǎng)站上下載loadrunner9.5的試用版程序(有windows和linux的版本);

          2、按照步驟進(jìn)行安裝(安裝之前先安裝必須的.net框架和組件);

          3、安裝文件的目錄及文件存放路徑一定不能含有中文,防止錯(cuò)誤;另外最好不要選擇根目錄下,要新建一個(gè)文件夾,命名,然后安裝其下,安裝完成后,重啟。

          4、從http://support.openview.hp.com/selfsolve/document/KM750376下載LoadRunner9.51 patch安裝LoadRunner_951.msp文件

          然后http://support.openview.hp.com/selfsolve/document/KM793318下載LoadRunner 9.52 patch安裝LoadRunner_952.exe文件

          Ld9.50對(duì)flex的支持有以下問(wèn)題:

          l 無(wú)法解析flex內(nèi)部的對(duì)象;

          l 在一臺(tái)機(jī)器上錄制的腳本無(wú)法在另一臺(tái)機(jī)器上正確運(yùn)行;報(bào)錯(cuò)如:

          java.io.IOException: file c:\jars\syswincrm3.jar is not found

          at hp.flex.ClassLoaderManipulator.loadClassPathString(ClassLoaderManipulator.java:58)

          (這是在調(diào)試中顯示的/HP_FLEX_JAVA_LOG_FILE/,下面是在界面中的Replay log中顯示的)

          Error: Encoding of AMF message failed. Error is : Exception Occurred while invoking WriteObject method - java.lang.ClassNotFoundException: flex.messaging.io.amf.Amf3Output

          at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

          at java.security.AccessController.doPrivileged(Native Method)

          at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

          at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)

          at java.lang.ClassLoader.loadClass(ClassLoader.java:251)

          at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

          at java.lang.Class.forName0(Native Method)

          at java.lang.Class.forName(Class.java:164)

          at hp.flex.HPExternalizableWrapper.GetLCDSObjectOutputStream(HPExternalizableWrapper.java:155)

          at hp.flex.HPExternalizableWrapper.GetObjectOutputStream(HPExternalizableWrapper.java:215)

          at hp.flex.HPExternalizableWrapper.WriteObject(HPExternalizableWrapper.java:23)

          l 在Controller中添加其他ip地址(已經(jīng)安裝了agent process)Load Generators,運(yùn)行報(bào)錯(cuò);

          l Results Analysis中的Set Global Filter中沒有thinktime選項(xiàng),這樣就不能查看不包含thinktime的事務(wù)響應(yīng)時(shí)間了;

          l 其他問(wèn)題可在安裝后的readme.htm中查看

          升級(jí)到Ld9.52后則解決了此問(wèn)題,這兩個(gè)補(bǔ)丁所解決的問(wèn)題可以在下載的壓縮包中解壓的readme.htm文件中查看。

          5、然后用傳統(tǒng)的破解方法進(jìn)行破解即可。google,破解方法如下(僅供研究人員參考,請(qǐng)大家支持正版軟件!):

          l 用LR8.0中的mlr5lprg.dll、lm70.dll覆蓋LR9.5安裝目錄下“bin”文件夾中的對(duì)應(yīng)文件;

          l 手動(dòng)修改注冊(cè)表,刪除下面內(nèi)容:

          [HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner\License2]

          [HKEY_LOCAL_MACHINE\SOFTWARE\MercuryInteractive\LoadRunner\License2\History]"AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN"="" [HKEY_LOCAL_MACHINE\SOFTWARE\MercuryInteractive\LoadRunner\License2\PermanentLicense] @="AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN"

          "last"="AIBGEBFW-JVED-ZKEKEKEKEKEBDNQAF-KBRDN" [HKEY_LOCAL_MACHINE\SOFTWARE\MercuryInteractive\LoadRunner\License2\TemporaryLicense]@="AEBGEBFS-AKEKEKEKE-KAUCA" [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{87B3ADD4-21EB-11d5-93EF-00105AA0FD2D}] @="IControl"

          //當(dāng)然也可以直接執(zhí)行刪除注冊(cè)的文件lr_Del_license(regedit).exe。

          l 然后使用老的注冊(cè)碼就可以使用了;

          global-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI

          web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

          or(Ok――1000個(gè)用戶的Global License:AEACFSJI-YASEKJJKEAHJD-BCLBR)

          6、安裝后的配置:

          l 在用戶環(huán)境變量中增加HP_FLEX_JAVA_LOG_FILE的debug參數(shù) ;value為:目錄\日志文件名稱。

          Eg: C:\ldlog\flex.log

          l 在錄制腳本的Vugen中的Toole->Recording Options->Flex ->Externalizable Objects下添加Lib文件,這樣就可以正常解析測(cè)試系統(tǒng)中的定義的類和對(duì)象了,并且使得腳本中的文件結(jié)構(gòu)更加清晰。

          添加的文件:

          flex-messaging-common.jar

          flex-messaging-core.jar

          其他與flex和spring相關(guān)的文件;

          測(cè)試系統(tǒng)自定義的jar包,如:syswincrm31.jar

          這樣就可以正常解析flex協(xié)議下所有請(qǐng)求數(shù)據(jù)了,并且可以使得錄制的文件的結(jié)構(gòu)更加清晰,方便參數(shù)化。

          1、 錄制時(shí)無(wú)法彈出IE,google一下,解決辦法如下:

          l 主要是LR的注冊(cè)信息被修改,無(wú)法找到IE路徑。如何重新注冊(cè)LR呢?在lr的安裝目錄(例如D:\Program Files\Mercury\LoadRunner\bin)下,單擊register_vugen.bat文件,注冊(cè)信息被重新改寫了。不過(guò)別忘了最后一步。重新啟動(dòng)一下,好了;

          l 有多個(gè)瀏覽器時(shí),將IE置為默認(rèn)瀏覽器;由于IE的第三方插件的影響,IE工具-》Internet選項(xiàng)…-》高級(jí),把“啟用第三方瀏覽器擴(kuò)展”的選中去掉即可;

          l 對(duì)于Windows2003上無(wú)法錄制IE6/7,導(dǎo)致IE Crash,iedw.exe(IE Crash Detection)報(bào)告錯(cuò)誤事件,可能原因是Windows Server默認(rèn)對(duì)IE加載DEP(數(shù)據(jù)執(zhí)行保護(hù))特性,而Vugen.exe剛好又跟DEP沖突。方法:我的電腦>右鍵屬性->高級(jí)->“性能”部分的“設(shè)置”->“數(shù)據(jù)執(zhí)行保護(hù)”->點(diǎn)擊“添加”按鈕->將LR安裝目錄bin下的vugen.exe添加進(jìn)去->點(diǎn)擊確定,重啟一下LR,就可以錄制了。

          2、 錄制不到腳本

          l 選擇的協(xié)議不對(duì),有時(shí)需要選擇多個(gè)協(xié)議,這個(gè)需與開發(fā)、系統(tǒng)架構(gòu)師溝通;

          l 沒有選擇jar包;

          l 檢查防火墻個(gè)殺毒軟件,關(guān)閉所有的網(wǎng)絡(luò)監(jiān)測(cè);

          l 早期的版本(Ld8.0以前的版本)不能很好的支持IE6以上的版本,換成IE6即可;

          l Flex需要客戶端下安裝flash,并且IE選項(xiàng)的安全設(shè)置中設(shè)置可以訪問(wèn)所有active控件;

          3、 錄制的腳本回放錯(cuò)誤

          l 選擇的協(xié)議不對(duì)(應(yīng)選擇多個(gè)協(xié)議或其他協(xié)議);

          l 沒有選擇jar包,無(wú)法解析數(shù)據(jù);

          l 自動(dòng)關(guān)聯(lián)錯(cuò)誤;

          l 動(dòng)態(tài)數(shù)據(jù)沒有做關(guān)聯(lián);

          Flex協(xié)議錄制的腳本沒有辦法產(chǎn)生自動(dòng)關(guān)聯(lián)時(shí),需要下面的Ld中自帶的函數(shù)進(jìn)行自定義:

          l 選擇另一臺(tái)機(jī)器上錄制的ld9.50版本的腳本,原來(lái)選擇的http/flex兩個(gè)協(xié)議的腳本,回放報(bào)錯(cuò)Replay log如下:

          Error: Encoding of AMF message failed. Error is : Exception Occurred while invoking WriteObject method

          - java.lang.ClassNotFoundException: flex.messaging.io.amf.Amf3Output

          (Enter to WriteObject WriteObject throws exception:

          java.lang.ClassNotFoundException: flex.messaging.io.amf.Amf3Output――后臺(tái)debug log)

          at java.net.URLClassLoader$1.run(URLClassLoader.java:200)

          at java.security.AccessController.doPrivileged(Native Method)

          at java.net.URLClassLoader.findClass(URLClassLoader.java:188)

          at java.lang.ClassLoader.loadClass(ClassLoader.java:306)

          at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)

          at java.lang.ClassLoader.loadClass(ClassLoader.java:251)

          at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

          at java.lang.Class.forName0(Native Method)

          at java.lang.Class.forName(Class.java:164)

          at hp.flex.HPExternalizableWrapper.GetLCDSObjectOutputStream(HPExternalizableWrapper.java:155)

          at hp.flex.HPExternalizableWrapper.GetObjectOutputStream(HPExternalizableWrapper.java:215)

          at hp.flex.HPExternalizableWrapper.WriteObject(HPExternalizableWrapper.java:23)

          無(wú)法解析,原來(lái)機(jī)器上的jar包的位置在本機(jī)器上不同引起的

          因缺少錄制時(shí)候選擇的jar包,選擇的jar包的位置變化了或者引用的jar包已經(jīng)刪除了。

          解決方法:重新在Run-time settings->Flex->Externalizable Objects中增加jar包(因?yàn)樵瓉?lái)引用的jar包的位置已經(jīng)發(fā)生變化了),增加Recording Options中的jar是沒用的。

          l 重復(fù)記錄導(dǎo)致:Error: Server returned error for message #1 : "AMF call returned an error, described in XML seen in extended log"可以用打開所有l(wèi)og(Run-time Setting->General->Log->Extended log,全部選擇上),然后回放腳本,進(jìn)行具體問(wèn)題的跟蹤,一般是由于程序中限定不允許數(shù)據(jù)重復(fù)(或數(shù)據(jù)記錄的某個(gè)字段不能重復(fù)導(dǎo)致的,一般發(fā)生在新建和修改里面。(有些可能不是程序中作限定,而是數(shù)據(jù)庫(kù)中有唯一性限制,索引或主健等),刪除相關(guān)的所有記錄后再次回放即可。(本系統(tǒng)中的此次測(cè)試出現(xiàn)這個(gè)錯(cuò)誤是由于刪除了客戶臺(tái)帳的新建客戶數(shù)據(jù),但在客戶會(huì)中生成的主數(shù)據(jù)沒有刪除導(dǎo)致的)

          l 版本不兼容,在一個(gè)ld版本下錄制的腳本在一個(gè)版本下使用。

          l 請(qǐng)求超時(shí)或修改了程序(但你不知道)。

          l 根據(jù)Replay log的具體錯(cuò)誤內(nèi)容查看原因(結(jié)合Replay log(F10單步執(zhí)行)、web服務(wù)的后臺(tái)日志和程序綜合分析)注:web服務(wù)后臺(tái)日志的顯示級(jí)別在\WEB-INF\classes\log4j.properties或者中application-context.xml中的props設(shè)置(最好只顯示錯(cuò)誤,不然日志文件太大,不容易分析)。

          4、 錄制的可以回放的腳本卻不能操作成功

          l 對(duì)動(dòng)態(tài)數(shù)據(jù)沒有做關(guān)聯(lián);

          l 有驗(yàn)證碼:如果請(qǐng)求進(jìn)去后,服務(wù)器雖然判別請(qǐng)求非法,但是它仍能成功處理,告訴你請(qǐng)求數(shù)據(jù)有問(wèn)題,那么它返回的http代碼仍是200!只是頁(yè)面上會(huì)有它的提示信息錯(cuò)誤!LR只判斷請(qǐng)求的狀態(tài)是否正確,不判斷業(yè)務(wù)數(shù)據(jù)是否正確!如果要做判斷得自己寫檢查點(diǎn)判別!

          l web服務(wù)器后臺(tái)日志顯示Unknown AMF question的錯(cuò)誤,請(qǐng)求無(wú)效導(dǎo)致

          l  選擇的協(xié)議不完整,錄制的腳本不完整導(dǎo)致的;

          l 打開Extended Log單步執(zhí)行查看Replay log和web服務(wù)后臺(tái)日志,然后分析

          1、 腳本參數(shù)化之前所做的:

          l 保存錄制好的一個(gè)原始的腳本;然后另存一份進(jìn)行參數(shù)化(備份一份,以防參數(shù)化錯(cuò)誤導(dǎo)致無(wú)法恢復(fù)初始腳本而重新錄制腳本,浪費(fèi)時(shí)間);

          l 然后把需要關(guān)聯(lián)的進(jìn)行關(guān)聯(lián),然后回放成功且測(cè)試系統(tǒng)中成功(eg:能看到新增的相應(yīng)記錄)再保存一份;

          l 腳本中是否有注釋,沒有則添加注釋,增加腳本可讀性,方便參數(shù)化和以后重用;

          l 腳本中是否建立了事務(wù)的開始和結(jié)束點(diǎn)(錄制時(shí)需要考慮的);

          l Session和動(dòng)態(tài)數(shù)據(jù)是否正確和全部進(jìn)行了參數(shù)化替換,(注意一個(gè)參數(shù)錄制后分行的情況,要截取一部分通過(guò)查找功能一一檢查腳本;參數(shù)前面的特殊字符不進(jìn)行替換)eg如下:

          flex_web_request("amf;jsessionid="

          "LFgVY20Tly1K0pQqprsXvwFpKhvqg5KznhJn43syvgXGGpyDNh42!1755959435",

          "URL=http://erp.syswin.com/messagebroker/amf;jsessionid="

          "LFgVY20Tly1K0pQqprsXvwFpKhvqg5KznhJn43syvgXGGpyDNh42!1755959435",

          "Method=POST",

          "Resource=0",

          "RecContentType=application/x-amf",

          "Referer=http://erp.syswin.com/syswincrm3.swf",

          "Snapshot=t3.inf",

          "Mode=HTML",

          "EncType=application/x-amf",

          "BodyBinary=\\x00\\x03\\x00\\x00\\x00\\x01\\x00\\x04null\\x00\\x02/"

          "1\\x00\\x00\\x01\\x18\n\\x00\\x00\\x00\\x01\\x11\n"

          "\\x81\\x13Oflex.messaging.messages.RemotingMessage\\x13operation\r"

          "source\t"

          "body\\x13messageId\\x11clientId\\x15timeToLive\\x13timestamp\\x0Fheade"

          "rs\\x17destination\\x06\\x0Blogin\\x01\t\\x05\\x01\\x06\\x07gwa\\x06\r"

          "666666\\x06IAACD40DF-FFC4-8641-4CB8-02F1481FB0F4\\x01\\x04\\x00\\x04\\"

          "x00\n\\x0B\\x01\\x15DSEndpoint\\x06\rmy-amf\t"

          "DSId\\x06I3E3B399F-351B-D1FC-FC78-81B50BD94526\\x01\\x06\\x1DsessionSe"

          "rvice",

          LAST);

          flex_amf_call("AMF3_call_1",

          "Gateway=http://erp.syswin.com/messagebroker/amf;jsessionid="

          "LFgVY20Tly1K0pQqprsXvwFpKhvqg5KznhJn43syvgXGGpyDNh42!1755959435",

          "Snapshot=t4.inf",

          MESSAGE,

          "Method=null",

          "TargetObjectId=/2",

          BEGIN_ARGUMENTS,

          "<AMF3><object-externalizable-custom>"

          "<flex.messaging.messages.RemotingMessage>\n <destination"

          ">sessionService</destination>\n <messageId"

          ">4ADBA44D-56DE-48EF-3CF0-02F14929E669</messageId>\n <timestamp>0</"

          "timestamp>\n <timeToLive>0</timeToLive>\n <headers>\n <entry>\n "

          " <string>DSEndpoint</string>\n <string>my-amf</string>\n </"

          "entry>\n <entry>\n <string>DSId</string>\n <string"

          ">3E3B399F-351B-D1FC-FC78-81B50BD94526</string>\n </entry>\n </"

          "headers>\n <operation>getLoginInfo</operation>\n <parameters/>\n</"

          "flex.messaging.messages.RemotingMessage></object-externalizable-custom"

          "></AMF3>",

          END_ARGUMENTS,

          LAST);

          上面錄制的腳本通過(guò)回放對(duì)比(腳本的View Tree模式下的Server Response可以很明顯的看到j(luò)sessionid需要關(guān)聯(lián),直接關(guān)聯(lián)參數(shù)化替換即可;而DSid也需要關(guān)聯(lián),然而通過(guò)對(duì)比腳本的上下文發(fā)現(xiàn)前面的x06I并不需要參數(shù)化(后面的此相關(guān)內(nèi)容中都沒有x06I)

          l 保存腳本后,在每個(gè)腳本中增加readme文件,簡(jiǎn)要描述一下腳本的錄制內(nèi)容、多少個(gè)參數(shù)及其參數(shù)運(yùn)行機(jī)制等。

          l 以上的文件保存還有參數(shù)化及其腳本中的注釋一律用英文(Ld對(duì)中文支持的不好)

          2、 Flex中sessionid如何關(guān)聯(lián)?

          l 首先在Generation Log中查找第一返回sessionid的AMF Response的xml文件(也可以在View Tree模式下查看第一個(gè)flex amf call 后的Server response中返回的內(nèi)容,然后右側(cè)選擇Snapshot (Both+XML)得到如下xml文件,但目前的版本中沒有看到此文件)eg:

          AMF notify: AMF Response xml

          <AMFPacket AMF_version="3">

          <AMFHeaders>

          <AMFHeader name="AppendToGatewayUrl" must_understand="true">

          <string>;jsessionid=LFgVY20Tly1K0pQqprsXvwFpKhvqg5KznhJn43syvgXGGpyDNh42!1755959435</string>

          </AMFHeader>

          </AMFHeaders>

          <Messages>

          <Message method="/1/onResult" target="">

          <AMF3>

          <object-externalizable-custom>

          <flex.messaging.messages.AcknowledgeMessageExt>

          <byte>-88</byte>

          <byte>3</byte>

          <flex.messaging.io.amf.ASObject serialization="custom">

          <unserializable-parents/>

          <map>

          <default>

          <loadFactor>0.75</loadFactor>

          <threshold>12</threshold>

          </default>

          <int>16</int>

          <int>2</int>

          <string>DSId</string>

          <string>3E3B399F-351B-D1FC-FC78-81B50BD94526</string>

          <string>DSMessagingVersion</string>

          <double>1.0</double>

          </map>

          <flex.messaging.io.amf.ASObject>

          <default>

          <inHashCode>false</inHashCode>

          <inToString>false</inToString>

          </default>

          </flex.messaging.io.amf.ASObject>

          </flex.messaging.io.amf.ASObject>

          <long>1267065045765</long>

          <byte-array>Pjs5nzUreVPrVzhfC43tVg==</byte-array>

          <byte-array>Pjs5nzU9e4JlWT2jzHpllQ==</byte-array>

          <byte>2</byte>

          <byte-array>k/Z0Cs1L2rKvVALxSC+pkg==</byte-array>

          <byte>0</byte>

          </flex.messaging.messages.AcknowledgeMessageExt>

          </object-externalizable-custom>

          </AMF3>

          </Message>

          </Messages>

          </AMFPacket>

          l 關(guān)聯(lián)的函數(shù)放在第一個(gè)flex_amf_call請(qǐng)求的后面,在第一個(gè)出現(xiàn)session id的請(qǐng)求前面(即服務(wù)器返回的帶有session的響應(yīng)數(shù)據(jù)是在第一個(gè)請(qǐng)求后返回到客戶端的)

          lr_message("resp %s", lr_eval_string( "{resp}"));

          lr_xml_get_values("XML={resp}", "ValueParam=seid","Query=/AMFPacket/AMFHeaders/AMFHeader/string",LAST);

          lr_xml_get_values("XML={resp}", "ValueParam=dsid","Query=//string[position() mod 4 = 2]",LAST);

          lr_message("seid %s", lr_eval_string( "{seid}"));

          lr_save_var(lr_eval_string("{seid}") + 12, 64, 0, "sid");

          lr_message("sid %s", lr_eval_string( "{sid}")); //output sid

          lr_message("dsid %s", lr_eval_string( "{dsid}")); //output dsid

          l 在第一個(gè)flex_amf_call請(qǐng)求中的MESSAGE前面增加一行

          "ResponseParameter=resp", //用于獲取服務(wù)器響應(yīng)中的內(nèi)容

          3、 腳本參數(shù)化時(shí)的注意事項(xiàng):

          l 分析腳本,對(duì)需要參數(shù)化的內(nèi)容進(jìn)行參數(shù)化;

          l 參數(shù)化時(shí),對(duì)于錄制的數(shù)據(jù)和參數(shù)化的數(shù)據(jù)長(zhǎng)度不一致而腳本解析不同時(shí),需修改參數(shù)與其一致;

          Eg: 密碼: 666666->腳本解析為->\r666666

          1 ->腳本解析為->\x01

          l 對(duì)于不需參數(shù)化的變量(項(xiàng)目名稱或ID等),給出注釋,寫明變量名稱,便于后續(xù)的分析和查找有無(wú)遺漏的參數(shù);

          l 對(duì)于換行的參數(shù),替換時(shí)要完全替換,但換行符要保留;

          l 參數(shù)化數(shù)據(jù)可通過(guò)連接數(shù)據(jù)庫(kù)查詢得到(必須安裝Oracle客戶端并建立本地Net服務(wù)名后方可)。Eg:

          在腳本中選擇要替換的參數(shù)值,選擇Replace with a Parameter->properties->Data Wizard…->SpecifySQLstatement manu-Next->Create->新建文件數(shù)據(jù)源->選擇Oracle in OraDb10g_home1->輸入一個(gè)名字(如cc)->完成->在Oracle ODBC Driver Connect窗口中Service Name中輸入在客戶端程序(Net Configuration Assistant中創(chuàng)建一個(gè)本地Net服務(wù)名配置且測(cè)試成功)中配置的名字(大寫,注不用輸入數(shù)據(jù)庫(kù)的IP地址),然后輸入登陸數(shù)據(jù)庫(kù)的用戶名和密碼->確定->選擇cc數(shù)據(jù)源->確定->再次輸入服務(wù)名(Service Name)/用戶名(User Name)/密碼(Password)[此時(shí)只輸入空白處的密碼即可,其他兩項(xiàng)已經(jīng)有剛才設(shè)置的數(shù)據(jù)了]->OK ->在Connection出顯示一串?dāng)?shù)據(jù)eg:DRIVER={Oracle in OraDb10g_home1}; SERVER=SYSWIN25; UID=crm39;PWD=crm39; DBQ=SYSWIN25; DBA=W;APA=T; EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;

          然后在下面SQL中輸入相應(yīng)的查詢語(yǔ)句即可->Finish,在參數(shù)列表中就可以看到數(shù)據(jù)了。

          l 對(duì)于參數(shù)化的數(shù)據(jù)最后是有規(guī)律的數(shù)據(jù),這樣可以通過(guò)excel表格下拉+1的方式生成;

          l 對(duì)于有數(shù)據(jù)關(guān)聯(lián)的情況,可以建立一個(gè)*.dat文件,然后從數(shù)據(jù)庫(kù)中查詢后導(dǎo)入,然后生成多列的參數(shù)化文件;

          l 一一檢查需要參數(shù)化的內(nèi)容,以防遺漏,全部參數(shù)化后,回放,回放無(wú)誤后,另存一份腳本。Eg: login1_OK。



          天貓 軟件自動(dòng)化測(cè)試開發(fā)

          posted on 2015-04-23 14:13 zouhui 閱讀(588) 評(píng)論(0)  編輯  收藏 所屬分類: 2.軟件測(cè)試 性能自動(dòng)化
          <2015年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(2)

          隨筆分類(94)

          隨筆檔案(94)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 崇左市| 柯坪县| 霍邱县| 锡林浩特市| 和林格尔县| 阿城市| 河曲县| 兴山县| 丰宁| 凯里市| 巴楚县| 玉屏| 宜兴市| 邹城市| 增城市| 安平县| 和林格尔县| 重庆市| 郴州市| 荥经县| 邓州市| 晋江市| 武川县| 中卫市| 海口市| 崇仁县| 南陵县| 丽江市| 咸宁市| 金溪县| 托克逊县| 三亚市| 弋阳县| 平塘县| 瓦房店市| 汝南县| 兰州市| 敖汉旗| 高州市| 石河子市| 肥西县|