开发者社区 问答 正文

性能测试 PTS 脚本编写如何进行?

对于非 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)

展开
收起
猫饭先生 2017-10-31 13:40:09 4158 分享 版权
0 条回答
写回答
取消 提交回答