﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-我的ITblog我作主　　关注→　『伊波拉』→　测试　SzDlinXie- ITblog　　  　　   -随笔分类-性能测试技术资料</title><link>http://www.cnitblog.com/szdlinxie/category/4495.html</link><description>·√·  本ITblog站点记录相关的软件技术文档、网络技术杂志、测试技术杂谈等技术文档的管理站点.联系方式：MSN：dowling@sunlike.cn   QQ:94595885</description><language>zh-cn</language><lastBuildDate>Tue, 04 Oct 2011 09:40:46 GMT</lastBuildDate><pubDate>Tue, 04 Oct 2011 09:40:46 GMT</pubDate><ttl>60</ttl><item><title>Linux服务器性能数据收集-Sysstat介绍</title><link>http://www.cnitblog.com/szdlinxie/archive/2008/05/06/43396.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 06 May 2008 03:12:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2008/05/06/43396.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/43396.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2008/05/06/43396.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/43396.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/43396.html</trackback:ping><description><![CDATA[&nbsp;
<p align=center><strong><span>Linux</span></strong><strong><span>服务器性能数据收集</span></strong></p>
<p align=center><strong><span>Sysstat</span></strong><strong><span>介绍</span></strong></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp; <strong><u><span>Linux</span></u></strong></span><span>中的<span>top,free</span>等命令不能完全满足我们性能数据收集的要求，我们需要一个更加强大的工具来收集性能数据。经过考察和对比，发现<span>Sysstat</span>是一个非常强大的工具，因此下载了试了下，效果不错。<span>Sysstat</span>是一个工具集，包括<span>sar</span>、<span>pidstat</span>、<span>iostat</span>、<span>mpstat</span>、<span>sadf</span>、<span>sadc</span>。其中<span>sar</span>是其中最强大，也是最能符合我们<strong><u><span>测试</span></u></strong>要求的工具，同时<span>pidstat</span>也是非常有用的东东，因此本文结合<strong><u><span>性能测试</span></u></strong>重点介绍这两个工具。<span> </span></span></p>
<p align=left><strong><span>Sysstat</span></strong><strong><span>的安装</span></strong></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>从<span>http://pagesperso-orange.fr/sebastien.godard/download.html</span>下载最新版本，解压，安装<span> </span></span></p>
<ul type=disc>
    <li><span>&nbsp;wget&nbsp;http://pagesperso-orange.fr/sebastien.godard/sysstat-<st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899">8.1.2</st1:chsdate>.tar.gz<br>&nbsp;tar&nbsp;zxvf&nbsp;sysstat-8.1.2.tar.gz<br>&nbsp;cd&nbsp;sysstat-8.1.2<br>&nbsp;./configure<br>&nbsp;make<br>&nbsp;su<br>&nbsp;&lt;enter&nbsp;root&nbsp;password&gt;<br>&nbsp;make&nbsp;install</span></li>
</ul>
<p align=left><strong><span>监视某个进程</span></strong></p>
<p align=left><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>通过<span>ps</span>命令找到相应进程的<span>PID</span>：<span> </span></span></p>
<p align=left><span><img src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1040"><span>ps&nbsp;-e</span></span></p>
<p align=left><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>使用<span>pidstat</span>命令监视进程，详细用法见：<u><span>http://pagesperso-orange.fr/sebastien.godard/man_pidstat.html</span></u><span> </span></span></p>
<p align=left><span>pidstat&nbsp;</span><span>2</span>&nbsp;<span>5</span><span>&nbsp;<br></span><span>//</span><span>每隔<span>2</span>秒，显示<span>5</span>次，所有活动进程的<span>CPU</span>使用情况<span><br></span></span><span>pidstat&nbsp;-p&nbsp;</span><span>3132</span>&nbsp;<span>2</span>&nbsp;<span>5</span><span>&nbsp;<br></span><span>//</span><span>每隔<span>2</span>秒，显示<span>5</span>次，<span>PID</span>为<span>1643</span>的进程的<span>CPU</span>使用情况显示<span><br></span></span><span>pidstat&nbsp;-p&nbsp;</span><span>3132</span>&nbsp;<span>2</span>&nbsp;<span>5</span><span>&nbsp;-r<br></span><span>//</span><span>每隔<span>2</span>秒，显示<span>5</span>次，<span>PID</span>为<span>1643</span>的进程的内存使用情况显示</span></p>
<p align=left><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>很可惜的是，<span>pidstat</span>命令没有保存性能数据的功能。<span> </span></span></p>
<p align=left><strong><span>查看性能数据</span></strong></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>在<span>sysstat</span>工具包中，<span>sar</span>是最强大的了，通过<span>sar</span>几乎可以监视所有的性能数据，同时，<span>sar</span>还支持将性能数据保存起来。<span><br>sar</span>详细用法请见：<span><a href="http://pagesperso-orange.fr/sebastien.godard/man_sar.html">http://pagesperso-orange.fr/sebastien.godard/man_sar.html</a> </span></span></p>
<p align=left><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>查看<span>CPU</span>使用情况<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1041"><span>sar&nbsp;</span><span>2</span>&nbsp;<span>5</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1042"></span><span>//</span></span><span>每隔<span>2</span>秒，显示<span>5</span>次，<span>CPU</span>使用的情况</span></p>
<p align=left><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>查看内存使用情况<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1043"><span>sar&nbsp;-r&nbsp;</span><span>2</span>&nbsp;<span>5</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1044"></span><span>//</span></span><span>每隔<span>2</span>秒，显示<span>5</span>次，内存使用的情况</span></p>
<p align=left><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>查看网络吞吐量<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1045"><span>sar&nbsp;-n&nbsp;DEV&nbsp;</span><span>2</span>&nbsp;<span>5</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1046"></span><span>//</span></span><span>每隔<span>2</span>秒，显示<span>5</span>次，网络吞吐量情况</span></p>
<p align=left><strong><span>保存性能数据</span></strong></p>
<p align=left><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sar</span><span>支持保存成两种格式的文件，一种是文本文件，一种是二进制文件（只有通过<span>sar</span>自己的命令才能查看）。<span> </span></span></p>
<p align=left><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>保存为文本文件</span></strong><span><br><br></span><span>结合上面的查看命令，加入<span> &gt; filename </span>参数即可保存文本文件，下面列出几个有用的命令：<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1047"><span>sar&nbsp;</span><span>1</span>&nbsp;<span>10</span><span>&nbsp;&gt;&nbsp;data.txt<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1048"></span><span>//</span></span><span>每隔<span>1</span>秒，写入<span>10</span>次，把<span>CPU</span>使用数据保存到<span>data.txt</span>文件中。<span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1049"></span></span><span>sar&nbsp;</span><span>1</span>&nbsp;<span>0</span><span>&nbsp;-e&nbsp;</span><span>15</span><span>:</span><span>00</span><span>:</span><span>00</span><span>&nbsp;&gt;&nbsp;data.txt<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1050"></span><span>//</span><span>每隔<span>1</span>秒记录<span>CPU</span>的使用情况，直到<span>15</span>点，数据将保存到<span>data.txt</span>文件中。<span>(-e&nbsp;</span>参数表示结束时间，注意时间格式：必须为<span>hh:mm:ss</span>格式<span>)<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1051"></span></span><span>sar&nbsp;</span><span>1</span>&nbsp;<span>0</span><span>&nbsp;-r&nbsp;-e&nbsp;</span><span>15</span><span>:</span><span>00</span><span>:</span><span>00</span><span>&nbsp;&gt;&nbsp;data.txt<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1052"></span><span>//</span><span>每隔<span>1</span>秒记录内存使用情况，直到<span>15</span>点，数据将保存到<span>data.txt</span>文件中。<span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1053"></span></span><span>sar&nbsp;</span><span>1</span>&nbsp;<span>0</span><span>&nbsp;-n&nbsp;DEV&nbsp;-e&nbsp;</span><span>15</span><span>:</span><span>00</span><span>:</span><span>00</span><span>&nbsp;&gt;&nbsp;data.txt<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1054"></span><span>//</span><span>每隔<span>1</span>秒记录网络使用情况，直到<span>15</span>点，数据将保存到<span>data.txt</span>文件中。</span></p>
<p align=left><span>用<span>WinSCP</span>工具从<span>Linux</span>服务器上取下<span>data.txt</span>文件，内容如下：</span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1055"><span>Linux&nbsp;</span><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899"><span>2.6</span><span>.</span><span>18</span></st1:chsdate><span>-</span><span>53</span><span>.el5&nbsp;(Performancesvr5)&nbsp;&nbsp;<st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="05" Month="05" Year="2008">2008<span><span>年05</span></span><span><span>月05</span></span><span><span>日</span></span></st1:chsdate>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_x86_64_<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1056"><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1057">&nbsp;11</span></span><span>时<span>04</span>分<span>05</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%nice&nbsp;&nbsp;&nbsp;%system&nbsp;&nbsp;&nbsp;%iowait&nbsp;&nbsp;&nbsp;&nbsp;%steal&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%idle<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1058">&nbsp;11</span>时<span>04</span>分<span>06</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.75</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1030">&nbsp;11</span><span>时<span>04</span>分<span>07</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.75</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1031">&nbsp;11</span><span>时<span>04</span>分<span>08</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>1.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>98.00</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1032">&nbsp;11</span><span>时<span>04</span>分<span>09</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.25</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1033">&nbsp;11</span><span>时<span>04</span>分<span>10</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>100.00</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1034">&nbsp;11</span><span>时<span>04</span>分<span>11</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.50</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1035">&nbsp;11</span><span>时<span>04</span>分<span>12</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.75</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1036">&nbsp;11</span><span>时<span>04</span>分<span>13</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.99</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>98.01</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1037">&nbsp;11</span><span>时<span>04</span>分<span>14</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>1.25</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>98.75</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1038">&nbsp;11</span><span>时<span>04</span>分<span>15</span>秒<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.50</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.50</span><span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1039">&nbsp;</span><span>平均时间<span>:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span>0.20</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.15</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.42</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>0.00</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>99.23</span></p>
<p align=left><span>有了这份数据，就可以轻松的使用<span>WPS</span>表格来统计<span>CPU</span>的使用情况了。<span> </span></span></p>
<p align=center><span><img border=0 alt=111 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image002.jpg" width=529 height=278 v:shapes="_x0000_i1025"></span></p>
<p align=left><strong><span>保存为二进制文件</span></strong><span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span>由于保存的二进制文件只有<span>sar</span>通过<span>-f</span>参数才能打开，不利于我们分析和统计数据，因此不推荐使用这个方法。保存二进制文件的参数是<span>-o</span>，如：<span> </span></span></p>
<p align=left><span><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1026"><span>sar&nbsp;</span><span>1</span>&nbsp;<span>5</span><span>&nbsp;-r&nbsp;-o&nbsp;data<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1027"></span><span>//</span></span><span>每隔<span>1</span>秒，写入<span>5</span>次，将内存使用的数据写入二进制文件<span>data</span>中。<span><br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1028"></span></span><span>sar&nbsp;-f&nbsp;data<br><img border=0 src="file:///D:/DOCUME~1/ADMINI~1/LOCALS~1/Temp/msohtml1/04/clip_image001.gif" width=11 height=16 v:shapes="_x0000_i1029"></span><span>//</span><span>查看<span>data</span>文件</span></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/43396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2008-05-06 11:12 <a href="http://www.cnitblog.com/szdlinxie/archive/2008/05/06/43396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rational Robot 基础使用手册</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27372.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 21 May 2007 06:17:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27372.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/27372.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/27372.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/27372.html</trackback:ping><description><![CDATA[<p>Rational Robot 基础使用手册<br>目录..................................................................................................................................................................................... 1<br>第一章 绪论....................................................................................................................................................................... 3<br>一、概述......................................................................................................................................................................... 3<br>二、基本概念................................................................................................................................................................. 4<br>第二章 使用....................................................................................................................................................................... 5<br>一、GUI 脚本................................................................................................................................................................. 5<br>（一）、设置以及预定义........................................................................................................................................... 5<br>（二）、记录GUI 脚本............................................................................................................................................ 10<br>（三）、在GUI Script 中加入特写........................................................................................................................... 17<br>（四）、使用查证点................................................................................................................................................. 22<br>（五）、使用Datapools............................................................................................................................................ 23<br>（六）、编辑GUI 脚本............................................................................................................................................ 25<br>（七）、编译GUI 脚本............................................................................................................................................ 26<br>（八）、调试GUI 脚本............................................................................................................................................ 27<br>（九）、回放GUI 脚本............................................................................................................................................ 29<br>（十）、工具条操作................................................................................................................................................. 30<br>二、VU 脚本................................................................................................................................................................ 32<br>（一）、设置以及预定义......................................................................................................................................... 32<br>（二）、记录VU 脚本.............................................................................................................................................. 32<br>（三）、回放VU 脚本.............................................................................................................................................. 33<br>（四）、重录VU 脚本.............................................................................................................................................. 33<br>（五）、复制VU 脚本.............................................................................................................................................. 34<br>（六）、删除VU 脚本.............................................................................................................................................. 34<br>（七）、编译VU 脚本.............................................................................................................................................. 34<br>（八）、查询会话中的脚本列表.............................................................................................................................. 34<br>（九）、用会话生成脚本......................................................................................................................................... 35<br>（十）、将VU 脚本融入会话.................................................................................................................................. 35<br>（十一）、手工VU 脚本编码.................................................................................................................................. 35<br>三、VB 脚本................................................................................................................................................................. 36<br>四、SQA BASIC............................................................................................................................................................. 37<br>（一）、定制SQA Basic 脚本.................................................................................................................................. 37<br>五、测试应用程序....................................................................................................................................................... 42<br>（一）、测试Delphi 应用程序................................................................................................................................. 42<br>51Testing 软件测试网<br>（二）、测试Visual Basic 应用程序......................................................................................................................... 43<br>第三章 参考................................................................................................................................................................... 44<br>（一）查证点............................................................................................................................................................... 44<br>（二）查证方法........................................................................................................................................................... 45<br>（三）鉴别方法........................................................................................................................................................... 45<br>（四）标准数据类型................................................................................................................................................... 45<br>（五）RATIONAL ROBOT 命令行选项....................................................................................................................... 45<br>（六）RATIONAL ROBOT 窗口.................................................................................................................................. 45<br>（七）菜单................................................................................................................................................................... 45<br></p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/27372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2007-05-21 14:17 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rational Robot 创建测试脚本</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20902.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Thu, 21 Dec 2006 03:16:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20902.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20902.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20902.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20902.html</trackback:ping><description><![CDATA[
		<strong>
				<font color="#000066">Rational Robot 创建测试脚本<br /><h3><font size="3">目的</font></h3><p>        本工具向导说明了如何使用 Rational Robot<sup><sup>TM</sup></sup> 来记录测试脚本以及在记录脚本之后如何通过编辑脚本对其进行扩展。</p><p>相关的 Rational Unified Process 活动： 
</p><ul><li>活动：实施测试中的“记录或通过编程创建测试脚本”部分 </li></ul><h3><font size="3">概述</font></h3><p>本工具向导适用于 Microsoft Windows 95/98/NT 4.0。</p><p>要使用 Robot 来记录和扩展脚本，请执行以下步骤： 
</p><ol><li>在 Robot 中记录脚本。 
</li><li>插入核实点。 
</li><li>必要时编辑测试脚本。 
</li><li>回放脚本。 
</li><li>在 LogViewer 中查看结果。 
</li><li>用比较器分析核实点结果。 </li></ol><h3><font size="3">1. 在 Robot 中记录脚本 <img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></font></h3><p>当您记录脚本时，Robot 会记录以下内容： 
</p><ul><li>您与所测试的应用程序进行交互时执行的操作。这些用户操作包括帮助您在应用程序中浏览的击键和鼠标点击操作。 
</li><li>您创建用来获取和保存有关特定对象信息的核实点。核实点是您在脚本中创建的一个点，用来确定跨多个工作版本的对象的状态和行为。在记录过程中，核实点获取对象的信息并将其存储为基线。而在回放过程中，核实点将再次获取对象信息，并将该信息与基线进行比较。 </li></ul><p>记录的脚本为所测试的应用程序建立预期行为的基线。得到应用程序的修订工作版本之后，您便可以回放脚本，根据已建立的基线对应用程序的新工作版本进行测试，这样做占用的时间只是手工测试所需时间的一小部分。</p><p>在记录和回放过程中，Robot 面向对象的记录技术在 Windows 层检查所测试应用程序中的对象。因此，脚本的回放通常并不依赖于屏幕的绝对坐标。面向对象的记录技术使脚本不受用户界面微小变化的影响，从而简化了脚本的维护。</p><p>要记录新脚本，请执行以下步骤：</p><center><table cellpadding="5" width="85%" border="0"><tbody><tr><td valign="top" align="right" width="33">1.</td><td width="558">在 TestManager 中输入测试脚本属性，准备记录测试脚本。请参见“工具向导：使用 Rational TestManager™ 获取确定和结构化测试过程的结果“。</td></tr><tr><td valign="top" align="right" width="33">2.</td><td width="558">通过设置记录选项来准备测试环境。请参见“工具向导：在 Rational Robot 中设置测试环境“。</td></tr><tr><td valign="top" align="right" width="33"></td><td width="558">启动所测试的应用程序。（或者，您也可以在开始记录之后，单击 Robot 中的 <b>Insert &gt; Start Application</b> 来启动所测试的应用程序。）</td></tr><tr><td valign="top" align="right" width="33">3.</td><td width="558">单击 Robot 工具栏上的 <strong>Record GUI Script</strong> 按钮。</td></tr><tr><td valign="top" align="right" width="33">4.</td><td width="558">键入一个名称（最长为 40 个字符）或从列表中进行选择。</td></tr><tr><td valign="top" align="right" width="33">5.</td><td width="558">列出的脚本在 TestManager 中已有定义或已在 Robot 中记录。</td></tr><tr><td valign="top" align="right" width="33">6.</td><td width="558">要改变记录选项，请单击 <b>Options</b>。完成后，单击 <b>OK</b>。</td></tr><tr><td valign="top" align="right" width="33">7.</td><td width="558">如果您选择了一个以前已定义或已记录的脚本，可以通过单击 <b>Properties</b> 来改变其属性。完成后，单击 <b>OK</b>。</td></tr><tr><td valign="top" align="right" width="33">8.</td><td width="558">单击 <b>OK</b> 开始记录。将出现以下事件：</td></tr><tr><td valign="top" align="right" width="33"></td><td width="558"><ul><li>如果您选择了一个已记录的脚本，Robot 会询问您是否要覆盖它。单击 Yes。（如果在现有的 GUI 脚本上进行记录，该脚本文件会被覆盖，但所有现有的属性将适用于新脚本。） </li></ul></td></tr><tr><td valign="top" align="right" width="33"></td><td width="558"><ul><li>Robot 最小化（默认行为）。 </li></ul></td></tr><tr><td valign="top" align="right" width="33"></td><td width="558"><ul><li>出现浮动的 GUI Record 工具栏。使用此工具栏，您可以暂停或停止记录、重新显示 Robot 或向脚本中添加功能部件。 </li></ul></td></tr><tr><td valign="top" align="right" width="33">9.</td><td width="558">通过执行过程中确定的操作来执行测试过程，同时插入必要的功能部件（例如核实点、注释和定时器）。有关详细信息，请参见 Robot 联机帮助。</td></tr><tr><td valign="top" align="right" width="33">10.</td><td width="558">如果必要，可以从“面向对象的记录”切换到低层记录。</td></tr><tr><td valign="top" align="right" width="33">11.</td><td width="558">“面向对象的记录”检查所测试应用程序中的 Windows GUI 对象和其他对象，不依赖于精确的计时或屏幕坐标。而低层记录则利用屏幕坐标和精确的计时来跟踪每次鼠标的移动和键盘操作。</td></tr><tr><td valign="top" align="right" width="33">12.</td><td width="558">完成后，单击 GUI Record 工具栏上的 <strong>Stop Recording</strong> 按钮。将出现以下事件：</td></tr><tr><td valign="top" align="right" width="33"></td><td width="558"><ul><li>所记录的脚本出现在 Robot 主窗口中一个 Script 窗口内。 </li></ul></td></tr><tr><td valign="top" align="right" width="33"></td><td width="558"><ul><li>此脚本中的核实点（如果有的话）显示在左侧的 Asset 窗格中。 </li></ul></td></tr><tr><td valign="top" align="right" width="33"></td><td width="558"><ul><li>此脚本的文本显示在右侧的 Script 窗格中。 </li></ul></td></tr><tr><td valign="top" align="right" width="33"></td><td width="558"><ul><li>当编译或回放脚本时，编译结果将显示在 Output 窗口的 Build 选项卡中。 </li></ul></td></tr><tr><td valign="top" align="right" width="33">13.</td><td width="558">单击 <strong>File &gt; Properties</strong> 是另一种设置脚本属性的方法。</td></tr></tbody></table></center><center><br /></center><center><h3 align="left">2. <a name="heading of tool step two"><u>插入核实点</u></a><a href="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/toolment/robot/tm_imtst.htm#Top"><img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></a></h3></center><p align="left">要在记录或编辑脚本时插入核实点，请执行以下步骤： 
</p><center><ol><li><div align="left">进行以下操作之一： </div></li></ol></center><blockquote><ul><li><div align="left">如果要进行记录，单击 GUI Record 工具栏上的 Display GUI Insert Toolbar 按钮。 </div></li><li><div align="left">如果要进行编辑，在脚本中定位指针并单击 Standard 工具栏上的 Display GUI Insert Toolbar 按钮。 </div></li></ul></blockquote><div align="center"><ol start="2"><li><div align="left">单击 GUI Insert 工具栏上的核实点按钮。 </div><p align="left">核实点依照其类型命名（如果脚本中有多个同一类型的核实点，名称中还应该有一个数字）。</p></li><li><div align="left">对名称进行适当的编辑。 </div></li><li><div align="left">设置等待状态选项（此操作可选）。 </div></li><li><div align="left">设置预期结果选项（此操作可选）。 </div></li><li><div align="left">单击 OK。<br /></div></li><li><div align="left">如果提示您选择一个对象，请将对象定位工具拖动到所需的对象上，然后松开鼠标左键，这样便可以选中该对象。或者，还可以通过单击 Browse 按钮从对象列表中选择对象。选择了所需的对象之后，单击 OK。 </div></li></ol></div><p align="left">有关详细信息，请参见 Robot 联机帮助和 Using Rational Robot 手册中的 Creating Verification Points in GUI Scripts 一章。</p><h3 align="left">3. <a name="step three"><u>必要时编辑测试脚本</u></a><a href="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/toolment/robot/tm_imtst.htm#Top"><img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></a></h3><p align="left">可以手工更改脚本的文本或添加新的功能部件来编辑现有的脚本。例如，您可以： 
</p><ul><li><div align="left">编辑脚本的文本（删除行、移动文本等） </div></li><li><div align="left">向现有的脚本添加新的用户操作（选择菜单命令、单击按钮等） </div></li><li><div align="left">向现有的脚本添加新的功能部件（添加核实点、注释等） </div></li><li><div align="left">转至带有编译器错误的行（转至特定的行号、查找下一个错误等） </div></li></ul><p align="left">有关详细信息，请参见 Robot 联机帮助和 Using Rational Robot 手册中的 Editing, Compiling, and Debugging Scripts 一章。</p><h3 align="left">4. <a name="step four"><u>回放脚本</u></a><a href="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/toolment/robot/tm_imtst.htm#Top"><img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></a></h3><p align="left">回放脚本时，Robot 会重复您所记录的操作并自动进行软件测试。与手工测试相比，自动测试可以使您对应用程序的每一个新的工作版本进行更快、更完全的测试。这不但可以缩短测试时间，而且可以扩大测试覆盖面并保持整体的一致性。</p><p align="left">脚本回放一般有两个阶段： 
</p><ul><li><div align="left">测试实施 - 使用所测试的应用程序的同一个工作版本（与您用来记录的工作版本相同），回放脚本来检查它们是否按预期的方式工作。这样即可为所测试的应用程序核实其预期行为的基线。 </div></li><li><div align="left">测试执行和回归 - 回放脚本，将所测试的应用程序的最新工作版本和在测试实施过程中建立的基线进行比较。测试过程中对所有测试脚本的回放可以说明从上一个工作版本之后该应用程序中出现的所有不同之处。通过对这些不同之处进行评估，可以确定它们是实际缺陷还是有意变更。 </div></li></ul><p align="left">在进行回放之前，如果一个脚本在上一次运行之后已经发生变化，Robot 将对其进行自动编译。</p><p align="left">有关为脚本回放准备测试环境的详细信息，请参见“工具向导：在 Rational Robot 中设置测试环境“。</p><p align="left">要回放脚本，请执行以下步骤： 
</p><ol><li><div align="left">单击工具栏上的 Playback Script 按钮。将出现 Playback 对话框。 </div></li><li><div align="left">键入一个脚本名或从列表中选择一个脚本。 </div><p align="left">查询将决定列表中出现哪些名称和字段。如果要改变列表，可以从 Query 下拉列表中选择查询。通过这种方法可以在 TestManager 中创建新查询。</p></li><li><div align="left">如果要改变 Playback 选项，请单击 Options。完成后，单击 OK。有关 Playback 选项的详细信息，请参见“工具向导：在 Rational Robot 中设置测试环境“。</div></li></ol><ol start="4"><li><div align="left">单击 OK 继续下一步。 </div></li><li><div align="left">如果出现 Specify Log Information 对话框，则进行以下操作： </div></li></ol><blockquote><ul><li><div align="left">从列表中选择一个工作版本。如果要创建新的工作版本，请单击右侧的“Build”按钮。也可以使用 TestManager 来创建工作版本。 </div></li><li><div align="left">从列表中选择一个日志文件夹。要创建新的日志文件夹，请单击右侧的 Log Folder 按钮。也可以使用 TestManager 来创建日志文件夹。 </div></li><li><div align="left">接受默认的日志名（同于脚本的名称），或者键入新名称。 </div></li><li><div align="left">单击 OK。 </div></li></ul></blockquote><ol start="6"><li><div align="left">如果出现提示信息，询问您是否要覆盖该日志，请单击 Yes。 </div></li></ol><p align="left">注：如果要停止回放脚本，请按 F11 键。只有当回放面向对象的命令时，才可以在 Robot 中使用 F11 键。在低层操作中，F11 键不能停止回放。<br /><br /></p><h3 align="left">5. <a name="step five"><u>在 LogViewer 中查看结果</u></a><a href="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/toolment/robot/tm_imtst.htm#Top"><img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></a></h3><p align="left">回放结束后，使用 Rational LogViewer 来查看回放结果，包括核实点故障、过程故障、异常中止和任何其他回放信息。</p><p align="left">要控制日志信息和 LogViewer 的显示，您可以在 UI Playback Options 对话框的 Log 选项卡中设置选项。 
</p><ul><li><div align="left">要用回放结果来更新储存库，请选择 <b>Output playback results to log</b>。单击要输出到日志的细节量。 </div></li><li><div align="left">要在回放之后自动显示 LogViewer，请选择 <b>View log after playback</b>。 </div></li></ul><p align="left">如果未选择该选项，您可以在回放结束后通过单击 <b>Tools &gt; Rational Test &gt; LogViewer</b> 来显示 LogViewer。</p><p align="left">如果测试脚本的回放导致了任何错误，必须找出形成这一错误的具体原因。</p><p align="left">包含错误的脚本在 LogViewer 的 <strong>Results</strong> 列中用 <strong>Fail</strong>（在红色框中）或 <strong>Warning</strong>（在黄色框中）进行标识。需要处理以下几类错误：致命错误、脚本错误和核实点故障。致命错误通常要求对测试环境进行调查并解决故障。而脚本错误通常要求维护测试脚本。核实点故障（在测试实施过程中）通常要求改变核实点参数，或指出所测试应用程序的理想状态在记录脚本和回放脚本时有什么不同。有关分析核实点的内容，请参见下一部分。</p><p align="left">可以在 <strong>Log Event Properties</strong> 窗口中查看有关错误状态的其他信息。单击<b> View &gt; Log Event Properties</b>，打开此窗口。选择<strong> Results </strong>选项卡将显示错误的说明和有关所遇到错误类型的其他信息。</p><p align="left">对于每个出现故障（或警告）的脚本，复审有关该故障的信息，并在必要的情况下编辑测试脚本（请参见前面的第 3 部分：必要时编辑测试脚本）。在 LogViewer 中单击<b> View &gt; Script</b> 可以打开测试脚本（和 Robot）。</p><p align="left">完成脚本编辑之后，应将环境重设为适当的初始值（请参见“工具向导：在 Rational Robot 中设置测试环境“）并重新执行测试（<font size="3">回放脚本）。</font></p><h3 align="left">6. <a name="step six"><u>用比较器分析核实点结果</u></a><img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></h3><p align="left">使用比较器来分析核实点结果。要从 LogViewer 打开比较器，请执行以下步骤: 
</p><ol><li><div align="left">在 Log Event 列中，双击一个核实点。出现相应的 Comparator 对话框窗口。也可以从 Robot 打开比较器，方法是双击 Asset 窗格中的核实点。但是，如果使用这种方法打开比较器，您只能查看基线文件。<br /></div></li><li><div align="left">基线和实际结果之间的差别会突出显示出来。 </div></li><li><div align="left">复审这些差别并确定适当的操作过程，包括：<br />（注：根据核实点类型的不同，可执行的操作也有所不同） </div></li></ol><blockquote><ul><li><div align="left">将属性复制到基线 - 复制当前的单个实际属性并覆盖基线属性。 </div></li><li><div align="left">将所有属性复制到基线 - 复制所有实际属性值并覆盖所有基线属性。 </div></li><li><div align="left">通过双击属性（菜单、值等）再输入一个不同的值，对单个属性（菜单、值等）进行编辑。 </div></li><li><div align="left">编辑属性列表（以此来确定核实点应当使用的属性）。 </div></li><li><div align="left">创建/修改掩码。 </div></li></ul></blockquote><ol start="4"><li><div align="left">进行了适当的更改之后，单击 <strong>Exit</strong> 按钮来关闭比较器并保存所做的更改。 </div></li></ol><p align="left">编辑完脚本和/或核实点之后，应该将环境重设为适当的初始值（请参见工具向导：在 Rational Robot 中设置测试环境）并重新执行测试（<font size="3">回放脚本）。</font></p></font>
		</strong>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-21 11:16 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Rational Robot中设置测试环境</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20901.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Thu, 21 Dec 2006 03:14:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20901.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20901.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20901.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20901.html</trackback:ping><description><![CDATA[
		<font color="#000066">
				<strong>Rational Robot中设置测试环境<br /></strong>
				<h3>
						<font size="3">目的</font>
				</h3>
				<p>
						<strong>本工具向导说明了如何在 Rational Robot<sup><sup>TM</sup></sup> 中设置测试环境。</strong>
				</p>
				<p>
						<strong>相关的 Rational Unified Process 活动： </strong>
				</p>
				<ul>
						<li>
								<strong>活动：实施测试中的“记录或通过编程创建测试脚本”部分 </strong>
						</li>
						<li>
								<strong>活动：执行测试中的“执行测试过程和/或测试脚本”部分 </strong>
						</li>
				</ul>
				<h3>
						<font size="3">概述</font>
				</h3>
				<p>
						<strong>本工具向导适用于 Microsoft Windows 95/98/NT 4.0。</strong>
				</p>
				<p>
						<strong>要使用 Robot 来设置测试环境，请执行以下步骤： </strong>
				</p>
				<ol>
						<ol>
								<li>
										<strong>设置测试环境以进行记录、编辑或测试脚本回放。 </strong>
								</li>
								<li>
										<strong>设置 GUI 脚本记录选项。 </strong>
								</li>
								<li>
										<strong>设置 GUI 脚本回放选项。 </strong>
								</li>
						</ol>
				</ol>
				<h3>
						<font size="3">1. 设置测试环境以进行记录、编辑或测试脚本回放 <img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></font>
				</h3>
				<p>
						<strong>Windows 环境和您所测试的应用程序的状态会影响脚本的回放。如果所记录的环境和回放环境之间存在差异，回放就会出现问题。</strong>
				</p>
				<p>
						<strong>在记录或编辑测试脚本之前，确保您所测试的应用程序和所有其他软件（在测试环境中）都处于适当的初始状态。另外，在执行测试（回放测试脚本）之前，请保证所测试的应用程序和所有其他软件都处于记录/编辑该测试脚本时所处的初始状态。当您开始回放脚本时，记录脚本时处于打开、激活或显示状态的所有应用程序和窗口应该仍处于打开、激活或显示状态。此外，确保所有相关的网络设置、现用数据库和系统内存处于同记录脚本时相同的状态。</strong>
				</p>
				<p>
						<strong>回放测试脚本时，确保您设置了适当的回放选项，其中包括 Robot 应该如何处理意外活动窗口以及如何从脚本命令错误中恢复（请参见下一部分）。</strong>
				</p>
				<h3>
						<font size="3">2. 设置 GUI 脚本记录选项 <img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></font>
				</h3>
				<p>
						<strong>GUI 脚本记录选项指示 Robot 在记录测试脚本时，应如何处理某些对象、鼠标拖动、窗口设置、对象内容和 Robot 窗口。</strong>
				</p>
				<p>
						<strong>要设置 GUI 脚本记录选项，请执行以下步骤： </strong>
				</p>
				<ol>
						<li>
								<strong>执行以下操作之一来显示 GUI Record Options 对话框： </strong>
						</li>
				</ol>
				<blockquote>
						<ul>
								<li>
										<strong>开始记录之前，请单击 Tools &gt; GUI Record Options。 </strong>
								</li>
								<li>
										<strong>单击工具栏上的 Record Script 按钮，开始记录。在 Record 对话框中，单击 Options。 </strong>
								</li>
						</ul>
				</blockquote>
				<ol start="2">
						<li>
								<strong>设置每个选项卡上的选项。有关各选项卡的详细信息，请参见 Using Rational Robot 手册中的 Setting GUI Record Options 一章或参见 Robot 联机帮助。 </strong>
						</li>
				</ol>
				<blockquote>
						<p>
								<strong>General - 指定 Robot 如何确定/识别列表和菜单内容，以及不支持的鼠标拖动。另外，在此选项卡中，您还可以指定：用于脚本自动命名的前缀、是否让 Robot 来保存和恢复活动窗口的大小和位置、是否记录思考时间、是否记录按下回车键后的延迟。Robot Window</strong> - 指定记录测试脚本时 Robot 窗口的显示方式。该选项卡还使用户可以指定热键，用来隐藏/重新显示 Robot 窗口，以及在面向对象的记录模式和低层记录模式之间进行切换。<strong>Object Recognition Order</strong> - 用于在记录之前或记录过程中，改变个别对象类型的对象识别方法优先级。</p>
				</blockquote>
				<p>
						<strong>有关如何记录脚本的详细信息，请参见工具向导：使用 Rational Robot™<sup><sup></sup></sup> 创建测试脚本。</strong>
				</p>
				<h3>
						<font size="3">3. 设置 GUI 脚本回放选项 <img height="20" alt="返回页首" src="http://reference.sdlgame.com/RationalUnifiedProcess.zh_cn/images/top.gif" width="26" border="0" /></font>
				</h3>
				<p>
						<strong>GUI 脚本回放选项指示 Robot 如何回放 GUI 脚本。您既可以在回放之前，也可以在回放过程开始时设置这些选项。</strong>
				</p>
				<p>
						<strong>要设置 GUI 回放选项，请执行以下步骤： </strong>
				</p>
				<ol>
						<li>
								<strong>执行以下操作之一来显示 GUI Playback Options 对话框： </strong>
						</li>
				</ol>
				<blockquote>
						<ul>
								<li>
										<strong>开始回放之前，请单击 Tools &gt; GUI Playback Options。 </strong>
								</li>
								<li>
										<strong>单击工具栏上的 Playback Script 按钮，开始回放。在 Playback 对话框中，单击 Options。 </strong>
								</li>
						</ul>
				</blockquote>
				<ol start="2">
						<li>
								<strong>设置每个选项卡上的选项。有关各选项卡的详细信息，请参见 Using Rational Robot 手册中的 Setting GUI Playback Options 一章或参见 Robot 联机帮助。 </strong>
								<p>
										<strong>Playback</strong> - 指定命令和击键之间的延迟、是否使用记录的思考时间和键入延迟、是否跳过核实点、是否显示确认结果对话框，以及回放过程中 Robot 窗口中出现的内容。有关详细信息，请单击对话框中的 Help 按钮。<strong>Log</strong> - 指定日志中保存的结果、回放后是否显示日志、是否要在覆盖日志之前得到提示、以及是使用默认日志信息还是使用您提供的信息。<strong></strong></p>
								<p>Caption Matching - 指定 Robot 如何匹配记录过程中所记录的窗口标题和回放过程中发现的标题。有关详细信息，请单击对话框中的 Help 按钮。</p>
								<b>
										<p>Wait State</p>
								</b> - 指定回放时的默认重试和超时值。<b><p>Unexpected Active Windows</p></b> - 指定 Robot 应该如何响应意外的活动窗口。<b><p>Error Recovery</p></b> - 指定在脚本回放时，Robot 如何从脚本命令错误和核实点故障中恢复。<b><p>Trap</p></b> - 指定 Trap 实用程序应该记录的有关回放过程中常见保护故障的信息和恢复方法。</li>
						<li>单击 <b>OK</b>。 
<ol></ol><p>有关如何回放脚本的详细信息，请参见工具向导：使用 Rational Robot™<sup><sup></sup></sup> 执行测试。</p></li>
				</ol>
		</font>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-21 11:14 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Loadrunner中参数设置详细分析</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20900.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Thu, 21 Dec 2006 03:00:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20900.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20900.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20900.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20900.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Loadrunner中参数设置详细分析						做负载或者压力测试时，很多人选择使用了Loadrunner测试工具。该工具的基本流程是先将用户的实际操作录制成脚本，然后产生数千个虚拟用户运行脚本（虚拟用户可以分布在局域网中不同的PC机上），最后生成相关的报告以及分析图。但是在录制脚本的过程中会遇到很多实际的问题，比如不同的用户有不同的使用数据，这就牵涉到参数的设置问题。本文就Loadrunn...&nbsp;&nbsp;<a href='http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20900.html'>阅读全文</a><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-21 11:00 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WAS服务器负载测试软件导读</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20833.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 03:08:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20833.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20833.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20833.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20833.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20833.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: WAS服务器负载测试软件导读你的Web服务器和应用到底能够支持多少并发用户访问？在出现大量并发请求的情况下，软件会出现问题吗？这些问题靠通常的测试手段是无法解答的。本文介绍了Microsoft为这个目的而提供的免费工具WAS及其用法。另外，本文介绍了一种Web应用的性能优化方法，并利用WAS测试了它的性能改善程度。　　编译如下：　　随着服务器端处理任务的日益复杂以及网站访问量的迅速增长，服务器性能...&nbsp;&nbsp;<a href='http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20833.html'>阅读全文</a><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-20 11:08 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Robot连接SQL的例子</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20811.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 19 Dec 2006 09:31:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20811.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20811.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20811.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20811.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20811.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="558" border="0">
				<tbody>
						<tr>
								<td valign="center" align="right" colspan="2" height="32">
										<div class="style7" align="center">
												<span style="FONT-SIZE: 12pt">
														<b>使用Robot连接SQL的例子</b>
												</span>
										</div>
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" bgcolor="#000000" colspan="2" height="1">
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" colspan="2" height="20">
										<div align="center"> </div>
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" colspan="2" height="10">
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" width="2%" height="10">
										<div align="left">
										</div>
								</td>
								<td valign="top" align="right" width="98%" bgcolor="#ffffff">
										<div class="daxiao14" align="left">
												<p>
														<font size="2">    这是使用Robot连接TestDirector数据库的一个例子。 <br />    首先在控制面板的ODBC中新建一个DSN，选择SQL Server连接，名字是td_test（这个可以自己随便取），连接服务器选择你TD库保存的DB服务器名称。连接你想要查询的库名，我这里是gpt_gogs_db，登录名是td，密码tdtdtd（在TD中新建一个project时，数据库默认所有者为td，密码为tdtdtd），这里仅两不要使用权限过大的用户，因为在脚本中是要明文写入密码的。最后测试一下数据源。<br /></font>
														<br />
														<font size="2">开始编写脚本了：<br /></font>
														<font size="2">======================================================================<br /></font>
														<font size="2">Sub Main<br />    Dim Result As Integer<br />    Dim connect as long<br />    Dim outputstr,query as string<br />    Dim out(1 to 2,1 to 16) as variant       <br />    '这里定义一个二维数组，第一维表示数据库中查询结果中的列，第二维表示查询结果中的行，可以看到这里可以一次查询并存储两行两列<br />    dim retcode as variant<br />    dim i as integer<br />    'Initially Recorded: 2005-7-18  22:16:12<br />    'scrīpt Name: sqltest<br />    connect = SQLOpen("DSN=td_test;UID=td;PWD=tdtdtd",outputstr)<br />    '注意这里各个参数和等号及等号后面赋值是紧跟着的，没有空格，因为如果有空格的话连接的时候连空格也算上<br />    '这样的话连接的时候就会提示选择DSN或是输入用户名，密码<br />    <br />    query = "select bg_bug_id,bg_status from bug where bg_subject='113'"<br />    '最好在查询分析器中执行一下这条语句<br />    <br />    call SQLExecquery(connect,query)<br />    <br />    call SQLRetrieve(connect,out()) <br />    <br />    msgbox out(1,1)<br />    msgbox out(2,1)<br />    msgbox out(1,2)<br />    msgbox out(2,2)<br />    '显示保存的结果<br />'    next<br />    <br />    call sqlclose(connect)<br />    </font>
												</p>
												<p>
														<font size="2">End Sub<br /></font>
														<font size="2">=================================================================================</font>
														<br />
														<font size="2">这里尤其注意那个设置二维数组的地方，这个二维数组可以一次存储多个查询结果，其结构就类似SQL Server中查询分析器查询后的结果。</font>
												</p>
												<p>
														<font size="2">如果我生明了两个二维数组即可保存不同的查询结果。</font>
												</p>
												<p>
														<font size="2">其读取查询内容的函数也应该重点看看。</font>
												</p>
												<p>
														<font size="2">如果想要返回不同的查询语句结果，应该这样写：</font>
														<br />
														<font size="2">=================================================================================<br /></font>
														<font size="2">Sub Main</font>
												</p>
												<p>
														<font size="2">    Dim Result As Integer</font>
												</p>
												<p>
														<font size="2">    Dim connect as long</font>
												</p>
												<p>
														<font size="2">    Dim outputstr,query1,query2 as string</font>
												</p>
												<p>
														<font size="2">    Dim out1(1 to 2,1 to 1) as variant </font>
												</p>
												<p>
														<font size="2">    Dim out2(1 to 2,1 to 1) as variant      </font>
												</p>
												<p>
														<font size="2">    '这里定义一个二维数组，第一维表示数据库中查询结果中的列，第二维表示查询结果中的行，可以看到这里可以一次查询并存储两行两列</font>
												</p>
												<p>
														<font size="2">    dim retcode as variant</font>
												</p>
												<p>
														<font size="2">    dim i as integer</font>
												</p>
												<p>
														<font size="2">    'Initially Recorded: 2005-7-18  22:16:12</font>
												</p>
												<p>
														<font size="2">    'scrīpt Name: sqltest</font>
												</p>
												<p>
														<font size="2">    connect = SQLOpen("DSN=td_test;UID=td;PWD=tdtdtd")</font>
												</p>
												<p>
														<font size="2">    '注意这里各个参数和等号及等号后面赋值是紧跟着的，没有空格，因为如果有空格的话连接的时候连空格也算上</font>
												</p>
												<p>
														<font size="2">    '这样的话连接的时候就会提示选择DSN或是输入用户名，密码</font>
												</p>
												<p>
														<font size="2">    query1 = "select bg_bug_id,bg_status from bug where bg_subject='113'"</font>
												</p>
												<p>
														<font size="2">    '最好在查询分析器中执行一下这条语句</font>
												</p>
												<p>
														<font size="2">query2 = "select bg_bug_id,bg_severity from bug where bg_subject='113'"</font>
												</p>
												<p>
														<font size="2">'不同的查询语句</font>
												</p>
												<p>
														<font size="2">    call SQLExecquery(connect,query1)</font>
														<font size="2">   </font>
												</p>
												<p>
														<font size="2">call SQLRetrieve(connect,out1())</font>
												</p>
												<p>
														<font size="2">'执行完查询语句后赋值给一个二维数组，切记！</font>
												</p>
												<p>
														<font size="2">    call SQLExecquery(connect,query2)</font>
												</p>
												<p>
														<font size="2">    call sqlretrieve(connect,out2())</font>
														<font size="2"> </font>
												</p>
												<p>
														<font size="2">    msgbox out1(1,1)</font>
												</p>
												<p>
														<font size="2">    msgbox out1(2,1)</font>
												</p>
												<p>
														<font size="2">    msgbox out2(1,1)</font>
												</p>
												<p>
														<font size="2">    msgbox out2(2,1)</font>
												</p>
												<p>
														<font size="2">    '显示保存的结果</font>
												</p>
												<p>
														<font size="2">'    next</font>
												</p>
												<p>
														<font size="2">    call sqlclose(connect)</font>
												</p>
												<p>
														<font size="2">End Sub</font>
												</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20811.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-19 17:31 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20811.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Robot进行数据库的并发测试</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20777.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 19 Dec 2006 06:34:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20777.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20777.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20777.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20777.html</trackback:ping><description><![CDATA[
		<div class="style7" align="center">
				<span style="FONT-SIZE: 12pt">
						<b>Robot进行数据库的并发测试<br /><div class="daxiao14" align="left"><p><font size="2">第一步：创建演示程序：打开SQL SERVER查询分析器，在SQL SERVER测试数据库中执行下列脚本（脚本执行操作：创建表testtable，并插入一条记录；创建存储过程test）：</font></p><p><font size="2">if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Test]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)</font></p><p><font size="2">drop procedure [dbo].[Test]</font></p><p><font size="2">GO</font></p><p><font size="2">if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[testtable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)</font></p><p><font size="2">drop table [dbo].[testtable]</font></p><p><font size="2">GO</font></p><p><font size="2">CREATE TABLE [dbo].[testtable] (</font></p><p><font size="2">       [testid] [int] NULL ,</font></p><p><font size="2">       [counts] [int] NULL </font></p><p><font size="2">) ON [PRIMARY]</font></p><p><font size="2">GO</font><font size="2"> </font></p><p><font size="2">insert into testtable (testid,counts) values (1,0)</font></p><p><font size="2">GO</font></p><p><font size="2">SET QUOTED_IDENTIFIER ON </font></p><p><font size="2">GO</font></p><p><font size="2">SET ANSI_NULLS ON </font></p><p><font size="2">GO</font><font size="2"> </font></p><p><font size="2">CREATE Procedure dbo.Test</font></p><p><font size="2">as</font></p><p><font size="2">  declare @count int</font></p><p><font size="2">  begin tran TEST    </font></p><p><font size="2">    select @count=counts  from testtable where testid=1    </font></p><p><font size="2">    update testtable set </font><a href="mailto:counts=@count+1"><font color="#000000" size="2">counts=@count+1</font></a><font size="2"> </font><font size="2">    </font></p><p><font size="2">  if (@@error &gt;0) begin</font></p><p><font size="2">       rollback tran TEST</font></p><p><font size="2">  end else begin</font></p><p><font size="2">       commit tran TEST</font></p><p><font size="2">  end</font></p><p><font size="2">GO</font></p><p><font size="2">SET QUOTED_IDENTIFIER OFF </font></p><p><font size="2">GO</font></p><p><font size="2">SET ANSI_NULLS ON </font></p><p><font size="2">GO</font></p><p><font size="2">第二步：创建测试脚本：在Robot中新建VU脚本，输入以下内容：</font></p><p><font size="2">#include &lt;VU.h&gt;</font></p><p><font size="2">{</font></p><p><font size="2">push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */</font></p><p><font size="2">push Think_def = "LR";</font></p><p><font size="2">Min_tmout = 120000;       /* Set minimum Timeout_val to 2 minutes          */</font></p><p><font size="2">push Timeout_val = Min_tmout;</font></p><p><font size="2">ser=sqlconnect("server","sa","888","192.168.0.99","sqlserver");</font></p><p><font size="2">set Server_connection = ser;</font></p><p><font size="2">push Think_avg = 0;</font></p><p><font size="2">sync_point "logon";</font></p><p><font size="2">sqlexec ["sql_1000"] "testdb..test";</font></p><p><font size="2">sqldisconnect (ser);</font></p><p><font size="2">}</font></p><p><font size="2">说明：</font></p><p><font size="2">ser=sqlconnect("server","sa","888","192.168.0.99","sqlserver") </font></p><p><font size="2">  sa为数据库用户名，888为sa密码，192.168.0.99数据库IP地址</font></p><p><font size="2">  以上三项按实际的测试数据库设置更改，其他两项不用修改</font></p><p><font size="2">sqlexec ["sql_1000"] "testdb..test"</font></p><p><font size="2">  testdb为新建存储过程test所在的数据库，按实际的数据库修改</font></p><p><font size="2">第三步：执行测试：运行上一步创建的脚本（运行时自动创建Suite），在Run Suite窗口中的“Number of users”上输入20。运行完脚本，打开数据库查看counts的数值。把counts值改为零多次运行脚本，观察每次运行后counts的结果。</font></p><p><font size="2">测试说明</font></p><p><font size="2">（1）、测试示例程序的目的是，存储过程test每执行一次，表testtable中的counts字段增加一；</font></p><p><font size="2">（2）、第三步的测试可以发现每次执行后counts结果并不相同，而且不等于20，这说明这个程序是在并发时是问题的。</font></p><p><font size="2">（3）、将存储过程中的select @count=counts  from testtable where testid=1修改为select @count=counts  from test </font></p><p><font size="2">此文除此51testing博客，转载请注明出处<br />原始链接：</font><a href="http://blog.51testing.com/html/26/84226_itemid_1180.html"><font color="#000000" size="2">http://blog.51testing.com/html/26/84226_itemid_1180.html</font></a></p></div></b>
				</span>
		</div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-19 14:34 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Robot压力测试实例</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20767.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 19 Dec 2006 03:02:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20767.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20767.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20767.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20767.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="558" border="0">
				<tbody>
						<tr>
								<td valign="center" align="right" colspan="2" height="32">
										<div class="style7" align="center">
												<span style="FONT-SIZE: 12pt">
														<b>Robot压力测试实例</b>
												</span>
										</div>
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" bgcolor="#000000" colspan="2" height="1">
								</td>
						</tr>
						<tr>
								<td valign="center" align="right" colspan="2" height="20">
										<div align="center"> </div>
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" colspan="2" height="10">
								</td>
						</tr>
						<tr>
								<td valign="top" align="right" width="2%" height="10">
										<div align="left">
										</div>
								</td>
								<td valign="top" align="right" width="98%" bgcolor="#ffffff">
										<div class="daxiao14" align="left">
												<p>看到很多人在要这个,找到一篇,转过来给大家看看</p>
												<p>文章的出处没有看到作者的名字,非常抱歉</p>
												<p>脚本与被测程序有关,直接运行这个脚本是不能回放成功的(因为你没有脚本运行的环境)</p>
												<p>文章如下</p>
												<p> </p>
												<p>第一步：设置Robot</p>
												<p>    Robot――Tools――Session Record options，Method选择API Recorder，Generater Filtering中Filtering选择Auto filtering，Select protocols只选择Socket；</p>
												<p>第二步：录制VU脚本</p>
												<p>    在启动的Start Application窗口中，Executable输入被测程序的客户端程序的路径和文件名，Working Directory中输入被测程序的工作路径，Program Arguments如果没有就空着。被测程序程序启动后，执行需要的操作然后关闭程序，停止录制脚本，Robot会自动生成脚本。</p>
												<p>脚本示例：</p>
												<p>#include &lt;VU.h&gt;</p>
												<p>{</p>
												<p> </p>
												<p>push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */</p>
												<p>push Think_def = "LR";</p>
												<p>Min_tmout = 120000;       /* Set minimum Timeout_val to 2 minutes          */</p>
												<p>push Timeout_val = Min_tmout;</p>
												<p> </p>
												<p>SERVER = sock_connect("123001", "SERVER:2000");</p>
												<p> </p>
												<p>{ INFO SERVER "SERVER"="192.168.1.12"; } /*1*/</p>
												<p> </p>
												<p>set Server_connection = SERVER;</p>
												<p> </p>
												<p>push Think_avg = 0;</p>
												<p> </p>
												<p>sock_send</p>
												<p>    "`45645651300000000001cc00f701000002000000c3330100000000000000000001000000"    "00000000000sdgsdfgfhjghjjdfhjhkjgfhjgfjjk000000000000hh0000000000000000000000"    "000000000000000000000000000000000000000000000100`g2222`0012313546545465431"    "`45641313000000000000000000000000000000000000`";</p>
												<p> </p>
												<p>sock_nrecv ["123002"] 200;</p>
												<p> </p>
												<p>sock_send    "`1321321656548745215599154654456546122132112313210000000000000001000000"    "00000000021321215665654548879654654655562000000000000000000000000000000"    "00000000000000000000000000000000000000000000012131132321213212111323213"    "`123110000000`Z2";</p>
												<p> </p>
												<p>sock_recv ["123003"] "$"; /* 50 bytes */</p>
												<p> </p>
												<p>sock_disconnect(SERVER);</p>
												<p> </p>
												<p>pop [Think_def, Think_avg, Timeout_val, Timeout_scale];</p>
												<p> </p>
												<p>}</p>
												<p> </p>
												<p>这个脚本如果不能正确回放，可以将将sock_recv ["123003"] "$"; /* 50 bytes */改为</p>
												<p>sock_nrecv ["123003"] 50; /* 50 bytes */</p>
												<p> </p>
												<p>第三步：设置Suite，回放脚本</p>
												<p>回放录制的脚本，Testmanager会自动创建Suite，如下所示：</p>
												<p> </p>
												<p>
														<br />    默认脚本运行一次，为了长时间运行，修改增加脚本的运行次数（最大32767），在Run properties中Iterations中设置。然后运行Suite，在Run Suite窗口中的“Number of users”上输入虚拟用户数，如200。</p>
												<p>    第四步：观察被测服务程序的运行情况，查看有无异常。压力测试需要连续、高负载运行不少于72小时，运行完成服务程序需要无资源泄漏、无报错、无异常退出以及其他不正常情况。</p>
												<p>数据库并发测试</p>
												<p>数据库并发测试的必要性：</p>
												<p>1、  与数据库连接的服务程序采用多线程同时开启多个数据库连接；</p>
												<p>2、  与数据库连接的服务程序单线程，但是同时开启多套服务程序；</p>
												<p>    以上两种情况均会产生对数据库的并发访问操作。数据库并发访问会导致数据库数据错误、数据库死锁等故障，需要在测试阶段进行充分测试。</p>
												<p> </p>
												<p>数据库并发测试测试方法：</p>
												<p>1、  利用测试工具模拟多个最终用户进行并发测试；</p>
												<p>    这种测试方法的缺点：最终用户往往并不是直接连接到数据库上，而是要经过一个和多个中间服务程序，所以并不能保证访问数据库时还是并发。其次，这种测试方法需要等到客户端程序、服务端程序全部完成才能进行；</p>
												<p>2、  利用测试工具编写脚本，直接连接数据库进行并发测试；</p>
												<p>    这种方法可以有效的保证并发操作，而且在数据库访问程序完成即可测试，可以大大缩短测试时间，而且测试效果更好。</p>
												<p> </p>
												<p>下面通过一个演示程序，演示使用Robot使用第二种测试方法进行数据库的并发测试：</p>
												<p>第一步：创建演示程序：打开SQL SERVER查询分析器，在SQL SERVER测试数据库中执行下列脚本（脚本执行操作：创建表testtable，并插入一条记录；创建存储过程test）：</p>
												<p>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Test]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)</p>
												<p>drop procedure [dbo].[Test]</p>
												<p>GO</p>
												<p> </p>
												<p>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[testtable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)</p>
												<p>drop table [dbo].[testtable]</p>
												<p>GO</p>
												<p> </p>
												<p>CREATE TABLE [dbo].[testtable] (</p>
												<p>       [testid] [int] NULL ,</p>
												<p>       [counts] [int] NULL </p>
												<p>) ON [PRIMARY]</p>
												<p>GO</p>
												<p> </p>
												<p>insert into testtable (testid,counts) values (1,0)</p>
												<p>GO</p>
												<p> </p>
												<p>SET QUOTED_IDENTIFIER ON </p>
												<p>GO</p>
												<p>SET ANSI_NULLS ON </p>
												<p>GO</p>
												<p> </p>
												<p>CREATE Procedure dbo.Test</p>
												<p>as</p>
												<p>  declare @count int</p>
												<p>  begin tran TEST    </p>
												<p>    select @count=counts  from testtable where testid=1    </p>
												<p>    update testtable set <a href="mailto:counts=@count+1"><font color="#000000" size="2">counts=@count+1</font></a></p>
												<p>    </p>
												<p>  if (@@error &gt;0) begin</p>
												<p>       rollback tran TEST</p>
												<p>  end else begin</p>
												<p>       commit tran TEST</p>
												<p>  end</p>
												<p>GO</p>
												<p>SET QUOTED_IDENTIFIER OFF </p>
												<p>GO</p>
												<p>SET ANSI_NULLS ON </p>
												<p>GO</p>
												<p> </p>
												<p>第二步：创建测试脚本：在Robot中新建VU脚本，输入以下内容：</p>
												<p>#include &lt;VU.h&gt;</p>
												<p>{</p>
												<p>push Timeout_scale = 200; /* Set timeouts to 200% of maximum response time */</p>
												<p>push Think_def = "LR";</p>
												<p>Min_tmout = 120000;       /* Set minimum Timeout_val to 2 minutes          */</p>
												<p>push Timeout_val = Min_tmout;</p>
												<p> </p>
												<p>ser=sqlconnect("server","sa","888","192.168.0.99","sqlserver");</p>
												<p>set Server_connection = ser;</p>
												<p>push Think_avg = 0;</p>
												<p>sync_point "logon";</p>
												<p>sqlexec ["sql_1000"] "testdb..test";</p>
												<p>sqldisconnect (ser);</p>
												<p>}</p>
												<p>说明：</p>
												<p>ser=sqlconnect("server","sa","888","192.168.0.99","sqlserver") </p>
												<p>  sa为数据库用户名，888为sa密码，192.168.0.99数据库IP地址</p>
												<p>  以上三项按实际的测试数据库设置更改，其他两项不用修改</p>
												<p>sqlexec ["sql_1000"] "testdb..test"</p>
												<p>  testdb为新建存储过程test所在的数据库，按实际的数据库修改</p>
												<p> </p>
												<p>第三步：执行测试：运行上一步创建的脚本（运行时自动创建Suite），在Run Suite窗口中的“Number of users”上输入20。运行完脚本，打开数据库查看counts的数值。把counts值改为零多次运行脚本，观察每次运行后counts的结果。</p>
												<p> </p>
												<p>测试说明</p>
												<p>（1）、测试示例程序的目的是，存储过程test每执行一次，表testtable中的counts字段增加一；</p>
												<p>（2）、第三步的测试可以发现每次执行后counts结果并不相同，而且不等于20，这说明这个程序是在并发时是问题的。</p>
												<p>（3）、将存储过程中的select @count=counts  from testtable where testid=1修改为select @count=counts  from testtable with (UPDLOCK) where testid=1。再次进行并发测试，每次的结果应该都是20。</p>
												<p> </p>
												<p>    以上演示程序，仅仅演示了测试的方法。在实际的数据库并发测试中，首先要确定存在哪些并发情况、哪些数据受到并发影响，然后编写脚本，设置suite进行并发测试。</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-19 11:02 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试指标介绍</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20719.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 18 Dec 2006 01:33:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20719.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20719.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20719.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20719.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20719.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="0" width="778" align="center" border="0">
				<tbody>
						<tr>
								<td valign="top">
										<table cellspacing="0" cellpadding="0" width="558" border="0">
												<tbody>
														<tr>
																<td valign="top" align="right" width="98%" bgcolor="#ffffff">
																		<div class="daxiao14" align="left">
																				<p>TPC-C</p>
																				<p>作为一家非盈利性机构，事务处理性能委员会（TPC）负责定义诸如TPC-C、TPC-H和TPC-W基准测试之类的事务处理与数据库性能基准测试，并依据这些基准测试项目发布客观性能数据。TPC基准测试采用极为严格的运行环境，并且必须在独立审计机构监督下进行。委员会成员包括大多数主要数据库产品厂商以及服务器硬件系统供应商。 </p>
																				<p>相关企业参与TPC基准测试以期在规定运行环境中获得客观性能验证，并通过应用测试过程中所使用的技术开发出更加强健且更具伸缩性的软件产品及硬件设备。 </p>
																				<p>TPC-C是一种旨在衡量联机事务处理（OLTP）系统性能与可伸缩性的行业标准基准测试项目。这种基准测试项目将对包括查询、更新及队列式小批量事务在内的广泛数据库功能进行测试。许多IT专业人员将TPC-C视为衡量“真实”OLTP系统性能的有效指示器。 </p>
																				<p>TPC-C基准测试针对一种模拟订单录入与销售环境测量每分钟商业事务（tpmC）吞吐量。特别值得一提的是，它将专门测量系统在同时执行其它四种事务类型（如支付、订单状态更新、交付及证券级变更）时每分钟所生成的新增订单事务数量。独立审计机构将负责对基准测试结果进行公证，同时，TPC将出据一份全面彻底的测试报告。这份测试报告可以从TPC Web站点(http://www.tpc.org)上获得。</p>
																				<p>tpmC定义: TPC-C的吞吐量，按有效TPC-C配置期间每分钟处理的平均交易次数测量，至少要运行12分钟。</p>
																				<p>1．TPC-C规范概要 </p>
																				<p>TPC-C是专门针对联机交易处理系统（OLTP系统）的，一般情况下我们也把这类系统称为业务处理系统。 </p>
																				<p>TPC-C测试规范中模拟了一个比较复杂并具有代表意义的OLTP应用环境:假设有一个大型商品批发商，它拥有若干个分布在不同区域的商品库；每个仓库负责为10个销售点供货；每个销售点为3000个客户提供服务；每个客户平均一个订单有10项产品;所有订单中约1%的产品在其直接所属的仓库中没有存货，需要由其他区域的仓库来供货。 </p>
																				<p>该系统需要处理的交易为以下几种： </p>
																				<ul>
																						<li>
																								<p>New-Order：客户输入一笔新的订货交易； </p>
																						</li>
																						<li>
																								<p>Payment:更新客户账户余额以反映其支付状况; </p>
																						</li>
																						<li>
																								<p>Delivery:发货(模拟批处理交易); </p>
																						</li>
																						<li>
																								<p>Order-Status:查询客户最近交易的状态； </p>
																						</li>
																						<li>
																								<p>Stock-Level:查询仓库库存状况，以便能够及时补货。 </p>
																						</li>
																				</ul>
																				<p>对于前四种类型的交易，要求响应时间在5秒以内；对于库存状况查询交易，要求响应时间在20秒以内。 </p>
																				<p>逻辑结构图：</p>
																				<p>
																						<img height="239" alt="逻辑结构图：" src="http://www.51testing.com/tech/lib/20050128_1/image002.gif" width="426" />
																				</p>
																				<p>流程图：</p>
																				<p>
																						<img height="205" alt="流程图：" src="http://www.51testing.com/tech/lib/20050128_1/image004.gif" width="371" />
																				</p>
																				<p>2．评测指标 </p>
																				<p>TPC-C测试规范经过两年的研制，于1992年7月发布。几乎所有在OLTP市场提供软硬件平台的厂商都发布了相应的TPC-C测试结果，随着计算机技术的不断发展，这些测试结果也在不断刷新。 </p>
																				<p>TPC-C的测试结果主要有两个指标： </p>
																				<p>● 流量指标(Throughput，简称tpmC) </p>
																				<p>按照TPC的定义，流量指标描述了系统在执行Payment、Order-status、Delivery、Stock-Level这四种交易的同时，每分钟可以处理多少个New-Order交易。所有交易的响应时间必须满足TPC-C测试规范的要求。 </p>
																				<p>流量指标值越大越好！ </p>
																				<p>● 性价比(Price/Performance，简称Price/tpmC) </p>
																				<p>即测试系统价格（指在美国的报价）与流量指标的比值。 </p>
																				<p>性价比越小越好！ <br /></p>
																				<p>3．结果发布 </p>
																				<p>各厂商的TPC-C测试结果都按TPC组织规定的两种形式发布：测试结果概要(Executive Summary)和详细测试报告(Full Disclosure Report)。测试结果概要中描述了主要的测试指标、测试环境示意图以及完整的系统配置与报价，而详细测试报告中除了包含上述内容外，还详细说明了整个测试环境的设置与测试过程。 </p>
																				<p>P690 tpmC测试值：76,389,839.00</p>
																				<p>$/tpmC：831.00</p>
																				<p>美国美金报价：6,349,223.0</p>
																				<p>CPU数：32</p>
																				<p>数据库：IBM DB2 UDB 8.1</p>
																				<p>操作系统：AIX 5L V5.2</p>
																				<p>中间件：TUXEDO 8.0</p>
																				<p>测试日期：2003.6.30</p>
																				<p>P690 TPC-C测试的配置：</p>
																				<p>1．  后台：1 x eServer pSeries 690 with 32 x 1.7GHz POWER4+ processors with 128MB L3 cache per MCM (total of four MCMs), 512GB memory</p>
																				<p>2．  前端：30 x eServer pSeries 630 Model 6E4 each with 4 x 1.0GHz POWER4 CPUs with 32MB L3 cache, 16GB memory</p>
																				<p>SPECweb:</p>
																				<p>SPECweb96: 在SPECweb96基准测试程序上实现的每秒钟超文本传输协议（HTTP）操作最多次数，响应时间无明显退化。</p>
																				<p>SPECweb99: 接入数，网络服务器可用预先确定的工作量支持的同时接入数。SPECweb99检测设备模拟客户通过慢Internet联接，向网络服务器发送HTTP工作量请求。</p>
																				<p>SPECweb99 测试Web服务器运行状况</p>
																				<p>SPECweb99 是由标准性能评估组织（SPEC）开发的Web服务器基准测试。它测量满足特定吞吐量和客户请求响应速率要求的WEB服务器的最大并发连接数量。并发连接的合计波特率在320 Kbps到400Kbps范围内，则满足相应规范。</p>
																				<p>SPECweb99 在一台称为主客户端的机器上运行，这台机器上包含有允许用户加载特定负载请求的配置文件。主客户端也要处理在客户端和服务器或测试中的系统（SUT）之间的传输协调问题。客户端通过许多子进程／线程生成独立HTTP请求流，仿真足够的负载发送给SUT。图二表示客户端／服务器的层次关系。</p>
																				<p>
																						<img height="383" alt="图2. 典型 SPECweb99 实验设置 " src="http://www.51testing.com/tech/lib/20050128_1/image006.gif" width="443" />
																				</p>
																				<p>图：典型的SPECweb99实验环境</p>
																				<p>在这个测试中，客户端向测试中的服务器发送请求数据。测试规范要求客户端和服务器之间的连接不能使用片段大小大于1460比特的TCP协议。因此，每一个客户端读取1460比特或更少数据块的响应。</p>
																				<p>测试中使用两种类型的负载量：</p>
																				<p>静态负载. 静态负载具有四种类型的文件。最小的文件的增幅为0.1KB，第二种文件类型的增幅为1KB，最后两种类型的文件的增幅为10KB和100KB。每一个目录包含每种类型9个文件共36个文件。</p>
																				<p>目标请求的文件类型在各类型中分散使用。在每一类中的9个文件中又进行二次分布。最终目标文件混合为：</p>
																				<p>35％的请求文件小于1 KB</p>
																				<p>50％的请求文件小于10 KB</p>
																				<p>14％的请求文件小于100 KB，但是大于或等于10 KB</p>
																				<p>1％的请求文件小于1000 KB，但是大于或等于100 KB</p>
																				<p>动态负载.动态负载是基于广告和用户注册。共有四种在SPECweb99中使用的请求内容类型，分别是标准动态取操作、动态随机取操作、动态发送操作和客户图形接口动态取操作。标准动态取操作和客户图形接口动态取操作表现web服务器的简单广告轮转特性。带有广告轮转的动态取操作追踪用户和用户选择，所以广告可以由不同的方式来定制。最终，动态发布实施一个用户注册在相应的网站上。</p>
																				<p>P690 SPECweb99测试值：21,000</p>
																				<p>Web服务器：Zeus 4.0</p>
																				<p>操作系统：AIX 5L V5.1 (64-bit)</p>
																				<p>CPU数：16</p>
																				<p>测试日期：2001-10-1</p>
																				<p>测试配置：16 x 1.3GHz POWER-4 Processors w/1440KB unified on chip L2 cache, 192GB memory, 32 x 32 IBM Gigabit Ethernet-SX PCI controllers, 32 x Gigabit Ethernet network (1 Gigabit/sec  ), 96 x Clients (4 x 375MHz POWER3-II, RS/6000 44P-270), Requested Connections = 21000, Max Fileset Size = 67319.6MB</p>
																				<p>P650 SPECweb99测试值：12,400</p>
																				<p>Web服务器：Zeus 4.1r3</p>
																				<p>操作系统：AIX 5L V5.2 (64-bit)</p>
																				<p>CPU数：8</p>
																				<p>测试日期：2002-10-1</p>
																				<p>测试配置：8 x 1.45GHz POWER4+ processors w/1.5MB(I+D) unified on chip L2 cache, 32MB unified off chip/SCM L3 cache, 64GB memory, 8 x Gigabit Ethernet-SX PCI-X controllers, 8 x Gigabit Ethernet network (1 Gigabit/sec ), 48 x Clients (6 x 668MHz RS64-IV, pSeries 620 Model 6F1), Requested Connections = 12400, Max Fileset Size = 39801.28MB</p>
																				<p>p630 SPECweb99测试值：6,895</p>
																				<p>Web服务器：Zeus 4.2r1</p>
																				<p>操作系统：AIX 5L V5.2(64-bit)</p>
																				<p>CPU数：4</p>
																				<p>测试日期：2003-2-1</p>
																				<p>测试配置：4 x 1450MHz POWER4+ Processors w/1536KB(I+D) unified on chip L2 cache, 8MB unified (off chip)/SCM L3 cache, 32GB memory, 4 x Gigabit Ethernet-SX PCI-X controllers, 4 x Gigabit Ethernet networks (1 Gigabit/sec ), 24 x Clients (4 x 375MHz POWER3-II, pSeries 640 Model B80), Requested Connections = 6900, Max Fileset Size = 22199.12MB</p>
																				<p>NotesBench:</p>
																				<p>NotesBench是测试各种不同Lotus Notes方面的驱动程序。目的是执行自定义工作量教本中的命令，模拟客户机的操作。NotesBench测试“仅测试邮件”和“测试邮件和数据库”。所有已经公布的IBM结果均为“仅测试邮件工作量”。</p>
																				<p>p680 NotesBench测试值：150,197</p>
																				<p>用户数：108,000</p>
																				<p>平均反应时间：0.584秒</p>
																				<p>Domino服务器版本：5.06a</p>
																				<p>操作系统：AIX 4.3.3</p>
																				<p>CPU数：4</p>
																				<p>测试日期：2001.11.20</p>
																				<p>测试配置：IBM eServer pSeries 680 (24*RS64 IV/600MHz; 96GB RAM, 30 Partitions) </p>
																		</div>
																</td>
														</tr>
														<tr>
																<td valign="top" align="right" colspan="2" height="12">
																		<div align="right"> </div>
																</td>
														</tr>
														<tr bordercolor="#f0f7ff" bgcolor="#f0f7ff">
																<td valign="top" align="right" colspan="2" height="3">
																		<div align="left">
																		</div>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
								<td valign="top" height="296">
										<table style="BORDER-RIGHT: #ffffff 1px solid; BORDER-TOP: #ffffff 1px solid; BORDER-LEFT: #ffffff 1px solid; BORDER-BOTTOM: #ffffff 1px solid" cellspacing="0" cellpadding="0" width="100%" border="0">
												<tbody>
														<tr>
																<td valign="top" bgcolor="#ffffff">
																		<table cellspacing="0" cellpadding="0" width="100%" align="center" border="0">
																				<form name="searchform" action="/php/search.php">
																						<tbody>
																								<tr>
																										<td width="89%">
																												<img height="12" src="http://www.51testing.com/php/modpage/img/image_01.gif" width="12" /> 站内搜索</td>
																										<td width="11%" height="9">
																												<div align="center">
																												</div>
																										</td>
																								</tr>
																								<tr>
																										<td>
																												<input id="keyword" size="22" name="keyword" />
																										</td>
																										<td>
																												<a href="javascript:document.searchform.submit();">
																														<img height="19" src="http://www.51testing.com/php/modpage/img/GO.gif" width="25" border="0" />
																												</a>
																										</td>
																								</tr>
																						</tbody>
																				</form>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" cellpadding="0" width="80%" align="center" border="0">
												<tbody>
														<tr>
																<td height="9">
																</td>
														</tr>
												</tbody>
										</table>
										<table style="BORDER-RIGHT: #bea3e0 1px solid; BORDER-TOP: #bea3e0 1px solid; BORDER-LEFT: #bea3e0 1px solid; BORDER-BOTTOM: #bea3e0 1px solid" cellspacing="0" cellpadding="2" width="100%" align="center" bgcolor="#bea3e0" border="1">
												<tbody>
														<tr>
																<td style="BORDER-RIGHT: #bea3e0 1px solid; BORDER-TOP: #bea3e0 1px solid; BORDER-LEFT: #bea3e0 1px solid; BORDER-BOTTOM: #bea3e0 1px solid" bgcolor="#bea3e0">
																		<div class="style38" align="center">相关文章</div>
																</td>
														</tr>
														<tr>
																<td class="space" style="BORDER-RIGHT: #f0f7ff 1px solid; BORDER-TOP: #f0f7ff 1px solid; BORDER-LEFT: #f0f7ff 1px solid; BORDER-BOTTOM: #f0f7ff 1px solid" valign="top" align="left" bgcolor="#f0f7ff" height="45">
																</td>
														</tr>
												</tbody>
										</table>
										<table cellspacing="0" cellpadding="0" width="80%" align="center" border="0">
												<tbody>
														<tr>
																<td height="9">
																</td>
														</tr>
												</tbody>
										</table>
										<table style="BORDER-RIGHT: #bea3e0 1px solid; BORDER-TOP: #bea3e0 1px solid; BORDER-LEFT: #bea3e0 1px solid; BORDER-BOTTOM: #bea3e0 1px solid" cellspacing="0" cellpadding="2" width="100%" align="center" bgcolor="#bea3e0" border="1">
												<tbody>
														<tr>
																<td style="BORDER-RIGHT: #bea3e0 1px solid; BORDER-TOP: #bea3e0 1px solid; BORDER-LEFT: #bea3e0 1px solid; BORDER-BOTTOM: #bea3e0 1px solid" bgcolor="#bea3e0">
																		<div class="style38" align="center">热门文章</div>
																</td>
														</tr>
														<tr>
																<td class="space" style="BORDER-RIGHT: #f0f7ff 1px solid; BORDER-TOP: #f0f7ff 1px solid; BORDER-LEFT: #f0f7ff 1px solid; BORDER-BOTTOM: #f0f7ff 1px solid" valign="top" align="left" bgcolor="#f0f7ff" height="45">
																		<a href="http://www.51testing.com/html/8/653.html">
																				<font color="#000000">◎性能测试方法</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/645.html">
																				<font color="#000000">◎压力测试计划实例</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/967.html">
																				<font color="#000000">◎系统性能测试方案</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/664.html">
																				<font color="#000000">◎带宽大小我心知 专业带宽评测工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/640.html">
																				<font color="#000000">◎性能测试及性能调整概述</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1039.html">
																				<font color="#000000">◎性能测试基础知识－性能的规划与实现</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/713.html">
																				<font color="#000000">◎一个大型集中项目的性能测试实例</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/647.html">
																				<font color="#000000">◎关注性能：压力负载</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1387.html">
																				<font color="#000000">◎性能测试的准备</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/42.html">
																				<font color="#000000">◎性能：软件测试的重中之重</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1189.html">
																				<font color="#000000">◎怎样提高性能测试的效率和质量</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/305.html">
																				<font color="#000000">◎性能测试</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1410.html">
																				<font color="#000000">◎Oracle SQL 性能优化技巧</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/957.html">
																				<font color="#000000">◎性能计数器解释</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1044.html">
																				<font color="#000000">◎AIX 性能调优－内存、CPU篇</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1070.html">
																				<font color="#000000">◎性能测试基础知识－处理器调度程序性能</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1094.html">
																				<font color="#000000">◎性能测试之协议分析</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1013.html">
																				<font color="#000000">◎WebLogic Server 性能调优（一）</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1071.html">
																				<font color="#000000">◎性能和容量规划（1）</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1219.html">
																				<font color="#000000">◎Java性能</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1399.html">
																				<font color="#000000">◎性能测试的容量评估</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/43.html">
																				<font color="#000000">◎有效的用例编写规则</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/259.html">
																				<font color="#000000">◎调整压力测试工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1047.html">
																				<font color="#000000">◎实际项目中可使用的性能需求</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1015.html">
																				<font color="#000000">◎WebLogic Server 性能调优（三）</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1292.html">
																				<font color="#000000">◎测试您的DB2数据库:用JMeter测量性能</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1116.html">
																				<font color="#000000">◎关注10大E-mail邮箱性能</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1202.html">
																				<font color="#000000">◎WTC性能测试报告</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1388.html">
																				<font color="#000000">◎跟踪数据库性能变化</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/753.html">
																				<font color="#000000">◎对你的ASP程序作负载测试</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1523.html">
																				<font color="#000000">◎什么是可伸缩性测试</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1502.html">
																				<font color="#000000">◎如何调整压力测试工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/260.html">
																				<font color="#000000">◎对 Linux 内核进行压力测试</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1014.html">
																				<font color="#000000">◎WebLogic Server 性能调优（二）</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/252.html">
																				<font color="#000000">◎路由器性能指标详解</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1209.html">
																				<font color="#000000">◎刨根问底 微软Vista操作系统详尽测试</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/336.html">
																				<font color="#000000">◎Ad Hoc网络性能测试关键技术研究</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/465.html">
																				<font color="#000000">◎Java性能</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/306.html">
																				<font color="#000000">◎NET Framework部署的性能调整</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1072.html">
																				<font color="#000000">◎性能和容量规划（2）</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1010.html">
																				<font color="#000000">◎文件系统性能调优</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1073.html">
																				<font color="#000000">◎性能和容量规划（3）</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1556.html">
																				<font color="#000000">◎LoadRunner的Apache的监控</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1115.html">
																				<font color="#000000">◎性能比较：事务处理控件</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/655.html">
																				<font color="#000000">◎Redhat AS3下Oracle9204异步I/O的实现</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/685.html">
																				<font color="#000000">◎迈向测试自动化成功的七个步骤</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/911.html">
																				<font color="#000000">◎cdma2000 1xEVDO网络性能测试</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/1409.html">
																				<font color="#000000">◎优化ERP应用</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/307.html">
																				<font color="#000000">◎对 Windows DNA 应用程序中的数据访问组件进行压力测试</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/8/681.html">
																				<font color="#000000">◎选择测试自动化框架</font>
																		</a>
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20719.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-18 09:33 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20719.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试之场景设计思想</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20716.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 18 Dec 2006 01:29:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20716.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20716.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20716.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20716.html</trackback:ping><description><![CDATA[
		<font size="2">前段时间有幸收到珠海X公司性能题目，呵呵，以下是对公司产品性能测试的总结。个人认为有关性能测试场景问题，其实更佳着重于对性能测试目的考究。</font>
		<p class="main">
				<font size="2">　　验证测试是用于验证在特定的场景、时间、压力、环境和操作方式下系统能够正常的运行，服务器、应用系统和网络环境等软硬件设施还能否良好的支撑这些情况下用户的使用。验证性测试主要针对有明确的压力目标和预期结果，验证系统在这种压力下的各方面反映能够达到预期结果。</font>
		</p>
		<p class="main">
				<font size="2">　　主要分以下几种：</font>
		</p>
		<p class="main">
				<font size="2">　　<strong>压力测试：</strong>已知系统高峰期使用人数，验证各事务在最大并发数（通过高峰期人数换算）下事务响应时间能够达到客户要求。系统各性能指标在这种压力下是否还在正常数值之内。系统是否会因这样的压力导致不良反应（如：宕机、应用异常中止等）。</font>
		</p>
		<p class="main">
				<font size="2">　　<strong>Ramp Up 增量设计：</strong>如并发用户为75人，系统注册用户为1500人，以5％－7％作为并发用户参考值。一般以每15s加载5人的方式进行增压设计，该数值主要参考测试加压机性能，建议Run几次。以事务通过率与错误率衡量实际加载方式。</font>
		</p>
		<p class="main">
				<font size="2">　　<strong>Ramp Up增量设计目标：</strong> 寻找已增量方式加压系统性能瓶颈位置，抓住出现的性能拐点时机，一般常用参考Hits点击率与吞吐量、CPU、内存使用情况综合判断。模拟高峰期使用人数，如早晨的登录，下班后的退出，工资发送时的消息系统等。</font>
		</p>
		<p class="main">
				<font size="2">　　另一种极限模拟方式，可视为在峰值压力情况下同时点击事务操作的系统极限操作指标。加压方式不变，在各脚本事务点中设置同集合点名称（如：lr_rendzvous("same");）在场景设计中，使用事务点集合策略。以同时达到集合点百分率为标准，同时释放所有正在Run的Vuser。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>稳定性测试：</strong>已知系统高峰期使用人数、各事务操作频率等。设计综合测试场景，测试时将每个场景按照一定人数比率一起运行，模拟用户使用数年的情况。并监控在测试中，系统各性能指标在这种压力下是否能保持正常数值。事务响应时间是否会出现波动或随测试时间增涨而增加。系统是否会在测试期间内发生如宕机、应用中止等异常情况。</font>
		</p>
		<p class="main">
				<font size="2">　　根据上述测试中，各事务条件下出现性能拐点的位置，已确定稳定性测试并发用户人数。仍然根据实际测试服务器（加压机、应用服务器、数据服务器三方性能），估算最终并发用户人数。</font>
		</p>
		<p class="main">
				<font size="2">　　<strong>场景设计思想</strong>：从稳定性测试场景的设计意义，应分多种情况考虑：</font>
		</p>
		<p class="main">
				<font size="2">　　针对同一个场景为例，以下以公文附件上传为例简要分析场景设计思想：</font>
		</p>
		<p class="main">
				<font size="2">　　1）场景一：已压力测试环境下性能拐点的并发用户为设计测试场景，目的验证极限压力情况下测试服务器各性能指标。</font>
		</p>
		<p class="main">
				<font size="2">　　2）场景二：根据压力测试环境中CPU、内存等指标选取服务器所能承受最大压力的50%来确定并发用户数。</font>
		</p>
		<p class="main">
				<font size="2">　　测试方法：采用1)Ramp Up-Load all Vusers simultaneously</font>
		</p>
		<p class="main">
				<font size="2">　　2)Duration-Run Indefinitely</font>
		</p>
		<p class="main">
				<font size="2">　　3)在Sechedule-勾选Initalize all Vusers before Run </font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>容错性测试：</strong>通过模拟一些非正常情况（如：服务器突然断电、网络时断时续、服务器硬盘空间不足等），验证系统在发生这些情况时是否能够有自动处理机制以保障系统的正常运行或恢复运行措施。如有HA（自动容灾系统），还可以专门针对这些自动保护系统进行另外的测试。验证其能否有效触发保护措施。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>问题排除性测试：</strong>通过原有案例或经验判断，针对系统中曾经发生问题或怀疑存在隐患的模块进行验证测试。验证这些模块是否还会发生同样的性能问题。如：上传附件模块的内存泄露问题、地址本模块优化、开启Tivoli性能监控对OA系统性能的影响等等。</font>
		</p>
		<p class="main">
				<font size="2">　　测评测试是用于获取系统的关键性能指标点，而进行的相关测试。主要是针对预先没有明确的预期测试结果，而是要通过测试获取在特定压力场景下的性能指标（如：事务响应时间、最大并发用户数等）。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>评测事务交易时间：</strong>为获取某事务在特定压力下的响应时间而进行的测试活动。通过模拟已知客户高峰期的各压力值或预期所能承受的压力值，获取事务在这种压力下的响应时间。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>评测事务最大并发用户数：</strong>为获取某事务在特定系统环境下所能承受的最大并发用户数而进行的测试活动。通过模拟真实环境或直接采用真实环境，评测在这种环境下事务所能承受的最大并发用户数。判定标准阈值需预先定义（如响应时间，CPU占用率，内存占用率，已出现点击率峰值，已出现吞吐量峰值等）。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>评测系统最大并发用户数：</strong>为获取整个系统所能够承受的最大并发用户数而进行的的测试活动。通过预先分析项目各主要模块的使用比率和频率，定义各事务在综合场景中所占的比率，以比率方式分配各事务并发用户数。模拟真实环境或直接采用真实环境，评测在这种环境下系统所能承受的最大并发用户数。判定标准阀值预先定义（如响应时间，CPU占用率，内存占用率，已出现点击率峰值，已出现吞吐量峰值等）。取值标准以木桶法则为准（并发数最小的事务为整个系统的并发数）。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>评测不同数据库数据量对性能的影响：</strong>针对不同数据库数据量的测试，将测试结果进行对比，分析发现数据库中各表的数据量对事务性能的影响。得以预先判断系统长时间运行后，或某些模块客户要求数据量较大时可能存在的隐患。</font>
		</p>
		<p class="main">
				<font size="2">　　问题定位测试在通过以上测试或用户实际操作已经发现系统中的性能问题或怀疑已存在性能问题。需通过响应的测试场景重现问题或定义问题。如有可能，可以直接找出引起性能问题所在的代码或模块。</font>
		</p>
		<p class="main">
				<font size="2">　　该类测试主要还是通过测试出问题的脚本场景，并可以增加发现和检测的工具，如开启Tivoli性能监控、开启HeapDump输出、Linux资源监控命令等。并在场景运行过程中辅以手工测试。 </font>
		</p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-18 09:29 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试之场景设计思想</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20717.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 18 Dec 2006 01:29:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20717.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20717.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20717.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20717.html</trackback:ping><description><![CDATA[
		<font size="2">前段时间有幸收到珠海X公司性能题目，呵呵，以下是对公司产品性能测试的总结。个人认为有关性能测试场景问题，其实更佳着重于对性能测试目的考究。</font>
		<p class="main">
				<font size="2">　　验证测试是用于验证在特定的场景、时间、压力、环境和操作方式下系统能够正常的运行，服务器、应用系统和网络环境等软硬件设施还能否良好的支撑这些情况下用户的使用。验证性测试主要针对有明确的压力目标和预期结果，验证系统在这种压力下的各方面反映能够达到预期结果。</font>
		</p>
		<p class="main">
				<font size="2">　　主要分以下几种：</font>
		</p>
		<p class="main">
				<font size="2">　　<strong>压力测试：</strong>已知系统高峰期使用人数，验证各事务在最大并发数（通过高峰期人数换算）下事务响应时间能够达到客户要求。系统各性能指标在这种压力下是否还在正常数值之内。系统是否会因这样的压力导致不良反应（如：宕机、应用异常中止等）。</font>
		</p>
		<p class="main">
				<font size="2">　　<strong>Ramp Up 增量设计：</strong>如并发用户为75人，系统注册用户为1500人，以5％－7％作为并发用户参考值。一般以每15s加载5人的方式进行增压设计，该数值主要参考测试加压机性能，建议Run几次。以事务通过率与错误率衡量实际加载方式。</font>
		</p>
		<p class="main">
				<font size="2">　　<strong>Ramp Up增量设计目标：</strong> 寻找已增量方式加压系统性能瓶颈位置，抓住出现的性能拐点时机，一般常用参考Hits点击率与吞吐量、CPU、内存使用情况综合判断。模拟高峰期使用人数，如早晨的登录，下班后的退出，工资发送时的消息系统等。</font>
		</p>
		<p class="main">
				<font size="2">　　另一种极限模拟方式，可视为在峰值压力情况下同时点击事务操作的系统极限操作指标。加压方式不变，在各脚本事务点中设置同集合点名称（如：lr_rendzvous("same");）在场景设计中，使用事务点集合策略。以同时达到集合点百分率为标准，同时释放所有正在Run的Vuser。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>稳定性测试：</strong>已知系统高峰期使用人数、各事务操作频率等。设计综合测试场景，测试时将每个场景按照一定人数比率一起运行，模拟用户使用数年的情况。并监控在测试中，系统各性能指标在这种压力下是否能保持正常数值。事务响应时间是否会出现波动或随测试时间增涨而增加。系统是否会在测试期间内发生如宕机、应用中止等异常情况。</font>
		</p>
		<p class="main">
				<font size="2">　　根据上述测试中，各事务条件下出现性能拐点的位置，已确定稳定性测试并发用户人数。仍然根据实际测试服务器（加压机、应用服务器、数据服务器三方性能），估算最终并发用户人数。</font>
		</p>
		<p class="main">
				<font size="2">　　<strong>场景设计思想</strong>：从稳定性测试场景的设计意义，应分多种情况考虑：</font>
		</p>
		<p class="main">
				<font size="2">　　针对同一个场景为例，以下以公文附件上传为例简要分析场景设计思想：</font>
		</p>
		<p class="main">
				<font size="2">　　1）场景一：已压力测试环境下性能拐点的并发用户为设计测试场景，目的验证极限压力情况下测试服务器各性能指标。</font>
		</p>
		<p class="main">
				<font size="2">　　2）场景二：根据压力测试环境中CPU、内存等指标选取服务器所能承受最大压力的50%来确定并发用户数。</font>
		</p>
		<p class="main">
				<font size="2">　　测试方法：采用1)Ramp Up-Load all Vusers simultaneously</font>
		</p>
		<p class="main">
				<font size="2">　　2)Duration-Run Indefinitely</font>
		</p>
		<p class="main">
				<font size="2">　　3)在Sechedule-勾选Initalize all Vusers before Run </font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>容错性测试：</strong>通过模拟一些非正常情况（如：服务器突然断电、网络时断时续、服务器硬盘空间不足等），验证系统在发生这些情况时是否能够有自动处理机制以保障系统的正常运行或恢复运行措施。如有HA（自动容灾系统），还可以专门针对这些自动保护系统进行另外的测试。验证其能否有效触发保护措施。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>问题排除性测试：</strong>通过原有案例或经验判断，针对系统中曾经发生问题或怀疑存在隐患的模块进行验证测试。验证这些模块是否还会发生同样的性能问题。如：上传附件模块的内存泄露问题、地址本模块优化、开启Tivoli性能监控对OA系统性能的影响等等。</font>
		</p>
		<p class="main">
				<font size="2">　　测评测试是用于获取系统的关键性能指标点，而进行的相关测试。主要是针对预先没有明确的预期测试结果，而是要通过测试获取在特定压力场景下的性能指标（如：事务响应时间、最大并发用户数等）。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>评测事务交易时间：</strong>为获取某事务在特定压力下的响应时间而进行的测试活动。通过模拟已知客户高峰期的各压力值或预期所能承受的压力值，获取事务在这种压力下的响应时间。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>评测事务最大并发用户数：</strong>为获取某事务在特定系统环境下所能承受的最大并发用户数而进行的测试活动。通过模拟真实环境或直接采用真实环境，评测在这种环境下事务所能承受的最大并发用户数。判定标准阈值需预先定义（如响应时间，CPU占用率，内存占用率，已出现点击率峰值，已出现吞吐量峰值等）。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>评测系统最大并发用户数：</strong>为获取整个系统所能够承受的最大并发用户数而进行的的测试活动。通过预先分析项目各主要模块的使用比率和频率，定义各事务在综合场景中所占的比率，以比率方式分配各事务并发用户数。模拟真实环境或直接采用真实环境，评测在这种环境下系统所能承受的最大并发用户数。判定标准阀值预先定义（如响应时间，CPU占用率，内存占用率，已出现点击率峰值，已出现吞吐量峰值等）。取值标准以木桶法则为准（并发数最小的事务为整个系统的并发数）。</font>
		</p>
		<p class="main">
				<font size="2"> 　　<strong>评测不同数据库数据量对性能的影响：</strong>针对不同数据库数据量的测试，将测试结果进行对比，分析发现数据库中各表的数据量对事务性能的影响。得以预先判断系统长时间运行后，或某些模块客户要求数据量较大时可能存在的隐患。</font>
		</p>
		<p class="main">
				<font size="2">　　问题定位测试在通过以上测试或用户实际操作已经发现系统中的性能问题或怀疑已存在性能问题。需通过响应的测试场景重现问题或定义问题。如有可能，可以直接找出引起性能问题所在的代码或模块。</font>
		</p>
		<p class="main">
				<font size="2">　　该类测试主要还是通过测试出问题的脚本场景，并可以增加发现和检测的工具，如开启Tivoli性能监控、开启HeapDump输出、Linux资源监控命令等。并在场景运行过程中辅以手工测试。 </font>
		</p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-18 09:29 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试（并发负载压力）测试分析－简要篇</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20715.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 18 Dec 2006 01:28:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20715.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20715.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20715.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20715.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20715.html</trackback:ping><description><![CDATA[
		<font size="2">在论坛混了多日，发现越来越多的性能测试工程师基本上都能够掌握利用测试工具来作负载压力测试，但多数人对怎样去分析工具收集到的测试结果感到无从下手，下面我就把个人工作中的体会和收集到的有关资料整理出来，希望能对大家分析测试结果有所帮助。 </font>
		<p>
				<font size="2">分析原则： </font>
		</p>
		<p>
				<font size="2">• 具体问题具体分析（这是由于不同的应用系统，不同的测试目的，不同的性能关注点） </font>
		</p>
		<p>
				<font size="2">• 查找瓶颈时按以下顺序，由易到难。 </font>
		</p>
		<p>
				<font size="2">    服务器硬件瓶颈-〉网络瓶颈（对局域网，可以不考虑）-〉服务器操作系统瓶颈（参数配置）-〉中间件瓶颈（参数配置，数据库，web服务器等）-〉应用瓶颈（SQL语句、数据库设计、业务逻辑、算法等） </font>
		</p>
		<p>
				<font size="2">    注：以上过程并不是每个分析中都需要的，要根据测试目的和要求来确定分析的深度。对一些要求低的，我们分析到应用系统在将来大的负载压力（并发用户数、数据量）下，系统的硬件瓶颈在哪儿就够了。 </font>
		</p>
		<p>
				<font size="2">• 分段排除法 很有效 </font>
		</p>
		<p>
				<font size="2">分析的信息来源： </font>
		</p>
		<p>
				<font size="2">•1 根据场景运行过程中的错误提示信息 </font>
		</p>
		<p>
				<font size="2">•2 根据测试结果收集到的监控指标数据 </font>
		</p>
		<p>
				<font size="2">一．错误提示分析 </font>
		</p>
		<p>
				<font size="2">分析实例： </font>
		</p>
		<p>
				<font size="2">1 •Error: Failed to connect to server “10.10.10.30:8080″: [10060] Connection </font>
		</p>
		<p>
				<font size="2">•Error: timed out Error: Server “10.10.10.30″ has shut down the connection prematurely </font>
		</p>
		<p>
				<font size="2">分析： </font>
		</p>
		<p>
				<font size="2">•A、应用服务死掉。 </font>
		</p>
		<p>
				<font size="2">（小用户时：程序上的问题。程序上处理数据库的问题） </font>
		</p>
		<p>
				<font size="2">•B、应用服务没有死 </font>
		</p>
		<p>
				<font size="2">（应用服务参数设置问题） </font>
		</p>
		<p>
				<font size="2">    例：在许多客户端连接Weblogic应用服务器被拒绝，而在服务器端没有错误显示，则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息，说明应提高该值，每次增加25％ </font>
		</p>
		<p>
				<font size="2">•C、数据库的连接 </font>
		</p>
		<p>
				<font size="2">(1、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数（跟硬件的内存有关）) </font>
		</p>
		<p>
				<font size="2">2 Error: Page download timeout (120 seconds) has expired </font>
		</p>
		<p>
				<font size="2">分析：可能是以下原因造成 </font>
		</p>
		<p>
				<font size="2">•A、应用服务参数设置太大导致服务器的瓶颈 </font>
		</p>
		<p>
				<font size="2">•B、页面中图片太多 </font>
		</p>
		<p>
				<font size="2">•C、在程序处理表的时候检查字段太大多 </font>
		</p>
		<p>
				<font size="2">二．监控指标数据分析 </font>
		</p>
		<p>
				<font size="2">1．最大并发用户数： </font>
		</p>
		<p>
				<font size="2">应用系统在当前环境（硬件环境、网络环境、软件环境（参数配置））下能承受的最大并发用户数。 </font>
		</p>
		<p>
				<font size="2">    在方案运行中，如果出现了大于3个用户的业务操作失败，或出现了服务器shutdown的情况，则说明在当前环境下，系统承受不了当前并发用户的负载压力，那么最大并发用户数就是前一个没有出现这种现象的并发用户数。 </font>
		</p>
		<p>
				<font size="2">    如果测得的最大并发用户数到达了性能要求，且各服务器资源情况良好，业务操作响应时间也达到了用户要求，那么OK。否则，再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。 </font>
		</p>
		<p>
				<font size="2">2．业务操作响应时间： </font>
		</p>
		<p>
				<font size="2">    • 分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图，可以确定在方案执行期间响应时间过长的事务。 </font>
		</p>
		<p>
				<font size="2">• 细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的？问题是否与网络或服务器有关？ </font>
		</p>
		<p>
				<font size="2">• 如果服务器耗时过长，请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长，请使用“网络监视器”图确定导致性能瓶颈的网络问题 </font>
		</p>
		<p>
				<font size="2">3．服务器资源监控指标： </font>
		</p>
		<p>
				<font size="2">内存： </font>
		</p>
		<p>
				<font size="2">1 UNIX资源监控中指标内存页交换速率（Paging rate），如果该值偶尔走高，表明当时有线程竞争内存。如果持续很高，则内存可能是瓶颈。也可能是内存访问命中率低。 </font>
		</p>
		<p>
				<font size="2">2 Windows资源监控中，如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高，同时Memory\Available bytes计数器的值持续降低，则很可能存在内存泄漏。 </font>
		</p>
		<p>
				<font size="2">内存资源成为系统性能的瓶颈的征兆: </font>
		</p>
		<p>
				<font size="2">很高的换页率(high pageout rate); </font>
		</p>
		<p>
				<font size="2">进程进入不活动状态; </font>
		</p>
		<p>
				<font size="2">交换区所有磁盘的活动次数可高; </font>
		</p>
		<p>
				<font size="2">可高的全局系统CPU利用率;  </font>
		</p>
		<p>
				<font size="2">内存不够出错(out of memory errors) </font>
		</p>
		<p>
				<font size="2">处理器： </font>
		</p>
		<p>
				<font size="2">1 UNIX资源监控（Windows操作系统同理）中指标CPU占用率（CPU utilization），如果该值持续超过95%，表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是80-85%  </font>
		</p>
		<p>
				<font size="2">合理使用的范围在60%至70%。 </font>
		</p>
		<p>
				<font size="2">2 Windows资源监控中，如果System\Processor Queue Length大于2，而处理器利用率（Processor Time）一直很低，则存在着处理器阻塞。 </font>
		</p>
		<p>
				<font size="2">CPU资源成为系统性能的瓶颈的征兆:  </font>
		</p>
		<p>
				<font size="2">很慢的响应时间(slow response time)  </font>
		</p>
		<p>
				<font size="2">CPU空闲时间为零(zero percent idle CPU)  </font>
		</p>
		<p>
				<font size="2">过高的用户占用CPU时间(high percent user CPU)  </font>
		</p>
		<p>
				<font size="2">过高的系统占用CPU时间(high percent system CPU)  </font>
		</p>
		<p>
				<font size="2">长时间的有很长的运行进程队列(large run queue size sustained over time) </font>
		</p>
		<p>
				<font size="2">磁盘I/O： </font>
		</p>
		<p>
				<font size="2">1 UNIX资源监控（Windows操作系统同理）中指标磁盘交换率（Disk rate），如果该参数值一直很高，表明I/O有问题。可考虑更换更快的硬盘系统。 </font>
		</p>
		<p>
				<font size="2">2 Windows资源监控中，如果 Disk Time和Avg.Disk Queue Length的值很高，而Page Reads/sec页面读取操作速率很低，则可能存在磁盘瓶径。 </font>
		</p>
		<p>
				<font size="2">I/O资源成为系统性能的瓶颈的征兆 : </font>
		</p>
		<p>
				<font size="2">过高的磁盘利用率(high disk utilization)  </font>
		</p>
		<p>
				<font size="2">太长的磁盘等待队列(large disk queue length)  </font>
		</p>
		<p>
				<font size="2">等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O)  </font>
		</p>
		<p>
				<font size="2">太高的物理I/O速率:large physical I/O rate(not sufficient in itself)  </font>
		</p>
		<p>
				<font size="2">过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself))  </font>
		</p>
		<p>
				<font size="2">太长的运行进程队列，但CPU却空闲(large run queue with idle CPU) </font>
		</p>
		<p>
				<font size="2">4．数据库服务器： </font>
		</p>
		<p>
				<font size="2">SQL Server数据库： </font>
		</p>
		<p>
				<font size="2">1 SQLServer资源监控中指标缓存点击率（Cache Hit Ratio），该值越高越好。如果持续低于80%，应考虑增加内存。 </font>
		</p>
		<p>
				<font size="2">2 如果Full Scans/sec（全表扫描/秒）计数器显示的值比1或2高，则应分析你的查询以确定是否确实需要全表扫描，以及SQL查询是否可以被优化。  </font>
		</p>
		<p>
				<font size="2">3 Number of Deadlocks/sec(死锁的数量/秒)：死锁对应用程序的可伸缩性非常有害，并且会导致恶劣的用户体验。该计数器的值必须为0。 </font>
		</p>
		<p>
				<font size="2">4 Lock Requests/sec(锁请求/秒)，通过优化查询来减少读取次数，可以减少该计数器的值。 </font>
		</p>
		<p>
				<font size="2">Oracle数据库： </font>
		</p>
		<p>
				<font size="2">1 如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90，那么需要增加SHARED_POOL_SIZE的大小。 </font>
		</p>
		<p>
				<font size="2">快存（共享SQL区）和数据字典快存的命中率：  </font>
		</p>
		<p>
				<font size="2">select(sum(pins-reloads))/sum(pins) from v$librarycache;  </font>
		</p>
		<p>
				<font size="2">select(sum(gets-getmisses))/sum(gets) from v$rowcache;  </font>
		</p>
		<p>
				<font size="2">自由内存： select * from v$sgastat where name=’free memory’;  </font>
		</p>
		<p>
				<font size="2">2 如果数据的缓存命中率小于0.90，那么需要加大DB_BLOCK_BUFFERS参数的值（单位：块）。 </font>
		</p>
		<p>
				<font size="2">缓冲区高速缓存命中率： </font>
		</p>
		<p>
				<font size="2">select name,value from v$sysstat where name in (’db block gets’, </font>
		</p>
		<p>
				<font size="2">‘consistent gets’,'physical reads’) ; </font>
		</p>
		<p>
				<font size="2">Hit Ratio = 1-(physical reads / ( db block gets + consistent gets)) </font>
		</p>
		<p>
				<font size="2">3 如果日志缓冲区申请的值较大，则应加大LOG_BUFFER参数的值。 </font>
		</p>
		<p>
				<font size="2">日志缓冲区的申请情况 ： </font>
		</p>
		<p>
				<font size="2">select name,value from v$sysstat where name = ‘redo log space requests’ ; </font>
		</p>
		<p>
				<font size="2">4 如果内存排序命中率小于0.95，则应加大SORT_AREA_SIZE以避免磁盘排序 。 </font>
		</p>
		<p>
				<font size="2">内存排序命中率 ： </font>
		</p>
		<p>
				<font size="2">select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’ </font>
		</p>
		<p>
				<font size="2">注：上述SQL Server和Oracle数据库分析，只是一些简单、基本的分析，特别是Oracle数据库的分析和优化，是一门专门的技术，进一步的分析可查相关资料。 </font>
		</p>
		<p>
				<br />
				<font size="2">本文出自51testing博客，转载请注明出处<br />原始链接：</font>
				<font size="2">http://blog.51testing.com/?49159/action_viewspace_itemid_869.html</font>
				<br />
		</p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20715.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-18 09:28 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20715.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试原理及性能测试实例分析</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20714.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 18 Dec 2006 01:25:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20714.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20714.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20714.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20714.html</trackback:ping><description><![CDATA[
		<div class="daxiao14" align="left">
				<p>
						<strong>【摘要】 </strong>在大型软件系统投入生产之前进行性能测试已经成为趋势，本文结合一个性能测试案例对性能测试的过程和原理进行了介绍。 </p>
				<p>
						<strong>【关键字】 </strong>性能测试　　并发测试　　负载测试</p>
				<p>•  <strong><strong>软件测试中的性能测试</strong></strong></p>
				<p>软件测试是保证软件质量的重要手段，也是软件过程中一个必不可少的环节。而性能测试则隶属于软件测试中的系统级测试，它对软件在集成系统中运行的性能行为进行测试，旨在及早确定和消除软件中与构架有关的性能瓶颈。</p>
				<p>•  性能测试的含义 </p>
				<p>目前对性能测试没有明确的定义，一般地，它主要是针对系统的性能指标制定性能测试方案，执行测试用例，得出测试结果来验证系统的性能指标是否满足既定值。性能指标里可能包括系统各个方面的能力，如系统并发处理能力，批量业务处理能力等。</p>
				<p>•  性能测试的分解</p>
				<p>在性能测试的执行中，可以根据具体的性能指标，分解为几种测试，根据其关系，可以在不同的时间和空间内执行。这些子测试通常包括以下几种：</p>
				<p>并发测试：验证系统的并发处理能力。一般是和服务器端建立大量的并发连接，通过客户端的响应时间和服务器端的性能监测情况来判断系统是否达到了既定的并发能力指标。</p>
				<p>负载测试：验证系统的负载工作能力。系统配置不变的条件下，在一定时间内，服务器端在高负载情况下的性能行为表现。这里的负载可以是用户数，交易数，事务数等。</p>
				<p>配置测试：核实在操作条件保持不变的情况下，系统在使用不同配置时其性能行为的可接受性。</p>
				<p>健壮性测试：核实被测系统的性能行为在异常或极端条件之下的可接受性。这里的异常或极端条件指的是资源过少，用户数过多，突发故障等。</p>
				<p>随着软件系统的规模日益庞大，结构日趋复杂，对软件系统的性能测试已经成为必须和趋势。尤其大型的分布式软件系统更要在正式运行前进行性能测试，因为这样的系统在投入生产之后，往往要接受大批量的业务量，这对应用程序本身，操作系统, 中心数据库服务器，中间件服务器，网络设备的承受力都是一个严峻的考验。在其中任意一个环节出现的问题都可能给用户带来巨大的商业损失。预见软件系统的并发承受能力以避免商业风险，这是在软件测试阶段就应该解决的。例如中国人民银行的现代化支付系统和上海外汇交易中心的本币交易系统都在投入生产之前进行了多轮的第三方性能测试，起到了很好的作用。</p>
				<p>下面我就介绍一个性能测试案例。</p>
				<p>• <strong>一个性能测试实例</strong></p>
				<p>• 被测系统</p>
				<p>1)被测系统介绍</p>
				<p>本系统应我国金融信息化发展设计，采用当今比较先进和流行的技术，是运行在城域网上的大型分布式应用系统。</p>
				<p>本系统遵循J2EE规范，采用B/S体系结构进行设计和开发。业务主要分为交易业务和查询业务，查询业务采用J2EE规范，交易业务以J2EE体系架构为基础，进行进一步的处理，采用了TCP的四层结构。系统体系结构图如下： </p>
				<table width="618" border="0">
						<tbody>
								<tr>
										<td width="60"> </td>
										<td width="484">
												<img height="328" src="http://www.51testing.com/emagzine/lib/No2/4/pic1.jpg" width="530" />
										</td>
										<td width="60"> </td>
								</tr>
						</tbody>
				</table>
				<p align="center">图表 1被测系统体系结构设计图</p>
				<ul>
						<li>表示层：　 </li>
				</ul>
				<p>运行在终端上。运行java applet程序，提供协议控制和用户界面，与系统最终用户实现直接交互，通过TCP/HTTP与前置系统通讯。向前置系统发送请求报文，并接收前置系统返回的回应报文。</p>
				<ul>
						<li>商业逻辑层： </li>
				</ul>
				<p>作为中间层实现核心业务逻辑服务。 </p>
				<p>交易应用服务：运行在交易主机上。在tuxedo中间件上运行业务处理程序，按交易规则处理前置机发来的交易指令，通过tuxedo jolt与前置机连接，通过DB2 C API与数据库连接。 </p>
				<p>交易前置服务和查询前置服务：运行在前置机上。交易前置服务运行服务程序接收终端请求报文并通过tuxedo jolt客户端将其转发给交易主机，再通过轮询和同步反馈接收交易主机返回的报文，将其转发给业务终端；查询前置服务运行在weblogic应用服务器上并调用Jreport组件，通过JDBC完成对查询流指令的发送并接受数据库返回的结果给业务终端。</p>
				<ul>
						<li>数据层： </li>
				</ul>
				<p>运行在数据库主机上。负责整个系统中数据信息的存储、访问及其优化。运行DB2数据库服务程序。通过DB2 C API与交易主机通讯，JDBC与查询前置服务通讯。</p>数据库主机和交易主机运行在交易中心城市，前置机运行在各个分中心城市，终端是各个城市参加交易的单位，整个系统覆盖城域网。 
<p>2) 被测系统的性能要求和性能指标</p><p>金融系统是业务处理十分频繁、数据交换吞吐量很大的系统，业务处理的速度直接关系到公司的经济效益和客户对公司的评价。在客观条件下，整个广域网系统必须在大业务量的情况下同时保持快速的实时响应能力，以保证整个业务系统的通畅运行。用户对此提出如下性能指标： </p><table width="200" border="0"><tbody><tr><td>　　</td><td><img height="141" src="http://www.51testing.com/emagzine/lib/No2/4/pic2.jpg" width="552" /></td><td> </td></tr></tbody></table><p align="center">表格1用户要求性能指标表</p><p>下面我们会根据此系统和给定的性能指标来进行性能测试：</p><p>•  <a class="style2" name="_Toc22896932"><strong><font size="2">对被测系统进行性能测试</font></strong></a></p><p>性能测试的目的是最大程度地模拟真实业务场景，来验证系统的性能指标，并发现可能存在的性能瓶颈。 </p><p>1)对被测系统进行系统分析 </p><p>我们可以看到本系统大体上由终端、前置机、交易主机、数据库主机节点组成。</p><p>在整个业务流程中，业务终端→前置机→交易主机→数据库主机形成了一个压力流串，每个节点在压力下能够正常工作是整个系统正常运转的基础。也就是说，如果其中任意一个节点在业务压力下发生了拥塞、处理不力等不正常情况，那整个系统都无法正常运转。</p><p>我们来看一下业务流程。</p><p>首先，从终端到前置机，终端产生业务报文发送至前置机，前置机上运行查询前置服务和交易前置服务，查询前置服务向下通过HTTP协议以WEB服务形式和终端连接，向上通过JDBC直接与数据库系统相连。交易前置服务向下通过基于TCP协议的socket连接和终端通讯，向上通过tuxedo jolt客户端和交易应用服务连接。交易应用服务进行业务逻辑计算，并操作数据库系统。</p><p>由以上分析，我们可以整理出整个系统的两条压力流程线来，之所以我们把其分为两条流程线，是因为交易前置服务和查询前置服务的工作原理完全不同，下与终端的连接，上与交易主机的连接也完全是独立的两个通路。</p><p>终端→交易前置机→交易主机→数据库系统</p><p>终端→查询前置机→数据库系统</p><p>下面我们先独立分析两条流程线，之后我们将再次综合分析，以考虑二者之间的相互影响作用。</p><p>第一条路线上主要运行的是登陆指令和交易指令信息。</p><p>当系统运作时，多个交易终端与交易前置服务建立socket连接，完成登陆，之后发送交易指令，造成对交易前置服务的压力。交易前置服务通过运行服务程序接收到交易指令，并检验其合法性，然后通过交易中间件tuxedo的客户端把业务的压力传递给交易主机进行处理。交易主机进行必要的金融计算和业务逻辑运行，得出反馈结果，生成消息，一方面顺原路返回到各个终端上去，一方面记录入数据库。</p><p>在本条流程线上的加压主要考验交易前置服务程序的socket多连接建立能力，tuxedo交易中间件的即时响应能力，交易主机的计算能力，以及DB2数据库的DML语句加锁机制。</p><p>第二条路线上主要运行的是查询指令信息。</p><p>查询指令产生时，通过http协议访问weblogic上的web服务器和应用服务器上的相应组件，以JDBC接口访问后台的DB2数据库，并把数据库返回的结果发送至终端界面。</p><p>在本条流程线上的加压主要验证weblogic处理能力，数据库中索引是否创建合理。</p><p>两条流程线相对独立，但又是互相依赖的。由于是对同一个数据库系统进行读操作和写操作，查询流程的结果依赖于交易流程数据的产生，交易流程的产生的数据又通过查询流程得到验证。在进行压力测试时，两者的协同会对数据库形成压力的冲击。</p>鉴于以上分析，结合用户性能指标，我们决定把本次性能测试分解为如下几个子测试来进行。 
<p>A: 并发登陆测试：750个终端一分钟内并发登陆系统，并且响应时间在30秒之内。</p><p>B: 业务负载测试</p><p>此下又有三个子测试。</p><ul><li>交易流程测试：多个终端发起交易请求，逐渐加压，以达到300笔/秒的压力为限。 </li></ul><ul><li>查询流程测试：多个终端进行查询，逐渐加压，以达到400笔/秒的压力为限。查询成功与否以所请求的web页面完全展现为标准。（查询响应能力其实和数据库中的数据量有关系，后来和用户进一步确认，基础数据为30万条） </li></ul><ul><li>综合测试： </li></ul><p>在上面两种测试都通过的情况下，进行综合测试。</p><p>2)性能测试的执行过程，性能测试依照下面的步骤来进行：</p><ul><li><a class="style2" name="_Toc22896935"><strong><font size="2">第一步：测试脚本的开发</font></strong></a></li></ul><p>本次压力测试采用MI公司的loadrunner工具，脚本编辑和编译工作在VU Generator(脚本作坊)中进行。</p><p>理想的脚本是对现实世界的业务行为进行了完全无误的模拟，这其实是不可能的。我们的目标是使模拟的误差在我们认可的范围之内，并能有方法加以控制。</p><p>针对并发登陆测试和交易流程测试，由于两者运行机理相同，都是终端调用socket client，和交易前置的socket server建立连接，将请求消息发送至交易前置机。我们考虑采用将此部分java socket程序编入测试脚本程序，生成登陆和交易业务脚本，通过loadrunner来执行。这样做的好处是绕过终端IE界面复杂的处理逻辑，直接施压在前置机上（这种方式同时也带来了偏差，在执行测试场景时通过其它方法得到了一定的弥补）。</p><p>脚本除了要实现与前置机的socket连接，业务发送等功能，还要建立用户信息数据池，设置检测点、异常退出点，为脚本执行后的结果统计和分析提供正确的依据。</p><p>交易业务脚本内容略。部分如下：</p>public class Actions {/*登陆变量初始化*/ProtocolManager protocol;//ProtocolManager为实现socket连接的类 ServiceName service; //ServiceName对服务端的信息进行了封装，包括IP地址和端口号。LoginMessage login；//LoginMessage为登陆时需要向服务器发送的消息，待服务器确认并返回回应消息时，登陆成功。protocol = new ProtocolManager(); //创建ProtocolManager类的protocol对象service = ServiceName.getInstance();//获得ServiceName的实例login=new LoginMessage();//创建LoginMessage类的login对象service.setIP("200.31.10.18");//设置服务端的IP地址service.setPort(17777);//设置服务端的端口号/*设置登陆消息*/ login.serUserName(lr.eval.string(“{loginName}”));//从数据池里读出用户名，设置在login成员变量里login.setPasswd(“1234”);//数据库中添加的用户密码都为1234/*发送登陆消息*/protocol.login(login);//发送登陆消息lr_start_transaction("trade");//交易开始点TradeMessage trademessage;//生成交易消息/*设置交易消息*/ 
<p>………………………….</p><p>………………………….</p>/*发送交易消息*/ 
<p>………………………….</p><p>………………………….</p>if(sendfail)lr_end_transaction("trade", LR_FAIL);//如果发送交易消息失败，交易结束，返回。/*循环回收主机返回的处理信息*/ 
<p>…………………………</p><p>…………………………</p>if(recievefail)lr_end_transaction("trade", LR_FAIL);//如果不能接收到主机处理回应消息，交易结束，返回。if(recievesuccess)lr_end_transaction("trade", LR_PASS);//如果接收到主机成功处理的回应消息，交易结束，返回。 
<p>…………………………..</p>} 
<p>在上面的例子中，我们主要对每笔交易进行了transaction化。在交易开始时设置开始检测点，交易结束时设置结束检测点，并给loadrunner报出交易状态。实际的脚本中在回收交易响应消息时还进行了拆包，在应用层上对交易状态进行识别，并非例子中只在socket层加以判断。</p><p>针对查询流程测试，由于loadrunner工具支持基于http的web访问录制功能，我们将考虑采用以录制脚本为主，手工编写脚本为辅的方法，生成查询业务脚本，通过loadrunner来执行。由于查询脚本基本由录制生成http请求和应答，不同的压力测试工具录制会有差别，这里就不再写出查询脚本样例。</p><ul><li><a class="style2" name="_Toc22896937"><strong><font size="2">第二步：根据用户性能指标创立测试场景</font></strong></a></li></ul>在本次性能测试中，用户提出的性能指标不够细致和确切，通过对用户调查和实际业务分析，我们把性能指标的实现方式进行了明确的定位。 
<p>A:并发登陆测试场景</p><p>并发登陆750用户/分钟，登陆响应时间在30秒之内。仔细考虑一下，这里的并发登陆750用户/分钟指的是系统能够在1分钟内接受750个用户的登陆请求，而处理的效果如何则在交易终端体现，即登陆响应时间。基于这样的理解，我们把用户性能指标转化为如下的测试场景：</p><p>从第一秒钟开始，用loadrunner每秒钟登陆13个用户，并保持socket连接，直到1分钟结束，从终端向系统一共发送750个左右的用户登陆请求，系统在一分钟内建立了750个连接。在终端观察并统计登陆响应时间。如果系统不能响应持续增加的登陆请求或平均登陆响应时间大于30秒，并发登陆测试场景都不能算通过。</p>为了帮助用户更加深入了解系统的能力，我们对系统的瞬时并发能力进行测试，即测试系统所能承受的最大的瞬时并发用户登陆连接请求个数。这个场景通过loadrunner在登陆前设置同步点来实现，这个结果将结合上一个结果一同反映系统的登陆处理能力。 
<p>B:交易流程测试和查询流程测试：</p><p>在这里我们只对系统的业务负载能力做测试（并发处理能力在登陆测试中已经得到考证）。测试场景如下：</p><p>在loadrunner中，建立goal-orented的测试场景，以400笔/秒为目标，将调度权交给loadrunner来试图达到这个指标。</p><p>C: 综合测试：</p><p>交易流程测试和查询流程测试同时进行。</p><p>以上的测试场景要求均可在loadrunner中的Controller进行设置完成。</p><p>测试场景的创建之后，我们的测试任务更加具体化和清晰化。</p><ul><li><a class="style2" name="_Toc22896938"><strong><font size="2">第三步：运行测试场景，同步监测被测系统性能行为</font></strong></a></li></ul><p>在loadrunner中的controller中开启unix系统资源计数器，weblogic计数器，DB2计数器，检测系统资源消耗情况，并最终和测试结果数据合并，成为分析图表。</p><p>测试结果可在测试执行完毕后，通过loadrunner工具中的Analysis（分析器）获得。</p><p>A: 并发登陆测试</p><p>依照设计好的测试场景，用loadrunner工具在一分钟内渐增向系统发送登陆请求。分别进行三次，结果如下 </p><table width="618" border="0"><tbody><tr><td width="57"> </td><td width="490"><img height="191" src="http://www.51testing.com/emagzine/lib/No2/4/pic3.jpg" width="555" /></td><td width="57"> </td></tr></tbody></table><p align="center">表格 2登陆测试结果数据表 </p><p>注：这里的登陆成功用户指的是系统接受了登陆请求，并建立了连接。平均响应时间在登陆脚本里设置检测点，由loadrunner工具自动获得。</p><p>考察系统的瞬时并发处理能力：在完成上一步测试的前提下，逐步增加瞬时并发登陆用户数，直到系统极限。</p><p>测试执行结果如下：</p><table width="616" border="0"><tbody><tr><td width="100"> </td><td width="402"><img height="143" src="http://www.51testing.com/emagzine/lib/No2/4/pic4.jpg" width="552" /></td><td width="100"> </td></tr></tbody></table><p align="center"><a class="style2" name="_Toc22886134"><strong><font size="2">表格3瞬时并发登陆测试结果数据表</font></strong></a></p><p align="left">B: 负载测试</p><ul><li>交易流程测试： </li></ul><p>测试结果如下：</p><p>对于通过网络接口发送的批量业务请求，均在性能指标所指定的时间范围内得到请求成功的反馈消息，说明主机已经处理成功。</p><p>在通过网络接口发送业务请求的同时，开启IE，通过实际终端界面进行登陆和交易，系统响应时间延长，界面显示和刷新明显变慢，到业务量高峰时期，界面已经不能显示任何信息，处于不可工作的状态。</p><p>需求说明的是系统正常工作时，每个界面终端不仅应该能够展示己方的交易信息，还要展示其他交易单位的交易信息和系统信息。因此当交易量大的时候，界面需要展示的信息量是巨大的，这本身对终端界面是一个性能考验。</p><ul><li>查询流程测试： </li></ul><p>本流程测试在交易流程测试之后进行,以利用其生成的数据。</p><p>测试结果基本满足性能指标。</p><ul><li>综合测试 </li></ul><p>由于交易流程测试的未通过，本测试已经不能执行。</p><ul><li><a class="style2" name="_Toc22896939"><strong><font size="2">第四步：测试结果分析及性能评价</font></strong></a></li></ul><p>A:并发测试结果分析</p><p>根据上述的并发测试响应时间表，我们可以得出以下的结论：</p><p>被测系统在一分钟内并不能接受750个用户的登陆请求，其可接受的登陆请求用户数大概为490个左右。在这样的条件下，登陆响应时间在用户要求范围之内。</p><p>被测系统的瞬时并发处理能力约为122个用户。</p><p>B: 交易流程测试结果分析及性能评价</p><p>根据交易流程测试结果可知，通过脚本程序进行业务行为，发送业务请求消息到回收主机处理回应消息，这段时间系统是顺畅的，反应也是迅速的，但是在终端界面却不能即时展现消息。这说明信息的回馈通路在终端界面出现了性能瓶颈。当界面需要在短时间内展示大量交易信息时，已经不能承受负荷。这与终端采用java applet技术有关。</p><p>C: 查询流程测试结果分析</p><p align="left">查询流程基本符合性能指标。</p><p>需要说明的是，实际中，以上每个场景的测试都执行了多次，中间件参数进行了多次的调优。从以上测试的结果分析也可以看出，我们的性能测试瓶颈不是出现在中间件产品上，而是在自身开发的程序上。</p><p>•  <strong>总结</strong></p><p>由以上的实例过程我们可以看出性能测试基本由以下几个步骤进行 </p><ol><li>系统分析 </li></ol><p>将系统的性能指标转化为性能测试的具体目标。通常在这一步骤里，要分析被测系统结构，结合性能指标，制定具体的性能测试实施方案。这要求测试人员对被测系统结构和实施业务的全面掌握。</p><p>　　2.　建立虚拟用户脚本 </p><p>将业务流程转化为测试脚本，通常指的是虚拟用户脚本或虚拟用户。虚拟用户通过驱动一个真正的客户程序来模拟真实用户。在这一步骤里，要将各类被测业务流程从头至尾进行确认和记录，弄清这些交易过程可以帮助分析到每步操作的细节和时间，并能精确地转化为脚本。此过程类似制造一个能够模仿人的行为和动作的机器人过程。这个步骤非常重要，在这里将现实世界中的单个用户行为比较精确地转化为计算机程序语言。如果对现实世界的行为模仿失真，不能反映真实世界，性能测试的有效性和必要性也就失去了意义。 </p><p>　　3. 根据用户性能指标创建测试场景 </p><p>根据真实业务场景，将单个用户的行为进行复制和控制，转化为多个用户的行为。在这个步骤里，对脚本的执行制定规则和约束关系。具体涉及到交易量，并发时序等参数的设置。这好比是指挥脚本运行的司令部。这个步骤十分关键，往往需要结合用户性能指标进行细致地分析。 </p><p>　　4. 运行测试场景，同步监测应用性能 </p><p>在性能测试运行中，实时监测能让测试人员在测试过程中的任何时刻都可以了解应用程序的性能优劣。系统的每一部件都需要监测：客户端，网络，web服务器，应用服务器，数据库和所有服务器硬件。实时监测可以在测试执行中及早发现性能瓶颈。 </p><p>　　5. 性能测试的结果分析和性能评价</p><p>结合测试结果数据，分析出系统性能行为表现的规律，并准确定位系统的性能瓶颈所在。在这个步骤里，可以利用数学手段对大批量数据进行计算和统计，使结果更加具有客观性。在性能测试中，需要注意的是，能够执行的性能测试方案并不一定是成功的，成败的关键在于其是否精确地对真实世界进行了模拟。</p><p>在整个性能测试过程中，自动化测试工具的选择只能影响性能测试执行的复杂程度，简便一些或繁杂一些；但人的分析和思考却会直接导致性能测试的成败。所以本篇着重于对性能测试思路的整理。测试工具的介绍可以参看有关压力测试工具的资料。</p><p>注1：在本次性能测试案例中，还涉及到健壮性测试和可恢复性测试，限于篇幅，只介绍了并发测试和负载测试。</p><p>注2：loadrunner脚本样例并非实际运行脚本，只是为了表示其流程。</p><p>• <strong>参考文献</strong></p><p>Roger S. Pressman：软件工程实践者的研究方法黄柏素梅宏译机械工业出版社<br /></p></div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-18 09:25 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用LoadRunner进行负载测试的流程</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20709.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 18 Dec 2006 01:04:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20709.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20709.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20709.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20709.html</trackback:ping><description><![CDATA[用LoadRunner进行负载测试的流程通常由五个阶段组成：<br />计划、脚本创建、场景定义、场景执行和结果分析。<br />(1)计划负载测试：定义性能测试要求，例如并发用户的数量、典型业务流程和所需<br />响应时间。<br />(2)创建 Vuser 脚本：将最终用户活动捕获到自动脚本中。<br />(3)定义场景：使用 LoadRunner Controller 设置负载测试环境。<br />(4)运行场景：通过 LoadRunner Controller 驱动、管理和监控负载测试。<br />(5)分析结果：使用 LoadRunner Analysis 创建图和报告并评估性能。 <img src ="http://www.cnitblog.com/szdlinxie/aggbug/20709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-18 09:04 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/18/20709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Web application的压力测试（MS Web Application Stress Tool (was)）</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20659.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Sat, 16 Dec 2006 17:08:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20659.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20659.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20659.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20659.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 15pt">Web application</span>
				</b>
				<b>
						<span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的压力测试</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 15pt">
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<b>
						<span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（</span>
				</b>
				<span lang="EN-US">MS Web Application Stress Tool (was)</span>
				<b>
						<span style="FONT-SIZE: 15pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</span>
				</b>
				<b>
						<span lang="EN-US" style="FONT-SIZE: 15pt">
								<o:p>
								</o:p>
						</span>
				</b>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span>
				<span lang="EN-US">MS</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的网站上发现了一个挺不错的小东西：</span>
				<span lang="EN-US">MS Web Application Stress Tool (was)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。这是一个</span>
				<span lang="EN-US">web</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用压力测试工具。它是免费的，这一点很重要，否则</span>
				<span lang="EN-US">MS</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的版权大棒又要来了。</span>
				<span lang="EN-US">
						<br />
						<br />    </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如今</span>
				<span lang="EN-US">B/S</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">结构横行，基于浏览器的应用多如恒河沙数。我们也投入了太多的时间在</span>
				<span lang="EN-US">web</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">技术上，我们努力提高开发效率，花大量时间研究各种脚本，轻量级框架，</span>
				<span lang="EN-US">mvc</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">框架，也许我们可以多投入一些时间关注一下系统执行效率，做做压力测试。</span>
				<span lang="EN-US">
						<br />
						<br />    Was</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的使用非常简单，只需要配置好测试脚本，它就可以开始运行，然后给你一个非常详细的报告。脚本的配置有多种方式：</span>
				<span lang="EN-US">
						<br />
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体">◇</span>
				<span lang="EN-US">    </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自行编写测试脚本</span>
				<span lang="EN-US">
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体">◇</span>
				<span lang="EN-US">    </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">让</span>
				<span lang="EN-US">was</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">记录你在</span>
				<span lang="EN-US">IE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的操作</span>
				<span lang="EN-US">
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体">◇</span>
				<span lang="EN-US">    </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">让</span>
				<span lang="EN-US">was</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">读取</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span>
				<span lang="EN-US">log</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，生成脚本</span>
				<span lang="EN-US">
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体">◇</span>
				<span lang="EN-US">    </span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指定</span>
				<span lang="EN-US">url</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">地址，生成脚本</span>
				<span lang="EN-US">
						<br />
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我的原则是速战速决，对于这样一个小工具，没有必要花太多时间去研究细节，让它自己记录我的</span>
				<span lang="EN-US">IE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作吧，下面列出操作过程。</span>
				<span lang="EN-US">
						<br />
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择菜单：</span>
				<span lang="EN-US">scripts_create_record</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在出现的窗口中选择记录哪里信息，全选也无所谓，</span>
				<span lang="EN-US">next__finish</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，系统会弹出一个</span>
				<span lang="EN-US">IE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">窗口，该窗口中的所有</span>
				<span lang="EN-US">request-response</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都会被记录到测试脚本中。需要注意的是该窗口需要比较高的权限，所以请暂时关闭上网助手之类、广告拦截之类的东西。</span>
				<span lang="EN-US">
						<br />
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在该窗口中你可以随意操作你的</span>
				<span lang="EN-US">web</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序，把要测试的模块都跑到。完成之后直接关闭</span>
				<span lang="EN-US">IE</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，然后点击</span>
				<span lang="EN-US">”stop recording”</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，一个测试脚本就完成了，实在够傻瓜，不愧是</span>
				<span lang="EN-US">MS</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的东西啊，体贴我这类懒人。</span>
				<span lang="EN-US">
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">展开刚建好的测试，选择</span>
				<span lang="EN-US">”setting”</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，指定</span>
				<span lang="EN-US">Stress level(threads)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的值，同时连接</span>
				<span lang="EN-US">server</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的并发数。</span>
				<span lang="EN-US">Ok</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，选择菜单：</span>
				<span lang="EN-US">scripts_run</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，开始折磨你的机器吧。</span>
				<span lang="EN-US">
						<br />
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">测试完成之后，选择菜单：</span>
				<span lang="EN-US">view_reports</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，可以看到测试结果报告。相当详细，多少次操作，多少数据量，每个页面花多少时间都看得一清二楚，爽啊。</span>
				<span lang="EN-US">
						<br />
						<br />
				</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">测试报告中，有两个术语很重要，在</span>
				<span lang="EN-US">”page summary”</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，有两个指标：</span>
				<span lang="EN-US">TTFB</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">TTLB</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span>
				<span lang="EN-US">
						<br />
						<br />TTFB Avg</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是指：从第一个请求发出到测试工具接收到服务器应答数据的第一个字节之间的平均时间。</span>
				<span lang="EN-US">
						<br />
						<br />TTLB Avg</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是指：从第一个请求发出到测试工具接收到服务器应答数据的最后一个字节之间的平均时间。</span>
		</p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-17 01:08 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Web Application Stress Tool(WAS)做性能测试</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20657.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Sat, 16 Dec 2006 17:04:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20657.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20657.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20657.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20657.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要：这篇文章讨论了性能测试对于成功发布一个网络应用的重要性，集中讨论了微软的				Web Application Stress (WAS)				这个用于测试				Duwamish Online				的性能的工具。																																								内容														...&nbsp;&nbsp;<a href='http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20657.html'>阅读全文</a><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-17 01:04 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/17/20657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>压力测试</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20572.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 15 Dec 2006 13:10:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20572.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20572.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20572.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20572.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20572.html</trackback:ping><description><![CDATA[以下资源来源网络： 
<p><span>利用现代的设计技术和正式的技术复审可以减少代码中存在的初始错误，但是错误总是存在的，如果开发者找不到错误，那么，客户就会找到它们。越来越多的软件组织认识到软件测试是软件质量保证的重要元素之一，很多软件开发组织将</span><span>30%—40%</span><span>甚至更多的项目资源用在测试上，软件测试技术和软件测试策略受到了高度的重视和广泛的应用。</span><span><br />       </span><span>本文不想就软件测试技术和软件测试策略作深入的理论分析，而是列举一个在软件系统测试阶段进行的压力测试实例，希望能通过这个实例与从事软件测试相关工作的朋友进行交流。</span><span><br />      </span><span>首先介绍一下实例中软件的项目背景，该软件是一个典型的三层</span><span>C/S</span><span>架构的</span><span>MIS</span><span>系统（客户端</span><span>/</span><span>应用服务器</span><span>/</span><span>数据库管），中间层是业务逻辑层，应用服务器处理所有的业务逻辑，但应用服务器本身不提供负载均衡的能力，而是利用开发工具提供的</span><span>ORB</span><span>（对象请求代理）软件保证多个应用服务器间的负载均衡。本次测试的目的是：进行单个应用服务器的压力测试，找出单个应用服务器能够支持的最大客户端数。测试压力估算的依据是：假定在实际环中，用户只启用一个应用服务器进行所有的业务处理。方法是：按照正常业务压力估算值的</span><span>1~10</span><span>倍进行测试，考察应用服务器的运行情况。</span><span><br />     <br /><br />   </span><span>压力测试的详细计划如下：</span><span><br />                                 <br /><br />                          </span><span>压力测试计划</span><span><br /><br />1</span><span>、测试计划名称</span><span><br />     </span><span>河北省公安交通管理信息系统压力测试计划。</span><span><br />2</span><span>、测试内容</span><span><br />2.1</span><span>背景</span><span><br />      </span><span>本次测试中的压力测试是指模拟实际应用的软硬件环境及用户使用过程的系统负荷，长时</span><span></span><span>间运行测试软件来测试被测系统的可靠性，同时还要测试被测系统的响应时间。</span><span><br />       <br /><br />    </span><span>用户的实际使用环境：</span><span><br />        </span><span>◇</span><span>由两台</span><span>IBM XSeries250 PC Server</span><span>组成的</span><span>Microsoft Cluster</span><span>；</span><span><br />        </span><span>◇</span><span>数据库管理系统采用</span><span>Oracle8.1.6</span><span>；</span><span><br />        </span><span>◇</span><span>应用服务器程序和数据库管理系统同时运行在</span><span>Microsoft Cluster</span><span>上。</span><span><br />        </span><span>◇</span><span>有</span><span>200</span><span>个用户使用客户端软件进行业务处理，每年通过软件进行处理的总业务量为：</span><span>150</span><span>万笔业务</span><span>/</span><span>年。</span><span><br /><br />2.2</span><span>测试项</span><span><br />    </span><span>应用服务器的压力测试；</span><span><br />2.3</span><span>不被测试的特性</span><span><br />        </span><span>◇</span><span>系统的客户端应用程序的内部功能；</span><span><br />        </span><span>◇</span><span>数据库中的数据量对程序性能的影响。</span><span><br />3</span><span>、测试计划</span><span><br />3.1</span><span>测试强度估算</span><span><br />    </span><span>测试压力估算时采用如下原则：</span><span><br />        </span><span>◇</span><span>全年的业务量集中在</span><span>8</span><span>个月完成，每个月</span><span>20</span><span>个工作日，每个工作日</span><span>8</span><span>个小时；</span><span><br />        </span><span>◇</span><span>采用</span><span>80—20</span><span>原理，每个工作日中</span><span>80%</span><span>的业务在</span><span>20%</span><span>的时间内完成，即每天</span><span>80%</span><span>的业务在</span><span>1.6</span><span>小时内完成；</span><span><br />     </span><span>测试压力的估算结果：</span><span><br />      </span><span>去年全年处理业务约</span><span>100</span><span>万笔，其中</span><span>15%</span><span>的业务处理每笔业务需对应用服务器提交</span><span>7</span><span>次请求；</span><span><br />    70%</span><span>的业务处理每笔业务需对应用服务器提交</span><span>5</span><span>次请求；其余</span><span>15%</span><span>的业务每笔业务向应用服务器</span><span><br />    </span><span>提交</span><span>3</span><span>次请求。根据以往统计结果，每年的业务增量为</span><span>15%</span><span>，考虑到今后三年业务发展的需</span><span><br />    </span><span>要，测试需按现有业务量的</span><span>2</span><span>倍进行。</span><span><br />      </span><span>每年总的请求数量为：（</span><span>100*15%*7+100*70%*5+100*15%*3</span><span>）</span><span>*2=300</span><span>万次</span><span>/</span><span>年。</span><span><br />      </span><span>每天的请求数量为：</span><span>300/160=1.875</span><span>万次</span><span>/</span><span>天。</span><span><br />      </span><span>每秒的请求数量为：（</span><span>18750*80%</span><span>）</span><span>/</span><span>（</span><span>8*20%*3600</span><span>）</span><span>=2.60</span><span>次</span><span>/</span><span>秒。</span><span><br />      </span><span>正常情况下，应用服务器处理请求的能力应达到：</span><span>3</span><span>次</span><span>/</span><span>秒。</span><span><br />3.2</span><span>测试环境准备</span><span><br />3.2.1</span><span>基本硬件及软件环境的准备</span><span><br />    1)</span><span>网络环境：公司内部的以太网，与服务器的连接速率为</span><span>100M</span><span>，与客户端的连接速率为</span><span>10/100M</span><span>自适应。</span><span><br />    2)</span><span>使用两台</span><span>IBM XSeries250</span><span>（</span><span>1G</span><span>内存）</span><span>PC Server</span><span>作</span><span>Microsoft Cluster</span><span>，安装系统软件</span><span> Windows 2000 Advance Server</span><span>及</span><span>Microsoft Cluster Server</span><span>（</span><span>MSCS</span><span>）。</span><span><br />    3)</span><span>数据库管理系统的安装及配置：在测试用的</span><span>IBM XSeries</span><span>服务器上安装</span><span>Oracle8.1.6</span><span>，数据</span><span></span><span>库采用</span><span>Oracle Fail Safe</span><span>（</span><span>ofs</span><span>）的</span><span>Active/Passive</span><span>配置。</span><span>    </span><span>安装数据库管理系统及支撑软件（包括</span><span>VisiBroker</span><span>和</span><span>BDE Administrator</span><span>）。</span><span><br />    4)</span><span>安装被测的应用服务器程序。</span><span><br />    5)</span><span>客户端的</span><span>PC</span><span>机：</span><span>10</span><span>台（</span><span>P</span><span>Ⅲ</span><span>600/128M RAM</span><span>）。</span><span><br />3.2.2</span><span>系统客户端测试程序的编写系统客户端测试程序使用</span><span>Delphi</span><span>编写，要求测试程序实现如下功能：</span><span><br />    1)</span><span>模拟一个主要的向应用服务器发送请求并接收响应信息的功能。要求交替模拟两种情况：第一种，发送的请求至少包括</span><span>10</span><span>个参数，参数类型涵盖字符、日期、数字种类型；接收的</span><span></span><span>响应信息不少于</span><span>1</span><span>个参数；第二种，发送的请求不少于</span><span>1</span><span>个参数；接收的响应信息至少包括</span><span>10</span><span>个参数，参数类型涵盖字符、日期、数字种类型。</span><span><br />    2)</span><span>必须能够通过参数设定在每台</span><span>PC</span><span>机上运行的客户端测试程序个数、请求的时间间隔（单位：毫秒）、运行时间（单位：小时）。</span><span><br />    3)</span><span>在数据库中建立测试记录表，生成测试记录，向数据库写入测试记录的功能不通过被测的应用服务器实现。日志内容包括：发送测试请求的机器名、客户端测试程序序号、发出请求时间、收到响应时间、处理是否成功。表名：</span><span>TEST_LOG</span><span>，字段名：</span><span>MACHINE</span><span>、</span><span>ID</span><span>、</span><span>START_TIME</span><span>、</span><span>END_TIME</span><span>、</span><span>FLAG</span><span>。</span><span><br />3.2.3</span><span>系统本底数据的准备</span><span><br />      </span><span>为考察系统运行一段时间后系统的响应性能，参照实际运行情况及发展进行系统的本底数据准备。业务处理中涉及到的业务表中都要求按设计规模进行本底数据的准备。要求准备的数据记录的有效性符合系统要求，数据有效性的具体要求参见数据库设计及系统设计文档。</span><span><br />3.3</span><span>破坏性测试</span><span><br />      </span><span>按照设计连接的客户端连接数量进行测试，把应用服务器处理请求的设计频度增加</span><span>1</span><span>－</span><span>10</span><span>倍，分别测试出现错误的状态和和出现错误的比率，考察是否出现不可恢复错误，系统设计要考</span><span></span><span>虑出现严重错误情况下负荷减轻错误自动恢复的实现方法。</span><span><br />      </span><span>计划时间：</span><span>2</span><span>天；这个时间包括破坏性的修复和自动恢复的实现需要的时间。</span><span><br />      </span><span>在测试过程中每</span><span>10</span><span>分钟记录一次</span><span>IBM Xseries PC Server</span><span>的内存及</span><span>CPU</span><span>使用情况，包括被测程序的内存占用百分比、数据库管理系统的内存占用百分比、操作系统的内存占用百分比。</span><span><br />3.4</span><span>强度稳定性测试</span><span><br />      </span><span>选择一种负荷比设计负荷重的情况（应用服务器处理请求的频度为应用服务器处理请求的</span><span><br />  </span><span>设计频度的</span><span>1.5</span><span>倍），进行</span><span>24</span><span>小时稳定性测试。</span><span><br />3.5</span><span>测试方法和工具</span><span><br />    </span><span>黑盒测试</span><span><br />    </span><span>测试工具：无外购的测试工具，自己编制的测试工具。</span><span><br />3.6</span><span>测试时间计划</span><span><br />3.6.1</span><span>环境准备：</span><span>2</span><span>天。</span><span><br />    </span><span>其中：基本硬件、软件环境及系统本底数据的准备：</span><span>1</span><span>天，</span><span><br />             </span><span>系统客户端测试程序的编写及测试：</span><span>1</span><span>天。</span><span><br />3.6.2</span><span>破环性测试：</span><span>2</span><span>天。</span><span><br />3.6.3</span><span>强度稳定性测试：</span><span>1</span><span>天。</span><span><br />3.7</span><span>测试中的问题及处理</span><span><br />3.7.1</span><span>暂停标准和再启动要求</span><span><br />    </span><span>暂停标准：被测试软件在强度稳定性测试中频繁出现异常（每小时出现</span><span>1</span><span>次以上）时。用户或公司要求暂停测试时。</span><span><br />    </span><span>再启动要求：通过调试后，预计被测试软件的可靠性有所提高时，可再次启动测试。</span><span><br />3.7.2</span><span>不可预见问题</span><span><br />    </span><span>不可预见问题包括：</span><span><br />      </span><span>◇</span><span>测试环境被破坏而导致测试无法进行；</span><span><span><br />      </span></span><span>◇</span><span>当出现上述不可预见问题时，测试终止，就已完成的测试内容编制测试总结报告，并在报告中说明测试终止的原因。</span><span><br />3.8</span><span>测试报告</span><span> 2002.06.21 <br />    </span><span>测试总结报告提交日期：</span><span>2002.06.21</span><span>。</span><span><br />3.8.1</span><span>应生成的测试文件</span><span><br />    </span><span>测试记录（测试负责人和参与测试的人员签字）；</span><span><br />    </span><span>测试总结报告。</span><span><br />3.8.2</span><span>测试总结报告中必须包含的内容</span><span><br />    </span><span>被测试软件名称、测试项、测试环境；</span><span><br />    </span><span>被测试软件的压力测试结论：响应时间、最大</span><span>/</span><span>最小并发数、失败的次数、正常连续运行的最长</span><span>/</span><span>最短时间，并发数与失败的关系。</span><span><br />4</span><span>、人员和职责</span><span><br />4.1</span><span>职责</span><span><br />    </span><span>测试工程师：负责编写测试计划，组织测试，对测试过程进行记录，收集、整理测试记录数据，对测试结果进行分析，编写测试总结报告。</span><span><br />    </span><span>软件工程师：负责编写、调试客户端测试软件；数据库管理系统的安装、</span><span>ofs</span><span>配置及系统的本底数据准备。</span><span><br />    </span><span>系统工程师：负责测试用的硬件维护及操作系统安装、</span><span>MSCS</span><span>配置。</span><span><br />    </span><span>总工程师：负责对测试计划及测试总结报告进行批准。</span><span><br />    </span><span>用户：必要时可参加测试，并提出具体的测试要求；可要求暂停测试。</span><span><br />4.2</span><span>人员和训练要求</span><span><br />    </span><span>本次测试无特别的人员及培训要求。</span><span><br />5</span><span>、批准</span><span><br />    </span><span>本测试计划必须经过总工程师批准后才能开始实施。</span></p><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20572.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-15 21:10 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20572.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微软提供的性能测试用例模版</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20571.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 15 Dec 2006 13:09:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20571.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20571.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20571.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20571.html</trackback:ping><description><![CDATA[
		<div>微软提供的性能测试用例模版<br /><br /><br />测试用例模板<br />测试用例 (Test case)<br />用例名称 <br />用例编号 重要程度 <br />用例设计人 代码负责人 <br />测试人 测试时间 <br />English version<br />Title <br />Case ID Level <br />Designer Developer <br />Tester Time <br />测试场景描述 (Case scenario)<br />场景描述<br />子场景(可选)<br />子场景1 例如，返回10条记录<br />子场景2 例如，返回100条记录<br />测试流程 (Testing process)<br />描述被测试应用场景的商业流程，流程必须在实际测试中发挥良好的导航作用，使不熟悉该系统的使用者能够对商业流程有清晰的了解。<br />(被测的商业流程应该事先通过检测，以确保功能的顺利运行。应用程序代码在测试阶段应该被冻结)<br />1．<br />2．<br />3．<br />测试条件和要求 (Requirements)<br />环境要求<br />硬件要求：<br />WEB服务器 - 配置1.2 (详细配置信息见测试计划文档，或附录)<br />软件要求：<br />补丁要求：<br />网络要求：<br />性能基线和衡量指标 (Testing baseline &amp; metrics)<br />前提 (测试结果有效的先决条件)<br />1. 例如：无内存泄漏；HTTP错误个数为0<br />2. 数据库数据要求<br />例如：流水表已有20万条记录<br />3. 并发连接数要求<br />4. 测试周期或测试次数<br />性能基线<br />1. 例如：每秒钟完成XXX笔交易<br />2.</div>
		<div>3.<br />监视参数 (详情见附录)<br />1. 例如：Performance Monitor: Private Byte<br />2.<br />3.<br />性能计算方式<br />1. 例如：数据库交易表增加纪录数 / 总时间(秒)<br />2.<br />3.<br />测试数据和脚本 (Testing data, Scripts)<br />测试数据准备<br />包括登陆账号组，输入数据；可以事先保存在某个文本文件中<br />测试数据库<br />数据库、表、存储过程、视图、用户帐号、相关数据<br />测试脚本<br />根据测试工具编写相应脚本或编写手工测试脚本<br />for Example</div>
		<div>1LBrowser<br />1. Navigate to the home page of the Online Shopping site.<br />2. Click “Help.”<br />3. Click “FAQ.”<br />4. Click “Shopping” on FAQ.<br />5. Click “Shopping/Our Products” on the main menu.<br />6. Click “Product Search.”<br />7. Click “Special Offers.”<br />8. Click “Store Finder.”<br />9. Click Central Scotland to view shop addresses.<br />10. Click “Edinburgh” to see details.<br />11. Click “After Sales.”<br />12. Click “Basket.”<br />13. Navigate to the home page of the Online Shopping site.<br />14. Click on Advert at bottom of page.<br /><br /><br />测试手段 (Testing instrument)<br />例如： 编写自动测试工具<br />或使用专用测试工具。<br />备注 (Remarks)<br /><br /><br /><br />附录A – 应用软件性能数据分类<br />4.1 应用软件性能数据概述<br />在企业级应用的负载测试过程中，测试工具通过部署一整套性能监视器，来收集和显示各个架构层次、服务器和组件上的性能数据，包括网络、操作系统、应用服务器、中间件、应用程序、.NET服务器、Web服务器和数据库服务器。在进行负载测试时，这些数据用来精确测量系统各个方面的性能，从而用户可以快速、简便地定位问题和瓶颈的来源。最终，这些数据用来生成各种文档和图表，并判断出应用程序的性能是否满足业务的需要。<br /><br /><br /><br />4.2 应用软件常用性能数据描述<br />1. Number of Concurrent Users (NCU)<br />并发用户数 – 在指定时刻，系统观察到的并发用户连接数。<br />2. Request Per Second (RPS)<br />每秒处理请求数 – 指示服务器平均每秒钟能处理的用户事务请求数量。<br />3. Response Time<br />响应时间 – 指从客户发出一个事务请求到收到处理结果的最后一个字节的时间长度。<br />4. Time to First Byte (TTFB)<br />客户端收到响应的第一个字节的平均毫秒数。<br />5. Time to Last Byte (TTLB)<br />客户端收到响应的最后一个字节的平均毫秒数。<br />6. Think Time<br />思考时间 – 用户在发送下一个请求前花在浏览页面上的时间。<br />7. Hits per Second<br />每秒点击次数<br />8. Throughput<br />吞吐量 – 以kilobyte为单位，客户每秒接收的数据总量。<br />9. Pages per Second<br />每秒下载页数 – 每秒内从Web服务器上下载到客户端的Web页面数量。<br />10. User-define Data Point (supported by LoadRunner)<br />用户自定义性能指标 – 由LoadRunner支持的自定义性能指标，比如: Transaction Response Time, Transaction Per Second Passed, Failed。<br />11. %Processor Time:CPU平均利用率<br />12. %User Time:用户态CPU平均利用率<br />13. % Privileged Time:核心态CPU平均利用率<br />14. Processor Queue Length:处理器队列中的线程数<br />15. Context Switches per Second:每秒线程切换次数<br />16. Interrupts/Sec:每秒中断数<br />17. Page Faults / sec:每秒内存换页数<br />18. Memory, Available Bytes:平均剩余的可用内存<br />19. Private Bytes:进程分配内存数<br />20. Process, Handle Count:进程使用系统句柄数<br />21. Memory, Pool Paged Bytes:可交换到硬盘的系统物理内存byte数。<br />22. Memory, Pool Non-paged Bytes:不可交换到硬盘的系统物理内存byte数。<br />23. Network Interface, bytes total/sec:网络带宽利用率<br />24. Network Interface, Output Queue Length:网络适配器输出队列长度<br />25. Physical Disk, %Disk Time:物理磁盘利用率<br />26. Physical Disk, Avg Disk Queue Length:物理磁盘平均磁盘I/O队列长度<br />27. Physical Disk, Current Disk Queue Length:物理磁盘当前磁盘I/O队列长度<br />28. Physical Disk, Disk Read/Sec, Disk Write/Sec:物理磁盘每秒读/写操作次数<br />29. COM+ Authenticate (by LoadRunner):COM+ 调用级别验证成功频率<br />30. COM+ Authenticate Failed (by LoadRunner):COM+ 调用级别验证失败的频率<br />31. COM+ Activation (by LoadRunner):COM+ 应用激活频率<br />32. COM+ Failed (by LoadRunner):COM+ 应用关闭频率<br />33. COM+ Thread Start (by LoadRunner):STA的线程启动的比率<br />34. COM+ Thread Terminate (by LoadRunner):STA的线程中止的比率<br />35. Transaction Duration (by LoadRunner):COM+事务的平均周期<br />36. Transaction Start (by LoadRunner):COM+事务启动比率<br />37. Transaction Prepared (by LoadRunner):COM+事务进入准备阶段的比率<br />38. Transaction Aborted (by LoadRunner):COM+事务回滚的比率<br />39. Transaction Commited (by LoadRunner):COM+事务提交的比率<br />40. Object LifeTime(by LoadRunner):COM+组件平均生命期<br />41. Object Create (by LoadRunner):创建COM+组件实例的比率<br />42. Object Destroy (by LoadRunner):释放COM+组件实例的比率<br />43. Object Activate (by LoadRunner):COM+ JIT-actived对象激活的比率<br />44. Object Deactivate (by LoadRunner):COM+ JIT-actived对象失活的比率<br />45. Disable Commit (by LoadRunner):COM+对象处于DisableCommit状态的比率<br />46. Enable Commit (by LoadRunner):COM+对象处于Enable状态的比率<br />47. Set Complete (by LoadRunner):COM+对象处于SetComplete状态的比率<br />48. Set Abort (by LoadRunner)COM+对象处于SetAbort状态的比率<br />49. COM+ Method Duration (by LoadRunner):COM+方法调用平均持续时间<br />50. COM+ Method Frequency (by LoadRunner):COM+方法调用频率 
<div>51. COM+ Method Failed (by LoadRunner):COM+方法失败的频率<br />52. COM+ Method Exception (by LoadRunner):COM+方法抛出异常的频率<br />53. Active Server Page, Request per Second:ASP每秒执行请求数<br />54. Active Server Page, Request Queue:ASP请求队列长度<br />55. Active Server Page, Requests Execute Time:ASP平均请求执行时间<br />56. Active Server Page, Requests Wait Time:ASP平均请求等待时间<br />57. Active Server Page, Session Current:当前活动Session计数<br />58. .NET CLR Data, SqlClient, Current # Pooled Connection:当前被连接池缓存的数据库连接<br />59. .NET CLR Data, SqlClient, Current # Pooled and Non-pooled Connection<br />当前所有的数据库连接，缓存和未缓存的<br />60. .NET CLR Memory, Gen 0、1、2 heap size:.NET中0、1、2代虚拟堆的大小<br />61. .NET CLR Memory, # bytes in all Heaps:.NET中托管内存的总数<br />62. ASP.NET, Application Restarts:ASP.NET中应用重新启动的次数<br />63. ASP.NET, Work Process Restarts:ASP.NET中工作进程重新启动的次数<br />64. ASP.NET, Request Execution Time:ASP.NET平均请求执行时间毫秒数<br />65. ASP.NET, Request Wait Time:ASP.NET平均请求等待时间毫秒数<br />66. ASP.NET, Requests Queued:ASP.NET平均请求队列长度<br />67. ASP.NET Application, Requests/Sec:ASP.NET某特定应用每秒钟处理的请求数<br />68. ASP.NET Application, Requests Executing:ASP.NET某特定应用正在执行的请求数<br />69. ASP.NET Application Sessions Active:ASP.NET某特定应用中活动的Session数<br />70. Web Service, Get Requests per Second:HTTP的GET方法每秒请求数<br />71. Web Service, Post Requests per Second:HTTP的POST方法每秒请求数<br />72. Distributed Transaction Coordinator, Transactions/Sec<br />    每秒的分布式事务数<br />73. Distributed Transaction Coordinator, Committed Transactions<br />    提交的分布式事务总数<br />74. Distributed Transaction Coordinator, Aborted Transactions<br />    回滚的分布式事务总数<br />75. Distributed Transaction Coordinator, Active Transactions<br />    当前活动的分布式事务数<br />76. Distributed Transaction Coordinator, Response Time – Average<br />    分布式事务从开始到提交的平均时间间隔<br />77. SQL Server, Cache Manager, Cache Hit Ratio:SQL Server的缓存区命中率<br />78. SQL Server, Cache Manager, Cache Used Counts per Second<br />    SQL Server每秒内使用的缓存对象数<br />79. SQL Server, Locks, Exclusive/Shared &amp; Users blocked<br />    SQL Server 每秒内用户由于表级锁被阻塞数<br />80. SQL Server, % Procedure Cache Used &amp; % Procedure Cache Active<br />    SQL Server存储过程缓存使用率<br />81. SQL Server, Transaction/Sec:SQL Server每秒的事务数<br />82. SQL Server, General statistics, User Connections<br />    SQL Server 当前用户连接数<br />83. SQL Profiler, Audit Login/Logout<br />    SQL Profiler中跟踪用户登入/登出数<br />84. SQL Profiler, Stored Procedure, RPC Completed</div><div>SQL Profiler中跟踪存储过程的调用<br />85. SQL Profiler, TSQL, Batch Completed:SQL Profiler中跟踪TSQL语句的调用<br />86. SQL Profiler, SQL Transaction:SQL Profiler 中跟踪事务的提交。<br /><br /><br />4.3 应用软件性能数据分类<br />企业应用程序可以根据系统架构分成以下类型<br /> Client/Server – 客户机/服务器架构l<br />l 基于浏览器/Web服务器的三层架构<br /> 基于中间件应用服务器的三层架构l<br />l 基于Web服务器和中间件的多层架构<br />以上架构都由客户机、Web服务器、中间层应用服务器、数据库服务器组成。通过针对不同层次的性能指标监测，可以分析出整体架构的性能指标和性能瓶颈。 
<div>1． 数据库服务器的性能指标监测<br />l Processor, %Processor Time<br />   Processor, %User Timel </div><div> Processor, %l Privileged Time<br /> Processor, Processor Queue Lengthl<br /> System, Contextl Switches per Second<br /> Memory, Page Faults/secl<br /> Memory, Availablel Bytes<br /> Memory, Pool Paged Bytesl<br /> Network Interface, bytes total/secl<br />l Network Interface, Output Queue Length<br /> Physical Disk, %Disk Timel<br />l Physical Disk, Current Disk Queue Length<br /> Physical Disk, Avg Disk Queuel Length<br /> Physical Disk, Disk Read/Sec, Disk Write/Secl<br /> SQL Server,l General statistics, User Connections<br /> SQL Server, Transaction/Secl<br /> SQLl Server, Cache Manager, Cache Hit Ratio<br /> SQL Server, Cache Manager, Cachel Used Counts per Second<br /> SQL Server, Locks, Exclusive/Sharedl &amp; Users blocked<br /> SQL Server, % Procedure Cache Usedl &amp; % Procedure Cache Active<br /> SQL Profiler, Audit Login/Logoutl<br /> SQL Profiler, Storedl Procedure, RPC Completed<br /> SQL Profiler, TSQL, Batch Completedl<br /> SQLl Profiler, SQL Transaction<br /><br />2． Web服务器的性能指标监测<br /> Processor, %Processorl Time<br /> Processor, %User Timel<br /> Processor, % Privileged Timel<br />l Processor, Processor Queue Length<br /> System, Context Switches per Secondl<br />l Process, Private Bytes<br /> Memory, Page Faults/secl<br /> Memory, Availablel Bytes<br /> Memory, Pool Paged Bytesl<br /> Network Interface, bytes total/secl<br />l Network Interface, Output Queue Length<br /> Physical Disk, %Disk Timel<br />l Physical Disk, Avg Disk Queue Length<br /> Number of Concurrent Users (NCU)l<br />l Request Per Second (RPS)<br /> Response Timel<br /> Time to First Byte (TTFB)l<br />l Time to Last Byte (TTLB)<br /> Think Timel<br /> Web Service, Get Requests perl Second<br /> Web Service, Post Requests per Secondl<br /> Active Server Page,l Request per Second<br /> Active Server Page, Request Queuel<br /> Active Serverl Page, Requests Execute Time<br /> Active Server Page, Requests Wait Timel<br />l Active Server Page, Session Current   。<br /><br /><br /><div>3． 基于ASP.NET的Web服务器或Web Service服务器性能指标监测<br /> Processor, %Processor Timel<br /> Processor, %User Timel<br />l Processor, % Privileged Time<br /> Processor, Processor Queue Lengthl<br /> System,l Context Switches per Second<br /> Process, Private Bytesl<br /> Memory, Pagel Faults/sec<br /> Memory, Available Bytesl<br /> Memory, Pool Paged Bytesl<br />l Network Interface, bytes total/sec<br /> Network Interface, Output Queuel Length<br /> Physical Disk, %Disk Timel<br /> Physical Disk, Avg Disk Queuel Length<br /> Number of Concurrent Users (NCU)l<br /> Request Per Second (RPS)l<br />l Response Time<br /> Time to First Byte (TTFB)l<br /> Time to Last Byte (TTLB)l<br />l Think Time<br /> Web Service, Get Requests per Secondl<br /> Web Service, Postl Requests per Second<br /> ASP.NET, Application Restartsl<br /> ASP.NET, Workl Process Restarts<br /> ASP.NET, Request Execution Timel<br /> ASP.NET, Request Waitl Time<br /> ASP.NET, Requests Queuedl<br /> ASP.NET Application, Requests/Secl<br />l ASP.NET Application, Requests Executing<br /> ASP.NET Application Sessionsl Active<br /><br />4． 中间层应用服务器的性能指标监测<br /> Processor, %Processor Timel<br /> Processor,l %User Time<br /> Processor, % Privileged Timel<br /> Processor, Processor Queuel Length<br /> System, Context Switches per Secondl<br /> Process, Private Bytesl<br />l Memory, Page Faults/sec<br /> Memory, Available Bytesl<br /> Memory, Pool Pagedl Bytes<br /> Network Interface, bytes total/secl<br /> Network Interface, Outputl Queue Length<br /> Physical Disk, %Disk Timel<br /> Physical Disk, Avg Disk Queuel Length<br /> COM+ Authenticate (by LoadRunner)l<br /> COM+ Authenticate Failed (byl LoadRunner)<br /> COM+ Activation (by LoadRunner)l<br /> COM+ Failed (byl LoadRunner)<br /> COM+ Thread Start (by LoadRunner)l<br /> COM+ Thread Terminatel (by LoadRunner)<br /> Transaction Duration (by LoadRunner)l<br /> Transaction Startl (by LoadRunner)<br /> Transaction Prepared (by LoadRunner)l<br /> Transactionl Aborted (by LoadRunner)<br /> Transaction Commited (by LoadRunner)l<br /> Objectl LifeTime(by LoadRunner)<br /> Object Create (by LoadRunner)l<br /> Object Destroyl (by LoadRunner)<br /> Object Activate (by LoadRunner)l<br /> Object Deactivate (byl LoadRunner)<br /> Disable Commit (by LoadRunner)l<br /> Enable Commit (byl LoadRunner)<br /> Set Complete (by LoadRunner)l<br /> Set Abort (byl LoadRunner)<br /> COM+ Method Duration (by LoadRunner)l<br /> COM+ Method Frequencyl (by LoadRunner)<br /> COM+ Method Failed (by LoadRunner)l<br /> COM+ Methodl Exception (by LoadRunner)<br /> .NET CLR Data, SqlClient, Current # Pooledl Connection<br /> .NET CLR Data, SqlClient, Current # Pooled and Non-pooledl Connection<br /> .NET CLR Memory, Gen 0、1、2 heap sizel<br /> .NET CLR Memory, #l bytes in all Heaps<br /> Distributed Transaction Coordinator,l Transactions/Sec<br /> Distributed Transaction Coordinator, Committedl Transactions<br /> Distributed Transaction Coordinator, Aborted Transactionsl<br />l Distributed Transaction Coordinator, Active Transactions<br /> Distributedl Transaction Coordinator, Response Time – Average<br /><br />5． 客户机的性能指标监测<br />l Processor, %Processor Time<br /> Process, Private Bytesl<br /> Process, Handlel Counts<br /> Network Interface, bytes total/secl<br /> Network Interface, Outputl Queue Length<br /> Physical Disk, Avg Disk Queue Lengthl<br /> .NET CLR Memory, Genl 0、1、2 heap size<br /> .NET CLR Memory, # bytes in all Heapsl<br /> Number ofl Concurrent Users (NCU)<br /> Request Per Second (RPS)l<br /> Response Timel<br />l Hits per Second<br /> Throughputl<br /> Pages per Secondl<br /> User-define Datal Point<br /> Time to First Byte (TTFB)l<br /> Time to Last Byte (TTLB)l<br /> Thinkl Time</div></div></div></div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-15 21:09 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>性能测试方法</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20570.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 15 Dec 2006 13:08:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20570.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20570.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20570.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20570.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20570.html</trackback:ping><description><![CDATA[
		<table cellspacing="0" cellpadding="3" width="100%" border="0">
				<tbody>
						<tr valign="bottom">
								<td colspan="2" height="20">
										<span class="h2b">作者简介</span>
								</td>
						</tr>
						<tr>
								<td valign="top" align="middle" width="0">
								</td>
								<td>
										<p>
												<a href="http://dev2dev.bea.com/pub/au/62">
														<font color="#336699">Matt Maccaux</font>
												</a>是BEA的一位门户性能工程师。</p>
										<p>
										</p>
										<table cellspacing="1" cellpadding="4" width="100%" border="0">
												<tbody>
														<tr>
																<td valign="top">
																		<div class="subhead">
																				<b>性能测试方法</b>
																		</div>
																</td>
														</tr>
														<tr>
																<td valign="top">
																		<div class="conten?t">
																				<p>　　对于企业应用程序，有许多进行性能测试的方法，其中一些方法实行起来要比其他方法困难。所要进行的性能测试的类型取决于想要达到的结果。例如，对于可再现性，基准测试是最好的方法。而要从当前用户负载的角度测试系统的上限，则应该使用容量规划测试。本文将介绍几种设置和运行性能测试的方法，并讨论这些方法的区别。</p>
																				<p>
																						<strong>简介</strong>
																				</p>
																				<p>　　如果不进行合理的规划，对J2EE应用程序进行性能测试将会是一项令人望而生畏且有些混乱的任务。因为对于任何的软件开发流程，都必须收集需求、理解业务需要，并在进行实际测试之前设计出正式的进度表。性能测试的需求由业务需要驱动，并由一组用例阐明。这些用例可以基于历史数据（例如，服务器一周的负载模式）或预测的近似值。弄清楚需要测试的内容之后，就需要知道如何进行测试了。</p>
																				<p>　　在开发阶段前期，应该使用基准测试来确定应用程序中是否出现性能倒退。基准测试可以在一个相对短的时间内收集可重复的结果。进行基准测试的最好方法是，每次测试改变一个且只改变一个参数。例如，如果想知道增加JVM内存是否会影响应用程序的性能，就逐次递增JVM内存（例如，从1024 MB增至1224 MB，然后是1524 MB，最后是2024 MB），在每个阶段收集结果和环境数据，记录信息，然后转到下一阶段。这样在分析测试结果时就有迹可循。下一小节我将介绍什么是基准测试，以及运行基准测试的最佳参数。</p>
																				<p>　　开发阶段后期，在应用程序中的bug已经被解决，应用程序达到一种稳定状态之后，可以运行更为复杂的测试，确定系统在不同的负载模式下的表现。这些测试被称为容量规划测试、渗入测试(soak test)、峰谷测试(peak-rest test)，它们旨在通过测试应用程序的可靠性、健壮性和可伸缩性来测试接近于现实世界的场景。对于下面的描述应该从抽象的意义上理解，因为每个应用程序的使用模式都是不同的。例如，容量规划测试通常都使用较缓慢的ramp-up（下文有定义），但是如果应用程序在一天之中的某个时段中有快速突发的流量，那么自然应该修改测试以反映这种情况。但是，要记住，因为更改了测试参数（比如ramp-up周期或用户的考虑时间(think-time)），测试的结果肯定也会改变。一个不错的方法是，运行一系列的基准测试，确立一个已知的可控环境，然后再对变化进行比较。</p>
																				<p>
																						<strong>基准测试</strong>
																				</p>
																				<p>　　基准测试的关键是要获得一致的、可再现的结果。可再现的结果有两个好处：减少重新运行测试的次数；对测试的产品和产生的数字更为确信。使用的性能测试工具可能会对测试结果产生很大影响。假定测试的两个指标是服务器的响应时间和吞吐量，它们会受到服务器上的负载的影响。服务器上的负载受两个因素影响：同时与服务器通信的连接（或虚拟用户）的数目，以及每个虚拟用户请求之间的考虑时间的长短。很明显，与服务器通信的用户越多，负载就越大。同样，请求之间的考虑时间越短，负载也越大。这两个因素的不同组合会产生不同的服务器负载等级。记住，随着服务器上负载的增加，吞吐量会不断攀升，直到到达一个点。</p>
																				<p align="center">
																						<a href="http://dev2dev.bea.com.cn/images/051027/0510270201b.jpg" target="_blank">
																								<img height="128" src="http://dev2dev.bea.com.cn/images/051027/0510270201.jpg" width="256" border="0" />
																						</a>
																						<br />图1.随着负载的增加，系统吞吐量的曲线（单位：页面/秒）</p>
																				<p>　　注意，吞吐量以稳定的速度增长，然后在某一个点上稳定下来。</p>
																				<p>　　在某一点上，执行队列开始增长，因为服务器上所有的线程都已投入使用，传入的请求不再被立即处理，而是放入队列中，当线程空闲时再处理。</p>
																				<p align="center">
																						<a href="http://dev2dev.bea.com.cn/images/051027/0510270202b.jpg" target="_blank">
																								<img height="139" src="http://dev2dev.bea.com.cn/images/051027/0510270202.jpg" width="257" border="0" />
																						</a>
																						<br />图2. 随着负载的增加，系统执行队列长度的曲线</p>
																				<p>　　注意，最初的一段时间，执行队列的长度为零，然后就开始以稳定的速度增长。这是因为系统中的负载在稳定增长，虽然最初系统有足够的空闲线程去处理增加的负载，最终它还是不能承受，而必须将其排入队列。 </p>
																		</div>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<table width="100%" align="center">
				<tbody>
						<tr>
								<td width="700">
										<div id="size" style="PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; LINE-HEIGHT: 180%; PADDING-TOP: 0px">testceo.com</div>
								</td>
						</tr>
				</tbody>
		</table>
		<p> </p>
		<p>　　当系统达到饱和点，服务器吞吐量保持稳定后，就达到了给定条件下的系统上限。但是，随着服务器负载的继续增长，系统的响应时间也随之延长，虽然吞吐量保持稳定。</p>
		<p align="center">
				<a href="http://dev2dev.bea.com.cn/images/051027/0510270203b.jpg" target="_blank">
						<img height="138" src="http://dev2dev.bea.com.cn/images/051027/0510270203.jpg" width="257" border="0" />
				</a>
				<br />图3. 随着负载的增加，系统中两个事务的响应时间曲线</p>
		<p>　　注意，在执行队列（图2）开始增长的同时，响应时间也开始以递增的速度增长。这是因为请求不能被及时处理。</p>
		<p>　　为了获得真正可再现的结果，应该将系统置于相同的高负载下。为此，与服务器通信的虚拟用户应该将请求之间的考虑时间设为零。这样服务器会立即超载，并开始构建执行队列。如果请求（虚拟用户）数保持一致，基准测试的结果应该会非常精确，完全可以再现。</p>
		<p>　　您可能要问的一个问题是：“如何度量结果？”对于一次给定的测试，应该取响应时间和吞吐量的平均值。精确地获得这些值的唯一方法是一次加载所有的用户，然后在预定的时间段内持续运行。这称为“flat”测试。</p>
		<p align="center">
				<a href="http://dev2dev.bea.com.cn/images/051027/0510270204b.jpg" target="_blank">
						<img height="146" src="http://dev2dev.bea.com.cn/images/051027/0510270204.jpg" width="242" border="0" />
				</a>
				<br />图4. flat测试的情况（所有的用户都是同时加载的）</p>
		<p>　　与此相对应的是“ramp-up”测试。</p>
		<p align="center">
				<a href="http://dev2dev.bea.com.cn/images/051027/0510270205b.jpg" target="_blank">
						<img height="135" src="http://dev2dev.bea.com.cn/images/051027/0510270205.jpg" width="252" border="0" />
				</a>
				<br />图5. ramp-up测试的情况（在测试期间，用户以稳定速度（每秒x个）增加）</p>
		<p>　　ramp-up测试中的用户是交错上升的（每几秒增加一些新用户）。ramp-up测试不能产生精确和可重现的平均值，这是因为由于用户的增加是每次一部分，系统的负载在不断地变化。因此，flat运行是获得基准测试数据的理想模式。</p>
		<p>　　这不是在贬低ramp-up测试的价值。实际上，ramp-up测试对找出以后要运行的flat测试的范围非常有用。ramp-up测试的优点是，可以看出随着系统负载的改变，测量值是如何改变的。然后可以据此选择以后要运行的flat测试的范围。</p>
		<p>　　Flat测试的问题是系统会遇到“波动”效果。</p>
		<p align="center">
				<a href="http://dev2dev.bea.com.cn/images/051027/0510270206b.jpg" target="_blank">
						<img height="166" src="http://dev2dev.bea.com.cn/images/051027/0510270206.jpg" width="275" border="0" />
				</a>
				<br />图6. 一次flat测试中所测得的系统吞吐量的曲线（单位：页面/秒）</p>
		<p>　　注意波动的出现，吞吐量不再是平滑的。</p>
		<p>　　这在系统的各个方面都有所体现，包括CPU的使用量。</p>
		<p align="center">
				<a href="http://dev2dev.bea.com.cn/images/051027/0510270207b.jpg" target="_blank">
						<img height="164" src="http://dev2dev.bea.com.cn/images/051027/0510270207.jpg" width="270" border="0" />
				</a>
				<br />图7. 一次flat测试中所测得的系统CPU使用量随时间变化的曲线</p>
		<p>　　注意，每隔一段时间就会出现一个波形。CPU使用量不再是平滑的，而是有了像吞吐量图那样的尖峰。</p>
		<p>　　此外，执行队列也承受着不稳定的负载，因此可以看到，随着系统负载的增加和减少，执行队列也在增长和缩减。</p>
		<p align="center">
				<a href="http://dev2dev.bea.com.cn/images/051027/0510270208b.jpg" target="_blank">
						<img height="165" src="http://dev2dev.bea.com.cn/images/051027/0510270208.jpg" width="272" border="0" />
				</a>
				<br />图8. 一次flat测试中所测得的系统执行队列的曲线</p>
		<p>　　注意，每隔一段时间就会出现一个波形。执行队列曲线与上面的CPU使用量图非常相似。</p>
		<p>　　最后，系统中事务的响应时间也遵循着这个波动模式。 <br /></p>
		<table width="100%" align="center">
				<tbody>
						<tr>
								<td width="700">
										<div id="size" style="PADDING-RIGHT: 0px; DISPLAY: block; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; LINE-HEIGHT: 180%; PADDING-TOP: 0px">testceo.com</div>
								</td>
						</tr>
				</tbody>
		</table>
		<p> </p>
		<p align="center">
				<a href="http://dev2dev.bea.com.cn/images/051027/0510270209b.jpg" target="_blank">
						<img height="170" src="http://dev2dev.bea.com.cn/images/051027/0510270209.jpg" width="282" border="0" />
				</a>
				<br />图9. 一次flat测试中所测得的系统事务的响应时间</p>
		<p>　　注意，每隔一段时间就会出现一个波形。事务的响应时间也与上面的图类似，只不过其效果随着时间的推移逐渐减弱。</p>
		<p>　　当测试中所有的用户都同时执行几乎相同的操作时，就会发生这种现象。这将会产生非常不可靠和不精确的结果，所以必须采取一些措施防止这种情况的出现。有两种方法可以从这种类型的结果中获得精确的测量值。如果测试可以运行相当长的时间（有时是几个小时，取决于用户的操作持续的时间），最后由于随机事件的本性使然，服务器的吞吐量会被“拉平”。或者，可以只选取波形中两个平息点之间的测量值。该方法的缺点是可以捕获数据的时间非常短。</p>
		<p>
				<strong>性能规划测试</strong>
		</p>
		<p>　　对于性能规划类型的测试来说，其目标是找出，在特定的环境下，给定应用程序的性能可以达到何种程度。此时可重现性就不如在基准测试中那么重要了，因为测试中通常都会有随机因子。引入随机因子的目的是为了尽量模拟具有真实用户负载的现实世界应用程序。通常，具体的目标是找出系统在特定的服务器响应时间下支持的当前用户的最大数。例如，您可能想知道：如果要以5秒或更少的响应时间支持8,000个当前用户，需要多少个服务器？要回答这个问题，需要知道系统的更多信息。</p>
		<p>　　要确定系统的容量，需要考虑几个因素。通常，服务器的用户总数非常大（以十万计），但是实际上，这个数字并不能说明什么。真正需要知道的是，这些用户中有多少是并发与服务器通信的。其次要知道的是，每个用户的“考虑时间”即请求间时间是多少。这非常重要，因为考虑时间越短，系统所能支持的并发用户越少。例如，如果用户的考虑时间是1秒，那么系统可能只能支持数百个这样的并发用户。但是，如果用户的考虑时间是30秒，那么系统则可能支持数万个这样的并发用户（假定硬件和应用程序都是相同的）。在现实世界中，通常难以确定用户的确切考虑时间。还要注意，在现实世界中，用户不会精确地按照间隔时间发出请求。</p>
		<p>　　于是就引入了随机性。如果知道普通用户的考虑时间是5秒，误差为20%，那么在设计负载测试时，就要确保请求间的时间为5×（1 +/- 20%）秒。此外，可以利用“调步”的理念向负载场景中引入更多的随机性。它是这样的：在一个虚拟用户完成一整套的请求后，该用户暂停一个设定的时间段，或者一个小的随机时间段（例如，2×（1 +/- 25%）秒），然后再继续执行下一套请求。将这两种随机化方法运用到测试中，可以提供更接近于现实世界的场景。</p>
		<p>　　现在该进行实际的容量规划测试了。接下来的问题是：如何加载用户以模拟负载状态？最好的方法是模拟高峰时间用户与服务器通信的状况。这种用户负载状态是在一段时间内逐步达到的吗？如果是，应该使用ramp-up类型的测试，每隔几秒增加x个用户。或者，所有用户是在一个非常短的时间内同时与系统通信？如果是这样，就应该使用flat类型的测试，将所有的用户同时加载到服务器。两种不同类型的测试会产生没有可比性的不同测试。例如，如果进行ramp-up类型的测试，系统可以以4秒或更短的响应时间支持5,000个用户。而执行flat测试，您会发现，对于5,000个用户，系统的平均响应时间要大于4秒。这是由于ramp-up测试固有的不准确性使其不能显示系统可以支持的并发用户的精确数字。以门户应用程序为例，随着门户规模的扩大和集群规模的扩大，这种不确定性就会随之显现。</p>
		<p>　　这不是说不应该使用ramp-up测试。对于系统负载在一段比较长的时间内缓慢增加的情况，ramp-up测试效果还是不错的。这是因为系统能够随着时间不断调整。如果使用快速ramp-up测试，系统就会滞后，从而报告一个较相同用户负载的flat测试低的响应时间。那么，什么是确定容量的最好方法？结合两种负载类型的优点，并运行一系列的测试，就会产生最好的结果。例如，首先使用ramp-up测试确定系统可以支持的用户范围。确定了范围之后，以该范围内不同的并发用户负载进行一系列的flat测试，更精确地确定系统的容量。</p>
		<p>
				<strong>渗入测试</strong>
		</p>
		<p>　　渗入测试是一种比较简单的性能测试。渗入测试所需时间较长，它使用固定数目的并发用户测试系统的总体健壮性。这些测试将会通过内存泄漏、增加的垃圾收集(GC)或系统的其他问题，显示因长时间运行而出现的任何性能降低。测试运行的时间越久，您对系统就越了解。运行两次测试是一个好主意——一次使用较低的用户负载（要在系统容量之下，以便不会出现执行队列），一次使用较高的负载（以便出现积极的执行队列）。</p>
		<p>　　测试应该运行几天的时间，以便真正了解应用程序的长期健康状况。要确保测试的应用程序尽可能接近现实世界的情况，用户场景也要逼真（虚拟用户通过应用程序导航的方式要与现实世界一致），从而测试应用程序的全部特性。确保运行了所有必需的监控工具，以便精确地监测并跟踪问题。</p>
		<p>
				<strong>峰谷测试</strong>
		</p>
		<p>　　峰谷测试兼有容量规划ramp-up类型测试和渗入测试的特征。其目标是确定从高负载（例如系统高峰时间的负载）恢复、转为几乎空闲、然后再攀升到高负载、再降低的能力。</p>
		<p>　　实现这种测试的最好方法就是，进行一系列的快速ramp-up测试，继之以一段时间的平稳状态（取决于业务需求），然后急剧降低负载，此时可以令系统平息一下，然后再进行快速的ramp-up；反复重复这个过程。这样可以确定以下事项：第二次高峰是否重现第一次的峰值？其后的每次高峰是等于还是大于第一次的峰值？在测试过程中，系统是否显示了内存或GC性能降低的有关迹象？测试运行（不停地重复“峰值/空闲”周期）的时间越长，您对系统的长期健康状况就越了解。</p>
		<p>
				<strong>结束语</strong>
		</p>
		<p>　　本文介绍了进行性能测试的几种方法。取决于业务需求、开发周期和应用程序的生命周期，对于特定的企业，某些测试会比其他的更适合。但是，对于任何情况，在决定进行某一种测试前，都应该问自己一些基本问题。这些问题的答案将会决定哪种测试方法是最好的。</p>
		<p>　　这些问题包括：</p>
		<ul>
				<li>结果的可重复性需要有多高？ 
</li>
				<li>测试需要运行和重新运行几次？ 
</li>
				<li>您处于开放周期的哪个阶段？ 
</li>
				<li>您的业务需求是什么？ 
</li>
				<li>您的用户需求是什么？ 
</li>
				<li>您希望生产中的系统在维护停机时间中可以持续多久？ 
</li>
				<li>在一个正常的业务日，预期的用户负载是多少？ </li>
		</ul>
		<p>　　将这些问题的答案与上述性能测试类型相对照，应该就可以制定出测试应用程序的总体性能的完美计划。</p>
		<p>
				<strong>参考资料</strong>
		</p>
		<ul>
				<li>
						<a href="http://e-docs.bea.com/wls/docs81/perform/appa_reading.html" target="_blank">
								<font color="#336699">WebLogic Server Performance and Tuning</font>
						</a>——WebLogic Server产品文档 
</li>
				<li>
						<a href="http://e-docs.bea.com/wls/docs81/perform/index.html" target="_blank">
								<font color="#336699">WebLogic Server performance tools and information</font>
						</a>——WebLogic Server产品文档 
</li>
				<li>
						<a href="http://dev2dev.bea.com/pub/a/2002/11/aston.html" target="_blank">
								<font color="#336699">The Grinder: Load Testing for Everyone</font>
						</a>（dev2dev，2002年11月），作者Philip Aston 
</li>
				<li>
						<a href="http://e-docs.bea.com/wlp/docs81/perftune/2ptgeneral.html" target="_blank">
								<font color="#336699">Performance Tuning Guide</font>
						</a>——WebLogic Portal产品文档 
</li>
				<li>
						<a href="http://dev2dev.bea.com/wlserver/" target="_blank">
								<font color="#336699">dev2dev WebLogic Server Product Center</font>
						</a>
				</li>
		</ul>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20570.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/szdlinxie/" target="_blank">szdlinxie</a> 2006-12-15 21:08 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20570.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>