s

d

功能 参数类型 取值方式 迭代方式 Loadrunner实现方式 nGrinder实现方式
参数化 文件  sequential

(顺序取值)

Each Iteration

(每次迭代)

在参数列表中设置,按照参数化的数据顺序,一个一个的来取,取到最后一行时继续从头开始取。

迭代一次值改变一次,迭代内值不变

变量声明:
public static List<String> lineList //存放参数文件记录
public def custno
public def lineNumber = 0
读取文件,在BeforeProcess块中定义:
lineList = new File("./resources/custno.dat").readLines("UTF-8")
顺序取值,在具体某个Test()中定义一次:
lineNumber = lineNumber%(lineList.size()-1)+1 //考虑了0行是列名行的情况,实际值从第1行开始
custno = lineList.get(lineNumber)

参数化 文件  sequential

(顺序取值)

Each Occurrence
(每次出现)

在参数列表中设置,按照参数化的数据顺序,一个一个的来取,取到最后一行时继续从头开始取。

每次出现的值都不一样

变量声明:
public static List<String> lineList //存放参数文件记录
public def custno
public def lineNumber = 0
读取文件,在BeforeProcess块中定义:
lineList = new File("./resources/custno.dat").readLines("UTF-8")
顺序取值,在Test块中各出现处插入如下程序:
lineNumber = lineNumber%(lineList.size()-1)+1 //考虑了0行是列名行的情况,实际值从第1行开始
custno = lineList.get(lineNumber)

参数化 文件  sequential

(顺序取值)

 Once(只取一次)  在参数列表中设置,实际只取第一行  lineNumber取固定值1
参数化 文件  Random

(随机取值)

 Each Iteration

(每次迭代)

 在参数列表中设置,随机取值

变量声明:
public static List<String> lineList //存放参数文件记录
public def custno
public def rowNumber
读取文件,在BeforeProcess块中定义:
lineList = new File("./resources/custno.dat").readLines("UTF-8")
随机取值,在某一个test中定义:
def rowNumbertemp = new Random().nextInt(lineList.size())
if(rowNumbertemp == 0) {
rowNumbertemp = 1
}
rowNumber = rowNumbertemp
custno = lineList.get(rowNumber) //在其他需要使用的地方直接用rowNumber参数

   文件  Random

(随机取值)

Each Occurrence
(每次出现)

 在参数列表中设置,每次出现的值都不一样

在出现处插入如下程序:
def rowNumber = new Random().nextInt(lineList.size())
if(rowNumber == 0) {
rowNumber = 1
}
custno = lineList.get(rowNumber)

   文件  Random

(随机取值)

 Once(只取一次)  在参数列表中设置,每个虚拟用户值不一样,但每次迭代取值都一样

在BeforeThread处插入如下程序:
def rowNumber = new Random().nextInt(lineList.size())
if(rowNumber == 0) {
rowNumber = 1
}
custno = lineList.get(rowNumber)

   文件

Unique
(唯一性取值)

Each Iteration
(每次迭代)

在参数列表中设置,结束策略有三种,分别为:1、AbortVuser;2、ContinueInCycleManner;3、ContinueWithLastValue。

通过下拉框选择结束策略

参数文件第一行是标题
文件最后不留空行
编码实现唯一性取值,参考TestRunner.groovy的代码:
首先声明全局类变量
//声明类的全局变量
public static final List<String> usernameList = new File("./resources/username.txt").readLines()

private enum WhenOutOfValues {
AbortVuser, ContinueInCycleManner, ContinueWithLastValue
}
private int invokeTimes = 0 //调用方法计数,不可随意修改
//迭代唯一取值方法
//update on Each Iteration
private int getCounterByIteration() {
assertTrue(grinder.runNumber >= 0)
int counter = getCounter(grinder.runNumber)
int line2 =counter + 1 ;
int MaxLine = usernameList.size() - 1;
WhenOutOfValues outHandler = WhenOutOfValues.AbortVuser
if (line2 > MaxLine) {
if (outHandler.equals(WhenOutOfValues.AbortVuser)) {
grinder.stopThisWorkerThread()
} else if (outHandler.equals(WhenOutOfValues.ContinueInCycleManner)) {
line2 = (line2 - 1) % MaxLine + 1
} else if (outHandler.equals(WhenOutOfValues.ContinueWithLastValue)) {
line2 = MaxLine;
}
}
return line2
}
//取唯一值的计算方法
private int getCounter(int iteration){
int intAgents = Integer.parseInt(grinder.getProperties().get("grinder.agents").toString())
int intProcs = Integer.parseInt(grinder.properties.get("grinder.processes").toString())
int intThreads = Integer.parseInt(grinder.properties.get("grinder.threads").toString())
int agent_no = grinder.agentNumber
int proc_no = grinder.processNumber
int thread_no = grinder.threadNumber

int counter = agent_no * intProcs * intThreads + proc_no * intThreads + thread_no + intAgents * intProcs * intThreads * iteration
return counter
}
在@Test方法内部调用,既可只调用一次,将值赋给一个全局变量,也可多次调用,一次迭代里多次调用的值均一样
int line = this.getCounterByIteration();
String name2 = usernameList.get(line)

   文件  Unique
(唯一性取值)

Each Occurrence
(每次出现)

 在参数列表中设置,结束策略有三种,分别为:1、AbortVuser;2、ContinueInCycleManner;3、ContinueWithLastValue。通过下拉框选择结束策略

参数文件第一行是标题
文件最后不留空行
编码实现唯一性取值,参考TestRunner.groovy的代码:
首先声明全局类变量
//声明类的全局变量
public static final List<String> usernameList = new File("./resources/username.txt").readLines()
private enum WhenOutOfValues {
AbortVuser, ContinueInCycleManner, ContinueWithLastValue
}
private int invokeTimes = 0 //调用方法计数,不可随意修改

//update on Each occurrrence
private int getCounterByOccurrence() {
int counter = getCounter(invokeTimes)
invokeTimes++
int line2 =counter + 1 ;
int MaxLine = usernameList.size() - 1;
WhenOutOfValues outHandler = WhenOutOfValues.AbortVuser
if (line2 > MaxLine) {
if (outHandler.equals(WhenOutOfValues.AbortVuser)) {
grinder.stopThisWorkerThread()
} else if (outHandler.equals(WhenOutOfValues.ContinueInCycleManner)) {
line2 = (line2 - 1) % MaxLine + 1
} else if (outHandler.equals(WhenOutOfValues.ContinueWithLastValue)) {
line2 = MaxLine;
}
}
return line2
}
//取唯一值的计算方法
private int getCounter(int iteration){
int intAgents = Integer.parseInt(grinder.getProperties().get("grinder.agents").toString())
int intProcs = Integer.parseInt(grinder.properties.get("grinder.processes").toString())
int intThreads = Integer.parseInt(grinder.properties.get("grinder.threads").toString())
int agent_no = grinder.agentNumber
int proc_no = grinder.processNumber
int thread_no = grinder.threadNumber

int counter = agent_no * intProcs * intThreads + proc_no * intThreads + thread_no + intAgents * intProcs * intThreads * iteration
return counter
}
在@Test方法内部各出现处调用
int line = this.getCounterByOccurrence();
String name = usernameList.get(line)

   文件  Unique
(唯一性取值)
 Once(只取一次)  -

参数文件第一行是标题
文件最后不留空行
编码实现唯一性取值,参考TestRunner.groovy的代码:
首先声明全局类变量
//声明类的全局变量
public static final List<String> usernameList = new File("./resources/username.txt").readLines()
private enum WhenOutOfValues {
AbortVuser, ContinueInCycleManner, ContinueWithLastValue
}
private int invokeTimes = 0 //调用方法计数,不可随意修改
//迭代唯一取值方法
//update Once
private int getCounterByOnce() {
int counter = getCounter(0)
int line2 =counter + 1 ;
int MaxLine = usernameList.size() - 1;
if (line2 > MaxLine) {
if (outHandler.equals(WhenOutOfValues.AbortVuser)) {
grinder.stopThisWorkerThread()
} else if (outHandler.equals(WhenOutOfValues.ContinueInCycleManner)) {
line2 = (line2 - 1) % MaxLine + 1
} else if (outHandler.equals(WhenOutOfValues.ContinueWithLastValue)) {
line2 = MaxLine;
}
}
return line2
}

//取唯一值的计算方法
private int getCounter(int iteration){
int intAgents = Integer.parseInt(grinder.getProperties().get("grinder.agents").toString())
int intProcs = Integer.parseInt(grinder.properties.get("grinder.processes").toString())
int intThreads = Integer.parseInt(grinder.properties.get("grinder.threads").toString())
int agent_no = grinder.agentNumber
int proc_no = grinder.processNumber
int thread_no = grinder.threadNumber

int counter = agent_no * intProcs * intThreads + proc_no * intThreads + thread_no + intAgents * intProcs * intThreads * iteration
return counter
}
在@Test方法内部调用
int line = this.getCounterByOnce();
String name = usernameList.get(line)

   文件  同行取值  -  支持

变量声明:
public static List<String> cityLineList //存放参数文件记录
读取文件,在BeforeProcess块中定义:
cityLineList = new File("./resources/City.txt").readLines("UTF-8")
//x、y与city相关,需要同行取值,在Test方法内,city赋值处进行x、y的赋值
city = cityLineList.get(cityRowNumber).split(",")[1]
x = cityLineList.get(cityRowNumber).split(",")[5]
y = cityLineList.get(cityRowNumber).split(",")[4]

  文件  文件读取方式  按列号取值  支持  支持,见同行取值中的[]
  文件   文件读取方式  按列名取值  支持  不支持
  文件    文件读取方式  文件列分隔符   支持逗号、tab键、空格做分隔符  支持所有分隔符,见同行取值中的.split(",")
   文件    文件读取方式

从第几行开始取值

 支持从任何一行开始  支持从任何一行开始,见同行取值中cityRowNumber + n;同时cityLineList.size() - n
   文件  参数模拟(simulate parameter) -  支持  支持,将Test方法中实际发送的请求注释,并将取值打印到日志中grinder.logger.info("x:"+x); 运行,查看日志中实际取值
   Date/Time  原值

Each Occurrence
(每次出现)

参数类型选择Date/Time
选择格式化字符串,例如
%Y-%m-%dT%H:%M:%S.000得到结果是
2017-10-31T16:27:10.993

在Test()出现处插入如下程序:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss:SSS");
String formatStr =formatter.format(new Date());
//输出结果01-11-2017 16:51:11:251
可以指定不同的日期格式化字符串

    Date/Time  增加偏移量

Each Occurrence
(每次出现)

 日期时间参数,指定offset如增加1天和8小时,通过界面设置完成

在Test()出现处插入如下程序:
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss:SSS");
Date today = new Date()
Calendar c = Calendar.getInstance();
c.setTime(today);
c.add(Calendar.DAY_OF_MONTH, 1);// 今天+1天
c.add(Calendar.HOUR,8)//今天+8小时
Date tomorrow = c.getTime();
String formatStr =formatter.format(tomorrow);

   Group Name  -  -  参数类型选择Group Name,场景中设置group的名称。  代码指定变量值即可。
   Iteration Number  -  -  当前某个agent某一进程下某线程已执行的迭代次数,从1开始计数,每次迭代加1  grinder.runNumber,从0开始
  Load Generator Name - - 参数设置为Load Generator Name InetAddress.getLocalHost().getHostName()
  Random Number - - 参数设置类型Random,[min,max],包含最小值和最大值的闭区间,默认1~100 new Random().nextInt(MAX),0~MAX的区间,包含0不包含MAX
  Table - - 支持 暂未实现
  Unique Number -

Each Iteration
(每次迭代)

参数类型设置为"Unique Number"
指定取值范围,范围默认1-100
超出范围后的方法可选:终止;循环;取最后一次的结果

private int invokeTimes = 0 //调用方法计数,不可随意修改
private enum WhenOutOfValues {
AbortVuser, ContinueInCycleManner, ContinueWithLastValue
}
//迭代唯一取值方法
//update on Each occurrrence
private int getCounterByOccurrence() {
int counter = getCounter(invokeTimes)
invokeTimes++
return counter + 1
}
//取唯一值的计算方法
private int getCounter(int iteration){
int intAgents = Integer.parseInt(grinder.getProperties().get("grinder.agents").toString())
int intProcs = Integer.parseInt(grinder.properties.get("grinder.processes").toString())
int intThreads = Integer.parseInt(grinder.properties.get("grinder.threads").toString())
int agent_no = grinder.agentNumber
int proc_no = grinder.processNumber
int thread_no = grinder.threadNumber

int counter = agent_no * intProcs * intThreads + proc_no * intThreads + thread_no + intAgents * intProcs * intThreads * iteration
return counter
}
在@Test方法内部调用
int line2 = this.getCounterByOccurrence();
int MaxLine = 100;
WhenOutOfValues outHandler = WhenOutOfValues.ContinueInCycleManner

if (line2 > MaxLine) {
if (outHandler.equals(WhenOutOfValues.AbortVuser)) {
grinder.stopThisWorkerThread()
} else if (outHandler.equals(WhenOutOfValues.ContinueInCycleManner)) {
line2 = line2 % MaxLine + 1
} else if (outHandler.equals(WhenOutOfValues.ContinueWithLastValue)) {
line2 = MaxLine;
}
}

  Unique Number -

Each Occurrence
(每次出现)

参数类型设置为"Unique Number"
指定取值范围,范围默认1-100
超出范围后的方法可选:终止;循环;取最后一次的结果

private int invokeTimes = 0 //调用方法计数,不可随意修改
private enum WhenOutOfValues {
AbortVuser, ContinueInCycleManner, ContinueWithLastValue
}
//迭代唯一取值方法
//update on Each occurrrence
private int getCounterByOccurrence() {
int counter = getCounter(invokeTimes)
invokeTimes++
return counter + 1
}
//取唯一值的计算方法
private int getCounter(int iteration){
int intAgents = Integer.parseInt(grinder.getProperties().get("grinder.agents").toString())
int intProcs = Integer.parseInt(grinder.properties.get("grinder.processes").toString())
int intThreads = Integer.parseInt(grinder.properties.get("grinder.threads").toString())
int agent_no = grinder.agentNumber
int proc_no = grinder.processNumber
int thread_no = grinder.threadNumber

int counter = agent_no * intProcs * intThreads + proc_no * intThreads + thread_no + intAgents * intProcs * intThreads * iteration
return counter
}
在@Test方法内部调用
int line2 = this.getCounterByOccurrence();
int MaxLine = 100;
WhenOutOfValues outHandler = WhenOutOfValues.ContinueInCycleManner

if (line2 > MaxLine) {
if (outHandler.equals(WhenOutOfValues.AbortVuser)) {
grinder.stopThisWorkerThread()
} else if (outHandler.equals(WhenOutOfValues.ContinueInCycleManner)) {
line2 = line2 % MaxLine + 1
} else if (outHandler.equals(WhenOutOfValues.ContinueWithLastValue)) {
line2 = MaxLine;
}
}

   Unique Number  -  Once(只取一次)

参数类型设置为"Unique Number"
指定取值范围,范围默认1-100
超出范围后的方法可选:终止;循环;取最后一次的结果

全局代码
private int invokeTimes = 0 //调用方法计数,不可随意修改
private enum WhenOutOfValues {
AbortVuser, ContinueInCycleManner, ContinueWithLastValue
}
//update Once
private int getCounterByOnce() {
int counter = getCounter(0)
return counter + 1
}
//取唯一值的计算方法
private int getCounter(int iteration){
int intAgents = Integer.parseInt(grinder.getProperties().get("grinder.agents").toString())
int intProcs = Integer.parseInt(grinder.properties.get("grinder.processes").toString())
int intThreads = Integer.parseInt(grinder.properties.get("grinder.threads").toString())
int agent_no = grinder.agentNumber
int proc_no = grinder.processNumber
int thread_no = grinder.threadNumber

int counter = agent_no * intProcs * intThreads + proc_no * intThreads + thread_no + intAgents * intProcs * intThreads * iteration
return counter
}
在@Test方法内部的代码
int line2 = this.getCounterByOnce();
int MaxLine = 100;
WhenOutOfValues outHandler = WhenOutOfValues.ContinueInCycleManner

if (line2 > MaxLine) {
if (outHandler.equals(WhenOutOfValues.AbortVuser)) {
grinder.stopThisWorkerThread()
} else if (outHandler.equals(WhenOutOfValues.ContinueInCycleManner)) {
line2 = line2 % MaxLine + 1
} else if (outHandler.equals(WhenOutOfValues.ContinueWithLastValue)) {
line2 = MaxLine;
}
}

           
           
           
           
           

end

nGrinder Loadrunner vs nGrinder的更多相关文章

  1. nGrinder性能测试平台搭建(LVS压力测试)

    1. nGrinder是什么 nGrinder是一个免费的.开放源代码的Web性能测试平台.运行在应用中间件服务器中运行.它由一个控制端和多个代理端组成.通过控制端(浏览器访问)建立测试场景,然后通过 ...

  2. 性能测试平台nGrinder

    ngrinder简介 ngrinder是NAVER(韩国大型互联网公司)开源的性能测试工具平台,直接部署成web服务,平台化,支持多用户使用,可扩展性好,可自定义plugin插件 开源地址:http: ...

  3. 使用flume-ng聚合双活Nginx日志

    前不久使用Keepalived搭建了Nginx双活代理服务器,以达到一个公网IP后支持多个云主机的多个域名网站的目的.完成后又想在这双活的Nginx上有所有访问网站的日志,之前有了解过Google A ...

  4. ngrinder的简介与基本使用(转载:https://www.jianshu.com/p/f336180806cc)

    nGrinder简介 nGrinder是基于Grinder开源项目,由NHN公司的开发团队进行了重新设计和完善.nGrinder是一款非常易用,有简洁友好的用户界面和controller-agent分 ...

  5. 基于Groovy搭建Ngrinder脚本调试环境

    介绍 最近公司搭建了一套压力测试平台,引用的是开源的项目 Ngrinder,做了二次开发,在脚本管理方面,去掉官方的SVN,引用的是Git,其他就是做了熔断处理等. 对技术一向充满热情的我,必须先来拥 ...

  6. nGrinder 介绍与安装

    nGrinder是基于Grinder开源项目,但由NHN公司的nGrinder开发团队进行了重新设计和完善(所以叫做nGrinder). 它是由一个controller和连接它的多个agent组成,用 ...

  7. nGrinder 参数使用

    背景: 性能测试中为了更加接近真实模拟现实应用,对于提交的信息每次都需要提交不同的数据,或使用不同的值,最为典型的就是登录时的账号. 性能测试工具需要提供动态参数化功能,如商业化的LoadRunner ...

  8. nGrinder安装指南

    NGrinder 由两个模块组成,其运行环境为 Oracle JDK 1.6 nGrinder controller  web 应用程序,部署在Tomcat 6.x 或更高的版本 nGrinder A ...

  9. Web压力测试系统-nGrinder

    nGrinder是一个免费的.开放源代码的Web性能测试工具.它本身是JAVA WEB应用程序,在Tomcat服务器中运行. 它由一个controller端和一个或多个Agent端组成.nGrinde ...

随机推荐

  1. RPM包定制

    概述 问题:当领导给你 100 台已经安装好系统的服务器,然后让优化,让你提出一个快速部署方案.解答: 1.tar 打包 先编译安装 打包-->分发-->解包(比如 mysql 打包后直接 ...

  2. Vue——服务器上部署vue.js

    服务器版本 [root@izuf63g0jydq42k49eo7zcz ~]# uname -a Linux izuf63g0jydq42k49eo7zcz -.el7.x86_64 # SMP Tu ...

  3. Colored Sticks POJ - 2513 并查集+欧拉通路+字典树hash

    题意:给出很多很多很多很多个棒子 左右各有颜色(给出的是单词) 相同颜色的可以接在一起,问是否存在一种 方法可以使得所以棒子连在一起 思路:就是一个判欧拉通路的题目,欧拉通路存在:没奇度顶点   或者 ...

  4. Quartz基础+实例

    1. 介绍 Quartz体系结构: 明白Quartz怎么用,首先要了解Scheduler(调度器).Job(任务)和Trigger(触发器)这3个核心的概念. 1. Job: 是一个接口,只定义一个方 ...

  5. springMVC整理04--文件上传 & 拦截器 & 异常处理

    1.  文件上传 SpringMVC 的文件上传非常简便,首先导入文件上传依赖的 jar: <!-- 文件上传所依赖的 jar 包 --> <dependency> <g ...

  6. MT【305】丹德林双球

    如图.在正方体$ABCD-A_1B_1C_1D_1$中,点$M,N$分别是直线$CD,AB$上的动点,点$P$是$\Delta A_1C_1D_1$内的动点(不包括边界),记直线$DP$与$MN$所成 ...

  7. Codeforces 346D Robot Control(01BFS)

    题意 有一个 \(N\) 个点, \(M\) 条边的有向图, 初始有一个机器人在 \(1\) 号点. 每个时刻, 这个机器人会随机选择一条从该点出发地边并通过.当机器人到达点 \(N\) 时, 它就会 ...

  8. THUSC2017题解

    THUSC2017题解 题目都是在LOJ上交的. chocolate LOJ#2977巧克力 这题看着就让人想起了百度之星复赛的\(T5\),就是这题. 因为种类的个数很多,所以把每个种类随意\(ra ...

  9. 【dfs】LETTERS

    1212:LETTERS [题目描述] 给出一个roe×colroe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母.问最多可以经过几个字母. [ ...

  10. poj1845 sumdiv (因数的和)

    首先分解质因数,$A^B=p_1^{m_1B}p_2^{m_2B}...p_n^{m_nB}$ 然后的话,它的所有因数的和就是$\prod{(1+p_i^1+p_i^2+...+p_i^n)}$ 用一 ...