??xml version="1.0" encoding="utf-8" standalone="yes"?>
我们可以通过一U变通的办法来实玎ͼ(x)
首先扑ֈ你出错的面Q保存该面到参数里面:(x)
web_set_max_html_param_len(“2048”);
web_reg_save_param(“FILED”,”LB=”,”RB=”,”Search=Body”,LAST);
然后输出到日志里面:(x) lr_output_message(”#######################################%s”,lr_eval_string(”{FILED}”));
修改lr run-time的几个设|:(x)
1、Always send messages
2、continue on error Q这h能保证运行lr_output_message)
q样lr?x)把所有的lr_output_message输出保存到日志文?
当然你不要下载资源文Ӟ否则保存到的׃是html面了,可能是一个gif :(
最后,l合lr controller的错误信息,定位到出错的vuser idQ查看该vuser的log文gp看到错误面?
非常有效的一个小技巧,用它解决了一个难~的问题?
׃大量开源框架的采用QClasses冲突的问题在我们的项目中来常见,下面写了一个简单的jspQ用来查扑ֽ前用类的位|:(x)
<%@page contentType="text/html; charset=gb2312" %> <html> <head> <title>Class conflict</title> </head> <body> Example input: com.primeton.tp.web.driver.webdriver.PageDriver<br> <form action="<%=request.getRequestURI()%> " method="post"> <input type="text" name="className" size="50" ><br> <input type="submit" value="submit"> </form> <% String classLocation = null; String className =request.getParameter("className"); if ((className != null) && ((className = className.trim()).length() != 0)) { try{ classLocation = Class.forName(className).getProtectionDomain().getCodeSource().toString(); }catch(Throwable e){ log("error=" + e, e); } if (classLocation != null) { out.println("Class " + className + " found in <br>" + classLocation ); } else { out.println("Class '" + className + "' not found" ); } } %> </body> <html>
通过q个jsp面可以输入需要查询的c?/p>
-----------------------------------------------------------------------------------------------------------------------------------------------------
另外Qwebsphere可以通过下面两个Ҏ(gu)来改变类的加载:(x)
1、在"Applications" >"Enterprise Applications" >" yourear ">" Class Loading and File Update Detection"
修改Q?Class loader mode" ?"Parent Last"Q这样应用类可以覆盖父装载器的类
当然但如果你混合使用了被覆盖的类和没有被覆盖的类Q则此操作有可能?x)导?ClassCastException ?LinkageErrors
2、在"Servers" > "Application servers" > "yourserver" > "Process Definition" > "Java Virtual Machine"
dCLASSPATHQ让你的cd加蝲
一Q基本介l?/strong>
在Loadrunner的用中Q对于Run-time Settings下的browser emulation讄是比较容易让Z生困惑的地方。下面我们结合sniffer来具体看看每个选项的用途,以及(qing)Ҏ(gu)试的影响?
Browser Emulation ?/p>
二:(x)案例和工?/strong>
1. 试案例Q?/b>
打开|站首页两次Q对比不同Browser Emulation讄下loadrunner的行为,脚本如下?
Action() { web_url("www.primeton.com", "URL=http://www.primeton.com/", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t2.inf", "Mode=HTML", LAST); web_url("www.primeton.com", "URL=http://www.primeton.com/", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t2.inf", "Mode=HTML", LAST); return 0; }
2. sniffer工具
开源工P(x)Wireshark(前n是ethereal)Qwww.wireshark.orgQ?
三:(x)试q程
Z方便描述Q我们约定用Q?
A代表Simulate browser cache
B代表Cache URLs requiring content(HTMLs)
C代表Check for newer versions of stored pages every visit to the page
D代表Download non-HTML resources
E代表Simulate a new user on each iteratioin
F代表Clear cache on each iteration
首先讄Run Logic中的iteration?。让Actionq行两次Q看看@环运行脚本两ơ,数据包和q接数的变化?
1. L所有选项
l果Q共获取数据?5个,建立q接1个(U色标识Q,断开q接1个(蓝色标识Q?
No. Time Source Destination Protocol Info 1 0.000000 192.168.1.61 203.81.29.137 TCP 13835 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 2 0.036053 203.81.29.137 192.168.1.61 TCP http > 13835 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 92 1.415887 192.168.1.61 203.81.29.137 TCP 13835 > http [FIN, ACK] Seq=817 Ack=71762 Win=257760 Len=0 94 1.449960 203.81.29.137 192.168.1.61 TCP http > 13835 [FIN, ACK] Seq=71762 Ack=818 Win=16464 Len=0
在这U情况下Q数据包非常(没有选择下蝲资源文g入css,js,gif{)(j)Q而且你可以看刎ͼ打开4ơ首,只徏立了一个tcpq接?
q时Q你即选择AQ发现数据包的数量量|有变化,因ؓ(f)cache主要q是针对资源文g
2. 选择E(F)
l果Q共获取数据?02个,建立q接2个(U色标识Q,断开q接2个(蓝色标识Q?/p>
No. Time Source Destination Protocol Info 1 0.000000 192.168.1.61 203.81.29.137 TCP 13886 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 2 0.037013 203.81.29.137 192.168.1.61 TCP http > 13886 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 48 0.618117 192.168.1.61 203.81.29.137 TCP 13886 > http [FIN, ACK] Seq=409 Ack=35882 Win=257760 Len=0 49 0.644106 192.168.1.61 203.81.29.137 TCP 13887 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 51 0.651919 203.81.29.137 192.168.1.61 TCP http > 13886 [FIN, ACK] Seq=35882 Ack=410 Win=16872 Len=0 53 0.676377 203.81.29.137 192.168.1.61 TCP http > 13887 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 99 1.310379 192.168.1.61 203.81.29.137 TCP 13887 > http [FIN, ACK] Seq=409 Ack=35882 Win=257760 Len=0 101 1.347949 203.81.29.137 192.168.1.61 TCP http > 13887 [FIN, ACK] Seq=35882 Ack=410 Win=16872 Len=0
在这U情况下Q数据包非常(没有选择下蝲资源文g入css,js,gif{)(j)Q对比第一U情况,你会(x)发现它徏立了两个q接Q这是E的作用,它对于每ơP代都当成一个新的用P需要重新徏立连接?
3. 选择DE(F)
l果Q共获取数据?782个,建立q接6个(U色标识Q,断开q接6个(蓝色标识Q?/p>
No. Time Source Destination Protocol Info 1 0.000000 192.168.1.61 203.81.29.137 TCP 14016 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 2 0.037911 203.81.29.137 192.168.1.61 TCP http > 14016 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 6 0.107432 192.168.1.61 203.81.29.137 TCP 14017 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 9 0.141816 203.81.29.137 192.168.1.61 TCP http > 14017 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 426 3.334889 192.168.1.61 203.81.29.137 TCP 14017 > http [FIN, ACK] Seq=1852 Ack=150284 Win=257484 Len=0 428 3.372253 203.81.29.137 192.168.1.61 TCP http > 14017 [FIN, ACK] Seq=150284 Ack=1853 Win=16998 Len=0 448 4.395488 192.168.1.61 203.81.29.137 TCP 14020 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 457 4.439604 203.81.29.137 192.168.1.61 TCP http > 14020 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 859 7.593610 192.168.1.61 203.81.29.137 TCP 14016 > http [FIN, ACK] Seq=2849 Ack=377404 Win=257484 Len=0 870 7.659680 203.81.29.137 192.168.1.61 TCP http > 14016 [FIN, ACK] Seq=377404 Ack=2850 Win=15935 Len=0 888 8.511308 192.168.1.61 203.81.29.137 TCP 14020 > http [FIN, ACK] Seq=1602 Ack=208150 Win=257760 Len=0 890 8.549451 203.81.29.137 192.168.1.61 TCP http > 14020 [FIN, ACK] Seq=208150 Ack=1603 Win=17280 Len=0 892 8.566246 192.168.1.61 203.81.29.137 TCP 14022 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 893 8.601893 203.81.29.137 192.168.1.61 TCP http > 14022 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 899 8.702628 192.168.1.61 203.81.29.137 TCP 14023 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 904 8.741807 203.81.29.137 192.168.1.61 TCP http > 14023 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 1298 11.809456 192.168.1.61 203.81.29.137 TCP 14022 > http [FIN, ACK] Seq=1550 Ack=159770 Win=257484 Len=0 1310 11.878665 203.81.29.137 192.168.1.61 TCP http > 14022 [FIN, ACK] Seq=159770 Ack=1551 Win=17280 Len=0 1341 12.771707 192.168.1.61 203.81.29.137 TCP 14026 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 1348 12.813950 203.81.29.137 192.168.1.61 TCP http > 14026 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 1759 16.032952 192.168.1.61 203.81.29.137 TCP 14023 > http [FIN, ACK] Seq=3151 Ack=367918 Win=257484 Len=0 1761 16.068296 203.81.29.137 192.168.1.61 TCP http > 14023 [FIN, ACK] Seq=367918 Ack=3152 Win=17280 Len=0 1779 16.983042 192.168.1.61 203.81.29.137 TCP 14026 > http [FIN, ACK] Seq=1602 Ack=208150 Win=257760 Len=0 1781 17.016836 203.81.29.137 192.168.1.61 TCP http > 14026 [FIN, ACK] Seq=208150 Ack=1603 Win=17280 Len=0
在这U情况下Q数据包的数量非常大Q连接也很多Q由于没有cache功能Q每ơ打开面都需要重C载所有的资源文g?
4. 选择ADE
l果Q共获取数据?25个,建立q接3个,断开q接3?不再标识了,syn即ؓ(f)q接hQfin即ؓ(f)断开hQ?/p>
No. Time Source Destination Protocol Info 1 0.000000 192.168.1.61 203.81.29.137 TCP 14189 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 2 0.033657 203.81.29.137 192.168.1.61 TCP http > 14189 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 6 0.100636 192.168.1.61 203.81.29.137 TCP 14190 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 9 0.133703 203.81.29.137 192.168.1.61 TCP http > 14190 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 429 3.383748 192.168.1.61 203.81.29.137 TCP 14190 > http [FIN, ACK] Seq=1852 Ack=150284 Win=257484 Len=0 431 3.418556 203.81.29.137 192.168.1.61 TCP http > 14190 [FIN, ACK] Seq=150284 Ack=1853 Win=16998 Len=0 471 4.352071 192.168.1.61 203.81.29.137 TCP 14189 > http [FIN, ACK] Seq=1504 Ack=235576 Win=257760 Len=0 472 4.380312 192.168.1.61 203.81.29.137 TCP 14192 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 474 4.389778 203.81.29.137 192.168.1.61 TCP http > 14189 [FIN, ACK] Seq=235576 Ack=1505 Win=17280 Len=0 476 4.413220 203.81.29.137 192.168.1.61 TCP http > 14192 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 522 5.078068 192.168.1.61 203.81.29.137 TCP 14192 > http [FIN, ACK] Seq=409 Ack=35882 Win=257760 Len=0 524 5.115099 203.81.29.137 192.168.1.61 TCP http > 14192 [FIN, ACK] Seq=35882 Ack=410 Win=16872 Len=0
在这U情况下Qcache发挥作用Q数据包Ҏ(gu)W三U情况大大减,几乎{于打开一ơ首늚数据量(449个数据包Q,只有W一ơ打开面需要完整下载页面(包括资源文gQ,后面的三ơ打开面都只要下载HTML面Q不包括资源文gQ?
5. 选择ADEF
选择F之后我们看看l果Q共获取数据?42个,建立q接4个,断开q接4?/p>
No. Time Source Destination Protocol Info 1 0.000000 192.168.1.61 203.81.29.137 TCP 14292 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 2 0.034524 203.81.29.137 192.168.1.61 TCP http > 14292 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 6 0.102314 192.168.1.61 203.81.29.137 TCP 14294 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 9 0.139752 203.81.29.137 192.168.1.61 TCP http > 14294 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 426 3.791111 192.168.1.61 203.81.29.137 TCP 14294 > http [FIN, ACK] Seq=1852 Ack=150284 Win=257484 Len=0 428 3.824970 203.81.29.137 192.168.1.61 TCP http > 14294 [FIN, ACK] Seq=150284 Ack=1853 Win=16998 Len=0 468 6.213276 192.168.1.61 203.81.29.137 TCP 14292 > http [FIN, ACK] Seq=1504 Ack=235576 Win=257760 Len=0 469 6.244052 192.168.1.61 203.81.29.137 TCP 14297 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 471 6.249564 203.81.29.137 192.168.1.61 TCP http > 14292 [FIN, ACK] Seq=235576 Ack=1505 Win=17280 Len=0 473 6.279647 203.81.29.137 192.168.1.61 TCP http > 14297 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 479 6.374967 192.168.1.61 203.81.29.137 TCP 14298 > http [SYN] Seq=0 Len=0 MSS=1460 WS=2 484 6.419597 203.81.29.137 192.168.1.61 TCP http > 14298 [SYN, ACK] Seq=0 Ack=1 Win=17280 Len=0 MSS=1440 WS=0 897 9.858493 192.168.1.61 203.81.29.137 TCP 14297 > http [FIN, ACK] Seq=1550 Ack=159770 Win=257484 Len=0 899 9.895188 203.81.29.137 192.168.1.61 TCP http > 14297 [FIN, ACK] Seq=159770 Ack=1551 Win=17280 Len=0 939 12.840029 192.168.1.61 203.81.29.137 TCP 14298 > http [FIN, ACK] Seq=1806 Ack=226090 Win=257760 Len=0 941 12.876120 203.81.29.137 192.168.1.61 TCP http > 14298 [FIN, ACK] Seq=226090 Ack=1807 Win=17076 Len=0
在这U情况下Q由于选择了FQ在q代的时候清除了cacheQ所以每ơP代都需要重C载资源文件。数据包差不多等于第三种情况的一半,U等于打开两次首页的数据量Q?49×2个数据包Q?
6. 关于BC选项
C的解释(Check for newer versions of stored pages every visit to the pageQ?/i>
C比较Ҏ(gu)理解Q类似IE讄中的每次(g)查,如果不设|CQLR对于已经cache的文件就不会(x)重新向服务器hQ如果选择CQ你可以在数据包中发现很多304信息?
B的解释(Cache URLs requiring content(HTMLs)Q?/i>
LR对于资源文g的cacheq不?x)真正cache在内存中或者在盘上,q个选项表示Q对于一些需要用到的兌Q校验,面解析内容真正cache在内存中Q减客L(fng)的重复工作?
当然如果你想把GIF也cache到内存中Q你可以在Advanced中设|,选择Specify URL requiring content in addition to HTML pagesQ加入条目image/gifQƈN。当Vuserq行的时候,你可以对比一下mmdrv.exeq程的内存消耗(内存占用?x)更多?j)?
四:(x) l论
通过上面的测试分析,我们大概知道了每个选项的真正含义,你需要根据你的测试目的来选择合适的讄Q?
1?对于一个具体的应用试Q对于前端Web Server不可忽略Q缺省设|非常合适,不需要调_(d)有时候需要考虑把C选上Q?
注意Q很多h在录制脚本的时候,?fn)惯把登入操作放到vuser_init中,q时候缺省设|可能会(x)抛错Q徏议把q类的操作都攑օ到action?
2?如果你更x后端应用服务器的性能或者说做一些架构的验证分析Q那你缺省设|对于你来说׃合适了Q你需要选择取消所有的讄V?
当然你也可以Ҏ(gu)自己的具体情况做不同调整Q但是一定要真正理解q些选项的具体含义才能做C犯错?/p>
~译的时候出现java抛如下异常:(x)
java.nio.BufferOverflowException
at java.nio.Buffer.nextPutIndex(Buffer.java:419)
at java.nio.HeapCharBuffer.put(HeapCharBuffer.java:145)
at com.sun.tools.javac.parser.Scanner.decode(Scanner.java:405)
at com.sun.tools.javac.parser.Scanner.<init>(Scanner.java:304)
at com.sun.tools.javac.parser.Scanner.<init>(Scanner.java:238)
at com.sun.tools.javac.parser.Scanner$Factory.newScanner(Scanner.java:72)
at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:254)
at com.sun.tools.javac.main.JavaCompiler.parse(JavaCompiler.java:281)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:399)
at com.sun.tools.javac.main.Main.compile(Main.java:592)
at com.sun.tools.javac.main.Main.compile(Main.java:544)
at com.sun.tools.javac.Main.compile(Main.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.tools.ant.taskdefs.compilers.Javac13.execute(Javac13.java:55)
at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:936)
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:758)
at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:275)
at org.apache.tools.ant.Task.perform(Task.java:364)
at org.apache.tools.ant.Target.execute(Target.java:341)
at org.apache.tools.ant.Target.performTasks(Target.java:369)
at org.apache.tools.ant.Project.executeTarget(Project.java:1214)
at com.primeton.studio.compile.java.bizlets.BizletProcessor.startAnt(BizletProcessor.java:327)
at com.primeton.studio.compile.java.bizlets.BizletProcessor.prepareclass(BizletProcessor.java:419)
at com.primeton.studio.compile.java.bizlets.BizletProcessor.init(BizletProcessor.java:374)
at com.primeton.studio.compile.java.bizlets.BizletProcessor.build(BizletProcessor.java:130)
at com.primeton.studio.compile.frame.ProjectProcessor.buildBizlets(ProjectProcessor.java:161)
at com.primeton.studio.compile.frame.ProjectProcessor.build(ProjectProcessor.java:115)
at com.primeton.studio.compile.frame.SimpleBuilder.build(SimpleBuilder.java:195)
at com.primeton.studio.compile.frame.SimpleBuilder.build(SimpleBuilder.java:182)
at com.primeton.studio.compile.frame.SimpleBuilder.main(SimpleBuilder.java:265)
查了一下,估计是java采用gbk字符集(~省windows的中文字W集Q,Dstack区溢出(明显没对国际化测试不_Q?
解决问题的方法就是修改系l的~省区域讄为English既可?/p>