功能 |
参数类型 |
取值方式 |
迭代方式 |
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; } }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|