WEB开发网      濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堝姛缂佺娀绠栭弻宥堫檨闁告挻姘ㄩ幑銏犫槈濞嗘劕顎撻梺鍛婂姇瀵爼骞栭幇顔炬/闁告挆鍕畬闂佸疇顫夐崹鍧楀箖閳哄啠鍋撻崷顓炐㈡い銉︾箞濮婂搫效閸パ€鍋撳Δ鍛;闁规崘顕ф闂佸憡娲﹂崹鎵不濞戙垺鐓曟い鎰剁稻缁€鍐┿亜鎼达紕效婵﹨娅g划娆忊枎閹冨闂備礁鎽滄慨鐢稿礉濞嗘劒绻嗛柣銏⑶圭粈瀣亜閺嶃劏澹橀柛鐐姂濮婃椽妫冨ù銈嗙⊕閹峰懘骞撻幒宥咁棜闂備礁婀遍崕銈夈€冮崱娑樼厱闁圭儤顨嗛悡鏇㈡煛閸ャ儱濡煎ù婊勭矋閵囧嫯绠涢敐鍛睄闂佸搫澶囬埀顒€纾弳鍡涙倵閿濆骸澧伴柡鍡欏█閺屟勫濞嗘垵鍩岄梺闈涙鐢帡锝炲┑瀣亗閹艰揪绲奸悽鑽ょ磽娴h娈曢柛銊ョ仢椤繒绱掑Ο璇差€撶紓浣圭☉椤戝懎鈻撻鐐╂斀妞ゆ梹鏋婚崗顒傜磼閻樿櫕宕岄柕鍡曠椤繈骞囨担鍏夋瀸濠电姷鏁告慨顓㈠磻閹捐秮褰掓晲閸モ斂鈧﹪鏌¢埀顒佺鐎n偆鍘藉┑鈽嗗灡椤戞瑩宕电€n兘鍋撶憴鍕仩闁稿氦绮鹃悘鍐⒑缂佹◤顏勵嚕閸洖鐤柣鎰暩绾惧ジ鏌涚仦鐐殤閺佸牓鎮楃憴鍕缂侇喖绻樿棟閻庨潧鎽滃Λ顖炴煙椤栧棔绀佹禒顕€鎮楀▓鍨灈闁绘牜鍘ч悾鐑芥偂鎼存ɑ顫嶅┑鈽嗗灟鐠€锕傛倵瀹曞洨纾介柛灞剧懅閸斿秵銇勯妸銉︻棞闁伙絾绻堥獮鏍ㄦ媴濮濆本鎲伴梻浣虹帛濡啴藟閹捐姹查悗锝庡枟閻撶喐淇婇妶鍌氫壕闂佺粯顨呭Λ妤呭煝閹炬緞鏃堝川椤旇瀚奸梺鑽ゅТ濞茬娀鍩€椤掑啯鐝柣蹇婂亾闂傚倷绀侀幖顐﹀箠閹邦厽鍙忛柟缁㈠枟閸嬧晠鏌i妶搴$仜濞存粌缍婇弻鐔兼倻濡偐鐣洪梺鍝勬噺缁诲牆顫忓ú顏咁棃婵炴垶鑹鹃。鍝勨攽閳藉棗浜濋柣鐔叉櫊閵嗕礁鈻庨幒鏃傛澑闂佸搫鍟崐濠氭儊閸儲鈷戞慨鐟版搐閻忓弶绻涙担鍐插椤╃兘鏌ㄩ弴鐐测偓褰掓偂閺囥垺鐓忓┑鐐茬仢閸斻倝鏌涢埡瀣ɑ妞ゃ劊鍎甸幃娆撳级閹存繍娼氭俊銈囧Х閸嬬偤鏁冮姀銈冣偓浣糕枎閹炬潙娈愰梺鍐叉惈椤戝洭鐛姀銈嗏拻闁稿本鐟︾粊鐗堛亜椤愩埄妲搁柣锝呭槻铻i柤娴嬫櫇閻撳顪冮妶鍡橆梿闁跨喆鍎茬粋宥堛亹閹烘挾鍘甸梺缁樺灦钃遍悘蹇e幖闇夋繝濠傚暟缁夌儤鎱ㄦ繝鍛仩缂佽鲸甯掕灒闁惧繘鈧稒顢橀梻鍌欑劍鐎笛兠哄澶婄柧婵炴垶绮庢禍閬嶆⒒娴e憡鍟炴繛璇х畵瀹曞綊鏌嗗鍛幈闂佺鎻梽鍕偂濞嗘挻鐓犳繛鏉戭儐濞呭懎霉閻樺磭鐭婇柍瑙勫灴閸ㄩ箖鎮欓挊澶夊垝闂備浇顕栭崰妤呫€冮崨鏉戠叀濠㈣埖鍔曠粻鎶芥煙閹屽殶鐟滄澘娲ㄧ槐鎾诲磼濞嗘垼绐楅梺鍝ュУ閻楃娀銆侀弽顓炲窛闁圭⒈鍘介弲锝夋⒑缁嬭法绠抽柛妯犲懏顐介柣鎰節缁诲棙銇勯弽銊х煂閻㈩垱绋掔换娑㈠川椤撶喎鏋犲┑顔硷功缁垶骞忛崨瀛樺仭闂侇叏绠戝▓婵堢磽閸屾瑦绁版い鏇嗗洤纾归柛顭戝櫘閸ゆ洜绱撴担璐細缂佲檧鍋撻梻浣规偠閸庮垶宕濆鍛瀺闁搞儺鍓氶埛鎴犵磼鐎n偄顕滄繝鈧幍顔剧<閻庯綆鍋呭畷宀€鈧娲忛崹浠嬪箖娴犲宸濆┑鐘插楠炴姊洪悷鏉挎倯闁伙綆浜畷瑙勭節濮橆剛鍘愰梺鍝勬储閸ㄦ椽鎮¢妷锔藉弿婵☆垰鐏濋悡鎰版煟閹捐泛鏋涢柣鎿冨亰瀹曞爼濡烽妷銉バ戠紓鍌欑椤戝牆鐣烽悽鍨潟闁圭儤姊荤壕鍏间繆椤栨繂浜归柣锝堟缁辨挻鎷呴搹鐟扮缂備浇顕ч悧鍡涙偩瀹勯偊娼ㄩ柍褜鍓氭穱濠傤潰瀹€濠冃ㄧ紓鍌欐祰妞村摜鎹㈤崼婵愭綎缂備焦蓱婵绱掑☉姗嗗剰婵炲牊鍔欏娲箹閻愭彃顬嗛梺鍛婎殔閸熷潡鎮鹃悜绛嬫晬闁绘劘灏欐鍥⒑閻熼偊鍤熷┑顕€娼ч埢鎾淬偅閸愨斁鎷虹紓鍌欑劍钃遍柍閿嬪浮閺屽秴鐣¢幍顔尖叺閻庢鍣崑濠傜暦閹烘鍊烽悗鐢登归獮鍫ユ⒒娴g懓鈻曢柡渚囧櫍瀹曟垿骞樼紒妯煎幐闂佸憡渚楅崰姘跺箠閸涱喕绻嗛柛娆忣槸婵洭鎽堕敐澶嬪仩婵炴垶甯掓晶鏌ユ煛閸屾浜鹃梻鍌氬€烽懗鍓佸垝椤栫偛绀夐柡鍥╁€i悢鍝ョ瘈闁搞儜鍐╁劒闂備胶绮弻銊╂儍濠靛缁╅柤鎭掑劘娴滄粓鏌¢崘銊﹀妞ゃ儱顦甸弻娑㈠棘鐠囨祴鍋撳┑瀣闁割偅娲橀崐鐑芥煟閹寸偍缂氶柛姗€浜跺娲传閸曨剙鍋嶉梺鍛婃煥閺堫剟寮查崼鏇ㄦ晬闁绘劕顕崢鍗炩攽閻愬弶顥滅紒缁樺笧缁粯绻濆顓犲幐闁诲繒鍋熼弲顐f櫏闁诲氦顫夊ú锕傚磻婵犲倻鏆﹂柣鏃傗拡閺佸棝鏌嶈閸撴瑩鍩㈠澶嬫櫜闁搞儮鏅濋敍婵囩箾鏉堝墽绋荤憸鏉垮暞缁傚秹鎮欓鍌滅槇闂侀潧楠忕徊鍓ф兜閻愵兙浜滈柟瀛樼箖瀹告繄绱掗鍓у笡闁靛牞缍佸畷姗€鍩¢崘銊ョ闂備浇顕х€涒晝绮欓幒鎴犲箵閻犳亽鍔庢稉宥嗘叏濡炶浜鹃梺鍝勮閸斿矂鍩ユ径濞㈢喐寰勯惂鍝ョɑ闁靛洤瀚版俊鎼佹晲閸涱厼袝闂備浇顕栭崰妤呮偡閳哄懌鈧線寮崼婵堫槹濡炪倖鎸荤换鍕矆閸曨垱鈷掗柛灞剧懄缁佺増銇勯弴鐔哄⒌鐎规洑鍗冲浠嬵敃閵堝浂妲稿┑鐘垫暩婵挳宕愭繝姘辈闁挎洖鍊归悡娆愩亜閺嶎偄浠滃ù婊呭娣囧﹪鎳犳0婵嗘闂佸疇顫夐崹鍧楀春閸曨垰绀冮柕濞у懌鍋″┑锛勫亼閸娿倝宕㈡ィ鍐ㄧ婵☆垯璀﹂崵鏇㈡偣閸ャ劎銈存俊鎻掔墦閺屾洝绠涢弴鐑嗘綌闂佸啿鎼幊蹇涙偂韫囨搩鐔嗛悹楦挎婢ф洟鏌涢弮鈧幐鎶藉蓟濞戙垹妫樻繛鍡欏亾妤旂紓鍌欐祰妞存悂骞愭繝姘闁告侗鍨抽惌娆撳箹鐎涙ɑ灏ù婊堢畺閺屾稑鈹戦崟顐㈠Б闂佹椿鍘介幐楣冨箟閹间焦鍋嬮柛顐g箘閻熴劑姊洪崫鍕靛剮缂佽埖宀稿濠氭偄閻撳海顦悷婊冪箳閺侇喖鈽夐姀锛勫幐闂佸憡渚楅崰妤呭磹閹扮増鐓涢悘鐐额嚙婵倿鏌熼鍝勨偓婵嗙暦閹烘垟妲堟慨妤€妫旂槐锟� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛濠傛健閺屻劑寮崼鐔告闂佺ǹ顑嗛幐鍓у垝椤撶偐妲堟俊顖氭惈缁犺鈹戦悙鍙夆枙濞存粍绮撻幃鈥斥槈閵忥紕鍘卞┑鐐村灥瀹曨剟鐛Ο姹囦簻闁哄倹瀵чˉ銏℃叏婵犲懏顏犻柟鐟板婵℃悂濡烽敂鎯х稈闂傚倷鑳堕幊鎾诲吹閺嶎厼绠柨鐕傛嫹
开发学院软件开发Java 使用 Java 扩展 Rational Performance Tester 阅读

使用 Java 扩展 Rational Performance Tester

 2010-04-22 00:00:00 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亝鎹i柣顓炴閵嗘帒顫濋敐鍛婵°倗濮烽崑娑⑺囬悽绋挎瀬闁瑰墽绮崑鎰版煙缂佹ê绗ч柍褜鍓﹂崣鍐潖閸濆嫅褔宕惰娴犲ジ姊虹拠鑼闁煎綊绠栭幃楣冩倻閽樺鎽曢梺闈涱檧婵″洭宕㈤悽鍛娾拺閻熸瑥瀚烽崯蹇涙煕閻樺磭澧甸柕鍡楀€圭缓浠嬪川婵犲嫬骞堥梺纭呭閹活亞妲愰弴鐔哄ⅰ闂傚倷绶氬ḿ褍煤閵堝洠鍋撳顐㈠祮闁绘侗鍣i獮鎺懳旈埀顒傜不閿濆棛绡€闂傚牊绋戦弳娆徝瑰⿰鍫㈢暫闁哄矉缍佹慨鈧柍鎯版硾濠€杈ㄧ珶閺囩喓绡€婵﹩鍘鹃崢鐢告⒑缂佹ê濮﹂柛鎾村哺閹ɑ娼忛妸銈囩畾闂佸湱绮敮鐐存櫠濞戞氨纾肩紓浣贯缚濞插鈧娲栧畷顒冪亙闂佸憡鍔曢崯鐘诲礈濠靛牊宕叉繛鎴炨缚閺嗗棗鈹戦悩杈厡闁轰焦鐗滅槐鎾存媴娴犲鎽甸梺鍦嚀濞层倝鎮鹃悜钘夌闁规惌鍘介崓鐢告⒑閻熸澘鎮侀柣鎺炵畵閹骞栨担鍏夋嫽婵炶揪绲块崕銈夊吹閳ь剟姊洪幖鐐测偓鏍偋閻樿崵宓侀煫鍥ㄧ⊕閺呮悂鏌ㄩ悤鍌涘濠电姷鏁告慨鐑藉极閸涘﹥鍙忛柣鎴f閺嬩線鏌涘☉姗堟敾闁告瑥绻戦妵鍕箻閸楃偟浠肩紓浣哄閸ㄥ爼寮诲☉銏犵疀闂傚牊绋掗悘鍫ユ倵閻熺増鍟炵紒璇插暣婵$敻宕熼姘鳖啋闁诲酣娼ч幗婊堟偩婵傚憡鈷戠痪顓炴媼濞兼劖绻涢懠顒€鏋庢い顐㈢箳缁辨帒螣閼测晜鍤岄梻渚€鈧偛鑻晶顔肩暆閿濆牆鍔垫い锔界叀閹繝濡舵径瀣帾闂佸壊鍋呯换鍐磻椤忓懐绠剧€瑰壊鍠曠花濠氬箚閻斿吋鈷戦悗鍦У閵嗗啴鏌ら崘鑼煟鐎规洘绻堥弫鍐焵椤掑嫧鈧棃宕橀鍢壯囨煕閳╁喚娈橀柣鐔稿姍濮婃椽鎮℃惔鈩冩瘣闂佺粯鐗曢妶绋跨暦閻戞ḿ绡€闁搞儜鍐ㄧギ闂備線娼ф蹇曟閺囥垹鍌ㄦい蹇撶墛閳锋垿鏌熼懖鈺佷粶闁告梹顨婇弻锟犲川椤旈敮濮囩紓浣稿€圭敮鐔妓囩€靛摜纾奸弶鍫涘妼缁楁碍绻涢悡搴g闁糕斁鍓濋幏鍛存煥鐎e灚缍楅梻鍌氬€峰ù鍥ь浖閵娾晜鍊块柨鏇炲€哥粻鏌ユ煕閵夘喖澧柡瀣╃窔閺岀喖宕滆鐢盯鏌¢崨顔藉€愰柡灞诲姂閹倝宕掑☉姗嗕紦闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾剧懓顪冪€n亜顒㈡い鎰Г閹便劌顫滈崱妤€骞婄紓鍌氬€瑰銊╁箟缁嬫鍚嬮柛顐線缂冩洟姊婚崒娆戭槮婵犫偓闁秵鎯為幖娣妼缁愭鏌″搴′簽濞戞挸绉甸妵鍕冀椤愵澀娌梺缁樻尪閸庣敻寮婚敐澶婂嵆闁绘劖绁撮崑鎾诲捶椤撴稑浜炬慨妯煎亾鐎氾拷  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌i幋锝呅撻柛銈呭閺屻倝宕妷锔芥瘎婵炲濮靛銊ф閹捐纾兼繛鍡樺笒閸橈紕绱撴笟鍥ф珮闁搞劌鐖兼俊鎾礃椤旂厧绐涢梺鍝勵槹閸ㄥ綊宕㈠ú顏呭€垫鐐茬仢閸旀碍銇勯敂璇茬仸鐎规洩绻濋獮搴ㄦ嚍閵壯冨妇闂傚⿴鍋勫ú锕€煤閺嶃劎澧¢梻鍌欐祰椤曆呪偓鍨浮瀹曟粓鎮㈡總澶嬬稁闂佹儳绻愬﹢杈╁閸忛棿绻嗘い鏍ㄧ閹牊銇勯銏⑿㈡い顏勫暣婵″爼宕卞Δ鈧~搴ㄦ⒑閸涘⿴鐒奸柛銉戝懎寮ㄥ┑鐘灱濞夋稖鐧岄梺缁樻煥閸氬鎮¢妷鈺傚€甸柨婵嗛閸樻挳鏌涚€n偅灏扮紒缁樼箓椤繈顢樺☉娆忣伖闂佽崵鍠愮划搴㈡櫠濡ゅ啯鏆滈柟鐑樻尵椤╂彃霉閻撳海鎽犻柣鎾存礋閺岀喖骞嗚閸ょ喖鏌嶉挊澶樻█闁哄苯绉剁槐鎺懳熼懡銈呭汲婵$偑鍊ら崑鍛崲閸儱绠犳繝濠傛噹閺嬪牊淇婇婵愬殭妞ゅ繐缍婂濠氬磼濞嗘埈妲梺纭咁嚋缁辨洜鍒掑▎鎾崇闁挎柨鎼禍濂告⒑閸濆嫷妲归柛銊у枛瀵悂寮崼鐔哄幐闂佸憡鍔х徊鑺ョ閸撗呯=濞达綀娅g敮娑氱磼鐎n偅灏扮紒鍌涘浮閺佸啴宕掑鎲嬬床婵犳鍠楅敃鈺呭礈閿曞倹鍊甸柟鎯板Г閳锋帒霉閿濆懏鎲搁柨娑樼Ф缁辨帡顢氶崨顓犱桓濡ょ姷鍋為崹鍨暦閸洦鏁嗛柛灞炬皑閵堬箓姊虹拠鎻掑毐缂傚秴妫欑粋宥夊冀椤撶偟鍝楁繛瀵稿Т椤戝棝鎮″▎鎾粹拺妞ゆ挶鍔庨悾鍗烆熆瑜滈崹閬嶅Φ閸曨垰妫橀柛顭戝枓閸嬫挾鎲撮崟顓涙敵婵犵數濮村ú锕傚磹闁垮浜滈煫鍥ㄦ尭椤忋倝鏌涚€n偅宕岀€殿喖鈧噥妾ㄥ┑鐐插悑閻楁洟鍩為幋锔藉亹閻庡湱濮撮ˉ婵嬫⒑缁嬭儻顫﹂柛鏂块叄楠炲顫㈠畝鈧悿鈧┑鐐村灦宀e潡鎮块崨瀛樷拺闁革富鍙€濡炬悂鏌涢悩鎰佹疁鐎殿喗鐓¢獮鏍ㄦ媴閸︻厼寮抽梻浣虹帛濞叉牠宕愰崷顓涘亾濮樼偓瀚�
核心提示:基于 Eclipse 的 IBM® Rational® 测试产品的可扩展能力,特别是 Rational Performance Tester 和 Rational Functional Tester 可以使用 Java™ 编写定制代码,使用 Java 扩展 Rational Performa

基于 Eclipse 的 IBM® Rational® 测试产品的可扩展能力,特别是 Rational Performance Tester 和 Rational Functional Tester 可以使用 Java™ 编写定制代码,使之成为开发复杂和灵活测试程序的明智选择。

Rational Functional Tester 在用于基于 Web 或者 Java 的应用程序时,是一种更加面向 Java 的测试工具,测试脚本会直接以 Java 生成,并提供对客户端程序内部 Java 对象的直接访问。Rational Functional Tester 为更便捷的扩展性提供了一个内构的模型,使用 SuperHelper 类来扩展 Helper。扩展 Rational Functional Tester 的各种范例,可以在 developerWorks® Rational® 专区中找到。

由于性能测试方面存在的差异,相似的内构类扩展功能并不存在于 Rational Performance Tester 中,与功能性测试和执行相反。例如,客户对象映射并不是性能测试模型的关键构件。另外,性能测试被设计成生成尽可能少的负荷,所以并不会产生冗繁的结果。

本文讨论了两个潜在的区域,该区域为 Rational Performance Tester 提供了强大的扩展点:通过一个超类来进行对象扩展,以及通过静态的方法来使用可再用设施。本文中的范例为性能测试之间持续性的变量,使用了一种不用编码的执行方法,非程序员可以很轻松地重复利用这些变量,非程序员可能会记录测试或者运行测试场景。

本文中的范例使用基于 Windows® 平台的 Rational Performance Tester,并采用默认设置。这里所讨论的功能在不同的平台之间不应该有所差异。本文中并没有涉及 Rational Functional Tester 的定制代码问题。

定制代码环境

假设您阅读了本文,并且熟悉 Rational Performance Tester 机制,以添加定制代码,并查找潜在的改善机会。其他的关于向测试添加定制代码的信息(许多其他的 Rational Performance Tester 相关话题)可以在 IBM Redbooks® 发布的“使用 Rational Performance Tester V7”一文中找到,您可以从 IBM Redbooks 站点中找到。本书中的许多内容同样适用于 RPT V8 版本。

通用的代码执行

在继续深入定制之前,让我们快速地查看一下 Java 代码执行的问题。Rational Performance Tester 按默认的定制代码构件来使用项目中的 src 文件夹,它位于一个名为 test 的包中。这个包中也是从 其他 Rational Performance Tester 构件动态生成 Java 的位置,例如测试和日程安排。

本文中的范例以一种更加结构化的格式来处理代码,以将通用的代码与动态生成的代码隔离开来。基本的 src 文件夹,是一个标准的 Java 项目命名规则,仍然作为根来使用。

为了与更加普通的业界标准保持一致,在这个执行中定义的包可以概括到表 1 中。

表 1. 本文中的 RPT 包

包的名字描述
com.ibm.rpt.template包含模板文件的包
com.ibm.rpt.util包含灵活可再用 Java 类的包
com.yourco.example.var与本文中描述的范例相关的范例包

为该执行的安装或者扩展使用一个相类似的命名规则。例如:

yourSuffix.yourCompanyName.applicationName.var

位于:

yourSuffix 就是公司标示符的后缀;例如,来自 ibm.com 的 com。yourCompanyName 就是您所在公司的名称。

applicationName 就是与变量相关程序的名字,在这些例子中就是 sample。

var 是一个常量,它指示了与变量相关的包。

提取范例

本文中含有一个包含代码、模板以及范例目录结构的 ZIP (rpt_ext.zip)文件,以及范例的目录结构。将 ZIP 文件复制到项目工作区内的src文件夹中并提取出内容。您会看到一个与如图 1 中所示相似的结构。

图 1. 范例的目录结构
使用 Java 扩展 Rational Performance Tester

因为您已经步入了 Java 编程的王国,切换至 Java 透视图并使用 Package Explorer 视图来查看布局。您会看到接下来的模板以及设施程序,以及一个名为 com.yourco.example.var 的空包。正如前面描述的那样,test 包是所有 Rational Performance Tester 生成的 Java 文件的默认位置。

图 2. Java 透视图 Package Explorer 视图
使用 Java 扩展 Rational Performance Tester

testsA 测试中的变量持续性通常包含了动态生成的值,尽管数据源中或者其他形式数据外部化没有包含合适的后续对象,它们仍然需要保留到最后的测试阶段。

Rational Performance Tester 使用 IDataArea 类来保留这些值,它可以得到实例化,并在虚拟的用户层次上进行访问,确保数据没有错误。

向测试插入定制代码的问题就是 Arguments 区域,只允许通过的值,而且没有提供名字关系。

为了解决这个问题,为您需要保存的每一个变量创建一个单独的类,给类命的名要参考在随后的测试中您需要应用的变量名。然后定义变量的脚本就可以访问一个普通的 Java 类(在本文中,是 VariablePersister.java),以执行持续性函数。

这种设计的一种好处,在于如果变量必须更改的话,那么每一个变量都可以得到扩展,这就使得变量得到显著的增加或者降低。

VariablePersister 执行

变量持续性最有可能的候选对象,是一个简单的字符串值。这个部分描述了怎样长久化一个带有提供模板的字符串值。不需要代码更改。

您并不需要成为一个 Java 程序员,以使用这里提供的 VariablePersister 执行,但是如果您熟悉定制代码的话,理解起来会更加的方便。

为了演示一个简单的 VariablePersister 用法,会记录一个随机生成的词(来自 http:// www.merriam-webster.com/ 的现代词)并保存。然后词语会翻译为其他的语言(通过 http://babelfish.yahoo.com/ 的 Yahoo! Babel Fish 进行翻译)。

创建一个 VariablePersister 字符串类

确定您处于 Java 透视图下,Package Explorer 视图中。

从com.ibm.rpt.template 包中复制 PersistentVariableStringTemplate.java 文件,并将其粘贴到分配给包含值的包中(在本例中,就是 com.yourco.example.var 包)。

将文件重命名以匹配您想要长久使用的变量的名字。为了做到这一点,您可以右击文件并点击 Refactor > Rename,如图 3 所示。

图 3. 重命名 PersistentVariableStringTemplate.java
使用 Java 扩展 Rational Performance Tester

查看原图(大图)

将拷贝版本的 Java 模板的名字更改为 SAMPLE_VAR1。

图 4. 重命名文件界面
使用 Java 扩展 Rational Performance Tester

保持其他默认的值不变,然后点击 Finish。

切换回 Test 视角。

获取作为应用的变量

Rational Performance Tester 将会验证用作变量的一些潜在值,但是在其他的一些实例中,您需要自己定义它们。在记录该场景的页面中显示在图 5 中。

图 5. 今天的 Merriam-Webster 词
使用 Java 扩展 Rational Performance Tester

为了将特定的值定义为一个引用,您可以执行下面的步骤:

打开来自您刚刚记录的页面中的回应:

图 6. WordOfTheDay 响应
使用 Java 扩展 Rational Performance Tester

Content 部分如清单 1 所示。

清单 1. WordOfTheDay 内容

[-- Content data is 27,493 characters long. 
Press Ctrl+Shift+Space or Ctrl+Left Click here to display it. --]

显示内容(如上所述),并搜索今天的词。在这里 HTML 定义的条件下,定位合适的实例(<span class="headword">debonair</span>)。引用必须足够独特以为未来的测试做好准备。

右击定位的文本并选择 Create Reference。

在左边的窗格中,点击 Test Data Sources 项。选择 References,并清除 Matching Only。您应该看到新定义的引用值(见于图 7)。

图 7. WordOfTheDay 数据源
使用 Java 扩展 Rational Performance Tester

为了对 SAMPLE_VAR1 设置值,您在前面复制的 Java 模板,执行以下的步骤:

在记录测试的 Test Contents 区域中,在主 URL 回应条目的下面,点击 Insert 并选择 Custom Code。

图 8. 插入 WordOfTheDay 定制代码
使用 Java 扩展 Rational Performance Tester

在 Class Name 区域的右边,输入 com.yourco.example.var.SAMPLE_VAR1。

点击 View Code 以确认您的进入。

点击 Arguments 框旁边的 Add,切换至 URl 入口,并点击您刚刚创建的引用值。

图 9. 选择 WordOfTheDay Arguments
使用 Java 扩展 Rational Performance Tester

SAMPLE_VAR1 现在已经设置为动态的值,如引用中定义的那样。

图 10. WordOfTheDay Test Element 细节内容
使用 Java 扩展 Rational Performance Tester

查看原图(大图)

通过向 Arguments 区域添加额外的值,您就可以执行相同的程序以创建一个 String[] 数组。在接下来的章节中将会处理这一点。

引用持续性的变量

为了引用来自原始的请求中获取的值,您可以切换至 URL 定义,会向这个定义发送一条请求,并检查 Data 区域以得到合适的值,如图 11 所示。

图 11. 持续性的变量值
使用 Java 扩展 Rational Performance Tester

查看原图(大图)

当测试得到记录之后,词 sample 用于获取请求数据。在 Data 区域内选择整个词 sample,右击并选择 Substitute from>Custom Code : com.yourco.example.var.SAMPLE_VAR1。

未来运行的测试将会使用新发现的值来替换值 sample。

具体的变量持续值

本部分涉及到了简单 Variable Persister 的免代码执行,让我们查看一下这个函数的机制。

注意:
接下来的部分假设您对 Java 编程语言已经很熟悉了。

接下来的表格列出了包含在三个 Template 类中的 Javadoc 注释:

这里是对来自 Javadoc 代码范例的描述:

通过虚拟用户的 IDataArea 持续 RPT 变量的使用。两个 Constructors 允许简单字符串值或者任意种类 Objects 的持续。可以在 com.ibm.rpt.template 包中找到模板。

表 2. 持续性的变量模板描述

模板文件名 描述
PersistentVariableStringTemplate简单的字符串变量。
PersistentVariableSequentialTemplate设置类 String[](数组)的持续性变量,按照它们输入数组的顺序来一次性返回值。数组会不断循环直到测试完成为止。
PersistentVariableRandomTemplate设置类型 String[](数组)的持续性变量,随机地返回值。

每一个类都使用包 com.ibm.rpt.util 中的 VariablePersister 类。VariablePersister 类执行实际的设置并使用 IDataArea 类的 put(String,Object) 和 get(String) 方法来得到定义变量的函数。

首先我们将会查看一下简单的类 PersistentVariableStringTemplate,以描述基本的工作。在 超类执行部分中将会讨论 Sequential 和 Random 模板。

PersistentVariableStringTemplate 类工作的一个假设是做出了单个字符串对单个字符串的联系。在清单 2 中显示了模板的简化视图。

清单 2. 模板代码范例

public class PersistentVariableStringTemplate implements ICustomCode2 { 
 // Set the name of the variable key, based on this class name 
 private final String variableKey = this.getClass().getSimpleName(); 
 
 public PersistentVariableStringTemplate() { 
 } 
 
 /** 
 * The exec(ITestExecutionServices, String[]) Method is the standard 
 * format for calling Java extension classes from RPT. 
 */ 
 public String exec(ITestExecutionServices testExecutionServices, String[] args) { 
 // Set the initial persisted variable value to null 
 String variableValue = null; 
 // Reset the variable variable value if an input value is provided 
 if (args.length == 1) { 
 variableValue = args[0]; 
 } 
 return new VariablePersister(testExecutionServices, 
 variableKey, variableValue).getVariableValue(); 
 } 
} 

正如上面注释中提到的那样,定制代码类的标准运行机制是 exec(ITestExecutionServices,String[]) 方法。在访问定制代码时,会通过这些自动生成的值,ITestExecutionServices 对象会提供关于测试环境的信息,而定制代码定义中 String[] 数组就是 Arguments 部分中所列的值。

实际的 VariablePersister 代码将会由模板文件重新分配为 VariablePersister.java,它会得到简单的处理。

程序中代码的关键两行是:

字符串变量 variableKey 的最终定义,会定义关键值的名字,以匹配新分配文件的名字(见于 VariablePersister Implementation),它用作变量的引用。

这个简单的模板假设了单个的值。代码中执行了确认操作,以确保提供了唯一的论题,它用作变量值;否则就会返回当前设置的值。该代码不同于 PersistentVariable Random 和 Sequential Templates,在稍后将会对其作出处理。

对新的 VariablePersister 对象的访问,会执行剩余的工作,返回与来自 PersistentVariableStringTemplate 文件创建的文件相关的变量的字符串值。

VariablePersister 类被设计成为单个字符串值的实例 :

new VariablePersister(ITestExecutionServices,String,String);

其中的参数是:

testExecutionServices,用于获取 IDataArea 的 ITestExecutionServices。

aVariableKey,应用持续性变量关键的名字。

aVariableValue,持续性变量的字符串值。

或者对于一个对象值:

new VariablePersister(ITestExecutionServices,String,Object);

其中的参数是:

testExecutionServices,用于获取 IDataArea 的 ITestExecutionServices。

aVariableKey,应用持续性变量关键的名字。

aVariableContent,持续性值的目标值。

两个版本的构造方法实际上都是相类似的,除了存储值的格式之外,如清单 3 所示。

清单 3. 持续性的代码

public VariablePersister(ITestExecutionServices testExecutionServices, 
 String aVariableKey, String aVariableValue) { 
 // Set variable key/value from input 
 variableKey = aVariableKey; 
 // Capture the Virtual User's IDataArea Object from ITestExecutionServices 
 virtualUserDataArea = testExecutionServices.findDataArea(IDataArea.VIRTUALUSER); 
 
 // Set the persisted value if input is provided (aVariableValue) 
 if (aVariableValue != null) { 
 variableValue = aVariableValue; 
 virtualUserDataArea.put(variableKey, variableValue); 
 } else { 
 // Try to get current value... 
 try { 
 variableValue = (String)virtualUserDataArea.get(variableKey); 
 } catch (NullPointerException e) { 
 // No value? Obviously not defined... set to empty String 
 variableValue = EMPTY_STRING; 
 virtualUserDataArea.put(variableKey, variableValue); 
 } 
 } 
} 

为了避免 nullPointerExceptions,可使用的方法有:

getVariableValue – 对于字符串值

getVariableContent – 对于对象值

它们分别返回一个空的字符串值或者一个空的 String[] 数组。

因为这些值都维护在虚拟用户的 IDataArea 中,没有跨用户值污染的可能性存在。

超类执行

生成的定制代码使用一个超类模型,如清单 4 中标准生成的定制代码所示。

清单 4. 生成的 RPT 类

package test; 
 
import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices; 
 
public class GeneratedClass implements 
 com.ibm.rational.test.lt.kernel.custom.ICustomCode2 { 
 
 public GeneratedClass() { 
 } 
 /** 
 * For javadoc of ICustomCode2 and ITestExecutionServices interfaces, select 
 * 'Help Contents' in the Help menu and select 'Extending Rational 
 * Performance Tester functionality' -> 'Extending test execution with custom 
 * code' 
 */ 
 public String exec(ITestExecutionServices tes, String[] args) { 
 return null; 
 } 
} 

执行的默认超类是 com.ibm.rational.test.lt.kernel.custom.ICustomCode2。

提供的两个基于数组的模板,PersistentVariableRandomTemplate 和 PersistentVariableSequentialTemplate,都扩展了 com.ibm.rpt.util.SuperObject,而它反过来又扩展了 ICustomCode2,提供了一种内部的位置以运行普通的定制代码。

SuperObject 类的概念

SuperObject 类中的主要功能,与处理永久性数组变量相关:

序列数组由 ariablePersister 函数处理,创建一个与 VariablePersister 类相同名字的变量,该类创建自以 _POINTER 为后缀的模板。对 VariablePersister 类的每一次访问,反过来都会访问 SuperObject 类 getNextPointerValue 方法,通过 VariablePersister 类中保持数组中的值进行循环。

随机数组由对 SuperObject 中 getRandomValue(String[]) 方法的调用处理,通过使用静态方法容器类 NumericGenerator 中的静态方法 getRandomInt(int) 中的准随机数字生成器。

使用动态生成的数据或者随机数据,来澄清从测试中使用非相似数据以进行测试是否可以简化测试结果的讨论。本文并不没有涉及到这个讨论。

SuperObject 类(见于清单 5)以下面的内容开始:

执行 ICustomCode2 类;它的超类

创建一系列的值以支持函数

提供了一个 exec(ITestExecutionServices, String[]) 方法,以匹配它的超类

清单 5. SuperObject 代码

package com.ibm.rpt.util; 
 
import com.ibm.rational.test.lt.kernel.IDataArea; 
import com.ibm.rational.test.lt.kernel.custom.ICustomCode2; 
import com.ibm.rational.test.lt.kernel.services.ITestExecutionServices; 
 
public abstract class SuperObject implements ICustomCode2 { 
 // definitions for persisted variable array with pointer 
 public String variableKey; 
 public String[] variableValue = null; 
 public String pointerKey; 
 public Integer pointerValue = null; 
 
 // RPT Virtual User definition for ITestExecutionServices 
 public ITestExecutionServices virtualUserTestExecutionServices; 
 // RPT Virtual User definition for IDataArea 
 public IDataArea virtualUserDataArea; 
 
 // set Constant values 
 public static final String POINTER_SUFFIX = "_POINTER"; 
 
 // required method as part of implementation of ICustomCode2 
 public String exec(ITestExecutionServices arg0, String[] arg1) { 
 return null; 
 } 

大多数的后续方法为 VariablePersister 模板提供了功能。

清单 6. VariablePersister 模板

public public PersistentVariableRandomTemplate() { 
} 
 public String exec(ITestExecutionServices testExecutionServices, String[] args) { 
 // populate super class (com.ibm.rpt.util.SuperObject) values 
 virtualUserTestExecutionServices = testExecutionServices; 
 variableKey = this.getClass().getSimpleName(); 
 pointerKey = variableKey + POINTER_SUFFIX; 
 // Capture the Virtual User's IDataArea Object from ITestExecutionServices 
 virtualUserDataArea = virtualUserTestExecutionServices. 
 findDataArea(IDataArea.VIRTUALUSER); 

执行模板代码可以在超类的层次上传播与 ITestExecutionServices 和 IDataArea 对象相关的值。

SuperObject 类中还包含了一个范例日志,如清单 7 所示。

清单 7. 范例日志方法

/** 
 * <p>Write a message out to the test execution log.</p> 
 * @param message The String value to be written to the log. 
 */ 
 public void putMessage(String message) { 
 virtualUserTestExecutionServices.getTestLogManager().reportMessage(message); 
 } 

这种方法为对测试日志编写一条信息提供了一种快捷的方式,或者以 refactoring 的方式提供了一个值。这可能是一个非必要的方法,但是它确实演示了提供普通机制的能力。一个更加有用的执行方法可能是对一个外部的源追踪特定的事件来使用一个普通的日志,在中央的位置拥有代码,会提供简化的维护与编辑方式。

使用 SuperObject 类

接下来的范例首先执行了来自 XE.com Universal Currency Converter 的货币兑换。初始的记录将会将一加元的值转化为相应的美元值。为了演示 SuperObject 与 PersistentVariableSequentialTemplate 类,会创建一个数组以从网站获得顶端的货币。

首先,从 PersistentVariableSequentialTemplate 来创建 SAMPLE_VAR2,与对 SAMPLE_VAR1 所做的操作相类似。

在 URL 应用下插入通用的代码,并将类设置为 com.yourco.example.var.SAMPLE_VAR2。

图 12. 货币性能测试
使用 Java 扩展 Rational Performance Tester

为 SAMPLE_VAR2 定制代码进行 Add,以添加多个值创建一个数组。

图 13. 选择货币论题
使用 Java 扩展 Rational Performance Tester

在记录的测试中扩展对 XE.com Conversion 请求的入口,并选择 URL www.xe.com/ucc/convert.cgi。

图 14. 选择货币 URL
使用 Java 扩展 Rational Performance Tester

将记录(USD)中第二个货币类型值替换为来自 SAMPLE_VAR2 的定制代码。

图 15. 显示货币值
使用 Java 扩展 Rational Performance Tester

查看原图(大图)

SAMPLE_VAR2 中的定制代码,将会在测试运行期间通过定义的数组,在值的末端重新启动。

与之相类似,PersistentVariableRandomTemplate 可以用以执行一个随机访问的数组。

使用定制代码中的静态方法

静态方法的使用可能是一种糟糕的面向对象的编程操作。但是,在有些情况下这是达到目标最快的一种方式。

扩展前面的范例,更改转化的值,使用一个 com.ibm.rpt.util.NumericGenerator.java 文件中简单的、可再用的准随机的数字生成器。

在初始的 URL 访问之前添加新的定制代码,使用一个类名:com.yourco.example.var.SAMPLE_VAR3。点击 Generate Code。

图 16. 货币转化
使用 Java 扩展 Rational Performance Tester

更改 SAMPLE_VAR3 中的代码:

清单 9. 更改前的代码

public class SAMPLE_VAR3 extends 
 com.ibm.rational.test.lt.kernel.custom.ICustomCode2 { 
 /** 
 * Instances of this will be created using the no-arg constructor. 
 */ 
 public SAMPLE_VAR3() { 
 } 
 
 public String exec(ITestExecutionServices tes, String[] args) { 
 return null; 
 } 

变更为:

清单 10. 变更后的代码

public class SAMPLE_VAR3 extends 
 com.ibm.rpt.util.SuperObject { 
 /** 
 * Instances of this will be created using the no-arg constructor. 
 */ 
 public SAMPLE_VAR3() { 
 } 
 
 public String exec(ITestExecutionServices tes, String[] args) { 
 return NumericGenerator.getRandomCurrency("5000"); 
 } 
} 

NumericGenerator.getRandomCurrency(字符串)方法接受了一个数字的字符串代表,指示了生成的最高值,反过来提供了一个准随机的值,它基于一种货币($.¢¢)格式的 DecimalFormat。数字的随机性使用 java.util.Random 来搜索,反过来又使用来自 System.currentTimeMillis() 的值来寻找。

清单 11. 生成随机货币的代码

public static String getRandomCurrency(String high) { 
 refreshRandom(); 
 double randomDouble = 
 Math.round(random.nextDouble() * Double.parseDouble(high)); 
 return currencyDecimalFormat.format(randomDouble).toString(); 
} 
 
private static void refreshRandom() { 
 random.setSeed(System.currentTimeMillis()); 
} 

一个错误显示出来,指示 NumericGenerator cannot be resolved。右击错误指示器,并选择 Quick Fix > Import NumericGenerator(com.ibm.rpt.util)。

图 17. 错误的快速修复
使用 Java 扩展 Rational Performance Tester

查看原图(大图)

在 www.xe.com/ucc/convert.cgi 的请求数据中,强调显示位于 Amount= 之后的 1,并由定制代码 SAMPLE_VAR3 所取代。1 和 0 之间的准随机数字将向每一次测试运行而提供。

分析

本文中提供的范例是简单的,但是它们却显示了怎样通过使用 Java 操作来扩展测试功能。降低冗余的代码,因此减少了长期的代码维护费用,通常是一个优秀的目标。

Rational Performance Tester 产品中提供的简单定制代码模型,可以轻松地得到扩展,以使用 Java 超类和再使用的代码构件来创建一个良好的测试环境。

本文示例源代码或素材下载

Tags:使用 Java 扩展

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接