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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

18、常有限。讀者如果需要更全面、深入地解Jython語言可以首先參考Python的Tutorial,語言Reference和Jython的用戶手冊。2.2Jython的詞法(delimiters)。這些token通過Jython的語言執(zhí)行器進行詞法分析產(chǎn)生,而詞法分析器通過字符方式讀入Jython腳本文件,這時就涉及到文件編碼問題。2.3文件編碼# -*- coding: utf-8 -*-7位ASCII編碼的字符就會發(fā)生 錯誤。我們通過在腳本文件首行添加以下代碼來讓Jython分析器知道用那種編碼來讀入腳本文件:# -*- 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顯示連接用在一行語句太長,需要分多行顯示的情況,我們可以通過,反斜杠來將多個行連接成一條語句:month_namesmonth_names=Januari,Februari,Maart,# These arethe April, Mei,Juni,# DutchnamesJuli, Augustus, September, # for the months Oktober, November, December # of the year2.4代碼塊代碼塊可以是一個類

21、,一個方法/函數(shù),或者是一個if/while的控制單元。多數(shù)程序語言會用專門的開始結束標 志來表示一個代碼塊,但是Jython/Python卻通過縮進來表示一個代碼塊,這是初學Python的人最不適應的地 方。縮進可以使用空格或者Tab制表符,但是最后Jython在解析的時候會將Tab轉換成空格,而不通的機器Tab和空格的對應關系可能不一樣,比如Windows通常使用4個空格表示一個Tab,而Unix可能用8個空格。所以非常重要的是我們在編輯器中只使用一種縮進方式:要不都用空格,要不都用縮進。我的通常做法是打開自動轉空格功能,在本地編輯就直接都用空格來縮進Jython腳本。開啟一個代碼塊需要用

22、:來提 示。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錯誤的示范: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標識符)只能以下劃線或者字母開頭,后面跟字母、數(shù)字或者下劃線,其他任何字 符都是非法的標識符。標識符區(qū)分大小寫、類和方法。用戶可以定義一個類把數(shù)據(jù)和操

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

25、的初始化方法,每個線程在創(chuàng)建TestRunner后執(zhí)行一次該方法def init (self):self.threadContext = PTS.Context.getThreadContext()# 主體壓測方法,每個線程在測試生命周期內會循環(huán)調用該方法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結束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# 調用施壓引擎施壓。第一個參數(shù)是事務名,可以為中文;第二個參數(shù)是執(zhí)行事務方法的方法名;第三個統(tǒng)一寫TestRunner PTS.Framework.instrumentMethod(urequestInfo, action_20013805, TestRunner)看上面這段代碼,我們還注意到Jython與Java或者C這些強類型語言的一些區(qū)別:變量的申明不需要指定類型,同樣方法或者函數(shù)的入?yún)⒑头祷刂狄膊恍枰贫愋停@就是Jython/Python語言的另一大特性-弱類型,Jython執(zhí)行器只有在執(zhí)行的時候才回去判斷對象的

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

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

30、.8腳本的執(zhí)行引擎分析后,是按行執(zhí)行的。腳本中頂格的代碼行都是會被執(zhí) 行器執(zhí)行的,而類或者全局方法則會被定義,定義之后代碼中其他的地方可以使用這些類和方法。#! /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語句來導入腳本中所用的地其它類或者模塊: Jyth

31、on中的模塊(Module)類似Java中的Package,用來把一組功能耦合的類封裝在一起。由于Jython可以和Java會操作,所以這里的import語句也 可以直接導入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請求/

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

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

34、測引擎的常用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的代碼腳本是一個TestRunner類,這個類會被每一個并發(fā)線程初始化,類成員變量是線程安全的。測試進 程首先加載腳本,并且執(zhí)行腳本中頂格的語句,同時定義了TestRunner這個測試類;然后每個線程會實例化一 個TestRunner類,調用類中的init方法一次,繼而循環(huán)調用TestRunner類的call方法;最后線程結束時,會調 用類中的del方法。init和del方法都是可選的,只有call方法是必需的。所以一個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類庫、Java類庫和自定義類的導入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請求/響應處理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測試, 如TCPUDP等協(xié)議# import socket# 設置系統(tǒng)編碼import sys# 腳本初始化段,可以設置壓測引擎的常用HTTP屬性ttt PTS.HttpUtilities.setUrlEncoding(UTF-8) PTS.HttpUtilities.setFollowRedirects(True) PTS.HttpUtilities.setTimeout(120000)# 腳本初始化段,可以設置壓測引擎的常用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測試類cla

40、ss TestRunner:class TestRunner:# TestRunner對象的初始化方法,每個線程在創(chuàng)建TestRunner后執(zhí)行一次該方法def init (self):self.threadContext = PTS.Context.getThreadContext()# 主體壓測方法,每個線程在測試生命周期內會循環(huán)調用該方法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代碼,調用下面這個方法會返回:VW,BMWBENZPTS.Htt

43、pUtilities.valuesFromTextBetween(text, name=, )方法:valueFromBodyBetween定義:def valueFromBodyBetween(left,right)獲取HTTP響應中被left和right字符串包圍的中間字符串,如果有多個匹配則返回第一個。 示例:# 返回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代碼,調用下面這個方法會返回:VW,BMWBENZPTS.HttpUtilities.valuesFromBodyBetween(name=, )方法:setProxyServer定義:def setPr

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

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

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

48、tedPattern為None時(可以不傳入該參 數(shù)),不進行文本校驗。# 當響應返回碼為200,且返回body包含IP地址則返回TruePTS.HttpUtilities.checkResponseByRegex(200, (0-9|1-90-9|10-92|20-40-9|250-5).)3(0-9|1-90- # 當響應返回碼為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請求/響應處理APIfrom util import PTSfrom HTTPClient import NVPair from HTTPClient import Cookiefrom HTTPClient import HTTPRequest from HTTPClient import CookieModule# 腳本初始化段,

50、可以設置壓測引擎的常用HTTP屬性#PTS.HttpUtilities.setKeepAlive(False)#PTS.HttpUtilities.setUrlEncoding(GBK)#PTS.HttpUtilities.setFollowRedirects(False)#PTS.HttpUtilities.setUseCookieModule(False)# 腳本執(zhí)行單元類,每個VU/壓測線程會創(chuàng)建一個TestRunner實例對象class TestRunner:# TestRunner對象的初始化方法,每個線程在創(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)# 主體壓測方法,每個線程在測試生命周期內會循環(huán)調用該方法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銷毀方法,每個線程循環(huán)執(zhí)行完成后執(zhí)行一次該方法def del (self):for c in self.init_cookies: CookieModule.addCookie(c, self.threadContext)self.action5()

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

評論

0/150

提交評論