开发者社区> 问答> 正文

如何参数化

参数文件用于构造数据集合,使测试数据更丰富。在请求设置中将数据值替换为指定的变量值后,施压过程中会将参数文件中的值动态替换为指定变量值。参数化可以用于很多场景,例如在需要用户名密码的业务中,需要使用各种不同的用户名以及对应的密码进行压测的场景。

构造参数文件
上传参数文件
请求链接参数化设置
模板编写方式
手工编写方式
完整示例代码
构造参数文件

目前仅支持 CSV 格式,请使用 UltraEdit 或 Notepad 工具(不要用 Excel)进行编辑;
第一行为参数变量,可增加多个参数变量,首行不得超过 255 个字符;
第二行开始为参数值,可增加多个参数值,脚本运行时会读取对应参数变量的参数值按从上往下的顺序执行;
每列参数化列值以英文逗号分隔;
如果参数文件内容包含中文,参数文件请使用 UTF-8 无 BOM 格式编码;
每个参数文件大小不得超过 60M;
一个脚本最多 10 个参数文件,不得重名,重名会覆盖。
参数化

上传参数文件

在新增脚本页面上传文件。上传后的文件默认开启循环使用状态,即参数文件中的数据会循环扫描使用。

上传文件

说明:

启用参数文件循环,则执行任务会循环使用该参数文件的参数值。

不启用参数文件循环适用于两种情况:

在只有一台施压机的情况下,执行任务只会运行一次该参数文件的参数值,然后任务停止。
在有多台施压机情况下,每个施压机都是全量数据。每个施压机会分别运行一次该参数文件参数值,然后任务停止。
请求链接参数化设置

一个参数文件或参数变量可用于多个不同链接,一个链接也可对应多个不同的参数文件或参数变量。

请求链接参数化设置分为模板编写和手工编写,分别对应不同的方式。

模板编写方式

在请求链接中选中要进行参数化的参数值,然后点击参数化按钮进行参数化。

参数化选择阴影

在参数化窗口选择参数文件及参数变量,参数变量可通过系统自动读取参数文件获得。

参数化选择变量

系统自动完成替换,替换格式为“%%_参数文件名:参数变量%%”。

参数化结果展示

手工编写方式

具体步骤如下:

导入以下类库:

from com.aliyun.pts import DsvReader
from com.aliyun.pts import ParamManager
加载参数化文件:

params = ParamManager.getInstance()
params.addProvider(DsvReader(u'user.csv'))
参数化文件指针向下移一行,注意只需要调用一次:

params.nextRecord(u'user.csv')
获取参数化值:

name = params.getParamValue(u'user.csv:password')
手工参数化编写技巧

在需要参数化的字符串中用 “%%_参数文件名:参数变量%%” 进行替换,保存脚本后,会自动转换成可运行的脚本。

例如将参数化用户名的地方进行日志输出:

PTS.Logger.info(‘username=%%_user.csv:password%%’)
保存脚本后,会将按照手工编写脚本参数化的步骤自动进行转换。

完整代码示例

#! /usr/bin/env python
# -*- coding: utf-8 -*-
# PTS Script Version 1.0
# Trunner auto-generated test script at Tue Jul 12 09:53:55 CST 2016
from java.lang import String
from java.util import Random
from java.util import Date
# 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
from HTTPClient import ShutdownException
# PTS对参数化的相关支持
from com.aliyun.pts import DsvReader
from com.aliyun.pts import ParamManager
# 脚本初始化段,可以设置压测引擎的常用HTTP属性
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.setParamDirectory("/Users/fei/Work/trunner/data")
# 支持socket测试, 如TCP\UDP等协议
# import socket
# 设置系统编码
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
params = ParamManager.getInstance()
expiryDate = Date()
expiryDate.year += 10
params.addProvider(DsvReader(u'FileName.csv'))
class TestRunner:
    # TestRunner对象的初始化方法,每个线程在创建TestRunner后执行一次该方法
    def __init__(self):
        self.threadContext = PTS.Context.getThreadContext()
    # 主体压测方法,每个线程在测试生命周期内会循环调用该方法
    def __call__(self):
        PTS.Data.delayReports = 1
        params.nextRecord(u'FileName.csv')
        PTS.Logger.info("username="+params.getParamValue(u'FileName.csv:Field')+"")
        # 请在此处调用事务方法
        #statusCode = self.action_name()
        #PTS.Framework.setExtraData(statusCode)
        PTS.Data.report()
        PTS.Data.delayReports = 0
    # 执行事务的方法,会在__call__主体压测方法中被调用到
    #def action_name(self):
        # 请输入方法内容
# 调用施压引擎施压。第一个参数是事务名,可以为中文;第二个参数是执行事务方法的方法名;第三个统一写TestRunner
#PTS.Framework.instrumentMethod(u'tran_name', 'action_name', TestRunner)

展开
收起
猫饭先生 2017-10-31 13:45:42 2751 0
1 条回答
写回答
取消 提交回答
  • Re如何参数化
    请问这个文章指的是云效测试数据中心构造数据的方式吗
    2018-11-14 23:14:42
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载