阿里云-性能测试服务用户手册-D_第1页
阿里云-性能测试服务用户手册-D_第2页
阿里云-性能测试服务用户手册-D_第3页
阿里云-性能测试服务用户手册-D_第4页
阿里云-性能测试服务用户手册-D_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、性能测试Lite用户使用手册性能测试/Lite用户使用手册性能测试/Lite用户使用手册 PAGE 46 PAGE 46Lite用户使用手册产品概述概述性能测试(PerformanceTesting)-Lite是阿里性能测试服务面向全网用户免费开放的性能云测试平台。Lite平台通过图形化的脚本编写方式挑战技术类Web产品的体验极限,基于HAR文件的脚本调试回放让应用协 议层的每个细节都清晰无比,更有HTTP录制功能极大的提升脚本创作效率;对于技术极客我们提供基于访问Lite控制台优势图像化编写方式,待测事务更直观-拖拽式的操作体验,基于时间序列的HTTP压测逻辑让性能测试更简单一键完成调试脚本

2、-调试回放HAR快照文件,结合日志可以确保测试脚执行正确的业务逻辑HTTP录制-支持Chrome和Firefox使用插件对用户操作进行录制,最大程度复现用户的真实使用场景编码模式,支持Python代码-使用代码实现更加丰富的压测场景,比如TCP、UDP协议,丰富的API让您变的无所不能云端压测-分布式压测引擎基于阿里云ECS技术实现,跨地域多引擎,可以实现几乎没有上限的施压能力一键监控,迅速定位系统瓶颈OSS/图片服务手册OSS/图片服务手册-性能监控工具,帮助您在性能测试的同时对自己的服务器进行同步监控访问Lite控制台功能环境管理:提供压测目标和监控集管理。测试管理:提供简单易用的性能测试

3、脚本模板模式和代码模式、测试场景配置、测试执行及执行数据 实时展示。结果报表:提供完善的性能结果报表和强大的性能分析图形展示。访问Lite控制台访问Lite控制台快速入门1Radar监控工具到需要被监控的服务器;2、创建测试(测试脚本和测试配置),执行测试并实时监控;3、测试结果概要及性能分析报表查看;访问Lite控制台名词解释大数据处理服务MaxCompute/Java SDK大数据处理服务MaxCompute/Java SDKLite:阿里性能测试服务面向全网用户免费开放的性能云测试平台。压测目标: Lite用户被压测系统入口地址。Radar:是Lite提供的一款系统性能监控工具,用户只需

4、要在服务器系统上安装这个工具就可以对服务 器系统进行细粒度的监控。监控集: 当前用户下安装Radar监控代理工具后可被Lite监控的服务器的集合。思考时间:用于模拟与服务器的各种交互之间存在等待时间的行为,在模拟脚本中通常设置于两个请 求步骤之间。步调时间:步调时间即脚本迭代运行频率控制时间,一旦设置,脚本每次运行后根据所设步调时间及 脚本包含的压测请求响应时间综合判断是否需要停顿,如需停顿则在停顿时间到达后再启动下一次运 行,注意区别于思考时间。测试元素:在测试模板模式脚本中构成脚本的元素,目前包括了HTTP GET请求、POST请求、思考时间。施压机:运行脚本并生成负载压力的代理服务器线程

5、数:在施压机中每个线程独立运行脚本模拟虚拟用户,每个线程代表一个虚拟用户。 预热时长:在设置的预定时间内均匀的增加线程达到设置的预定线程数。事务:事务是性能测试脚本的一个重要特性,要度量服务器的性能需要定义事务;在Lite模板模式脚 本中,每个事务包含一个HTTP请求。测试场景:测试过程中为了模拟真实用户的业务处理过程,在系统中构建的基于事务、脚本、虚拟用 户、运行设置等一系列动作的集合称之为性能测试场景。Lite中测试场景包含了脚本、线程数、预热 时长、日志级别、步调时间、监控集设置等。访问Lite控制台性能测试常用指标TPSTPS(Transaction Per Second)每秒系统能够

6、处理的交易或事务的数量,它是衡量系统处理能力的重要指标。访问Lite控制台响应时间响应时间是指从客户端发一个请求开始,到客户端接收到服务端返回的响应所经历的时间,响应时间由请求发 送时间、网络传输时间和服务器处理时间三部分组成。在性能测试结果分析中,性能场景中事务的响应时间可以通过监控得到,事务响应时间分为事务最小响应时间、事务平均响应时间、事务最大响应时间。访问Lite控制台并发用户数模拟真实业务逻辑步骤的虚拟用户,虚拟用户模拟的操作步骤都被记录在虚拟用户脚本里,脚本用于描述用户 在场景中执行的操作。访问Lite控制台错误率执行失败的事务数占总执行事务数的比率。访问Lite控制台请求状态请求

7、状态反映了HTTP压测结果的HTTP状态码,状态码含义如下:成功200:服务器已成功处理了请求并提供了请求的网页。成功204:服务器成功处理了请求,但没有返回任何内容。重定向3xx:需要客户端采取进一步的操作才能完成请求。客户端错误4xx:表示请求可能出错,妨碍了服务器的处理。服务器错误5xx:表示服务器在处理请求时发生内部错误,这些错误可能是服务器本身的错误而不是 请求出错。访问Lite控制台CPUCPU资源占用率,CPU资源是判断系统处理能力及 应用运行是否稳定的重要参数。访问Lite控制台Load系统平均负载指在特定时间间隔内运行队列中的平均进程数。如果一个进程满足以下条件就会位于运行队

8、列中:它没有在等待I/O操作的结果。它没有主动进入等待状态,也就是没有调用wait。没有被停止,例如等待终止。访问Lite控制台操作指南概述使用流程访问Lite控制台环境管理访问Lite控制台添加和验证压测目标在创建和执行测试前,必须先添加和验证压测目标:1.点击添加压测目标,输入被压测系统入口域名或IP,完成后进入下一步;备注:如果不是使用默认端口(HTTP:80,HTTPS:443),请手工指定(如::8080),输入内容只需提供host:port,http:/https:/URL路径。htdocs、Tomcat缺省根目录:tomcat安装目录webappsROOT、Nginx缺省根目录:

9、nginx安装目录html);3.验证目标弹窗会提示用浏览器访问指定URL来确认是否上传成功,如果URL能访问成功,说明已经上传成功;4.点击开始验证,验证成功后压测目标列表会显示被添加的压测目标已验证。访问Lite控制台访问Lite控制台添加监控服务器Windows和Linux版本。Radar下载地址:radar-for-linux.zipradar-for-Windows.zip备注:监控工具运行基于Java环境,安装监控工具前必须安装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用户执行unzipradar-for-linux.zip命令进行解压);3.配置perties文件,修改signature字段等于Lite用户设置中的用户标识;4. 启 动 Radar; start.bat文件Linux版:进入监控工具目录,运行chmod +x radar.sh赋予执行权限和./radar.sh start启动Radar(可通过agent.log日

11、志,查看监控工具启动运行信息)5.刷新监控集,可查看安装监控工具并成功启动后的监控服务器状态信息;访问Lite控制台新建测试访问Lite控制台新建测试添加压测目标并验证成功后即可新建测试,通过两种方式创建测试:1.进入控制台首页,点击创建测试按钮,进入测试编辑页面;阿里云大数据平台/机器翻译阿里云大数据平台/机器翻译2.选中导航菜单栏新建下拉框,点击测试,进入测试编辑页面;访问Lite控制台脚本开发访问Lite控制台创建事务(添加HTTP请求)在Lite测试编辑页面中,拖拽测试元素库Get请求或Post请求元素到五线谱中进行编辑,输入事务名、请求、检查点内容信息完成事务创建(多个测试元素执行顺

12、序为从左到右,从上到 下):1.创建Get请求事务2.创建Post请求事务3.添加请求Header属性大数据处理服务MaxCompute/Python SDK大数据处理服务MaxCompute/Python SDK4.添加请求Cookie属性5.添加请求Body属性6.添加请求检查点访问Lite控制台添加思考时间为模拟与服务器的各种交互之间存在等待时间的行为,可拖拽测试元素库中思考时间元素到五线谱任意两个请 求元素之间进行编辑,输入思考时间值(单位为毫秒):访问Lite控制台域名绑定如待测系统通过域名进行访问,可在此进行域名绑定,一个IP地址可绑定多个域名访问Lite控制台编码格式设置设置HT

13、TP请求与服务器数据交互编码格式,Lite支持UTF-8和GBK编码格式(默认为UTF-8),可根据被测服 务器设定的编码格式进行选择。访问Lite控制台日志级别设置、ERROR三个级别,用户可通过日志级别选择按钮选择相应的脚本运行日志级 别:阿里云大数据平台/智能语音交互阿里云大数据平台/智能语音交互访问Lite控制台代码模式编码模式,基于Python代码,使用代码实现更加丰富的压测场景,比如TCP、UDP协议,丰富的API让您变的 无所不能。代码模式手工编辑脚本SDK: HYPERLINK /%23/pub/pts/script-sdk-guide/sdk /#/pub/pts/scrip

14、t-sdk-guide/sdk 访问Lite控制台调试运行通过点击调试运行按钮回放脚本,生成回放请求快照及执行日志信息,帮助用户检查脚本正确性:访问Lite控制台访问Lite控制台录制测试脚本针对简单URL请求,很多用户都可以直接按照模板来进行编写,相当简单;但对于某些稍微复杂的业务,例如 登陆、考试、订购、购买、发帖、回帖、退出等业务,由于捕获请求内容进行模板编写或者手工编写脚本工作 量稍大,给用户带来不便,在此背景下,性能测试项目组开发了基于Firefox(支持37及以下版本)和Chrome浏览器插件录制工具。 通过使用此工具,用户在被测系统中进行手工操作业务,录制工具会将用户的操作行为进

15、行录制,录制完成以后,自动生成脚本,根据业务规则可能稍微修改一下脚本,就可以运行脚本了,录制下来的脚本模拟了用户真实的操作行为,极大地方便用户的使用。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代码模式可以使用自定义代码实现更加丰富的压测行为,比如TCP、UDP协议,丰富的API让您变的无所不能;Lite所使用的脚本语言为Jython,Jython是Python的Java语言实现,它使用Python的语法和类库,运行 在JVM中,和同一个JVM中的Java类可以实现无缝互操作。因此,使用Jython作为脚本语言可以最大程度的利 用Python的简洁、高效,同时保留对Java语言的全面兼容。Lite为了使脚本的创建更加高效,通过模板模式或录制工具提供配置式和录制式编写HTTP测试脚本的功能。用 户在页面上配置的HTTP脚本在执行前会被自动转换成Jython脚本,用

17、户可以通过预览或者手工编辑查看自动转 换后的脚本代码内容。通过模板模式和录制工具来编写HTTP脚本非常方便,但是如果遇到一些比较复杂的业务 场景,比如定制化的用户登录,可配置的执行流程或者需要对请求进行动态关联等等,就需要用户通过手工编 写脚本的方式来实现测试逻辑。本文围绕在Lite中使用手工编写方式这个主题,重点介绍性能测试脚本所用到的一些Jython语言基础、测试脚 本框架、常用类和函数,最后介绍一些常用的脚本功能范例。用户通过阅读该指南能够在Lite中手工编写较为 复杂的性能测试脚本。2.Jython语法基础2.1语言基础本章节重点介绍和编写性能测试脚本相关的Jython语言基础,内容非

18、常有限。读者如果需要更全面、深入地解Jython语言可以首先参考Python的Tutorial,语言Reference和Jython的用户手册。2.2Jython的词法(delimiters)。这些token通过Jython的语言执行器进行词法分析产生,而词法分析器通过字符方式读入Jython脚本文件,这时就涉及到文件编码问题。2.3文件编码# -*- coding: utf-8 -*-7位ASCII编码的字符就会发生 错误。我们通过在脚本文件首行添加以下代码来让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、,一个方法/函数,或者是一个if/while的控制单元。多数程序语言会用专门的开始结束标 志来表示一个代码块,但是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标识符)只能以下划线或者字母开头,后面跟字母、数字或者下划线,其他任何字 符都是非法的标识符。标识符区分大小写、类和方法。用户可以定义一个类把数据和操

24、作封装起来。比如下面这段代码定义了一个TestRunner的类,这个类有4个方 法:init、call、action_20013805。Jython定义方法用到关键字def,一般双划线格式的方法都是语言内置 的特殊方法,比如init方法是类的初始化方法,当一个类被实例化的时候该方法会被用调用一次,来初始化类的 一些成员数据;call方法用来实现一个类的callable接口,这个一般会在多线程调用时用到。class TestRunner:# TestRunner对象的初始化方法,每个线程在创建TestRunner后执行一次该方法defclass TestRunner:# TestRunner对象

25、的初始化方法,每个线程在创建TestRunner后执行一次该方法def init (self):self.threadContext = PTS.Context.getThreadContext()# 主体压测方法,每个线程在测试生命周期内会循环调用该方法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# 调用施压引擎施压。第一个参数是事务名,可以为中文;第二个参数是执行事务方法的方法名;第三个统一写TestRunner PTS.Framework.instrumentMethod(urequestInfo, action_20013805, TestRunner)看上面这段代码,我们还注意到Jython与Java或者C这些强类型语言的一些区别:变量的申明不需要指定类型,同样方法或者函数的入参和返回值也不需要制定类型,这就是Jython/Python语言的另一大特性-弱类型,Jython执行器只有在执行的时候才回去判断对象的

28、类型,如果有不匹配的操作会抛出异常。细心的读者还会发现一个怪怪的self,其实self就类似Java语言中的this,通过self类中的方法/函数可以引用类 的成员变量,或者调用类的成员方法,如果不加self,则默认使用全局空间的变量或方法,所谓全局变量/方法就是定义在类之外,脚本中顶格写的变量或者方法。定义类成员函数时,必须把self作为第一个参数传递给所定 义的方法。2.6字符串比如:s = This is a BIG surprise!,这个是一个合法的字符串。字符串作为一种特殊的字符数组,支持下标操作,比如s0=T,s0:5=This。字符串还有很多其它的操作比如连接、比较、分割,可以

29、参考: HYPERLINK /2/tutorial/introduction.html#strings /2/tutorial/introduction.html#strings2.7列表Jython中用来表示一个列表,列表是可变的,比如: a = apple, orange, peach数组下标从0开始,a0=apple;a1=orange。获列表长度用Jython内置函数:len,比如len(a)=3。 更多列表操作,请参考: HYPERLINK /2/tutorial/introduction.html#lists /2/tutorial/introduction.html#lists2

30、.8脚本的执行引擎分析后,是按行执行的。脚本中顶格的代码行都是会被执 行器执行的,而类或者全局方法则会被定义,定义之后代码中其他的地方可以使用这些类和方法。#! /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对象的初始化方法,每个线程在创建TestRunner后执行一次该方法class TestRunner:# TestRunner对象的初始化方法,每个

33、线程在创建TestRunner后执行一次该方法def init (self):# 主体压测方法,每个线程在测试生命周期内会循环调用该方法def call (self):def del (self):def action_20013805(self):4.也可以执行一些语句:# 脚本初始化段,可以设置压测引擎的常用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类,这个类会被每一个并发线程初始化,类成员变量是线程安全的。测试进 程首先加载脚本,并且执行脚本中顶格的语句,同时定义了TestRunner这个测试类;然后每个线程会实例化一 个TestRunner类,调用类中的init方法一次,继而循环调用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等协议# import socket# 设置系统编码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对象的初始化方法,每个线程在创建TestRunner后执行一次该方法def init (self):self.threadContext = PTS.Context.getThreadContext()# 主体压测方法,每个线程在测试生命周期内会循环调用该方法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时(可以不传入该参数),不进行文本校验。# 当响应返回码为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时(可以不传入该参 数),不进行文本校验。# 当响应返回码为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)# 脚本执行单元类,每个VU/压测线程会创建一个TestRunner实例对象class TestRunner:# TestRunner对象的初始化方法,每个线程在创建TestRunner后执行一次该方法def init (self):se

51、lf.threadContext = PTS.Context.getThreadContext()self.action1() self.action2()self.init_cookies = CookieModule.listAllCookies(self.threadContext)# 主体压测方法,每个线程在测试生命周期内会循环调用该方法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销毁方法,每个线程循环执行完成后执行一次该方法def del (self):for c in self.init_cookies: CookieModule.addCookie(c, self.threadContext)self.action5()

53、 self.action6()# 定义请求函数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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论