默认都是使用LR_AUTO来自动判断事务状态,现在来做一个脚本,看看LoadRunner的事务是如何自动判断状态的。
录制一个论坛注册用户的脚本,在提交注册表单处添加事务开始及结束标志,然后回放该脚本。事务的结果是PASS还是FAIL呢?虽然回放脚本注册用户是失败的(该用户已经存在),但是事务还是在PASS状态下完成了,而且会发现事务的持续时间很短。正常情况下注册一个用户到刷新首页一般都要2秒,现在只需要0.3秒。这是因为当服务器判断到该用户已存在后,就没有了数据插入和等待1秒刷新首页的操作,而是直接返回错误提示页面。这个0.3秒是系统处理错误的时间而不是注册用户所需要的时间。
LR_AUTO也是根据服务器的返回状态信息来决定事务是以LR_PASS状态通过还是以LR_FAIL状态结束,只要服务器返回页面,那么事务就会认为请求成功发出去了,服务器看懂了请求也返回了内容,自然事务是PASS状态了。
这样由于事务自动判断的错误,导致虽然操作是失败的,但得到了一个响应时间,并且这个响应时间又没有正确反映出做这件事情的真正时间,最终就会影响到性能测试得到的数据。
记得在论坛上就有朋友问过这样的问题,为什么系统在用户越来越多的情况下,响应时间不增反减?这种现象很有可能就是没有使用手工事务导致的结果。
对于这种情况就需要手工来判断操作是否成功,通过web_reg_find()检查点函数来检查页面是否返回正确,然后通过rowcount的参数值来进行事务状态判断,做到智能判断事务结果。
例如:检查点函数的rowcount保存在参数loginst中,那么事务的状态就应该这样判断:
1. lr_start_transaction("login");
2. web_reg_find("Search=Body",
3. "SaveCount=loginst",
4. "Text=登录失败",
5. LAST);
6. //登录请求
7. If(atoi(lr_eval_string("{loginst}"))>=1))
8. lr_end_transaction("login", LR_FAIL);
9. else
10. lr_end_transaction("login",LR_PASS);
通过检查点来检查登录后页面是不是存在"登录失败"这样的内容,如果存在那么loginst的值就大于等于1,然后把loginst的值取出来和1做比较,如果大于1那么就是登录失败,否则就是登录成功。
参数不能和值做比较,所以要先通过lr_eval_string()函数将其转化成字符串,然后再通过atoi()函数转化成整数,这样才能和1作比较。
在绝大多数情况下对于事务都需要采用手工事务的方式来确保事务的正确性和事务时间的有效性。
思考题:
对于Discuz论坛来说如何做一个有效的用户注册脚本通过手工事务并且获得准确注册操作的响应时间。
业务分析:
注册用户后,在系统的页面上会出现【欢迎:注册用户名】的信息,可以在注册后返回的页面中检查是否出现了这样的内容来判断注册事务是否成功。
通过检查页面可以得到需要判断的代码为:
1.
欢迎:<a class="dropmenu" id="viewpro" onmouseover="showMenu(this.id)">
所以在检查点函数中需要添加这个内容,为了更好地判断,还需要把注册用户的名字也加进去,最后可以得到下面的代码:
1. Action()
2. {
3. web_url("注册",
4. "URL=http://192.168.0.200/register.aspx",
5. "TargetFrame=",
6. "Resource=0",
7. "RecContentType=text/html",
8. "Referer=http://192.168.0.200/",
9. "Snapshot=t2.inf",
10. "Mode=HTML",
11. EXTRARES,
12. "URL=/templates/default/images/check_error.gif", ENDITEM,
13. "URL=/templates/default/images/check_right.gif", ENDITEM,
14. "URL=/images/level/3.gif", ENDITEM,
15. LAST);
16.
17. lr_start_transaction("reg");
18.
19. web_reg_find("Search=Body",
20. "SaveCount=regst",
21. "Text=欢迎:<a class=\"dropmenu\" id=\"viewpro\"
onmouseover= \"showMenu(this.id)\">{username}",
22. LAST);
23.
24. web_submit_data("register.aspx",
25. "Action=http://192.168.0.200/register.aspx?createuser=1",
26. "Method=POST",
27. "TargetFrame=",
28. "RecContentType=text/html",
29. "Referer=http://192.168.0.200/register.aspx",
30. "Snapshot=t11.inf",
31. "Mode=HTML",
32. ITEMDATA,
33. "Name=username", "Value={username}", ENDITEM,
34. "Name=password", "Value=112212", ENDITEM,
35. "Name=password2", "Value=112212", ENDITEM,
36. "Name=email", "Value={username}@cloud.chen", ENDITEM,
37. "Name=submit", "Value=创建用户", ENDITEM,
38. "Name=question", "Value=0", ENDITEM,
39. "Name=answer", "Value=", ENDITEM,
40. "Name=realname", "Value=", ENDITEM,
41. "Name=idcard", "Value=", ENDITEM,
42. "Name=mobile", "Value=", ENDITEM,
43. "