对于非 HTTP/HTTPS 协议的业务(如 TCP 协议等)或者某些内容不能录制的场景(如加密算法,非浏览器访问的应用等),需要进行手工编写代码开发脚本。
手工脚本语言为 Jython,目前支持 Jython 2.5.3 版本。
Jython 语法
Jython 程序由一系列语句组成,语句组成了代码块,代码块组成了方法、函数,然后再通过类把数据、方法和函数封装起来。和其它高级语言一样,Jython 的语句也是由一些最基本的词(token)组成。Token 可以是标识符(identifiers)、关键字(keywords)、字面值(literals)、操作符(operators)和分割符(delimiters),这些 token 通过 Jython 的语言执行器进行词法分析产生,而词法分析器通过字符方式读入 Jython 脚本文件。
脚本框架
性能测试的性能测试脚本是一个 TestRunner 类,这个类会被每一个并发线程初始化。
测试进程首先加载脚本并执行脚本中顶格的语句,同时定义 TestRunner 这个测试类。
然后每个线程会实例化一个 TestRunner 类,调用类中的 init 方法一次,
继而循环调用 TestRunner 类的 call 方法。
最后线程结束时会调用类中的 del 方法。
init 和 del 方法都是可选的,只有 call 方法是必需的。
示例解析
#第一部分:执行器声明和脚本编码声明
#! /usr/bin/env python
# -*- coding: utf-8 -*-
#第二部分:Jython类库、Java类库和自定义类的导入
# PTS Script Version 1.0
# PTS脚本SDK:框架API、常用HTTP请求/响应处理API
from util import PTS
from HTTPClient import NVPair
from HTTPClient import Cookie
from HTTPClient import HTTPRequest
from HTTPClient import CookieModule
#第三部分:测试进程级别的脚本语句和初始化
# 脚本初始化段,可以设置压测引擎的常用HTTP属性
#PTS.HttpUtilities.setKeepAlive(False)
#PTS.HttpUtilities.setUrlEncoding('GBK')
#PTS.HttpUtilities.setFollowRedirects(False)
#PTS.HttpUtilities.setUseCookieModule(False)
PTS.HttpUtilities.setUseContentEncoding(True)
PTS.HttpUtilities.setUseTransferEncoding(True)
#第四部分:TestRunner测试类
# 脚本执行单元类,每个VU/压测线程会创建一个TestRunner实例对象
class TestRunner:
# TestRunner对象的初始化方法,每个线程在创建TestRunner后执行一次该方法
def __init__(self):
self.threadContext = PTS.Context.getThreadContext()
self.init1()
self.init_cookies = CookieModule.listAllCookies(self.threadContext)
# 主体压测方法,每个线程在测试生命周期内会循环调用该方法
def __call__(self):
PTS.Data.delayReports = 1
for c in self.init_cookies:
CookieModule.addCookie(c, self.threadContext)
statusCode = self.action1()
PTS.Framework.setExtraData(statusCode)
statusCode = self.action2()
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.end1()
# 定义请求函数
def init1(self):
……
def action2(self):
……
def action2(self):
……
#第五部分:instrumentMethod语句
# 编织压测事务
PTS.Framework.instrumentMethod(u'action1', 'action1', TestRunner)
PTS.Framework.instrumentMethod(u'action2', 'action2', TestRunner)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。