Loadrunner 场景中实际运行参数化取值实验
[By:yy]
废话不多说了,直接入主题。
我设置了一个参数化{NewParam}这个参数里面有5个值,分别是1、2、3、4、5。使用的Sequential+Each iteration(每次迭代更新参数取值)。也就是说,我在VuGen里面如果迭代5次的话,按F5运行,日志里反馈的值应该是1、2、3、4、5。这时,我想知道每次取值消耗了多少秒所以加了一个事务,代码如下:
运行后发现5次迭代分别消耗了0.004~0.006秒之间,取这个中间值0.005作为平均数吧。那么我们在Controller中,1个并发用户,运行1秒的话。会有多少次迭代呢?
Ps:猜想是1秒/0.005秒=200迭代,如果按日志反馈的来算的话,0.005秒一次迭代,那么1秒中就会产生200次迭代。
那么我们放到场景里面去运行看看吧。场景配置如下
在场景中运行了1秒,场景自动停止了,这时我们去F:\test\testParam\res\log查看一下日志
Ps:我的脚本取名叫testParam放在F盘的test目录中。当时看到日志的txt的时候吓尿了,为什么1秒钟之内,生成的2M多的日志。按照逻辑来说,200次迭代不会有这么大的日志产生的。
从场景的日志我们可以看到,在1秒中,最后一次迭代开始是3566次。这比猜想的理论值大了17倍。如果这个值是在某个web网站做“注册”的压力测试的话,那么就已经注册了3566次了。跟实际预估的值差距有点大。
问题:为什么会有3566次呢?我到现在都不知道是为什么。如果哪位大神知道呢,请转告小弟了。可以私信我,也可以在博客中留言!
那么如何让取值在掌握范围内呢?于是又想到加个1秒用户思考时间在脚本里。代码如下
保存一下脚本,再到场景中去运行,查看日志。
这个时候,日志中就只有1次迭代了。
问题解决,可想而知实际用户思考时间对性能测试多么重要,想想当年为了让服务器的点击率高点,把ThinkTime给去掉了多么无知。以前就是为了想让数据变得好看一点,让服务器压力大一点。真心的为了出报告而出报告。这样违背了性能测试真正意义。所以希望各位能看到此篇文章的能重视到这一点。
这个问题解决了,那么新问题又来了,这时我如果想把并发数增加到5个。也就是说,5个并发执行5秒钟。脚本里有用户思考时间为1秒。那么5个并发分别是怎么取值呢?场景设计如下
运行后,日志中出现了5个日志,大小都是5K。查看日志中,5个并发在5秒钟之内进行的5次迭代,分别取了1、2、3、4、5这5个值。
Ps:这样取值不就重复了吗?如果我压测的是“注册”操作,重复注册的话肯定是不成功的,这样不是又无法真实的模拟用户操作的嘛?
现在的问题就是,我5个并发,在5秒种分别注册5个用户。而且每个并发取的值都是不一样的。
根据上述问题,我把脚本中的参数增加到25个。使用Unique+Each iteration+Abort Vuser(取值唯一,每次迭代取值更新,当参数值不够时忽略当前虚拟用户)Allocate设置的5。
这里解释下Allocate这个选项呢,是指的块。大致意思就是说每个并发能分到的虚拟用户数。我设置的5呢,就是说1个并发能分到5个用户。
-----------------------------------------------------------------------------------------------------------------------------
Q&A
问:那么5个用户分完了怎么办?
答:这时就要看When out of values选项了。我设置的是Abort Vuser当参数值不够时,忽略当前虚拟用户。意思就是说当我取到5值,后面就不会取值了。这时场景就会开始报错了。
问:好吧1个并发讨论完了,那么第2个并发会取到什么样的值呢?
答:因为我Abort Vuser分的5个用户,所以第2个并发也会得到5个用户,那么是哪5个用户呢?又因为我使用的是Unique所以用户取值是唯一的。不能重复的。所以呢,理论上来说,第2个并发应该取的是6-10这5个数。那么我们场景里面运行下看看实际情况吧。
Ps:详细资料可以查阅云层的书《Loadrunner11性能测试进阶指南》,yy我可是云大的死粉!
------------------------------------------------------------------------------------------------------------------------------
脚本代码、参数化设计如下
那么我们去场景里面运行下看看,场景设计如下
运行后出现了5个log日志,大小都是一样的。
查看日志后,每次迭代分别取值是
testParam_1 1-5
testParam_2 6-10
testParam_3 11-15
testParam_4 16-20
testParam_5 21-25
这样如果压测“注册”模块的话,取得值就能在我掌握之中了。O(∩_∩)O哈哈~
还有更好的方法来实现参数化来做“注册”的压力测试。敬请期待下次更新!