阿里云-性能測(cè)試服務(wù)用戶手冊(cè)-D_第1頁(yè)
阿里云-性能測(cè)試服務(wù)用戶手冊(cè)-D_第2頁(yè)
阿里云-性能測(cè)試服務(wù)用戶手冊(cè)-D_第3頁(yè)
阿里云-性能測(cè)試服務(wù)用戶手冊(cè)-D_第4頁(yè)
阿里云-性能測(cè)試服務(wù)用戶手冊(cè)-D_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、性能測(cè)試Lite用戶使用手冊(cè)性能測(cè)試/Lite用戶使用手冊(cè)性能測(cè)試/Lite用戶使用手冊(cè) PAGE 46 PAGE 46Lite用戶使用手冊(cè)產(chǎn)品概述概述性能測(cè)試(PerformanceTesting)-Lite是阿里性能測(cè)試服務(wù)面向全網(wǎng)用戶免費(fèi)開(kāi)放的性能云測(cè)試平臺(tái)。Lite平臺(tái)通過(guò)圖形化的腳本編寫(xiě)方式挑戰(zhàn)技術(shù)類Web產(chǎn)品的體驗(yàn)極限,基于HAR文件的腳本調(diào)試回放讓?xiě)?yīng)用協(xié) 議層的每個(gè)細(xì)節(jié)都清晰無(wú)比,更有HTTP錄制功能極大的提升腳本創(chuàng)作效率;對(duì)于技術(shù)極客我們提供基于訪問(wèn)Lite控制臺(tái)優(yōu)勢(shì)圖像化編寫(xiě)方式,待測(cè)事務(wù)更直觀-拖拽式的操作體驗(yàn),基于時(shí)間序列的HTTP壓測(cè)邏輯讓性能測(cè)試更簡(jiǎn)單一鍵完成調(diào)試腳本

2、-調(diào)試回放HAR快照文件,結(jié)合日志可以確保測(cè)試腳執(zhí)行正確的業(yè)務(wù)邏輯HTTP錄制-支持Chrome和Firefox使用插件對(duì)用戶操作進(jìn)行錄制,最大程度復(fù)現(xiàn)用戶的真實(shí)使用場(chǎng)景編碼模式,支持Python代碼-使用代碼實(shí)現(xiàn)更加豐富的壓測(cè)場(chǎng)景,比如TCP、UDP協(xié)議,豐富的API讓您變的無(wú)所不能云端壓測(cè)-分布式壓測(cè)引擎基于阿里云ECS技術(shù)實(shí)現(xiàn),跨地域多引擎,可以實(shí)現(xiàn)幾乎沒(méi)有上限的施壓能力一鍵監(jiān)控,迅速定位系統(tǒng)瓶頸OSS/圖片服務(wù)手冊(cè)O(shè)SS/圖片服務(wù)手冊(cè)-性能監(jiān)控工具,幫助您在性能測(cè)試的同時(shí)對(duì)自己的服務(wù)器進(jìn)行同步監(jiān)控訪問(wèn)Lite控制臺(tái)功能環(huán)境管理:提供壓測(cè)目標(biāo)和監(jiān)控集管理。測(cè)試管理:提供簡(jiǎn)單易用的性能測(cè)試

3、腳本模板模式和代碼模式、測(cè)試場(chǎng)景配置、測(cè)試執(zhí)行及執(zhí)行數(shù)據(jù) 實(shí)時(shí)展示。結(jié)果報(bào)表:提供完善的性能結(jié)果報(bào)表和強(qiáng)大的性能分析圖形展示。訪問(wèn)Lite控制臺(tái)訪問(wèn)Lite控制臺(tái)快速入門1Radar監(jiān)控工具到需要被監(jiān)控的服務(wù)器;2、創(chuàng)建測(cè)試(測(cè)試腳本和測(cè)試配置),執(zhí)行測(cè)試并實(shí)時(shí)監(jiān)控;3、測(cè)試結(jié)果概要及性能分析報(bào)表查看;訪問(wèn)Lite控制臺(tái)名詞解釋大數(shù)據(jù)處理服務(wù)MaxCompute/Java SDK大數(shù)據(jù)處理服務(wù)MaxCompute/Java SDKLite:阿里性能測(cè)試服務(wù)面向全網(wǎng)用戶免費(fèi)開(kāi)放的性能云測(cè)試平臺(tái)。壓測(cè)目標(biāo): Lite用戶被壓測(cè)系統(tǒng)入口地址。Radar:是Lite提供的一款系統(tǒng)性能監(jiān)控工具,用戶只需

4、要在服務(wù)器系統(tǒng)上安裝這個(gè)工具就可以對(duì)服務(wù) 器系統(tǒng)進(jìn)行細(xì)粒度的監(jiān)控。監(jiān)控集: 當(dāng)前用戶下安裝Radar監(jiān)控代理工具后可被Lite監(jiān)控的服務(wù)器的集合。思考時(shí)間:用于模擬與服務(wù)器的各種交互之間存在等待時(shí)間的行為,在模擬腳本中通常設(shè)置于兩個(gè)請(qǐng) 求步驟之間。步調(diào)時(shí)間:步調(diào)時(shí)間即腳本迭代運(yùn)行頻率控制時(shí)間,一旦設(shè)置,腳本每次運(yùn)行后根據(jù)所設(shè)步調(diào)時(shí)間及 腳本包含的壓測(cè)請(qǐng)求響應(yīng)時(shí)間綜合判斷是否需要停頓,如需停頓則在停頓時(shí)間到達(dá)后再啟動(dòng)下一次運(yùn) 行,注意區(qū)別于思考時(shí)間。測(cè)試元素:在測(cè)試模板模式腳本中構(gòu)成腳本的元素,目前包括了HTTP GET請(qǐng)求、POST請(qǐng)求、思考時(shí)間。施壓機(jī):運(yùn)行腳本并生成負(fù)載壓力的代理服務(wù)器線程

5、數(shù):在施壓機(jī)中每個(gè)線程獨(dú)立運(yùn)行腳本模擬虛擬用戶,每個(gè)線程代表一個(gè)虛擬用戶。 預(yù)熱時(shí)長(zhǎng):在設(shè)置的預(yù)定時(shí)間內(nèi)均勻的增加線程達(dá)到設(shè)置的預(yù)定線程數(shù)。事務(wù):事務(wù)是性能測(cè)試腳本的一個(gè)重要特性,要度量服務(wù)器的性能需要定義事務(wù);在Lite模板模式腳 本中,每個(gè)事務(wù)包含一個(gè)HTTP請(qǐng)求。測(cè)試場(chǎng)景:測(cè)試過(guò)程中為了模擬真實(shí)用戶的業(yè)務(wù)處理過(guò)程,在系統(tǒng)中構(gòu)建的基于事務(wù)、腳本、虛擬用 戶、運(yùn)行設(shè)置等一系列動(dòng)作的集合稱之為性能測(cè)試場(chǎng)景。Lite中測(cè)試場(chǎng)景包含了腳本、線程數(shù)、預(yù)熱 時(shí)長(zhǎng)、日志級(jí)別、步調(diào)時(shí)間、監(jiān)控集設(shè)置等。訪問(wèn)Lite控制臺(tái)性能測(cè)試常用指標(biāo)TPSTPS(Transaction Per Second)每秒系統(tǒng)能夠

6、處理的交易或事務(wù)的數(shù)量,它是衡量系統(tǒng)處理能力的重要指標(biāo)。訪問(wèn)Lite控制臺(tái)響應(yīng)時(shí)間響應(yīng)時(shí)間是指從客戶端發(fā)一個(gè)請(qǐng)求開(kāi)始,到客戶端接收到服務(wù)端返回的響應(yīng)所經(jīng)歷的時(shí)間,響應(yīng)時(shí)間由請(qǐng)求發(fā) 送時(shí)間、網(wǎng)絡(luò)傳輸時(shí)間和服務(wù)器處理時(shí)間三部分組成。在性能測(cè)試結(jié)果分析中,性能場(chǎng)景中事務(wù)的響應(yīng)時(shí)間可以通過(guò)監(jiān)控得到,事務(wù)響應(yīng)時(shí)間分為事務(wù)最小響應(yīng)時(shí)間、事務(wù)平均響應(yīng)時(shí)間、事務(wù)最大響應(yīng)時(shí)間。訪問(wèn)Lite控制臺(tái)并發(fā)用戶數(shù)模擬真實(shí)業(yè)務(wù)邏輯步驟的虛擬用戶,虛擬用戶模擬的操作步驟都被記錄在虛擬用戶腳本里,腳本用于描述用戶 在場(chǎng)景中執(zhí)行的操作。訪問(wèn)Lite控制臺(tái)錯(cuò)誤率執(zhí)行失敗的事務(wù)數(shù)占總執(zhí)行事務(wù)數(shù)的比率。訪問(wèn)Lite控制臺(tái)請(qǐng)求狀態(tài)請(qǐng)求

7、狀態(tài)反映了HTTP壓測(cè)結(jié)果的HTTP狀態(tài)碼,狀態(tài)碼含義如下:成功200:服務(wù)器已成功處理了請(qǐng)求并提供了請(qǐng)求的網(wǎng)頁(yè)。成功204:服務(wù)器成功處理了請(qǐng)求,但沒(méi)有返回任何內(nèi)容。重定向3xx:需要客戶端采取進(jìn)一步的操作才能完成請(qǐng)求。客戶端錯(cuò)誤4xx:表示請(qǐng)求可能出錯(cuò),妨礙了服務(wù)器的處理。服務(wù)器錯(cuò)誤5xx:表示服務(wù)器在處理請(qǐng)求時(shí)發(fā)生內(nèi)部錯(cuò)誤,這些錯(cuò)誤可能是服務(wù)器本身的錯(cuò)誤而不是 請(qǐng)求出錯(cuò)。訪問(wèn)Lite控制臺(tái)CPUCPU資源占用率,CPU資源是判斷系統(tǒng)處理能力及 應(yīng)用運(yùn)行是否穩(wěn)定的重要參數(shù)。訪問(wèn)Lite控制臺(tái)Load系統(tǒng)平均負(fù)載指在特定時(shí)間間隔內(nèi)運(yùn)行隊(duì)列中的平均進(jìn)程數(shù)。如果一個(gè)進(jìn)程滿足以下條件就會(huì)位于運(yùn)行隊(duì)

8、列中:它沒(méi)有在等待I/O操作的結(jié)果。它沒(méi)有主動(dòng)進(jìn)入等待狀態(tài),也就是沒(méi)有調(diào)用wait。沒(méi)有被停止,例如等待終止。訪問(wèn)Lite控制臺(tái)操作指南概述使用流程訪問(wèn)Lite控制臺(tái)環(huán)境管理訪問(wèn)Lite控制臺(tái)添加和驗(yàn)證壓測(cè)目標(biāo)在創(chuàng)建和執(zhí)行測(cè)試前,必須先添加和驗(yàn)證壓測(cè)目標(biāo):1.點(diǎn)擊添加壓測(cè)目標(biāo),輸入被壓測(cè)系統(tǒng)入口域名或IP,完成后進(jìn)入下一步;備注:如果不是使用默認(rèn)端口(HTTP:80,HTTPS:443),請(qǐng)手工指定(如::8080),輸入內(nèi)容只需提供host:port,http:/https:/URL路徑。htdocs、Tomcat缺省根目錄:tomcat安裝目錄webappsROOT、Nginx缺省根目錄:

9、nginx安裝目錄html);3.驗(yàn)證目標(biāo)彈窗會(huì)提示用瀏覽器訪問(wèn)指定URL來(lái)確認(rèn)是否上傳成功,如果URL能訪問(wèn)成功,說(shuō)明已經(jīng)上傳成功;4.點(diǎn)擊開(kāi)始驗(yàn)證,驗(yàn)證成功后壓測(cè)目標(biāo)列表會(huì)顯示被添加的壓測(cè)目標(biāo)已驗(yàn)證。訪問(wèn)Lite控制臺(tái)訪問(wèn)Lite控制臺(tái)添加監(jiān)控服務(wù)器Windows和Linux版本。Radar下載地址:radar-for-linux.zipradar-for-Windows.zip備注:監(jiān)控工具運(yùn)行基于Java環(huán)境,安裝監(jiān)控工具前必須安裝Java并已設(shè)置JAVA_HOME目錄Windows安裝Java教程: HYPERLINK /read/252566.html /read/252566.h

10、tml Linux 安 裝 Java 教 程 : HYPERLINK /read/252573.html /read/252573.html性能測(cè)試/Lite實(shí)踐指南性能測(cè)試/Lite實(shí)踐指南2.解壓Radar工具下載包(Linux用戶執(zhí)行unzipradar-for-linux.zip命令進(jìn)行解壓);3.配置perties文件,修改signature字段等于Lite用戶設(shè)置中的用戶標(biāo)識(shí);4. 啟 動(dòng) Radar; start.bat文件Linux版:進(jìn)入監(jiān)控工具目錄,運(yùn)行chmod +x radar.sh賦予執(zhí)行權(quán)限和./radar.sh start啟動(dòng)Radar(可通過(guò)agent.log日

11、志,查看監(jiān)控工具啟動(dòng)運(yùn)行信息)5.刷新監(jiān)控集,可查看安裝監(jiān)控工具并成功啟動(dòng)后的監(jiān)控服務(wù)器狀態(tài)信息;訪問(wèn)Lite控制臺(tái)新建測(cè)試訪問(wèn)Lite控制臺(tái)新建測(cè)試添加壓測(cè)目標(biāo)并驗(yàn)證成功后即可新建測(cè)試,通過(guò)兩種方式創(chuàng)建測(cè)試:1.進(jìn)入控制臺(tái)首頁(yè),點(diǎn)擊創(chuàng)建測(cè)試按鈕,進(jìn)入測(cè)試編輯頁(yè)面;阿里云大數(shù)據(jù)平臺(tái)/機(jī)器翻譯阿里云大數(shù)據(jù)平臺(tái)/機(jī)器翻譯2.選中導(dǎo)航菜單欄新建下拉框,點(diǎn)擊測(cè)試,進(jìn)入測(cè)試編輯頁(yè)面;訪問(wèn)Lite控制臺(tái)腳本開(kāi)發(fā)訪問(wèn)Lite控制臺(tái)創(chuàng)建事務(wù)(添加HTTP請(qǐng)求)在Lite測(cè)試編輯頁(yè)面中,拖拽測(cè)試元素庫(kù)Get請(qǐng)求或Post請(qǐng)求元素到五線譜中進(jìn)行編輯,輸入事務(wù)名、請(qǐng)求、檢查點(diǎn)內(nèi)容信息完成事務(wù)創(chuàng)建(多個(gè)測(cè)試元素執(zhí)行順

12、序?yàn)閺淖蟮接?,從上?下):1.創(chuàng)建Get請(qǐng)求事務(wù)2.創(chuàng)建Post請(qǐng)求事務(wù)3.添加請(qǐng)求Header屬性大數(shù)據(jù)處理服務(wù)MaxCompute/Python SDK大數(shù)據(jù)處理服務(wù)MaxCompute/Python SDK4.添加請(qǐng)求Cookie屬性5.添加請(qǐng)求Body屬性6.添加請(qǐng)求檢查點(diǎn)訪問(wèn)Lite控制臺(tái)添加思考時(shí)間為模擬與服務(wù)器的各種交互之間存在等待時(shí)間的行為,可拖拽測(cè)試元素庫(kù)中思考時(shí)間元素到五線譜任意兩個(gè)請(qǐng) 求元素之間進(jìn)行編輯,輸入思考時(shí)間值(單位為毫秒):訪問(wèn)Lite控制臺(tái)域名綁定如待測(cè)系統(tǒng)通過(guò)域名進(jìn)行訪問(wèn),可在此進(jìn)行域名綁定,一個(gè)IP地址可綁定多個(gè)域名訪問(wèn)Lite控制臺(tái)編碼格式設(shè)置設(shè)置HT

13、TP請(qǐng)求與服務(wù)器數(shù)據(jù)交互編碼格式,Lite支持UTF-8和GBK編碼格式(默認(rèn)為UTF-8),可根據(jù)被測(cè)服 務(wù)器設(shè)定的編碼格式進(jìn)行選擇。訪問(wèn)Lite控制臺(tái)日志級(jí)別設(shè)置、ERROR三個(gè)級(jí)別,用戶可通過(guò)日志級(jí)別選擇按鈕選擇相應(yīng)的腳本運(yùn)行日志級(jí) 別:阿里云大數(shù)據(jù)平臺(tái)/智能語(yǔ)音交互阿里云大數(shù)據(jù)平臺(tái)/智能語(yǔ)音交互訪問(wèn)Lite控制臺(tái)代碼模式編碼模式,基于Python代碼,使用代碼實(shí)現(xiàn)更加豐富的壓測(cè)場(chǎng)景,比如TCP、UDP協(xié)議,豐富的API讓您變的 無(wú)所不能。代碼模式手工編輯腳本SDK: HYPERLINK /%23/pub/pts/script-sdk-guide/sdk /#/pub/pts/scrip

14、t-sdk-guide/sdk 訪問(wèn)Lite控制臺(tái)調(diào)試運(yùn)行通過(guò)點(diǎn)擊調(diào)試運(yùn)行按鈕回放腳本,生成回放請(qǐng)求快照及執(zhí)行日志信息,幫助用戶檢查腳本正確性:訪問(wèn)Lite控制臺(tái)訪問(wèn)Lite控制臺(tái)錄制測(cè)試腳本針對(duì)簡(jiǎn)單URL請(qǐng)求,很多用戶都可以直接按照模板來(lái)進(jìn)行編寫(xiě),相當(dāng)簡(jiǎn)單;但對(duì)于某些稍微復(fù)雜的業(yè)務(wù),例如 登陸、考試、訂購(gòu)、購(gòu)買、發(fā)帖、回帖、退出等業(yè)務(wù),由于捕獲請(qǐng)求內(nèi)容進(jìn)行模板編寫(xiě)或者手工編寫(xiě)腳本工作 量稍大,給用戶帶來(lái)不便,在此背景下,性能測(cè)試項(xiàng)目組開(kāi)發(fā)了基于Firefox(支持37及以下版本)和Chrome瀏覽器插件錄制工具。 通過(guò)使用此工具,用戶在被測(cè)系統(tǒng)中進(jìn)行手工操作業(yè)務(wù),錄制工具會(huì)將用戶的操作行為進(jìn)

15、行錄制,錄制完成以后,自動(dòng)生成腳本,根據(jù)業(yè)務(wù)規(guī)則可能稍微修改一下腳本,就可以運(yùn)行腳本了,錄制下來(lái)的腳本模擬了用戶真實(shí)的操作行為,極大地方便用戶的使用。Lite用戶只需要把錄制生成的腳本代碼拷貝到Lite代碼模式的代碼框中,即可運(yùn)行。性能測(cè)試錄制工具下載: 錄制工具Firefox插件錄制工具Chrome插件性能測(cè)試錄制工具使用指南請(qǐng)參考: HYPERLINK /%23/pub/pts/record-tool-guide/record-tool- /#/pub/pts/record-tool-guide/record-tool- guide訪問(wèn)Lite控制臺(tái)手工腳本編寫(xiě)訪問(wèn)Lite控制臺(tái)手工編寫(xiě)測(cè)

16、試腳本1.概述Lite代碼模式可以使用自定義代碼實(shí)現(xiàn)更加豐富的壓測(cè)行為,比如TCP、UDP協(xié)議,豐富的API讓您變的無(wú)所不能;Lite所使用的腳本語(yǔ)言為Jython,Jython是Python的Java語(yǔ)言實(shí)現(xiàn),它使用Python的語(yǔ)法和類庫(kù),運(yùn)行 在JVM中,和同一個(gè)JVM中的Java類可以實(shí)現(xiàn)無(wú)縫互操作。因此,使用Jython作為腳本語(yǔ)言可以最大程度的利 用Python的簡(jiǎn)潔、高效,同時(shí)保留對(duì)Java語(yǔ)言的全面兼容。Lite為了使腳本的創(chuàng)建更加高效,通過(guò)模板模式或錄制工具提供配置式和錄制式編寫(xiě)HTTP測(cè)試腳本的功能。用 戶在頁(yè)面上配置的HTTP腳本在執(zhí)行前會(huì)被自動(dòng)轉(zhuǎn)換成Jython腳本,用

17、戶可以通過(guò)預(yù)覽或者手工編輯查看自動(dòng)轉(zhuǎn) 換后的腳本代碼內(nèi)容。通過(guò)模板模式和錄制工具來(lái)編寫(xiě)HTTP腳本非常方便,但是如果遇到一些比較復(fù)雜的業(yè)務(wù) 場(chǎng)景,比如定制化的用戶登錄,可配置的執(zhí)行流程或者需要對(duì)請(qǐng)求進(jìn)行動(dòng)態(tài)關(guān)聯(lián)等等,就需要用戶通過(guò)手工編 寫(xiě)腳本的方式來(lái)實(shí)現(xiàn)測(cè)試邏輯。本文圍繞在Lite中使用手工編寫(xiě)方式這個(gè)主題,重點(diǎn)介紹性能測(cè)試腳本所用到的一些Jython語(yǔ)言基礎(chǔ)、測(cè)試腳 本框架、常用類和函數(shù),最后介紹一些常用的腳本功能范例。用戶通過(guò)閱讀該指南能夠在Lite中手工編寫(xiě)較為 復(fù)雜的性能測(cè)試腳本。2.Jython語(yǔ)法基礎(chǔ)2.1語(yǔ)言基礎(chǔ)本章節(jié)重點(diǎn)介紹和編寫(xiě)性能測(cè)試腳本相關(guān)的Jython語(yǔ)言基礎(chǔ),內(nèi)容非

18、常有限。讀者如果需要更全面、深入地解Jython語(yǔ)言可以首先參考Python的Tutorial,語(yǔ)言Reference和Jython的用戶手冊(cè)。2.2Jython的詞法(delimiters)。這些token通過(guò)Jython的語(yǔ)言執(zhí)行器進(jìn)行詞法分析產(chǎn)生,而詞法分析器通過(guò)字符方式讀入Jython腳本文件,這時(shí)就涉及到文件編碼問(wèn)題。2.3文件編碼# -*- coding: utf-8 -*-7位ASCII編碼的字符就會(huì)發(fā)生 錯(cuò)誤。我們通過(guò)在腳本文件首行添加以下代碼來(lái)讓Jython分析器知道用那種編碼來(lái)讀入腳本文件:# -*- coding: utf-8 -*-以上指示表示該Jython腳本的編碼為

19、UTF-8,這樣我們就可以在腳本中使用中文這樣的Unicode字符。2.4代碼行中已(CRLF)作為換行而Mac中以CR作為換行,這些換行符在Jython中if 1900 year 2100 and 1 = month = 12 and 1 = day = 31 and 0 = hour 24 and 0 = minute 60 and 0 = second 60: # Looks like a valid date return 1都支持。if 1900 year 2100 and 1 = month = 12 and 1 = day = 31 and 0 = hour 24 and 0 =

20、 minute 60 and 0 = second 60: # Looks like a valid date return 1顯示連接用在一行語(yǔ)句太長(zhǎng),需要分多行顯示的情況,我們可以通過(guò),反斜杠來(lái)將多個(gè)行連接成一條語(yǔ)句:month_namesmonth_names=Januari,Februari,Maart,# These arethe April, Mei,Juni,# DutchnamesJuli, Augustus, September, # for the months Oktober, November, December # of the year2.4代碼塊代碼塊可以是一個(gè)類

21、,一個(gè)方法/函數(shù),或者是一個(gè)if/while的控制單元。多數(shù)程序語(yǔ)言會(huì)用專門的開(kāi)始結(jié)束標(biāo) 志來(lái)表示一個(gè)代碼塊,但是Jython/Python卻通過(guò)縮進(jìn)來(lái)表示一個(gè)代碼塊,這是初學(xué)Python的人最不適應(yīng)的地 方。縮進(jìn)可以使用空格或者Tab制表符,但是最后Jython在解析的時(shí)候會(huì)將Tab轉(zhuǎn)換成空格,而不通的機(jī)器Tab和空格的對(duì)應(yīng)關(guān)系可能不一樣,比如Windows通常使用4個(gè)空格表示一個(gè)Tab,而Unix可能用8個(gè)空格。所以非常重要的是我們?cè)诰庉嬈髦兄皇褂靡环N縮進(jìn)方式:要不都用空格,要不都用縮進(jìn)。我的通常做法是打開(kāi)自動(dòng)轉(zhuǎn)空格功能,在本地編輯就直接都用空格來(lái)縮進(jìn)Jython腳本。開(kāi)啟一個(gè)代碼塊需要用

22、:來(lái)提 示。def perm(l):# Compute the list of all permutations of l if len(l) = 1:def perm(l):# Compute the list of all permutations of l if len(l) = 1:return l r = for i inrange(len(l): s = l:i + li+1: p =perm(s)for x in p: r.append(li:i+1 + x)return r錯(cuò)誤的示范:p = perm(l:i + li+1:) # error: unexpected inden

23、t for x in p:p = perm(l:i + li+1:) # error: unexpected indent for x in p:r.append(li:i+1 + x)returnr# error: inconsistentdedent#error:firstlineindented# error: not indenteddef perm(l):for i in range(len(l): s = l:i + li+1:2.5標(biāo)識(shí)符)只能以下劃線或者字母開(kāi)頭,后面跟字母、數(shù)字或者下劃線,其他任何字 符都是非法的標(biāo)識(shí)符。標(biāo)識(shí)符區(qū)分大小寫(xiě)、類和方法。用戶可以定義一個(gè)類把數(shù)據(jù)和操

24、作封裝起來(lái)。比如下面這段代碼定義了一個(gè)TestRunner的類,這個(gè)類有4個(gè)方 法:init、call、action_20013805。Jython定義方法用到關(guān)鍵字def,一般雙劃線格式的方法都是語(yǔ)言內(nèi)置 的特殊方法,比如init方法是類的初始化方法,當(dāng)一個(gè)類被實(shí)例化的時(shí)候該方法會(huì)被用調(diào)用一次,來(lái)初始化類的 一些成員數(shù)據(jù);call方法用來(lái)實(shí)現(xiàn)一個(gè)類的callable接口,這個(gè)一般會(huì)在多線程調(diào)用時(shí)用到。class TestRunner:# TestRunner對(duì)象的初始化方法,每個(gè)線程在創(chuàng)建TestRunner后執(zhí)行一次該方法defclass TestRunner:# TestRunner對(duì)象

25、的初始化方法,每個(gè)線程在創(chuàng)建TestRunner后執(zhí)行一次該方法def init (self):self.threadContext = PTS.Context.getThreadContext()# 主體壓測(cè)方法,每個(gè)線程在測(cè)試生命周期內(nèi)會(huì)循環(huán)調(diào)用該方法def call (self):PTS.Data.delayReports = 1statusCode = self.action_20013805() PTS.Framework.setExtraData(statusCode)PTS.Data.report()PTS.Data.delayReports = 0def del (self):

26、 self.end = u結(jié)束def action_20013805(self): statusCode = 0L, 0L, 0L, 0Lheaders = result = HTTPRequest().GET(uhttp:/xx.xx.xx.xx:8080/examples/servlets/servlet/RequestInfoExample,headers) PTS.Framework.addHttpCode(result.getStatusCode(), statusCode)if(300 = result.getStatusCode():PTS.Data.forCurrentTest

27、.success = False return statusCode# 調(diào)用施壓引擎施壓。第一個(gè)參數(shù)是事務(wù)名,可以為中文;第二個(gè)參數(shù)是執(zhí)行事務(wù)方法的方法名;第三個(gè)統(tǒng)一寫(xiě)TestRunner PTS.Framework.instrumentMethod(urequestInfo, action_20013805, TestRunner)看上面這段代碼,我們還注意到Jython與Java或者C這些強(qiáng)類型語(yǔ)言的一些區(qū)別:變量的申明不需要指定類型,同樣方法或者函數(shù)的入?yún)⒑头祷刂狄膊恍枰贫愋?,這就是Jython/Python語(yǔ)言的另一大特性-弱類型,Jython執(zhí)行器只有在執(zhí)行的時(shí)候才回去判斷對(duì)象的

28、類型,如果有不匹配的操作會(huì)拋出異常。細(xì)心的讀者還會(huì)發(fā)現(xiàn)一個(gè)怪怪的self,其實(shí)self就類似Java語(yǔ)言中的this,通過(guò)self類中的方法/函數(shù)可以引用類 的成員變量,或者調(diào)用類的成員方法,如果不加self,則默認(rèn)使用全局空間的變量或方法,所謂全局變量/方法就是定義在類之外,腳本中頂格寫(xiě)的變量或者方法。定義類成員函數(shù)時(shí),必須把self作為第一個(gè)參數(shù)傳遞給所定 義的方法。2.6字符串比如:s = This is a BIG surprise!,這個(gè)是一個(gè)合法的字符串。字符串作為一種特殊的字符數(shù)組,支持下標(biāo)操作,比如s0=T,s0:5=This。字符串還有很多其它的操作比如連接、比較、分割,可以

29、參考: HYPERLINK /2/tutorial/introduction.html#strings /2/tutorial/introduction.html#strings2.7列表Jython中用來(lái)表示一個(gè)列表,列表是可變的,比如: a = apple, orange, peach數(shù)組下標(biāo)從0開(kāi)始,a0=apple;a1=orange。獲列表長(zhǎng)度用Jython內(nèi)置函數(shù):len,比如len(a)=3。 更多列表操作,請(qǐng)參考: HYPERLINK /2/tutorial/introduction.html#lists /2/tutorial/introduction.html#lists2

30、.8腳本的執(zhí)行引擎分析后,是按行執(zhí)行的。腳本中頂格的代碼行都是會(huì)被執(zhí) 行器執(zhí)行的,而類或者全局方法則會(huì)被定義,定義之后代碼中其他的地方可以使用這些類和方法。#! /usr/bin/env python# -*- coding: utf-8 -*-#! /usr/bin/env python# -*- coding: utf-8 -*-# PTS Script Version 1.0# Trunner auto-generated test script at Mon Jul 13 17:57:10 CST 20152.接下去回有一些import語(yǔ)句來(lái)導(dǎo)入腳本中所用的地其它類或者模塊: Jyth

31、on中的模塊(Module)類似Java中的Package,用來(lái)把一組功能耦合的類封裝在一起。由于Jython可以和Java會(huì)操作,所以這里的import語(yǔ)句也 可以直接導(dǎo)入Java的package或者類。比如:from java.lang import String from java.util import Random from java.util import Datefrom java.lang import String from java.util import Random from java.util import Date# PTS腳本SDK:框架API、常用HTTP請(qǐng)求/

32、響應(yīng)處理API from util import PTSfrom HTTPClient import NVPair from HTTPClient import Cookiefrom HTTPClient import HTTPRequest from HTTPClient import CookieModulefrom HTTPClient import ShutdownExceptionclass TestRunner:# TestRunner對(duì)象的初始化方法,每個(gè)線程在創(chuàng)建TestRunner后執(zhí)行一次該方法class TestRunner:# TestRunner對(duì)象的初始化方法,每個(gè)

33、線程在創(chuàng)建TestRunner后執(zhí)行一次該方法def init (self):# 主體壓測(cè)方法,每個(gè)線程在測(cè)試生命周期內(nèi)會(huì)循環(huán)調(diào)用該方法def call (self):def del (self):def action_20013805(self):4.也可以執(zhí)行一些語(yǔ)句:# 腳本初始化段,可以設(shè)置壓測(cè)引擎的常用HTTP屬性ttt PTS.HttpUtilities.setUrlEncoding(UTF-8) PTS.HttpUtilities.setFollowRedirects(True) PTS.HttpUtilities.setTimeout(120000)# 腳本初始化段,可以設(shè)置壓

34、測(cè)引擎的常用HTTP屬性ttt PTS.HttpUtilities.setUrlEncoding(UTF-8) PTS.HttpUtilities.setFollowRedirects(True) PTS.HttpUtilities.setTimeout(120000)# PTS.HttpUtilities.setKeepAlive(False)# PTS.HttpUtilities.setUseCookieModule(False)# PTS.HttpUtilities.setProxyServer(localhost, 8888)# PTS.Context.setParamDirector

35、y(/Users/fei/Work/trunner/data)3腳本框架Lite的代碼腳本是一個(gè)TestRunner類,這個(gè)類會(huì)被每一個(gè)并發(fā)線程初始化,類成員變量是線程安全的。測(cè)試進(jìn) 程首先加載腳本,并且執(zhí)行腳本中頂格的語(yǔ)句,同時(shí)定義了TestRunner這個(gè)測(cè)試類;然后每個(gè)線程會(huì)實(shí)例化一 個(gè)TestRunner類,調(diào)用類中的init方法一次,繼而循環(huán)調(diào)用TestRunner類的call方法;最后線程結(jié)束時(shí),會(huì)調(diào) 用類中的del方法。init和del方法都是可選的,只有call方法是必需的。所以一個(gè)Lite代碼腳本的總體框架如下:#! /usr/bin/env python# -*- codi

36、ng: utf-8 -*-#! /usr/bin/env python# -*- coding: utf-8 -*-# PTS Script Version 1.0# Trunner auto-generated test script at Mon Jul 13 17:57:10 CST 2015第二部分:Jython類庫(kù)、Java類庫(kù)和自定義類的導(dǎo)入from java.lang import String from java.util import Random from java.util import Datefrom java.lang import String from java

37、.util import Random from java.util import Date# PTS腳本SDK:框架API、常用HTTP請(qǐng)求/響應(yīng)處理API from util import PTSfrom HTTPClient import NVPair from HTTPClient import Cookiefrom HTTPClient import NVPair from HTTPClient import Cookiefrom HTTPClient import HTTPRequest from HTTPClient import CookieModulefrom HTTPCli

38、ent import ShutdownException# 支持socket測(cè)試, 如TCPUDP等協(xié)議# import socket# 設(shè)置系統(tǒng)編碼import sys# 腳本初始化段,可以設(shè)置壓測(cè)引擎的常用HTTP屬性ttt PTS.HttpUtilities.setUrlEncoding(UTF-8) PTS.HttpUtilities.setFollowRedirects(True) PTS.HttpUtilities.setTimeout(120000)# 腳本初始化段,可以設(shè)置壓測(cè)引擎的常用HTTP屬性ttt PTS.HttpUtilities.setUrlEncoding(UTF

39、-8) PTS.HttpUtilities.setFollowRedirects(True) PTS.HttpUtilities.setTimeout(120000)# PTS.HttpUtilities.setKeepAlive(False)# PTS.HttpUtilities.setUseCookieModule(False)# PTS.HttpUtilities.setProxyServer(localhost, 8888)# PTS.Context.setParamDirectory(/Users/fei/Work/trunner/data)第四部分:TestRunner測(cè)試類cla

40、ss TestRunner:class TestRunner:# TestRunner對(duì)象的初始化方法,每個(gè)線程在創(chuàng)建TestRunner后執(zhí)行一次該方法def init (self):self.threadContext = PTS.Context.getThreadContext()# 主體壓測(cè)方法,每個(gè)線程在測(cè)試生命周期內(nèi)會(huì)循環(huán)調(diào)用該方法def call (self):PTS.Data.delayReports = 1statusCode = self.action_20013805() PTS.Framework.setExtraData(statusCode)PTS.Data.rep

41、ort()PTS.Data.delayReports = 0def action_20013805(self): statusCode = 0L, 0L, 0L, 0Lheaders = result = HTTPRequest().GET(uhttp:/xx.xx.xx.xx:8080/examples/servlets/servlet/RequestInfoExample,headers) PTS.Framework.addHttpCode(result.getStatusCode(), statusCode)if(300 ;, ;) KDJAK # 返回KDJAKPTS.HttpUtil

42、ities.valueFromTextBetween(text, tb_token;, ;)方法:valuesFromTextBetween定義:def valuesFromTextBetween(text, left, right)功能和valueFromTextBetween類似,返回被left和right包圍的字符串列表。示例:PTS.HttpUtilities.valuesFromTextBetween(text, name=, )carname=VW/carname=BMW/carname=BENZ/ 比如上面這段xml代碼,調(diào)用下面這個(gè)方法會(huì)返回:VW,BMWBENZPTS.Htt

43、pUtilities.valuesFromTextBetween(text, name=, )方法:valueFromBodyBetween定義:def valueFromBodyBetween(left,right)獲取HTTP響應(yīng)中被left和right字符串包圍的中間字符串,如果有多個(gè)匹配則返回第一個(gè)。 示例:# 返回KDJAKPTS.HttpUtilities.valueFromBodyBetween(tb_token;, ;) KDJAK # 返回KDJAKPTS.HttpUtilities.valueFromBodyBetween(tb_token;, ;)方法:valuesFro

44、mBodyBetween定義:def valuesFromBodyBetween(left, right)功能和valueFromBodyBetween類似,返回被left和right包圍的字符串列表。示例:PTS.HttpUtilities.valuesFromBodyBetween(name=, )carname=VW/carname=BMW/carname=BENZ/ 比如上面這段xml代碼,調(diào)用下面這個(gè)方法會(huì)返回:VW,BMWBENZPTS.HttpUtilities.valuesFromBodyBetween(name=, )方法:setProxyServer定義:def setPr

45、oxyServer(ip, port)PTS.HttpUtilities.setProxyServer(localhost, 8888)設(shè)置底層HTTP引擎使用IP為ip,端口為port的代理進(jìn)行請(qǐng)求。示例:PTS.HttpUtilities.setProxyServer(localhost, 8888)方法:setUseCookieModule定義:def setUseCookieModule(flag)設(shè)置腳本中是否使用CookieModule來(lái)進(jìn)行cookie管理,默認(rèn)使用。如果用戶想在HTTP的header里自己設(shè)置Cookie,則需要通過(guò)調(diào)用這個(gè)方法來(lái)將CookieModule禁用。

46、PTS.HttpUtilities.setUseCookieModule(False)示例:PTS.HttpUtilities.setUseCookieModule(False)方法:checkResponse定義:def checkResponse(code, expectedText=None)對(duì)HTTP響應(yīng)進(jìn)行腳本,返回碼是否為code,響應(yīng)body里面是否包含expectedText。只有當(dāng)返回碼符合且expectedText存在時(shí)返回True。當(dāng)expectedText為None時(shí)(可以不傳入該參數(shù)),不進(jìn)行文本校驗(yàn)。# 當(dāng)響應(yīng)返回碼為200,且返回body包含test則返回True

47、 PTS.HttpUtilities.checkResponse(200, test)# 當(dāng)響應(yīng)返回碼為200,且返回body包含test則返回True PTS.HttpUtilities.checkResponse(200, test)方法:checkResponseByRegex定義:def checkResponseByRegex(code, expectedPattern=None)對(duì)HTTP響應(yīng)進(jìn)行腳本,返回碼是否為code,響應(yīng)body里面是否包含expectedPattern這樣的正則字符串。只 有當(dāng)返回碼符合且expectedPattern能夠匹配時(shí),返回True。當(dāng)expec

48、tedPattern為None時(shí)(可以不傳入該參 數(shù)),不進(jìn)行文本校驗(yàn)。# 當(dāng)響應(yīng)返回碼為200,且返回body包含IP地址則返回TruePTS.HttpUtilities.checkResponseByRegex(200, (0-9|1-90-9|10-92|20-40-9|250-5).)3(0-9|1-90- # 當(dāng)響應(yīng)返回碼為200,且返回body包含IP地址則返回TruePTS.HttpUtilities.checkResponseByRegex(200, (0-9|1-90-9|10-92|20-40-9|250-5).)3(0-9|1-90- 9|10-92|20-40-9|25

49、0-5)$)附錄一:HTTP示例腳本#! /usr/bin/env python#! /usr/bin/env python# -*- coding: utf-8 -*-# PTS Script Version 1.0# PTS腳本SDK:框架API、常用HTTP請(qǐng)求/響應(yīng)處理APIfrom util import PTSfrom HTTPClient import NVPair from HTTPClient import Cookiefrom HTTPClient import HTTPRequest from HTTPClient import CookieModule# 腳本初始化段,

50、可以設(shè)置壓測(cè)引擎的常用HTTP屬性#PTS.HttpUtilities.setKeepAlive(False)#PTS.HttpUtilities.setUrlEncoding(GBK)#PTS.HttpUtilities.setFollowRedirects(False)#PTS.HttpUtilities.setUseCookieModule(False)# 腳本執(zhí)行單元類,每個(gè)VU/壓測(cè)線程會(huì)創(chuàng)建一個(gè)TestRunner實(shí)例對(duì)象class TestRunner:# TestRunner對(duì)象的初始化方法,每個(gè)線程在創(chuàng)建TestRunner后執(zhí)行一次該方法def init (self):se

51、lf.threadContext = PTS.Context.getThreadContext()self.action1() self.action2()self.init_cookies = CookieModule.listAllCookies(self.threadContext)# 主體壓測(cè)方法,每個(gè)線程在測(cè)試生命周期內(nèi)會(huì)循環(huán)調(diào)用該方法def call (self):PTS.Data.delayReports = 1for c in self.init_cookies: CookieModule.addCookie(c, self.threadContext)statusCode =

52、 self.action3() PTS.Framework.setExtraData(statusCode)statusCode = self.action4() PTS.Framework.setExtraData(statusCode)PTS.Data.report() PTS.Data.delayReports = 0# TestRunner銷毀方法,每個(gè)線程循環(huán)執(zhí)行完成后執(zhí)行一次該方法def del (self):for c in self.init_cookies: CookieModule.addCookie(c, self.threadContext)self.action5()

53、 self.action6()# 定義請(qǐng)求函數(shù)def action1(self):headers = NVPair(Accept, */*), NVPair(Connection, Keep-Alive), NVPair(User-Agent, PTS-HTTP-CLIENT),result = HTTPRequest().GET(, None, headers)headers=NVPair(Accept,*/*),NVPair(Connection,Keep-Alive),NVPair(Content-Type,application/x- www-form-urlencoded),NVPa

54、ir(Host,),NVPair(User-Agent,PTS-HTTP-CLIENT),result = HYPERLINK /s%27 HTTPRequest().POST(/s, wd=test, headers)def action2(self):headers = NVPair(Accept, */*), NVPair(Connection, Keep-Alive), NVPair(User-Agent, PTS-HTTP-CLIENT),result = HYPERLINK /s?wd=test%27 HTTPRequest().GET(/s?wd=test, None, head

55、ers)headers=NVPair(Accept,*/*),NVPair(Connection,Keep-Alive),NVPair(Content-Type,application/x- www-form-urlencoded),NVPair(Host,),NVPair(User-Agent,PTS-HTTP-CLIENT),result = HYPERLINK /s%27 HTTPRequest().POST(/s, wd=test, headers)def action3(self):statusCode = 0L, 0L, 0L, 0Lheaders = NVPair(Accept,

56、 */*), NVPair(Connection, Keep-Alive), NVPair(User-Agent, PTS-HTTP-CLIENT),result = HYPERLINK /item.htm?spm=a217i_h.1303267.1998177633- HTTPRequest().GET(/item.htm?spm=a217i_h.1303267.1998177633-0.10.hx5m95&id=12817144777, None, headers) PTS.Framework.addHttpCode(result.getStatusCode(), statusCode)h

57、eaders=NVPair(Accept,*/*),NVPair(Connection,Keep-Alive),NVPair(Content-Type,application/x- www-form-urlencoded),NVPair(Host,),NVPair(User-Agent,PTS-HTTP-CLIENT),result= HYPERLINK /s%27 HTTPRequest().POST(/s,wd=test,headers) PTS.Framework.addHttpCode(result.getStatusCode(),statusCode)if(not PTS.HttpU

58、tilities.checkResponse(200):PTS.Data.forCurrentTest.success = Falsereturn statusCode def action4(self):statusCode = 0L, 0L, 0L, 0Lheaders = NVPair(Accept, */*), NVPair(Connection, Keep-Alive), NVPair(User-Agent, PTS-HTTP-CLIENT),result = HYPERLINK /item.htm?spm=a217i_h.1303267.1998177633- HTTPReques

59、t().GET(/item.htm?spm=a217i_h.1303267.1998177633-0.10.hx5m95&id=12817144777, None, headers) PTS.Framework.addHttpCode(result.getStatusCode(), statusCode)headers=NVPair(Accept,*/*),NVPair(Connection,Keep-Alive),NVPair(Content-Type,application/x- www-form-urlencoded),NVPair(Host,),NVPair(User-Agent,PT

60、S-HTTP-CLIENT),result= HYPERLINK /s?wd=test%27 HTTPRequest().GET(/s?wd=test,None,headers) PTS.Framework.addHttpCode(result.getStatusCode(),statusCode)if(not PTS.HttpUtilities.checkResponse(200):PTS.Data.forCurrentTest.success = Falsereturn statusCodedef action5(self):def action5(self):headers = NVPa

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論