其实看LR已经很久了,每次看到参数化的取值更新时,都没有看透,了解个大概就为止了,也确实挺搞脑子的。
现在理解下来
分成2部分
取值方式 Select next row
如何从数据列表中取值
Sequential 按着行顺序来取
Random 随机取
Unique 取的时候会检测保证取出的数据唯一,没有被取过
更新的时机 Update value on
也就是什么时候触发select next row
Each Iteration 每次迭代时,取数据。每次迭代时就触发select next row,即时没有被取值。
Each Occurence 每次遇到参数时,取数据
Once 只取一次数据,之后都用这个数据
其中最搞的就是Unique, 而这种方式用到的还很多,比如注册时,要求用户名是不能一样的
当选择Unique时,会多出一处下拉选择 When out value,因为取值需要唯一,当取值的次数小于数据量时,就会出现没有数据的情况,提供3种处理方式
1.放弃这个用户(用得最多)
2.再去循环回到第一行数据(如果是多Vusers手动分配过Block的话,只会在分配的那些数据里循环)
3.同个用户内出现没数据了,就取同个用户最后参数取值的那个值,之后的用户应为没有数据则报错
而Unique 碰到有迭代次数,多个Vusers时,就挺复杂了
比如 : 参数化数据源里有数据A,B,C,D,E 5条数据,另外有Vuser1, Vuser2,Vuser3,Vuser4,脚本迭代2次。
要保证每次参数取数据时的数据唯一性,怎么分配数据就成了关键。(脚本中同个多处使用同个参数的话更麻烦,觉得unique时尽量避免多处使用同参数)
Unique + Each Iteration:这时会出现数据分配方式选择,可以由系统自动分配,也可以手动分配
系统分配的话,会保证至少每个用户有1条数据,也就是说需要准备的数据量为 Vuser数 * 迭代数
如果设置这种组合,例子场景会如下分配数据(when out value 选择 continue with last value)
Vuser1 Vuser2 Vuser3 Vuser4
A,B C,D E,E 报错
手动分配的话,需要准备的数据量则为 Vuser数*手动分配的Block size,一般Block size肯定要大于迭代数
如果上例手动选择Block size 3
则数据分配情况为
Vuser1 Vuser2 Vuser3 Vuser4
A,B,C D,E 报错 报错
因为迭代2次,且脚本中就有一处取这个参数的话,所以Vuser1真正用的数据只有A,B。 C则未被使用
Unique + Each Occurence:这时手动分配每个用户多少数据选项灰色,由系统自动分配
Unique + Once:最难以理解的,系统为每个Vuser分配一个唯一的数据,不管脚本迭代几次,同参数有几个,这个Vuser就一直用这个数据
还有2个函数,可以将参数数据下移一行。
Action()
{
lr_output_message("Param1 %s, Param2 %s", lr_eval_string("{Param1}"), lr_eval_string("{Param2}")); lr_advance_param("Param1"); lr_output_message("Param1 %s, Param2 %s", lr_eval_string("{Param1}"), lr_eval_string("{Param2}")); return ;
}
Param1, Param2 都存在test.dat文件下
Param1 Param2
1111 1111
2222 2222
3333 3333
lr_advance_param("paramname"); 参数是"参数名"。 一般2个参数存在同个dat文件内,在迭代时,需要错行取值的时候,就可以用这个函数。这样的话,被advance的参数即使在each iteration的更新方式下,同个迭代内也会下移一行数据,而未被advance的参数则要在迭代时才更新。
Starting action Action.
Action.c(3): Param1 1111, Param2 1111
Action.c(7): Param1 2222, Param2 1111
Ending action Action.
但如果Param2 的取值方式选择为 sameline as Param1的话,则会和Param1 一起advance
Action()
{
lr_output_message(lr_eval_string("{NewParam}"));
lr_next_row(NewParam,dat);
lr_output_message(lr_eval_string("{NewParam}"));
return ;
}
lr_next_row(paramname.dat); 参数是 参数所存的dat文件。比each iteration优先级高,即在上面这个函数中,即使update value on each iteration, 但在函数的作用下,同个迭代内,也会下移一行数据。