熟悉LoadRunner的人,相信都会经常使用参数化功能,但是对于参数化的使用到底了解多少,就值得深思了。包括本人在内也是,每次在做压力测试的时候,基本上都少不了要对一些动态的参数进行大数据量的读取,使用参数化功能也都是为了更符合实际应用。所以说用了就不表示理解了,更不能代表能灵活运用了。最近在一次接口压力测试中就让我遇到了一点麻烦,本来准备了10万级的数据量,但是在执行压力场景运行总,配合做压力的开发人员监控数据库中表记录就发现,真正插入进去的数据有时候只有不到1000条,甚至有时候只有一条,起初我以为是接口那边做一些复杂的判断规则导致的,要求开发人员把程序里的规则包括数据库表中的约束等属性都适当的去除,或者是放宽,这样以来可以避免一些数据不至于因为规则和约束而插入失败。经过一番折腾之后,发现不以为然,数据还是没能按照预期的结果入库,而当前表约束只有一个规则,那就是唯一性,要求每次插入的数据都必须是唯一的,也就是新值,不过这对于LoadRunner的参数化功能是完全可以实现的,经过一番折腾之后发现这个参数化功能真还是那么简单,看似每个设置都能理解,但如果没有深入实践去证明,结果还真是大不相同。
改变参数化的取值方式,关键在于Select next row和Update value on这两个选项。
Select next row包括以下选项:
● Sequential:顺序方式
● Random:随机方式
● Unique:唯一方式
Update value on包括如下选项:
● Each iteration:每次迭代更新取值
● Each occurrence:每次取值更新
● Once:只更新一次
下面我们将通过如下的一段脚本来分别解析各个组合设置的效果,脚本如下:
Action() { int i = 0; for (i=0; i<5; i++) { lr_eval_string("{paramtemp}"); } lr_eval_string("{paramtemp}"); return 0; } |
注:以上脚本的功能就是先重复循环取5次参数,然后循环结束后再读取一次参数的值。这里为参数paramtemp准备的参数数据有temp1~8共8条数据,供测试使用。
1、Sequential+Each iteration(顺序方式+每次迭代更新取值),设置Run—Logic中action循环迭代5次,并运行以上脚本,结果如下:
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(7): Notify: Parameter Substitution: parameter "paramtemp" = "temp1"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(5): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
Action.c(7): Notify: Parameter Substitution: parameter "paramtemp" = "temp2"
......
通过如上的回放日志可以发现,共循环action5次,共取了5个参数化中的数据,但每次执行action脚本时,脚本内部的取值均相同。设置Sequential是为了保证顺序读取方式,而Each iteration是基于Run—Logic的设置的,就是说每次循环一次后,读取新的值。如果设置循环次数超过数据的行数,此时再回放之后的结果就是,超过第八,从第九次开始就又从temp1开始读取,完成循环迭代的读取过程。