l 用LR8.0中的mlr5lprg.dll、lm70.dll覆蓋LR9.5安裝目錄下“bin”文件夾中的對應文件;
l 手動修改注冊表,刪除下面內容:
[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"
//當然也可以直接執行刪除注冊的文件lr_Del_license(regedit).exe。
l 然后使用老的注冊碼就可以使用了;
global-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB
or(Ok――1000個用戶的Global License:AEACFSJI-YASEKJJKEAHJD-BCLBR)
6、安裝后的配置:
l 在用戶環境變量中增加HP_FLEX_JAVA_LOG_FILE的debug參數 ;value為:目錄\日志文件名稱。
Eg: C:\ldlog\flex.log
l 在錄制腳本的Vugen中的Toole->Recording Options->Flex ->Externalizable Objects下添加Lib文件,這樣就可以正常解析測試系統中的定義的類和對象了,并且使得腳本中的文件結構更加清晰。
添加的文件:
flex-messaging-common.jar
flex-messaging-core.jar
其他與flex和spring相關的文件;
測試系統自定義的jar包,如:syswincrm31.jar
這樣就可以正常解析flex協議下所有請求數據了,并且可以使得錄制的文件的結構更加清晰,方便參數化。
1、 錄制時無法彈出IE,google一下,解決辦法如下:
l 主要是LR的注冊信息被修改,無法找到IE路徑。如何重新注冊LR呢?在lr的安裝目錄(例如D:\Program Files\Mercury\LoadRunner\bin)下,單擊register_vugen.bat文件,注冊信息被重新改寫了。不過別忘了最后一步。重新啟動一下,好了;
l 有多個瀏覽器時,將IE置為默認瀏覽器;由于IE的第三方插件的影響,IE工具-》Internet選項…-》高級,把“啟用第三方瀏覽器擴展”的選中去掉即可;
l 對于Windows2003上無法錄制IE6/7,導致IE Crash,iedw.exe(IE Crash Detection)報告錯誤事件,可能原因是Windows Server默認對IE加載DEP(數據執行保護)特性,而Vugen.exe剛好又跟DEP沖突。方法:我的電腦>右鍵屬性->高級->“性能”部分的“設置”->“數據執行保護”->點擊“添加”按鈕->將LR安裝目錄bin下的vugen.exe添加進去->點擊確定,重啟一下LR,就可以錄制了。
2、 錄制不到腳本
l 選擇的協議不對,有時需要選擇多個協議,這個需與開發、系統架構師溝通;
l 沒有選擇jar包;
l 檢查防火墻個殺毒軟件,關閉所有的網絡監測;
l 早期的版本(Ld8.0以前的版本)不能很好的支持IE6以上的版本,換成IE6即可;
l Flex需要客戶端下安裝flash,并且IE選項的安全設置中設置可以訪問所有active控件;
3、 錄制的腳本回放錯誤
l 選擇的協議不對(應選擇多個協議或其他協議);
l 沒有選擇jar包,無法解析數據;
l 自動關聯錯誤;
l 動態數據沒有做關聯;
Flex協議錄制的腳本沒有辦法產生自動關聯時,需要下面的Ld中自帶的函數進行自定義:
l 選擇另一臺機器上錄制的ld9.50版本的腳本,原來選擇的http/flex兩個協議的腳本,回放報錯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――后臺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)
無法解析,原來機器上的jar包的位置在本機器上不同引起的
因缺少錄制時候選擇的jar包,選擇的jar包的位置變化了或者引用的jar包已經刪除了。
解決方法:重新在Run-time settings->Flex->Externalizable Objects中增加jar包(因為原來引用的jar包的位置已經發生變化了),增加Recording Options中的jar是沒用的。
l 重復記錄導致:Error: Server returned error for message #1 : "AMF call returned an error, described in XML seen in extended log"可以用打開所有log(Run-time Setting->General->Log->Extended log,全部選擇上),然后回放腳本,進行具體問題的跟蹤,一般是由于程序中限定不允許數據重復(或數據記錄的某個字段不能重復導致的,一般發生在新建和修改里面。(有些可能不是程序中作限定,而是數據庫中有唯一性限制,索引或主健等),刪除相關的所有記錄后再次回放即可。(本系統中的此次測試出現這個錯誤是由于刪除了客戶臺帳的新建客戶數據,但在客戶會中生成的主數據沒有刪除導致的)
l 版本不兼容,在一個ld版本下錄制的腳本在一個版本下使用。
l 請求超時或修改了程序(但你不知道)。
l 根據Replay log的具體錯誤內容查看原因(結合Replay log(F10單步執行)、web服務的后臺日志和程序綜合分析)注:web服務后臺日志的顯示級別在\WEB-INF\classes\log4j.properties或者中application-context.xml中的props設置(最好只顯示錯誤,不然日志文件太大,不容易分析)。
4、 錄制的可以回放的腳本卻不能操作成功
l 對動態數據沒有做關聯;
l 有驗證碼:如果請求進去后,服務器雖然判別請求非法,但是它仍能成功處理,告訴你請求數據有問題,那么它返回的http代碼仍是200!只是頁面上會有它的提示信息錯誤!LR只判斷請求的狀態是否正確,不判斷業務數據是否正確!如果要做判斷得自己寫檢查點判別!
l web服務器后臺日志顯示Unknown AMF question的錯誤,請求無效導致
l 選擇的協議不完整,錄制的腳本不完整導致的;
l 打開Extended Log單步執行查看Replay log和web服務后臺日志,然后分析
1、 腳本參數化之前所做的:
l 保存錄制好的一個原始的腳本;然后另存一份進行參數化(備份一份,以防參數化錯誤導致無法恢復初始腳本而重新錄制腳本,浪費時間);
l 然后把需要關聯的進行關聯,然后回放成功且測試系統中成功(eg:能看到新增的相應記錄)再保存一份;
l 腳本中是否有注釋,沒有則添加注釋,增加腳本可讀性,方便參數化和以后重用;
l 腳本中是否建立了事務的開始和結束點(錄制時需要考慮的);
l Session和動態數據是否正確和全部進行了參數化替換,(注意一個參數錄制后分行的情況,要截取一部分通過查找功能一一檢查腳本;參數前面的特殊字符不進行替換)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);
上面錄制的腳本通過回放對比(腳本的View Tree模式下的Server Response可以很明顯的看到jsessionid需要關聯,直接關聯參數化替換即可;而DSid也需要關聯,然而通過對比腳本的上下文發現前面的x06I并不需要參數化(后面的此相關內容中都沒有x06I)
l 保存腳本后,在每個腳本中增加readme文件,簡要描述一下腳本的錄制內容、多少個參數及其參數運行機制等。
l 以上的文件保存還有參數化及其腳本中的注釋一律用英文(Ld對中文支持的不好)
2、 Flex中sessionid如何關聯?
l 首先在Generation Log中查找第一返回sessionid的AMF Response的xml文件(也可以在View Tree模式下查看第一個flex amf call 后的Server response中返回的內容,然后右側選擇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 關聯的函數放在第一個flex_amf_call請求的后面,在第一個出現session id的請求前面(即服務器返回的帶有session的響應數據是在第一個請求后返回到客戶端的)
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 在第一個flex_amf_call請求中的MESSAGE前面增加一行
"ResponseParameter=resp", //用于獲取服務器響應中的內容
3、 腳本參數化時的注意事項:
l 分析腳本,對需要參數化的內容進行參數化;
l 參數化時,對于錄制的數據和參數化的數據長度不一致而腳本解析不同時,需修改參數與其一致;
Eg: 密碼: 666666->腳本解析為->\r666666
1 ->腳本解析為->\x01
l 對于不需參數化的變量(項目名稱或ID等),給出注釋,寫明變量名稱,便于后續的分析和查找有無遺漏的參數;
l 對于換行的參數,替換時要完全替換,但換行符要保留;
l 參數化數據可通過連接數據庫查詢得到(必須安裝Oracle客戶端并建立本地Net服務名后方可)。Eg:
在腳本中選擇要替換的參數值,選擇Replace with a Parameter->properties->Data Wizard…->SpecifySQLstatement manu-Next->Create->新建文件數據源->選擇Oracle in OraDb10g_home1->輸入一個名字(如cc)->完成->在Oracle ODBC Driver Connect窗口中Service Name中輸入在客戶端程序(Net Configuration Assistant中創建一個本地Net服務名配置且測試成功)中配置的名字(大寫,注不用輸入數據庫的IP地址),然后輸入登陸數據庫的用戶名和密碼->確定->選擇cc數據源->確定->再次輸入服務名(Service Name)/用戶名(User Name)/密碼(Password)[此時只輸入空白處的密碼即可,其他兩項已經有剛才設置的數據了]->OK ->在Connection出顯示一串數據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中輸入相應的查詢語句即可->Finish,在參數列表中就可以看到數據了。
l 對于參數化的數據最后是有規律的數據,這樣可以通過excel表格下拉+1的方式生成;
l 對于有數據關聯的情況,可以建立一個*.dat文件,然后從數據庫中查詢后導入,然后生成多列的參數化文件;
l 一一檢查需要參數化的內容,以防遺漏,全部參數化后,回放,回放無誤后,另存一份腳本。Eg: login1_OK。