﻿<?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/4497.html</link><description>·√·  本ITblog站点记录相关的软件技术文档、网络技术杂志、测试技术杂谈等技术文档的管理站点.联系方式：MSN：dowling@sunlike.cn   QQ:94595885</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 06:59:44 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 06:59:44 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 Suite Enterprise2002---系统测试解决方案</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27370.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Mon, 21 May 2007 06:10:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27370.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/27370.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27370.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/27370.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/27370.html</trackback:ping><description><![CDATA[Rational Suite Enterprise2002<br>系统测试解决方案V 1.0<br><br>Rational 系统测试解决方案 目录<br>- I -<br>目录<br>第一章 整体解决方案.................................................................................................................................. 1<br>第二章 产品线简介...................................................................................................................................... 3<br>2.1 测试管理........................................................................................................................................ 3<br>2.2 调用和功能测试............................................................................................................................. 3<br>2.3 运行时分析.................................................................................................................................... 3<br>2.4 功能测试........................................................................................................................................ 3<br>2.5 微软开发环境的功能测试............................................................................................................. 3<br>2.6 针对X-Windows和终端应用的衰减和调用测试......................................................................... 3<br>2.7 变更影响跟踪................................................................................................................................ 3<br>第三章 具体产品简介.................................................................................................................................. 4<br>3.1 TestManager.................................................................................................................................. 4<br>3.1.1 获得需求变更对于测试的影响........................................................................................... 4<br>3.1.2 让整个团队获得信息共享访问......................................................................................... 4<br>3.1.3 独立性和集成性................................................................................................................. 4<br>3.2 TeamTest........................................................................................................................................ 4<br>3.2.1 提高应用程序质量............................................................................................................. 4<br>3.2.2 重复功能性测试................................................................................................................. 4<br>3.2.3 量化的性能测试................................................................................................................. 4<br>3.2.4 集成测试管理..................................................................................................................... 4<br>3.3 PurifyPlus.................................................................................................................................... 5<br>3.3.1 Features and Benefits................................................................................................... 5<br>3.3.2 已支持环境......................................................................................................................... 5<br>3.3.3 注册.................................................................................................................................... 5<br>3.4 Robot.............................................................................................................................................. 5<br>3.4.1 降低测试用时提高效率..................................................................................................... 5<br>3.4.2 Rational Robot的性能.................................................................................................... 5<br>3.5 Visual Test.................................................................................................................................. 6<br>3.6 prevue............................................................................................................................................ 6<br>3.6.1 自动化脚本生成................................................................................................................. 6<br>3.6.2 非插入性测试..................................................................................................................... 6<br>3.6.3 全面的测试结果................................................................................................................. 6<br>3.7 ClearQuest.................................................................................................................................... 6<br>3.7.1 缺陷和变更跟踪工具-- Rational ClearQuest ............................................................. 6<br>3.7.2 配合你的工作方式............................................................................................................. 6<br>3.7.3 针对整个生命周期的变更跟踪......................................................................................... 6<br>3.7.4 设计一次就可以到处使用................................................................................................. 7<br>3.7.5 将分散的团队整合起来..................................................................................................... 7<br>Rational 系统测试解决方案 整体解决方案<br>- 1 -<br>第一章 整体解决方案<br>TestStudio 是Rational Suite Enterprise的系统测试工具组, 提供了针对可靠性测试, 功能<br>测试, 分布式功能测试, 衰减测试, 单元测试和CS的调用测试, 网页应用测试和ERP应用测试的自<br>动化解决方案. 它提供了一个同开发无缝集成的测试过程, 软件配置管理和测试管理三方面的支<br>持，提高了测试质量和最终的产品质量.<br>针对嵌入式-实时-基于网络的应用产品, Rational提供了实时测试套件. 它提供了针对目标主<br>机的测试, 代码覆盖措施, 内存泄漏检测和性能记录等方面的自动化功能.<br>在开发下一代应用程序软件的激烈竞赛中，企业所面临的压力越来越大，需要在更短时间内开<br>发出更高质量的产品，即我们称之为&#8220;软件开发矛盾&#8221;的两难境地。过去，企业通常以质量为代价<br>或推迟开发某些新功能，来满足产品的面市期限。如今，这些企业认识到：要想生存，就必须在第<br>一时间内既快又好地开发出应用程序。也就是说，开发团队中的每位成员都必须以保证产品质量为<br>己任。Rational Suite TestStudio v2002 可以使企业在Internet 时代，通过交付高质量的应用<br>程序，帮助他们解决软件开发的矛盾。<br>Rational Suite TestStudio 提供了一种集成测试解决方案，使测试人员就产品的功能、可靠<br>性和性能，进行全方位的质量测试。它包括一整套自动化测试和缺陷跟踪工具，以及Rational 团<br>队统一平台(Rational Team Unifying Platform)。该平台通过提供对项目需求、变更请求、测试资<br>料及其他数据的共享，提高了团队的工作效率。通过Rational 软件开发服务机构提供的支持，<br>Rational Suite TestStudio 可以帮助开发团队加速应用程序的开发和实施。<br>功能测试，可以确保应用程序满足产品规格说明和测试计划的每一条业务需求。Rational Suite<br>TestStudio 的目标，是使功能测试变得更简单、有效并可重复执行。为便于这种基于需求的测试，<br>它还提供了Rational RequisitePro.（获奖的需求管理工具）和Rational Robot（创建和维护功能<br>测试脚本的业界领先工具）。<br>Rational Robot 可以对在各种独立开发环境(IDE) 中开发的应用程序，创建、修改并执行功能<br>测试、分布式功能测试、回归测试以及整合测试。它还可以记录并回放能识别业务应用程序对象的<br>测试脚本。除此之外，使用Rational Robot 还可以快速有效地跟踪、报告与质量保证测试相关的<br>所有信息，并将这些信息绘制成图表。使用Rational Suite TestStudio 集成工具包， 可以在一<br>个测试周期中，将Rational Robot 的回归测试与Rational Purify. 结合使用完成可靠性测试，与<br>Rational PureCoverage. 结合使用完成代码覆盖计算，与Rational Quantify. 结合使用完成应用<br>程序性能测试。通过将优化的回归测试脚本与该工具化的测试方式相结合， Rational Suite<br>TestStudio 使可靠性及功能回归测试达到了前所未有的水平。<br>Rational Suite TestStudio 通过Rational TestFactory. 使可靠性测试自动化，该工具可以<br>自动找出应用程序中的缺陷。Rational TestFactory 将在自动认知用户界面的基础上， 创建测试<br>流程对应用程序进行严格的测试。基于这一点，它首先为要测试的应用程序构建元素图，然后自动<br>测试其中的每个元素。它可以找出所有的程序缺陷，例如，运行时错误（如挂起和异常）或设计缺<br>陷（如对话框按钮缺少快捷键）。对于每一个缺陷，TestFactory 都会创建相应的脚本将其重现。随<br>后，测试人员在Rational ClearQuest.（全面集成的变更与缺陷管理系统）中报告缺陷，确保将这<br>些缺陷被正确地跟踪并修正。<br>通过确定哪些功能测试脚本会受到代码变更的影响，Rational TestFactory 可以加速并简化回<br>归测试。这样，测试人员可以快速找到所做的修改，并且运行最少的脚本，即可对开发人员所做的<br>任何修改进行全面测试。<br>Rational Suite TestStudio 提供三种级别的诊断信息，开发人员可以对导致性能不佳的业务<br>事务处理、底层客户端调用和系统资源进行分析， 来找出产生性能瓶颈的原因。例如，Rational<br>Suite TestStudio 性能测试可以帮助测试人员确定，何时可通过增加系统内存或提高CPU 速度来<br>Rational 系统测试解决方案 整体解决方案<br>- 2 -<br>优化后端服务器，还可以找出，导致性能问题的客户端、中间层或服务器端代码所在的特定区域。<br>性能测试的准确性取决于测试工具根据实际用户负载情况调节测试负载，以及通过模拟实际工<br>作负载时间进度情况创建负载的能力。使用Rational Suite TestStudio，不必编程就可以迅速制<br>定综合的使用方案来模拟用户组活动，并创建工作负载计划。在给定时间内，通过指定虚拟用户群<br>提交事务处理的数量和类型， Rational Suite TestStudio 可以准确控制事务处理的速度。而且，<br>Rational Suite TestStudio 可以将功能测试与负载测试集于一身，便于测试人员设置后端服务器<br>的负载规模，同时使用同一个计划对客户端进行功能测试。<br>Rational 系统测试解决方案 产品线简介<br>- 3 -<br>第二章 产品线简介<br>2.1 测试管理<br>Rational TestManager 从一个独立的,全局的角度对于各种测试活动进行管理和控制. 它让测<br>试者可以随时了解需求变更对于测试用例的影响, 通过针对一致目标而进行的测试与报告提高了团<br>队生产力.<br>2.2 调用和功能测试<br>Rational TeamTest 提供了功能, 分布式功能, 衰减, 客户-服务器应用调用, 网页和ERP应用<br>的自动化测试解决方案. 通过跟踪和测试管理可以降低团队开发和配置的风险.<br>2.3 运行时分析<br>Rational PurifyPlus 工具集对于开发期间的单元测试实现了自动化, 确保了可靠性, 高性能<br>和高质量. 包括三个独立工具:<br>l Rational Purify<br>定位内存泄漏和运行时错误<br>l Rational Quantify<br>寻找性能瓶颈<br>l Rational PureCoverage<br>表示了未测试代码和提供代码覆盖分析<br>2.4 功能测试<br>Rational Robot 是一个针对WEB, ERP 和C/S 进行功能自动化测试的工具. 它可以降低功能测<br>试上的人力和物力的投入和风险包括了可见和非可见对象.<br>2.5 微软开发环境的功能测试<br>Rational Visual Test则是针对Windows应用程序的功能测试的自动化工具. 它可以直接针对<br>微软的可视化开发环境使用可复用, 可维护和可扩展的测试脚本, 降低了开发高质量软件的花费.<br>2.6 针对X-Windows和终端应用的衰减和调用测试<br>Rational preVue 是一个针对企业级别的基于X-Windows 和终端应用的自动化测试工具. 它们<br>降低了发布风险, 投入并且提高了用户的满意程度.<br>2.7 变更影响跟踪<br>Rational ClearQuest 是一个可以使用于任意平台上各种类型的项目的需求跟踪和变更调整工<br>具.<br>Rational 系统测试解决方案 具体产品简介<br>- 4 -<br>第三章 具体产品简介<br>3.1 TestManager<br>Rational TestManager用来从各个方面进行测试管理:<br>* 测试计划<br>* 测试设计<br>* 测试实现<br>* 测试执行<br>* 结果分析<br>Rational TestManager 可以处理针对测试的计划, 执行和结果数据收集-甚至包括使用第三方<br>的测试工具.使用Rational TestManager, 测试者可以通过创建, 维护或引用测试用例来组织自己<br>的测试计划, 包括来自外部稳定, 模块, 需求变更请求和Excel 电子表格的数据.<br>3.1.1 获得需求变更对于测试的影响<br>Rational TestManager 一个主要功能就是通过自动跟踪整个项目的质量和需求状态来分析所<br>造成的针对测试用例的影响, 由此成为整个软件团队的项目状态的数据集散中心.<br>3.1.2 让整个团队获得信息共享访问<br>QA 或者QE 经理, 商业分析师, 开发者和测试者使用Rational TestManager 都恶意获得基于<br>他们自己特定角度的测试结构数据, 并且利用这些数据对于他们的工作进行决策. Rational<br>TestManager 在整个项目生命周期内为团队提供了持续地面向测试计划目标的状态和进度跟踪.<br>3.1.3 独立性和集成性<br>Rational TestManager 在Rational Suite TestStudio 中作为一个独立组件存在. 我们也可以<br>配合Rational TeamTest 和Rational Robot 使用.作为一个集成的解决方案套件, Rational<br>TestManager 可以和Rational 的其他产品很好的连接各种产品的输入的即时跟踪, 诸如: Rational<br>RequisitePro 需求组件, Rational Rose系统分析模型, 和Rational ClearQuest 需求变更. 它的<br>开发式API可以让测试者为不同输入类型制作接口配件.<br>3.2 TeamTest<br>3.2.1 提高应用程序质量<br>Rational(r) TeamTest为开发中的项目提供了功能和性能的自动化, 高效率以及可重复的测试,<br>测试管理和跟踪能力. 测试者不仅可以降低配置应用的风险, 还减少了测试用时使得整个团队的生<br>产力得到提高.<br>3.2.2 重复功能性测试<br>Rational TeamTest 让测试者可以长剑和维护强壮的, 可重复的测试脚本进行功能-分布式功能<br>-衰减-冒烟测试, 可以集成在大多数开发环境当中, 和Rational Robot 一样, 它使用了<br>Object-Testing(r)技术.<br>3.2.3 量化的性能测试<br>测试者可以设计并执行高度量化的性能测试来模拟现实世界当中的真是情景. Rational<br>TeamTest使得不用编程就可以建立复杂的用例场景; 并且产生很有条理的报告显示性能问题的根源<br>所在.<br>3.2.4 集成测试管理<br>Rational TestManager 是一个Rational TeamTest集成组件, 是测试者的工作平台, 是一个有<br>力的, 开放式的可扩展环境来管理相关测试工作. 测试者使用Rational TestManager进行计划, 设<br>计和实现, 执行并且升级功能测试和性能测试; 并且Rational ClearQuest 负责根据相应的变更进<br>行跟踪.<br>Rational 系统测试解决方案 具体产品简介<br>- 5 -<br>3.3 PurifyPlus<br>Rational PurifyPlus是一个完整的自动化运行时分析工具, 用来提高应用程序的性能和质量.<br>它为哪些需要进行创建和配置可靠的应用程序的开发者设计, 支持Unix平台的C/C++, 和Java, 以<br>及Windows平台上的VC/C++, C#, VB.NET, VB .PurifyPlus for Windows 对于Java 的服务器端和<br>客户端提供一样的支持. 安装在你的WEB服务器上面以后, 你可以针对在服务器诸如IBM WebSphere,<br>BEA WebLogic 和Apache Jakarta Tomcat 上的Java Server Pages (JSPs)和Java servlets 使用<br>PurifyPlus.Rational PurifyPlus 由Rational Purify, Quantify 和 PureCoverage 组<br>成.PurifyPlus为Windows/UNIX开发者提高了生产力, 因为它完全集成在进程当中. 它不要求重新<br>编译目标应用程序, 不会降低你的进度. PurifyPlus 帮助你可视化的执行代码, 提供便于理解和可<br>重复信息, 可以结合或者独立于源代码-包括各种第三方组件.<br>3.3.1 Features and Benefits<br>* Rational Purify用来探测内存泄漏和代码错误.<br>* Rational Quantify 用来发现性能瓶颈.<br>* Rational PureCoverage 用来标识未测试代码.<br>3.3.2 已支持环境<br>* Rational PurifyPlus for Windows<br>Windows 2000 or NT 4.0 or above (including Japanese Windows NT 4.0)<br>Visual Studio 6.0<br>Rational PurifyPlus for UNIX<br>Sun Solaris 2.5.1, 2.6, 7, 8<br>Forte 6, Update 2, and GCC 2.95.2<br>HP-UX 10.20, 11.0, 11.11<br>HP cc/aCC, GCC 2.95.3 and GNUPro 98r2<br>Compaq Tru64 UNIX V4.0F patch 4, 4.0G patch 1, V5.0A, V5.1<br>Compaq C, CompaqCH (for Tru64 UNIX V4.0F, C or C++ prior to V6.2 supported with patch<br>CxxREDIST 621<br>3.3.3 注册<br>* Windows版本适用于nodelocked 或者floating注册方式<br>* UNIX 版本适用于named user或者floating注册方式<br>* 注册使用Globetrotter Software's FLEXlm license manager<br>3.4 Robot<br>3.4.1 降低测试用时提高效率<br>Rational Robot 是一个面向对象的工具让你可以创建, 修改和实现自动化进行功能, 衰减, 冒<br>烟测试. Rational TestManager 和Rational SiteCheck包含于Rational Robot, 让你实现测试的<br>各方面数据的团队共享, 给你一个面向站点的强壮性工具: 实现网站链接管理, 站点监视等功能.<br>3.4.2 Rational Robot的性能<br>仅仅通过鼠标就可以实现GUI 和各个属性的测试.<br>* 可以识别和记录以及重复测试各种应用程序中的对象.<br>* 跟踪, 报告和图形化你的测试进程的信息<br>* 检测以及修改你的网站的各个元素的问题<br>* 在记录的时候检查和修改测试脚本<br>* 对于多重平台使用同样测试脚本<br>Rational Robot 支持各种环境和语言, 包括HTML和DHMTL, Java, Microsoft Visual Basic and<br>Visual C++, Oracle Developer/2000, Delphi, SAP, PeopleSoft, 和Sybase PowerBuilder.<br>Rational 系统测试解决方案 具体产品简介<br>- 6 -<br>3.5 Visual Test<br>Rational Visual Test(r) 6.5 是专门为微软的视窗应用程序的开发者和测试者开发的自动化<br>功能测试工具, 并且可以和Microsoft Visual C++很好地集成. Rational Visual Test 让开发者和<br>测试者便利地组织程序.<br>特性和收益<br>* 支持Microsoft J++ WFC Controls<br>* 更好的Winfo工具<br>* 更好的套件管理者<br>* 将一个项目的所有文件批处理进入p-code<br>* 支持多监视器<br>* 新的activeX过程<br>* 新的ActiveX/Web过程<br>* 新的RUNEX 函数<br>* 新的MSI-based 安装器<br>3.6 prevue<br>Rational(r) preVue是针对X&amp;终端应用的测试解决方案, 让使用者降低测试投入和提高客户满<br>意程度. Rational preVue利用软件脚本模拟用户或者相关硬件行为, 实现自动化功能和衰减测试,<br>并以量化和图形化形式提交测试数据报告.<br>3.6.1 自动化脚本生成<br>Rational preVue 利用测试脚本记录或者"偷拍"用户和应用程序之间的交互合执行, 便于你可<br>以验证你的应用程序在各种调用方式下的性能及可靠性.<br>3.6.2 非插入性测试<br>使用Rational preVue 不需要额外负担. 针对目标应用程序不需要定制函数库或者修改. 该"<br>黑盒"方式允许你可以实现平台无关的X&amp;终端程序的测试.<br>3.6.3 全面的测试结果<br>Rational preVue 使用专业的报告, 图片和日志保存测试结果. 图片帮助你及早发现微小的质<br>量和性能问题, 使得它们没有机会暴露给最终用户.<br>* Rational preVue-X<br>X Window测试工具, 可以在任何X Window 环境中使用.<br>* Rational preVue-ASCII<br>远程终端模拟器, 模拟用户操作应用程序进行多用户自动化测试. Rational preVue-ASCII 支持<br>UNIX, MS Windows NT, MVS, 或者VMS 等系统的终端应用程序测试.<br>3.7 ClearQuest<br>3.7.1 缺陷和变更跟踪工具-- Rational ClearQuest<br>Rational(r) ClearQuest(r)缺陷跟踪工具是目前最具扩展性的系统. 不管你的开发团队的大<br>小和地理分布, 不管他们使用的平台--Windows, Unix或者Web--Rational ClearQuest都能实现高<br>效率地捕获, 跟踪和管理任意类型的变更. 你可以选择配置或者选择一个合适的模板配合你的过程.<br>配合企业数据库, ClearQuest 可以针对各种尺寸的项目. 同其他开发解决方案的集成确保所有团队<br>成员同缺陷/变更跟踪过程绑定.<br>3.7.2 配合你的工作方式<br>不同的组织使用不同的过程处理软件缺陷, 需求变更何其他修改结果. Rational ClearQuest<br>提供针对大多数组织的过程和允许你定制自己的过程.<br>3.7.3 针对整个生命周期的变更跟踪<br>开发当中的每一个人都不仅需要了解变更在特定层面上造成的影响, 也需要理解对于整个项目<br>Rational 系统测试解决方案 具体产品简介<br>- 7 -<br>的影响. 使用Rational ClearQuest 你可以在整个项目的生命周期中跟踪缺陷和需求变更, 分配工<br>作活动和访问项目的真实状态.<br>3.7.4 设计一次就可以到处使用<br>不管你的开发团队大小和他们的地理分布, 不管他们使用的平台, Rational ClearQuest 都可<br>以实现变更的捕获, 跟踪和管理. 用户化仅仅需要一次, 然后即可以发布到Windows, UNIX, Web 的<br>客户层面. ClearQuest 支持好几种企业数据库. 当你的组织成长的时候, ClearQuest 将和你一起成<br>长.<br>3.7.5 将分散的团队整合起来<br>基于被验证的Rational ClearCase MultiSite 技术, ClearQuest MultiSite 是一个针对<br>Rational ClearQuest 的选项, 支持针对地理上分布的站点的同步发展.
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/27370.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:10 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/05/21/27370.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设定时间让脚本自动运行</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/01/05/21583.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 05 Jan 2007 13:40:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/01/05/21583.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/21583.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/01/05/21583.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/21583.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/21583.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#000066">
						<font size="2">主要功能：实现每天都对数据库</font>
						<font size="2">进行备份</font>
				</font>
		</p>
		<p>
				<font color="#000066">
						<font size="2">由于WR没有定时自动运行脚本</font>
						<font size="2">的功能，但与TD结合便可以实现。使用的WR版本为7.0，具体实现如下：</font>
				</font>
		</p>
		<p>
				<font color="#000066" size="2">1、设置WR与TD连接。</font>
		</p>
		<p>
				<font color="#000066">
						<font size="2"> 1.1启动WR，在settings--&gt;general options菜单下的environment中勾选"Allow TestDirector to run tests remotely"，之后保存。</font>
						<a href="http://blog.51testing.com/batch.download.php?aid=774" target="_blank">
								<font size="2">
										<img title="点击图片可在新窗口打开" style="CURSOR: pointer" src="http://www.51testing.com/ddimg/uploadimg/20061230/1117060.jpg" border="0" />
								</font>
						</a>
				</font>
		</p>
		<p>
				<font size="2">
				</font> </p>
		<p>
				<font color="#000066">
						<font size="2"> 1.2选择菜单功能tools--&gt;TestDirector Connection,进行设置，指定TD服务器，连接指定的project。具体设置如图</font>
						<a href="http://blog.51testing.com/batch.download.php?aid=775" target="_blank">
								<font size="2">
										<img title="点击图片可在新窗口打开" style="CURSOR: pointer" src="http://www.51testing.com/ddimg/uploadimg/20061230/1117061.jpg" border="0" />
								</font>
						</a>
				</font>
		</p>
		<p>
				<font color="#000066" size="2">2、TD相关操作</font>
		</p>
		<p>
				<font color="#000066" size="2"> 2.1下载XRunnerTestDirector.exe插件。</font>
		</p>
		<p>
				<font color="#000066">
						<font size="2"> 2.2登陆TD，在test plan页面中新加一个测试</font>
						<font size="2">用例，修改type为WR-AUTOMATED.之后点到test scrīpt页签，点击copy from，选择脚本，导入。脚本就成功的导入了。其中脚本调用了其它两个子脚本，WR会跟据所指路径自动去读取，并且在脚本中已添加了加载map的语句。</font>
				</font>
		</p>
		<p>
				<font color="#000066" size="2"> 2.3切到test lab页面，新建test,然后执行"Add Tests to Test Set"功能如图wrltd6.jpg</font>
		</p>
		<p>
				<font color="#000066" size="2">
						<a href="http://blog.51testing.com/batch.download.php?aid=776" target="_blank">
								<img src="http://www.51testing.com/ddimg/uploadimg/20061230/1117062.jpg" border="0" />
						</a>
				</font>
		</p>
		<p>
				<font color="#000066">
						<font size="2">添加刚才test plan中指定的test.添加成功后如图wrltd7.jpg<br /></font>
						<a href="http://blog.51testing.com/batch.download.php?aid=779" target="_blank">
								<font size="2">
										<img title="点击图片可在新窗口打开" style="WIDTH: 400px; CURSOR: pointer" src="http://www.51testing.com/ddimg/uploadimg/20061230/1117063.jpg" border="0" />
								</font>
						</a>
				</font>
		</p>
		<p>
				<font color="#000066">
						<font size="2"> 2.4设置执行时间。见图wrltd7.jpg切到Execution Flow页签，设置时间。如图wrltd5.jpg.</font>
						<a href="http://blog.51testing.com/batch.download.php?aid=777" target="_blank">
								<font size="2">
										<img title="点击图片可在新窗口打开" style="WIDTH: 400px; CURSOR: pointer" src="http://www.51testing.com/ddimg/uploadimg/20061230/1117064.jpg" border="0" />
								</font>
						</a>
				</font>
		</p>
		<p>
				<font color="#000066">
						<font size="2"> 2.5点击wrltd5.JPg中的RUN按钮，弹出窗口"Execution of...窗口",点击run按钮,所有操作到这儿就完成了.如图wrltd6.jpg所示状态，脚本处于等待状态，等到设定的时间，TD会自动打开WR程序，并开始执行脚本。<br /></font>
						<a href="http://blog.51testing.com/batch.download.php?aid=778" target="_blank">
								<font size="2">
										<img title="点击图片可在新窗口打开" style="WIDTH: 400px; CURSOR: pointer" src="http://www.51testing.com/ddimg/uploadimg/20061230/1117065.jpg" border="0" />
								</font>
						</a>
						<br />
						<br />
				</font>
		</p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/21583.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-01-05 21:40 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/01/05/21583.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QTP中设置共享对象库</title><link>http://www.cnitblog.com/szdlinxie/archive/2007/01/05/21582.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 05 Jan 2007 13:38:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2007/01/05/21582.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/21582.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2007/01/05/21582.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/21582.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/21582.html</trackback:ping><description><![CDATA[
		<font size="2">很多时候我们总是觉得管理QTP的脚本比较烦.因为除了要对代码的管理之外，还要保证QTP对象库的完整．每一个用例脚本的生成，同时又都会生成一个对象库．那么是不是可以做一个公共的对象库来给各个用例脚本调用呢？接下来，我们就来实现共享对象库的应用．</font>
		<p>
		</p>
		<p>
				<font size="2">　　<strong>第一步：把需要加到共享对象库中的各个用例脚本的对象库，分别导出成．tsr文件．</strong></font>
		</p>
		<p>
				<font size="2">　　操作方法:先用QTP打开已经录制完毕的脚本后，选择Resources－－＞ Object Repository ．</font>
		</p>
		<p>
				<font size="2">　　然后file--&gt;export....取名导出文件．如下图：</font>
		</p>
		<p>
				<font size="2">　　　　　　　　　　　</font>
				<a href="http://blog.51testing.com/batch.download.php?aid=784" target="_blank">
						<font size="2">
								<img src="http://www.51testing.com/ddimg/uploadimg/20061231/1143410.jpg" border="0" />
						</font>
				</a>
		</p>
		<p>
				<font size="2">　　<strong>第二步：把需要加入到共享对象库中的各个用例脚本的对象库，合并对象及对象属性，形成一个大的共享对象库．</strong></font>
		</p>
		<p>
				<font size="2">　　操作方法:打开Resources－－＞Object Repository Manager．找到Tools菜单，然后选择打开Object Repository merge tool.选择两个要合并的对象库文件，进行对象合并．一次只能合并两个．所以如果这里你要合并多个对象库文件的话，先合并两个后，保存成一个新的．tsr文件．然后再重复上面的操作，选择这个新的．tsr文件和另一个准备好的对象库合并．如下图：</font>
		</p>
		<p>
				<font size="2">　　　　　　　　　</font>
				<a href="http://blog.51testing.com/batch.download.php?aid=785" target="_blank">
						<font size="2">
								<img src="http://www.51testing.com/ddimg/uploadimg/20061231/1143411.jpg" border="0" />
						</font>
				</a>
		</p>
		<p>
				<font size="2">　　合并的时候，你会发现，在两个对象库文件中，相同的对象合并成一个，不同的对象，全部被完整增加进去．然后形成一个大的对象库．现在只要保存这个共享对象库．如果以后有新增的对象，可以重复上述操作．</font>
		</p>
		<p>
				<font size="2">　　<strong>第三步：调用上面保存好的共享对象库．给新的脚本使用．</strong></font>
		</p>
		<p>
				<font size="2">
						<strong>　　</strong>操作步骤：Resources－－＞Associate Repository．选择上面保存好的共享对象库的．tsr文件．加入到Associate Repository中．如下图：</font>
		</p>
		<p>
				<font size="2">　　</font>
				<a href="http://blog.51testing.com/batch.download.php?aid=787" target="_blank">
						<font size="2">
								<img src="http://www.51testing.com/ddimg/uploadimg/20061231/1143412.jpg" border="0" />
						</font>
				</a>
		</p>
		<p>
				<font size="2">　　完成这一步后，其实整个共享对象库的操作已经完成．你在对象库中可以看到以后的对象．在录制新脚本的时候，如果对象已经存在，就不会再被记录，只有在这个对象库中没有的对象才会被记录进去．回放脚本，对象识别成功．</font>
		</p>
		<p>
				<strong>
						<font size="2">（注：此操作只适合与装有QTP9.0的版本．对于8.2版本不适合）</font>
				</strong>
		</p>
		<p>
				<strong>
						<font size="2">附：8.2版本中的共享对象库操作</font>
				</strong>
		</p>
		<div style="FONT-SIZE: 12px">
				<font size="2">QTP8.2的共享方法<br />1. 选择“测试”&gt;“设置”&gt;“资源”选项卡。<br />2. 在“对象库类型”区域，“共享”。<br />请指定要用作对象库文件的共享对象库文件。要指定文件，请输入对象库文件名，或单击浏览按钮并从“打开”对话框中选择资源文件。要新建共享对象库文件，请在“共享”框中输入新文件名。<br />对象库文件的默认文件扩展名是 .tsr，但是文件可能使用任何扩展名。在“打开”对话框中浏览现有对象库文件时，在“文件类型”框中选择“所有文件”。 <br />3. 注：请在新测试开始录制前进行设置，已有测试的对象库模式不能进行修改。</font>
		</div>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/21582.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-01-05 21:38 <a href="http://www.cnitblog.com/szdlinxie/archive/2007/01/05/21582.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>高级测试管理的工具和技术</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20896.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Thu, 21 Dec 2006 01:51:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20896.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20896.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20896.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20896.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20896.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 高级测试管理的工具和技术业务优化科技概述近年来，在应用测试领域有了突飞猛进的发展。随着当今应用复杂性的不断提升、竞争压力的不断加大，以及在应用失败和宕机方面的成本激增，使得对测试的需求不断攀升。 实施高质量应用的压力持续加大，其挑战在于日益紧缩的开发和部署进度、分散的机构组织、外包、技术熟练员工的高调动率，这些都造成了应用测试难度的提升。 为了实现以较少资源完成更多任务的目标、同时展开多个项目、管...&nbsp;&nbsp;<a href='http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20896.html'>阅读全文</a><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20896.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 09:51 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/21/20896.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QuickTest使用正则表达式 </title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20848.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 06:41:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20848.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20848.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20848.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20848.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20848.html</trackback:ping><description><![CDATA[QuickTest使用正则表达式 <br /><blockquote class="indent"><a name="wp799340"></a><h2 class="pn2Heading">正则表达式语法 </h2><a name="wp799346"></a><p class="pRegtext">通过正则表达式，QuickTest 可以使用不同的值来标识对象和文本字符串。可以在下列三种情况下使用正则表达式：一是定义对象属性和参数方法时；二是对某步骤进行参数化时；三是使用不同值创建检查点时。 </p><a name="wp799356"></a><p class="pRegtext">正则表达式是指定复杂搜索短语的字符串。使用特殊字符，如句点 (.)、星号 (*)、插字号 (^) 和方括号 ([ ])，可以定义搜索条件。有关正则表达式语法的详细信息，请参阅《QuickTest Professional 用户指南》。 </p></blockquote><br /><blockquote class="indent"><a name="wp799360"></a><h2 class="pn2Heading">使用正则表达式 </h2><a name="wp799362"></a><p class="pRegtext">在本教程中，将针对一个日期文本字符串创建文本检查点，该字符串随选定的航班日期而变化。可以将该日期定义为正则表达式，这样，检查点将检查捕获的文本字符串是否与期望的格式匹配，而不是检查准确的文本。 </p><a name="wp799364"></a><p class="pRegtext">为此，您将使用一个正则表达式创建文本检查点，该表达式将与已定义范围内的某一单个字符相匹配。 </p><div class="pSmartListBold1"><ol class="pSmartListBold1" type="1"><a name="wp799371"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">启动 QuickTest </b><span style="FONT-WEIGHT: normal"><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_AQT_icon.gif" border="0" /></span><b style="FONT-WEIGHT: bold">并打开“Recording”测试。</b></li></div><a name="wp799393"></a><p class="pIndent">如果 QuickTest 尚未打开，请选择“开始”&gt;“程序”&gt;“QuickTest Professional”&gt;“QuickTest Professional”。 </p><div class="pSmartBullet2"><ul class="pSmartBullet2"><a name="wp799395"></a><div class="pSmartBullet2"><li>如果“欢迎使用”窗口打开，请单击“打开现有测试”。 </li></div><a name="wp799402"></a><div class="pSmartBullet2"><li>如果 QuickTest 打开时未显示“欢迎使用”窗口，请选择<br />“文件”&gt;“打开”，或单击“打开”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_open_button.gif" border="0" /> 。 </li></div><a name="wp799404"></a><p class="pIndent">在“打开测试”对话框中，找到并选择“Recording”测试，然后单击“打开”。 </p></ul></div><a name="wp799406"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">将该测试另存为“RegExpression”。</b></li></div><a name="wp799408"></a><p class="pIndent">选择“文件”&gt;“另存为”。将该测试另存为“<span class="cExample">RegExpression</span>”。 </p><a name="wp799410"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">确认是否已启用“Active Screen”选项。</b></li></div><a name="wp799417"></a><p class="pIndent">如果在 QuickTest 窗口底部看不到 Active Screen，请单击“Active Screen”按钮<span style="FONT-WEIGHT: bold"><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_display_views.gif" border="0" /></span>或选择“查看”&gt;“Active Screen”。 </p><a name="wp799419"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">选择要为其创建检查点的文本。</b></li></div><a name="wp799421"></a><p class="pIndent">在关键字视图中，单击 (+) 展开“Welcome:Mercury:Tours”，然后单击“Select a Flight:Mercury”页。该页将显示在 Active Screen 中。 </p><a name="wp799423"></a><p class="pIndent">在 Active Screen 中向上滚动，然后突出显示出发航班 New York to San Francisco (<span class="cExample">12/29/2004</span>)。右键单击突出显示的字符串，然后选择“插入文本检查点”。将打开“文本检查点属性”对话框。 </p><a name="wp799425"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">对于要检查的文本，输入正则表达式。</b></li></div><a name="wp799429"></a><p class="pIndent">在“已检查的文本”区域中，单击“常量值选项”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_const_val_options.gif" border="0" /> 。将打开“常量值选项”对话框。<br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/constant_value_options.gif" border="0" /><br /><br /></p><a name="wp799435"></a><p class="pIndent_after">在“值”框中，用 <span class="cExample">[0-1][0-9]/[0-3][0-9]/200[0-9]</span> 替换当前日期。这将指示 QuickTest 检查选定文本中的每个字符与正则表达式定义的数字范围格式是否匹配。该表达式检查以下格式：MM/DD/200Y。 </p><a name="wp799437"></a><p class="pIndent">选择“正则表达式”复选框。将出现一个消息框，提示您在每个特殊字符之前插入反斜杠字符。单击“否”。 </p><a name="wp799445"></a><p class="pNote">注意： 单击“是”会使 QuickTest 将特殊字符 (<span class="cExample">[</span>)、(<span class="cExample">-</span>) 和 (<span class="cExample">]</span>) 作为文本字符而不是正则表达式处理。 </p><a name="wp799448"></a><p class="pIndent">单击“确定”接受其他默认设置，然后关闭“常量值选项”对话框。将打开“文本检查点属性”对话框。<br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/regular%20expression.gif" border="0" /><br /><br /></p><a name="wp799450"></a><p class="pIndent_after">单击“确定”关闭“文本检查点属性”对话框。 </p><a name="wp799456"></a><p class="pIndent">QuickTest 将向您的测试中添加文本检查点。该检查点在关键字视图中的“Select a Flight:Mercury”页显示为检查操作。 </p><a name="wp799458"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">保存测试。</b></li></div><a name="wp799461"></a><p class="pIndent">选择“文件”&gt;“保存”，或单击“保存”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_save_button.gif" border="0" /> 。 </p></ol></div></blockquote><br /><blockquote class="indent"><a name="wp799469"></a><h2 class="pn2Heading">使用正则表达式运行并分析测试 </h2><a name="wp799471"></a><p class="pRegtext">在本练习中，您将运行测试并对检查点结果进行检查。 </p><div class="pSmartListBold1"><ol class="pSmartListBold1" type="1"><a name="wp799473"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">运行“RegExpression”测试。</b></li></div><a name="wp799476"></a><p class="pIndent">单击“运行”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_run.gif" border="0" /> ，或选择“测试”&gt;“运行”。将打开“运行”对话框。 </p><a name="wp799478"></a><p class="pIndent">选择“新建运行结果文件夹”并接受默认的结果文件夹名。 </p><a name="wp799480"></a><p class="pIndent">单击“确定”。当完成测试运行时，将打开“测试结果”窗口。 </p><a name="wp799482"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">对检查点结果进行检查。</b></li></div><a name="wp799484"></a><p class="pIndent">在结果树中，单击 (+) 展开“Test RegExpression Summary”&gt;“RegExpression Iteration 1 (Row 1)”&gt;“Action1 Summary”&gt;“Welcome: Mercury Tours”&gt;“Select a Flight:Mercury” </p><a name="wp799487"></a><p class="pIndent">选择“检查点`[0-1][0-9]/[0-3][0-9]/200[0-9]'”。<br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/resreg_exp.gif" border="0" /><br /><br /></p><a name="wp799489"></a><p class="pIndent">由于文本以正则表达式指定的格式显示，因此该检查点通过。 </p><a name="wp799491"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">退出“测试结果”窗口。</b></li></div><a name="wp799495"></a><p class="pIndent">选择“文件”&gt;“退出”关闭“测试结果”窗口。 </p></ol></div></blockquote><br /><font face="Arial" size="1"><font style="BACKGROUND-COLOR: #e0dfe3" size="3">QuickTest</font>将测试拆分为多操作 <br /><blockquote class="indent"><a name="wp77723"></a><h2 class="pn2Heading">使用多操作 </h2><a name="wp77725"></a><p class="pRegtext">如果检查一下在以前课程中创建的某个测试，您将发现该测试可拆分为几个不同的过程： </p><div class="pSmartBullet1"><ul class="pSmartBullet1"><div class="pSmartBullet2"><ul class="pSmartBullet2"><a name="wp77727"></a><div class="pSmartBullet2"><li>登录到 Mercury Tours 站点。</li></div><a name="wp77729"></a><div class="pSmartBullet2"><li>提交航班订单。</li></div><a name="wp77731"></a><div class="pSmartBullet2"><li>注销。</li></div></ul></div></ul></div><a name="wp77741"></a><p class="pRegtext">假设您要为五个不同的航班订单运行测试。正如我们在<a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/parameterizing_tests.htm">参数化测试</a>中所见的，您可以对测试进行参数化，使其可以使用五组不同的数据运行五次测试。还可以组织测试，仅使第二个过程运行五次测试，模拟一个用户登录、预定五个航班以及注销的过程。可通过将测试拆分为对不同操作的调用，实现此目的。 </p><a name="wp77743"></a><p class="pRegtext">要将测试拆分成对不同操作的调用，您可以插入对新操作的调用、将现有操作拆分为对两个操作的调用、插入一个对现有操作副本的调用或插入一个对现有操作的调用。 </p><a name="wp77745"></a><p class="pRegtext">可以在录制会话期间或之后将对操作的调用插入测试中。使用下列菜单选项或工具栏按钮之一，向测试添加操作： </p><div class="pSmartBullet1"><ul class="pSmartBullet1"><a name="wp77748"></a><div class="pSmartBullet1"><li>“插入”&gt;“调用新建操作”，或使用“插入对新建操作的调用”按钮。 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_new_action.gif" border="0" /></li></div><a name="wp77751"></a><div class="pSmartBullet1"><li>“步骤”&gt;“拆分操作”，或使用“拆分操作”按钮。 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_split_action.gif" border="0" /></li></div><a name="wp77753"></a><div class="pSmartBullet1"><li>“插入”&gt;“调用操作副本”，或右键单击某项操作并选择“插入对操作副本的调用”。</li></div><a name="wp77755"></a><div class="pSmartBullet1"><li>“插入”&gt;“调用现有操作”，或右键单击某项操作并选择“插入对现有操作的调用”。</li></div></ul></div></blockquote><br />新建操作 <br /><blockquote class="indent"><a name="wp77793"></a><h4 class="pn3Heading">录制测试 </h4><div class="pSmartListBold1"><ol class="pSmartListBold1" type="1"><a name="wp77800"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">启动 QuickTest</b><span style="FONT-WEIGHT: normal"><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_AQT_icon.gif" border="0" /></span><b style="FONT-WEIGHT: bold">并打开新测试。</b></li></div><a name="wp77814"></a><p class="pIndent">有关详细信息，请参阅<a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/recording_tests.htm"></a><a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/Book-03-3.htm">录制测试</a>中的步骤 <a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/Book-03-3.htm#wp214451">1</a>。 </p><a name="wp77816"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">开始录制 Mercury Tours 网站。</b></li></div><a name="wp77822"></a><p class="pIndent">在后面的步骤中，您需要录制一个与<a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/recording_tests.htm">录制测试</a>课程中所录制的测试相似的测试。但是，该测试为了优化多操作测试的测试，而设计得有些不同。 </p><a name="wp77824"></a><p class="pIndent">请确认已关闭所有的 Web 浏览器。 </p><a name="wp77828"></a><p class="pIndent">选择“测试”&gt;“录制”，或单击“录制”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_record.gif" border="0" /> 。将打开“录制和运行设置”对话框。 <br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/record_run_set_web.gif" border="0" /><br /><br /></p><div class="pSmartBullet2"><ul class="pSmartBullet2"><a name="wp77830"></a><div class="pSmartBullet2"><li>在“Web”选项卡中，选择“录制或运行会话开始时打开以下浏览器”。</li></div><a name="wp77836"></a><p class="pIndent_wide">从“类型”列表中选择浏览器，并确认“地址”框中的 URL 为 <span class="cURL_example"><a href="http://newtours.mercuryinteractive.com&quot;%20target=&quot;_blank/" target="_blank"></a><a href="http://newtours.mercuryinteractive.com/" target="_blank">http://newtours.mercuryinteractive.com</a></span>。 </p><a name="wp77838"></a><p class="pIndent_wide">请确认已选中“不在已经打开的浏览器上录制和运行”和“当测试关闭时关闭浏览器”选项。 </p><a name="wp77840"></a><div class="pSmartBullet2"><li>在“Windows 应用程序”选项卡中，确认已选中“在以下应用程序(会话开始时打开的)上录制并运行”，而且没有列出任何应用程序。 </li></div><a name="wp77842"></a><p class="pIndent_after">单击“确定”。 </p><a name="wp77844"></a><p class="pIndent">QuickTest 开始进行录制，浏览器将打开 Mercury Tours 网站。 </p></ul></div><a name="wp77846"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">签入 Mercury Tours 网站。 </b></li></div><a name="wp77848"></a><p class="pIndent">在“User Name”和“Password”框中，键入在 Mercury Tours 中注册过的名称和密码。 </p><a name="wp77850"></a><p class="pIndent">单击“Sign-In”。 </p><a name="wp77852"></a><p class="pIndent">将打开“Flight Finder”页。 </p><a name="wp77854"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">输入航班详细信息。</b></li></div><a name="wp77856"></a><p class="pIndent">更改下列选项： </p><div class="pSmartBullet2"><ul class="pSmartBullet2"><a name="wp77858"></a><div class="pSmartBullet2"><li>Departing From:<b style="FONT-WEIGHT: bold">New York</b></li></div><a name="wp77860"></a><div class="pSmartBullet2"><li>On:<b style="FONT-WEIGHT: bold">Dec 29</b></li></div><a name="wp77862"></a><div class="pSmartBullet2"><li>Arriving In:<b style="FONT-WEIGHT: bold">San Francisco</b></li></div><a name="wp77864"></a><div class="pSmartBullet2"><li>Returning:<b style="FONT-WEIGHT: bold">Dec 31</b></li></div><a name="wp77866"></a><p class="pIndent">单击“CONTINUE”接受其他默认选项。将打开“Select Flight”页。 </p></ul></div><a name="wp77868"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">选择一个航班。</b></li></div><a name="wp77870"></a><p class="pIndent">单击“CONTINUE”接受其他默认航班选项。将打开“Book a Flight”页。 </p><a name="wp77872"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">输入必需的乘客信息和购买信息。</b></li></div><a name="wp77874"></a><p class="pIndent">在“Passengers”和“Credit Card”部分输入必需的信息（带有红色文本标签的字段）。 </p><a name="wp77876"></a><p class="pIndent">在该页的底部，单击“SECURE PURCHASE”。将打开“Flight Confirmation”页。 </p><a name="wp77878"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">将浏览器返回至“Flight Finder”页。</b></li></div><a name="wp77880"></a><p class="pIndent">在“Flight Confirmation”页的底部，单击“BACK TO FLIGHTS”按钮。将打开“Flight Finder”页。 </p><a name="wp77882"></a><p class="pIndent">通过结束在“Flight Finder”页上的录制，可以在同一页面上创建开始和结束操作，以便您可以根据需要多次调用操作。 </p><a name="wp77884"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">停止录制。</b></li></div><a name="wp77891"></a><p class="pIndent">在 QuickTest 中，单击“停止” <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_stop.gif" border="0" /> 停止录制过程。 </p><a name="wp77893"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">将测试另存为 ActionA。</b></li></div><a name="wp77895"></a><p class="pIndent">选择“文件”&gt;“另存为”。将测试另存为 <span class="cExample">ActionA</span>。 </p></ol></div></blockquote><br /><blockquote class="indent"><a name="wp77903"></a><h4 class="pn3Heading">将测试拆分为两项操作 </h4><a name="wp77905"></a><p class="pRegtext">您的测试当前包含两个主要进程：签入和购买机票，因此将测试拆分为不同的操作非常有意义。 </p><div class="pSmartListBold1"><ol class="pSmartListBold1" type="1"><a name="wp77907"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">选择您希望第二个操作开始时所在的页面。 </b></li></div><a name="wp77909"></a><p class="pIndent">在关键字视图中，单击 (+) 展开“Action1”&gt;“Welcome:Mercury Tours”。 </p><a name="wp77911"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">将测试拆分为两个操作。</b></li></div><a name="wp77915"></a><p class="pIndent">选择第一个“Find a Flight:Mercury”页并选择“步骤”&gt;“拆分操作”，或单击“拆分操作”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_split_action.gif" border="0" /> 。将打开“Split Action”对话框。 <br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/Split_Action.gif" border="0" /><br /><br /></p><a name="wp77917"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">输入这两项操作的名称和描述。</b></li></div><a name="wp77919"></a><p class="pIndent">在“第一个操作”中的“名称”框中键入：<span class="cExample">Sign_in</span>。 </p><a name="wp77921"></a><p class="pIndent">在“第一个操作”中的“描述”框中键入：<span class="cExample">Enters user name and password to sign in</span>。 </p><a name="wp77923"></a><p class="pIndent">在“第二个操作”中的“名称”框中键入：<span class="cExample">FlightOrder</span>。 </p><a name="wp77925"></a><p class="pIndent">在“第二个操作”中的“描述”框中键入：<span class="cExample">Chooses and purchases a flight</span>。 </p><a name="wp77927"></a><p class="pIndent">单击“确定”关闭“拆分操作”对话框，并接受其他默认选项。这两项操作将显示在关键字视图中。 </p><a name="wp77929"></a><p class="pIndent">选择“视图”&gt;“全部展开”检查每项操作的内容。注意，“FlightOrder”操作是在“Find a Flight:Mercury”页中开始和结束的操作。 </p></ol></div></blockquote><br /><blockquote class="indent"><a name="wp77933"></a><h4 class="pn3Heading">插入对新建操作的调用 </h4><a name="wp77935"></a><p class="pRegtext">现在您将插入一个对新操作的调用，并将录制返回 Mercury Tours 主页的步骤，以便整个测试在同一页面中开始和结束。 </p><div class="pSmartListBold1"><ol class="pSmartListBold1" type="1"><a name="wp77937"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">插入 ReturnHome 操作。</b></li></div><a name="wp77941"></a><p class="pIndent">选择“插入&gt;“调用新建操作”或单击“插入对新建操作的调用”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_new_action.gif" border="0" /> 。将打开“插入对新建操作的调用”对话框。<br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/Insert_New_Action.gif" border="0" /><br /><br /></p><a name="wp77943"></a><p class="pIndent_after">在“名称”框中输入 <span class="cExample">ReturnHome</span>，确认选择了“测试结尾处”，并单击“确定”。将关闭对话框，并将 ReturnHome 操作添加到测试的末尾。 </p><a name="wp77945"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">为录制准备应用程序。</b></li></div><a name="wp77947"></a><p class="pIndent">确认 Web 浏览器已打开“Flight Finder”页。 </p><a name="wp77953"></a><p class="pIndent">如果未打开浏览器，请在 Mercury Tours 站点 (<span class="cURL_example"><a href="http://newtours.mercuryinteractive.com&quot;%20target=&quot;_blank/" target="_blank"></a><a href="http://newtours.mercuryinteractive.com/" target="_blank">http://newtours.mercuryinteractive.com</a></span>) 中打开并签入。将打开“Flight Finder”页。 </p><a name="wp77959"></a><p class="pIndent">将应用程序放置在桌面上，以便可以同时看到 QuickTest 和 Web 浏览器。 </p><a name="wp77961"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">更改录制和运行设置。</b></li></div><a name="wp77963"></a><p class="pIndent">当前已设置了录制和运行设置，因此，每次开始录制测试时，即打开一个新的浏览器。但是，由于您想要在已打开并准备好的浏览器中录制步骤，因此您需要在开始录制之前更改录制和运行设置。 </p><a name="wp77970"></a><p class="pIndent">在 QuickTest 中，选择“测试”&gt;“录制和运行设置”。将打开“录制和运行设置”对话框。<br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/record_run_set_web.gif" border="0" /><br /><br /></p><a name="wp77972"></a><p class="pIndent_after">在“Web”选项卡中，选择“在任何打开的 Web 浏览器上录制和运行测试”并单击“确定”。 </p><a name="wp77974"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">录制 ReturnHome 操作。</b></li></div><a name="wp77976"></a><p class="pIndent">在关键字视图中，选择新的 ReturnHome 操作图标。 </p><a name="wp77979"></a><p class="pIndent">选择“测试”&gt;“录制”，或单击“录制”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_record.gif" border="0" /> 。 </p><a name="wp77981"></a><p class="pIndent">单击“Flight Finder”页左侧的“Home”导航链接。将打开 Mercury Tours 主页。 </p><a name="wp77988"></a><p class="pIndent">在 QuickTest 中，单击“停止” <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_stop.gif" border="0" /> 停止录制过程。 </p><a name="wp77990"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">将“录制和运行设置”还原为原始设置。</b></li></div><a name="wp78000"></a><p class="pIndent">您为了录制 ReturnHome 操作而更改了录制和运行设置，但此更改也将影响 QuickTest 运行测试的方式。如果您希望在运行测试时 QuickTest 新打开一个浏览器访问 Mercury Tours 主页，则需要重新应用原始设置。 </p><a name="wp78002"></a><p class="pIndent">选择“测试”&gt;“运行和录制设置”。将打开“录制和运行设置”对话框。 </p><a name="wp78008"></a><p class="pIndent">在“Web”选项卡中，选择“录制或运行会话开始时打开以下浏览器”。确认 <span class="cURL_example"><a href="http://newtours.mercuryinteractive.com&quot;%20target=&quot;_blank/" target="_blank"></a><a href="http://newtours.mercuryinteractive.com/" target="_blank">http://newtours.mercuryinteractive.com</a></span> 显示在“地址”框中并单击“确定”。 </p><a name="wp78010"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">保存测试。</b></li></div><a name="wp78013"></a><p class="pIndent">选择“文件”&gt;“保存”，或单击“保存”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_save_button.gif" border="0" /> 。 </p></ol></div></blockquote><br /><blockquote class="indent"><a name="wp78017"></a><h4 class="pn3Heading">将操作设置为可重用操作 </h4><a name="wp78019"></a><p class="pRegtext">可重用操作类似于编程中的函数。如果您需要将一个过程包含在几个测试中，请录制、修改并增强此过程的步骤并将它们保存在可重用操作中。然后即可从其他测试中调用该操作，而不必每次都进行录制、修改和增强这些同样的步骤。 </p><a name="wp78021"></a><p class="pRegtext">要从另一个测试中调用某项操作，必须在存储该操作所用的测试中将其设置为可重用操作。您在本课中创建的“Sign_in”和“ReturnHome”操作几乎可以应于在 Mercury Tours 站点上创建的所有测试，因此将其设为可重用操作非常有意义。 </p><div class="pSmartListBold1"><ol class="pSmartListBold1" type="1"><a name="wp78025"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">将 Sign_in 变为可重用操作。</b></li></div><a name="wp78028"></a><p class="pIndent">在关键字视图中，右键单击“Sign_in”操作并选择“操作属性”。将打开“操作属性”对话框。选择“可重用操作”复选框并单击“确定”。如果显示消息框，请阅读消息，然后单击“不再显示该对话框”，<b style="FONT-WEIGHT: bold"></b>再单击“确定”。操作图标更改为可重用操作图标 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_action_reusable.gif" border="0" /> 。 </p><a name="wp78032"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">查看 Sign_in 操作的详细信息。</b></li></div><a name="wp78034"></a><p class="pIndent">注意，您将不再能够在关键字视图中展开“Sign_in”操作。 </p><a name="wp78037"></a><p class="pIndent">如果此前关键字视图中并未显示操作列表，则操作列表将在您将操作转换为可重用操作之后进行显示。操作列表将显示测试中所有可重用操作和外部操作的列表。 <br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/ActionList.gif" border="0" /><br /><br /></p><a name="wp78039"></a><p class="pIndent_after">通过从操作列表中选择“Sign_in”，查看“Sign_in”操作的详细信息。将显示“Sign_in”操作的详细信息。 </p><a name="wp78041"></a><p class="pIndent">在操作列表中，选择“测试流程”，将关键字视图中的测试返回到主流程。 </p><a name="wp78043"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">将 ReturnHome 变为可重用操作。</b></li></div><a name="wp78053"></a><p class="pIndent">为 ReturnHome 操作重复步骤 <a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/Book-09-07.htm#wp78025">1</a> 和 <a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/Book-09-07.htm#wp78032">2</a>。 </p><a name="wp78055"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">保存测试。</b></li></div><a name="wp78058"></a><p class="pIndent">选择“文件”&gt;“保存”，或单击“保存”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_save_button.gif" border="0" /> 。 </p></ol></div></blockquote><br /><blockquote class="indent"><a name="wp78066"></a><h2 class="pn2Heading">插入现有操作 </h2><a name="wp78068"></a><p class="pRegtext">在设计一组测试时，您可能会发现每个测试都要求一个或多个同样的活动，例如签入。一旦创建了操作并使用一个测试将其保存，您即可将对现有操作副本的调用或对现有操作的调用插入到其他测试中。 </p><a name="wp78070"></a><p class="pRegtext">在插入对现有操作副本的调用时，可以对复制的操作进行更改，您所做的更改不会影响其他测试，也不会受到其他测试的影响。但是，对现有操作的调用在调用测试中具有只读属性。只能在存储它们所使用的测试中对其进行修改。通过对现有操作的调用，您可以从多个测试中调用同一个操作，这使得维护测试变得很容易，因为当您的应用程序发生更改时，只需更新使用原始测试存储的现有操作。 </p><a name="wp78072"></a><p class="pRegtext">在后面的练习中，您将新建一个类似于“ActionA”测试的测试，所不同的是，“Sign_in”和“ReturnHome”操作是外部操作（对使用其他测试存储的现有操作的调用），而且对“FlightOrder”操作进行了一点修改。 </p></blockquote><br /><blockquote class="indent"><a name="wp78215"></a><h2 class="pn2Heading">参数化操作 </h2><a name="wp78221"></a><p class="pRegtext">看一下 QuickTest 窗口底部的数据表，在 ActionB 测试中您将发现四个选项卡：“Global”“Copy of FlightOrder”、“Sign_in [ActionA]”以及“ReturnHome [ActionA]”。 </p><a name="wp78223"></a><p class="pNote">注意： 如果没有显示数据表，请选择“查看”&gt;“数据表”以显示数据表。 </p><a name="wp78225"></a><p class="pRegtext">“Global”选项卡是一个数据表，其中的数据用于整个测试。如果“Global”表中显示有五行数据，则测试将运行五次。此外，可以使用相关操作表为每个操作创建数据集。如果使用操作参数对步骤进行参数化，并在相应的工作表中输入五行数据，则此操作将在每个测试循环中运行五次。 </p><a name="wp78227"></a><p class="pNote">注意： “Sign_in [ActionA]”和“ReturnHome [ActionA]”数据表显示为灰色，无法进行编辑，因为每一个数据表都属于相应调用的操作，因此仅可以从所调用操作的原始测试进行编辑。 </p><a name="wp78229"></a><p class="pRegtext">在本部分中，您将为“FlightOrder”操作创建一个数据集，以检查应用程序如何在单个用户会话中处理多个订单。 </p><div class="pSmartListBold1"><ol class="pSmartListBold1" type="1"><a name="wp78231"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">打开 </b><b style="FONT-WEIGHT: bold">ActionB</b><b style="FONT-WEIGHT: bold"> 测试。</b></li></div><a name="wp78233"></a><p class="pIndent">如果尚未打开“ActionB”测试，请选择“文件”&gt;“打开”，浏览至“ActionB”。单击“打开”。 </p><a name="wp78237"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">选择要参数化的步骤。</b></li></div><a name="wp78239"></a><p class="pIndent">单击 (+) 展开“Copy of FlightOrder”&gt;“Welcome:Mercury Tours”&gt;“Find a Flight:Mercury”。 </p><a name="wp78243"></a><p class="pIndent">在关键字视图的“toPort”行中，单击“值”单元格，再单击参数化图标 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_param.gif" border="0" /> 。将打开“值配置选项”对话框。<br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/value_config2.gif" border="0" /><br /><br /></p><a name="wp78247"></a><p class="pIndent"><b style="FONT-WEIGHT: bold">输入参数信息。</b></p><a name="wp78249"></a><p class="pIndent">选择“参数”，并确认选择了“DataTable”选项。 </p><a name="wp78251"></a><p class="pIndent">在“名称”框中，键入 <span class="cExample">ArrivalCity</span>。 </p><a name="wp78253"></a><p class="pIndent">您正在专门为“Copy of FlightOrder”操作创建数据集。因此，选择“当前操作表（本地）”。单击“确定”关闭“值配置选项”对话框。 </p><a name="wp78259"></a><p class="pIndent">QuickTest 自动将“ArrivalCity”列添加到“Copy of FlightOrder”数据表并将“San Francisco”添加到“ArrivalCity”列的第一个单元格中。 </p><a name="wp78261"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">参数化其他步骤。</b></li></div><a name="wp78263"></a><p class="pIndent">一个客户在同一天飞到两个不同的地点，这不太符合逻辑，因此对出发和到达时间进行参数化非常有意义。 </p><a name="wp78269"></a><p class="pIndent">在关键字视图中，选择“fromMonth”。使用步骤 <a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/Book-09-11.htm#wp78237">2</a> 中的过程来参数化出发日期。确保选择“值配置选项”对话框中的“当前操作表（本地）”。 </p><a name="wp78275"></a><p class="pIndent">在关键字视图中，选择<b style="FONT-WEIGHT: bold">“toMonth”。</b>使用步骤 <a href="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/Book-09-11.htm#wp78237">2</a> 中的解释来参数化抵达日期。确保选择“值配置选项”对话框中的“当前操作表（本地）”。 </p><a name="wp78277"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">在数据表中输入参数化数据。</b></li></div><a name="wp78279"></a><p class="pIndent">在数据表中，单击“Copy of FlightOrder”选项卡。 </p><a name="wp78281"></a><p class="pIndent">在“ArrivalCity”列的第二行键入 <span class="cExample">Portland</span>。按 Enter 键。 </p><a name="wp78283"></a><p class="pIndent">在出发日期和抵达日期列的第二行键入 <span class="cExample">Oct </span>。 </p><a name="wp78285"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">将操作设置为在本地数据表中运行所有数据。</b></li></div><a name="wp78295"></a><p class="pIndent">默认情况下，QuickTest 仅运行测试中的每个操作的一个循环。您想要 QuickTest 使用“Copy of FlightOrder”选项卡中的所有数据。 </p><a name="wp78300"></a><p class="pIndent">右键单击关键字视图中的“Copy of FlightOrder”操作并选择“操作调用属性”。将打开“操作调用属性”对话框。<br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/Action%20Properties_run_tab.gif" border="0" /><br /><br /></p><a name="wp78302"></a><p class="pIndent_after">选择“运行”选项卡上的“在所有行上运行”。如果打开消息框，请阅读消息，然后单击“确定”将其关闭。单击“确定”关闭“操作调用属性”对话框。 </p></ol></div><div class="pSmartList1"><ol class="pSmartList1" type="1"><a name="wp78304"></a><div class="pSmartList1"><li><b style="FONT-WEIGHT: bold">保存测试。</b></li></div><a name="wp78307"></a><p class="pIndent">选择“文件”&gt;“保存”，或单击“保存”按钮 <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_save_button.gif" border="0" /> 。 </p><a name="wp78309"></a><p class="pIndent_after">现在您已创建了一个测试，该测试可完成下列操作：签入到 Mercury Tours 站点；提交以下两个航班订单：12 月 29 日到 12 月 31 日 从 London 飞往 San Francisco 的航班和 10 月 29 日到 12 月 31 日从 London 飞往 Portland 的航班；以及通过单击“Home”链接，从系统注销。 </p></ol></div></blockquote><br /><blockquote class="indent"><a name="wp78317"></a><h2 class="pn2Heading">运行和分析多操作测试 </h2><a name="wp78319"></a><p class="pRegtext">您将运行“ActionB”测试。整个测试只运行一次，而“FlightOrder”操作将运行两次，为“Copy of FlightOrder”数据表中的每组数据运行一次。 </p><div class="pSmartListBold1"><ol class="pSmartListBold1" type="1"><a name="wp78321"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">运行 </b>ActionB<b style="FONT-WEIGHT: bold"> 测试。</b></li></div><a name="wp78323"></a><p class="pIndent">请确认已关闭所有的 Web 浏览器。 </p><a name="wp78326"></a><p class="pIndent">单击“运行” <img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/sl_run.gif" border="0" /> 或选择“测试”&gt; “运行”。将打开“运行”对话框。 </p><a name="wp78328"></a><p class="pIndent">选择“新建运行结果文件夹”并接受默认的结果文件夹名。 </p><a name="wp78330"></a><p class="pIndent">单击“确定”。当完成测试运行时，将打开“测试结果”窗口。 </p><a name="wp78332"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">检查测试结果。</b></li></div><a name="wp78334"></a><p class="pIndent">检查结果概要。该测试标记为“完成”。这表明测试运行中未发生任何故障（没有要“通过”的检查点）。 </p><a name="wp78337"></a><p class="pIndent">展开“测试结果”窗口中的“Test ActionB Summary”&gt;“ActionB Iteration 1 (Row 1)”。选择结果树中的“Copy of FlightOrder Summary”操作。注意，概要将显示所有两项循环的结果。<br /><br /><img hspace="0" src="mk:@MSITStore:E:\基本常用工具\quicktest\QTP8.2_Tutorial使用手册\QTP8.2中文版Tutorial.chm::/images/results%20lesson8B.gif" border="0" /><br /><br /></p><a name="wp78339"></a><div class="pSmartListBold1"><li><b style="FONT-WEIGHT: bold">关闭“测试结果”窗口。</b></li></div><a name="wp78343"></a><p class="pIndent">选择“文件”&gt;“退出”关闭“测试结果”窗口。 </p></ol></div></blockquote><br /></font><img src ="http://www.cnitblog.com/szdlinxie/aggbug/20848.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 14:41 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20848.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>测试工具的选择和使用</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20832.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Wed, 20 Dec 2006 03:03:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20832.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20832.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20832.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20832.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">
																				<center>
																						<h4>Parasoft白盒测试工具集</h4>
																				</center>
																				<p>
																				</p>
																				<table class="hui" align="center" border="1">
																						<tbody>
																								<tr>
																										<td width="20%">工具名</td>
																										<td width="24%">支持语言环境</td>
																										<td>简介</td>
																								</tr>
																								<tr>
																										<td>Jtest</td>
																										<td>Java</td>
																										<td>代码分析和动态类、组件测试</td>
																								</tr>
																								<tr>
																										<td>Jcontract</td>
																										<td>Java</td>
																										<td>实时性能监控以及分析优化</td>
																								</tr>
																								<tr>
																										<td>C++ Test</td>
																										<td>C,C++</td>
																										<td>代码分析和动态测试</td>
																								</tr>
																								<tr>
																										<td>CodeWizard</td>
																										<td>C,C++</td>
																										<td>代码静态分析</td>
																								</tr>
																								<tr>
																										<td>Insure++</td>
																										<td>C,C++</td>
																										<td>实时性能监控以及分析优化</td>
																								</tr>
																								<tr>
																										<td>.test</td>
																										<td>.Net</td>
																										<td>代码分析和动态测试</td>
																								</tr>
																						</tbody>
																				</table>
																				<br />
																				<center>
																						<h4>Compuware白盒测试工具集</h4>
																				</center>
																				<p>
																				</p>
																				<table class="hui" align="center" border="1">
																						<tbody>
																								<tr>
																										<td width="20%">工具名</td>
																										<td width="24%">支持语言环境</td>
																										<td>简介</td>
																								</tr>
																								<tr>
																										<td>BoundsChecker</td>
																										<td>C++,Delphi</td>
																										<td>API和OLE错误检查、指针和泄露错误检查、内存错误检查</td>
																								</tr>
																								<tr>
																										<td>TrueTime</td>
																										<td>C++,Java,Visual Basic</td>
																										<td>代码运行效率检查、组件性能的分析</td>
																								</tr>
																								<tr>
																										<td>FailSafe</td>
																										<td>Visual Basic</td>
																										<td>自动错误处理和恢复系统</td>
																								</tr>
																								<tr>
																										<td>Jcheck</td>
																										<td>M$ Visual J++</td>
																										<td>图形化的纯种和事件分析工具</td>
																								</tr>
																								<tr>
																										<td>TrueCoverage</td>
																										<td>C++,Java,Visual Basic</td>
																										<td>函数调用次数、所占比率统计以及稳定性跟踪</td>
																								</tr>
																								<tr>
																										<td>SmartCheck</td>
																										<td>Visual Basic</td>
																										<td>函数调用次数、所占比率统计以及稳定性跟踪</td>
																								</tr>
																								<tr>
																										<td>CodeReview</td>
																										<td>Visual Basic</td>
																										<td>自动源代码分析工具</td>
																								</tr>
																						</tbody>
																				</table>
																				<br />
																				<center>
																						<h4>Xunit白盒测试工具集</h4>
																				</center>
																				<p>
																				</p>
																				<table class="hui" align="center" border="1">
																						<tbody>
																								<tr>
																										<td width="20%">工具名</td>
																										<td width="24%">支持语言环境</td>
																										<td>官方站点</td>
																								</tr>
																								<tr>
																										<td>Aunit</td>
																										<td>Ada</td>
																										<td>http://www.libre.act-europe.fr</td>
																								</tr>
																								<tr>
																										<td>CppUnit</td>
																										<td>C++</td>
																										<td>http://cppunit.sourceforge.net</td>
																								</tr>
																								<tr>
																										<td>ComUnit</td>
																										<td>VB,COM</td>
																										<td>http://comunit.sourceforge.net</td>
																								</tr>
																								<tr>
																										<td>Dunit</td>
																										<td>Delphi</td>
																										<td>http://dunit.sourceforge.net</td>
																								</tr>
																								<tr>
																										<td>DotUnit</td>
																										<td>.Net</td>
																										<td>http://dotunit.sourceforge.net</td>
																								</tr>
																								<tr>
																										<td>HttpUnit</td>
																										<td>Web</td>
																										<td>http://c2.com/cgi/wiki?HttpUnit</td>
																								</tr>
																								<tr>
																										<td>HtmlUnit</td>
																										<td>Web</td>
																										<td>http://htmlunit.sourceforge.net</td>
																								</tr>
																								<tr>
																										<td>Jtest</td>
																										<td>Java</td>
																										<td>http://www.junit.org</td>
																								</tr>
																								<tr>
																										<td>JsUnit(Hieatt)</td>
																										<td>Java<i>script</i> 1.4以上</td>
																										<td>http://www.jsunit.net</td>
																								</tr>
																								<tr>
																										<td>PhpUnit</td>
																										<td>Php</td>
																										<td>http://phpunit.sourceforge.net</td>
																								</tr>
																								<tr>
																										<td>PerlUnit</td>
																										<td>Perl</td>
																										<td>http://perlunit.sourceforge.net</td>
																								</tr>
																								<tr>
																										<td>XmlUnit</td>
																										<td>Xml</td>
																										<td>http://xmlunit.sourceforge.net</td>
																								</tr>
																						</tbody>
																				</table>
																				<center>
																						<h4>主流黑盒功能测试工具集</h4>
																				</center>
																				<p>
																				</p>
																				<table class="hui" align="center" border="1">
																						<tbody>
																								<tr>
																										<td width="20%">工具名</td>
																										<td width="24%">公司名</td>
																										<td>官方站点</td>
																								</tr>
																								<tr>
																										<td>WinRunner</td>
																										<td>Mercury</td>
																										<td>http://www.mercuryinteractive.com</td>
																								</tr>
																								<tr>
																										<td>Astra Quicktest</td>
																										<td>Mercury</td>
																										<td>http://www.mercuryinteractive.com</td>
																								</tr>
																								<tr>
																										<td>Robot</td>
																										<td>IBM Rational</td>
																										<td>http://www.rational.com</td>
																								</tr>
																								<tr>
																										<td>QARun</td>
																										<td>Compuware</td>
																										<td>http://www.compuware.com</td>
																								</tr>
																								<tr>
																										<td>SilkTest</td>
																										<td>Segue</td>
																										<td>http://www.segue.com</td>
																								</tr>
																								<tr>
																										<td>e-Test</td>
																										<td>Empirix</td>
																										<td>http://www.empirix.com</td>
																								</tr>
																						</tbody>
																				</table>
																				<center>
																						<h4>主流黑盒性能测试工具集</h4>
																				</center>
																				<p>
																				</p>
																				<table class="hui" align="center" border="1">
																						<tbody>
																								<tr>
																										<td width="20%">工具名</td>
																										<td width="24%">公司名</td>
																										<td>官方站点</td>
																								</tr>
																								<tr>
																										<td>WAS</td>
																										<td>M$</td>
																										<td>http://www.micro$oft.com</td>
																								</tr>
																								<tr>
																										<td>LoadRunner</td>
																										<td>Mercury</td>
																										<td>http://www.mercuryinteractive.com</td>
																								</tr>
																								<tr>
																										<td>Astra Quicktest</td>
																										<td>Mercury</td>
																										<td>http://www.mercuryinteractive.com</td>
																								</tr>
																								<tr>
																										<td>Qaload</td>
																										<td>Compuware</td>
																										<td>http://www.empirix.com</td>
																								</tr>
																								<tr>
																										<td>TeamTest:SiteLoad</td>
																										<td>IBM Rational</td>
																										<td>http://www.rational.com</td>
																								</tr>
																								<tr>
																										<td>Webload</td>
																										<td>Radview</td>
																										<td>http://www.radview.com</td>
																								</tr>
																								<tr>
																										<td>Silkperformer</td>
																										<td>Segue</td>
																										<td>http://www.segue.com</td>
																								</tr>
																								<tr>
																										<td>e-Load</td>
																										<td>Empirix</td>
																										<td>http://www.empirix.com</td>
																								</tr>
																								<tr>
																										<td>OpenSTA</td>
																										<td>OpenSTA</td>
																										<td>http://www.opensta.com</td>
																								</tr>
																						</tbody>
																				</table>
																				<center>
																						<h4>测试管理工具典型产品的比较</h4>
																				</center>
																				<p>
																				</p>
																				<table class="hui" border="1">
																						<tbody>
																								<tr>
																										<td width="18%">工具名称</td>
																										<td width="25%">Testdirector</td>
																										<td width="21%">ClearQuest</td>
																										<td width="20%">BMS</td>
																										<td>Bugzilla</td>
																								</tr>
																								<tr>
																										<td>流程定制</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>N</td>
																										<td>Y</td>
																								</tr>
																								<tr>
																										<td>查询功能定制</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>Y</td>
																								</tr>
																								<tr>
																										<td>功能域定制</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>Y</td>
																								</tr>
																								<tr>
																										<td>用户权限分级管理</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>Y</td>
																								</tr>
																								<tr>
																										<td>Email通知</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>Y</td>
																										<td>Y</td>
																								</tr>
																								<tr>
																										<td>构架模式</td>
																										<td>B/S</td>
																										<td>C/S,B/S</td>
																										<td>B/S</td>
																										<td>B/S</td>
																								</tr>
																								<tr>
																										<td>报表定制功能</td>
																										<td>Y</td>
																										<td>强,集成Crystal Report</td>
																										<td>有标准报表和高级报表,定制功能不够</td>
																										<td>Y</td>
																								</tr>
																								<tr>
																										<td>支持平台</td>
																										<td>Windows</td>
																										<td>Windows, Unix</td>
																										<td>Windows</td>
																										<td>Linux, FreeBSD</td>
																								</tr>
																								<tr>
																										<td>支持数据库</td>
																										<td>Oracle, M$ Access, SQL Server等</td>
																										<td>Oracle, M$ Access, SQL Server</td>
																										<td>SQL Server等MSDE</td>
																										<td>MySQL</td>
																								</tr>
																								<tr>
																										<td>安装配置的复杂度</td>
																										<td>简单</td>
																										<td>有些复杂</td>
																										<td>容易</td>
																										<td>不复杂</td>
																								</tr>
																								<tr>
																										<td>许可证费用</td>
																										<td>昂贵</td>
																										<td>昂贵</td>
																										<td>适中</td>
																										<td>免费</td>
																								</tr>
																								<tr>
																										<td>售后服务</td>
																										<td>国内有多家代理公司提供相关服务</td>
																										<td>在国内有分公司提供技术支持</td>
																										<td>技术支持和服务体系完备</td>
																										<td>可自行修改源代码</td>
																								</tr>
																								<tr>
																										<td>与其他工具集成</td>
																										<td>本身又是测试需求、测试案例管理工具, 与winRunner, LoadRunner集成，并且具有多种主流Case工具接口Add-In</td>
																										<td>与rational公司的其它产品无缝集成，特别与Clear Case配合以可实现UCM的配置管理体系</td>
																										<td>M$ VSS, Project</td>
																										<td>开源配置管理工具CVS</td>
																								</tr>
																								<tr>
																										<td>公司背景</td>
																										<td>世界主流测试软件提供商</td>
																										<td>已被IBM合并,世界著名软件公司</td>
																										<td>微软与上海市政府新成立的软件企业　</td>
																										<td>世界著名开源项目</td>
																								</tr>
																						</tbody>
																				</table>
																				<div align="left">
																						<strong>商业化自动功能测试工具特性比较</strong>
																						<br />
																						<table class="hui" width="100%" border="1">
																								<tbody>
																										<tr>
																												<td>特性</td>
																												<td>WinRunner</td>
																												<td>SilkTest</td>
																												<td>Etester</td>
																										</tr>
																										<tr>
																												<td>易于安装</td>
																												<td>是</td>
																												<td>是</td>
																												<td>是，不支持设置代理服务等设置</td>
																										</tr>
																										<tr>
																												<td>GUI对象和脚本分离</td>
																												<td>是</td>
																												<td>对象声明在单独的include文件中，但是case脚本中还有包含</td>
																												<td>两者都在VB脚本的case中</td>
																										</tr>
																										<tr>
																												<td>toolbar/field定制</td>
																												<td>可以</td>
																												<td>无法定制toolbar,可以定制GUI的fields内容</td>
																												<td>无法定制</td>
																										</tr>
																										<tr>
																												<td>操作系统</td>
																												<td>Windows</td>
																												<td>Unix,Windows</td>
																												<td>Unix, Windows</td>
																										</tr>
																										<tr>
																												<td>浏览器</td>
																												<td>NetScape,IE</td>
																												<td>NetScape,IE</td>
																												<td>NetScape,IE</td>
																										</tr>
																										<tr>
																												<td>支持测试对象</td>
																												<td>HTML,DHTML,JavaScript,VBScript,XML,JAVA applets, ActiveX,VB, PowerBuilder,Delphi,Terminal Emulator,,Oracle,SAP,PeopleSoft, Siebel</td>
																												<td>HTML, DHTML, JavaScript, XML, Java apps and applets, MFC, VB, Oracle, PowerBuilder, Delphi, SAP</td>
																												<td>Java apps and applets in M$JVM/SunJVM, HTML, DHTML, JavaScript, XML, MFC, VB, Oracle, SAP, Delphi, Terminal Emulator, PowerBuilder, Oracle, Peoplesoft</td>
																										</tr>
																										<tr>
																												<td>脚本语言</td>
																												<td>TSL</td>
																												<td>第四代面向对象的脚本语言4Test,类似C++</td>
																												<td>提供可编程接口，用户可使用标准语言扩展可视脚本，如VB,C++,Java</td>
																										</tr>
																										<tr>
																												<td>脚本调试功能</td>
																												<td>强大</td>
																												<td>类似C＋＋Debugger</td>
																												<td>VBA Debugger结合Visual Script Debugger</td>
																										</tr>
																										<tr>
																												<td>允许数据驱动的测试</td>
																												<td>是</td>
																												<td>是</td>
																												<td>是</td>
																										</tr>
																										<tr>
																												<td>自动数据生成</td>
																												<td>支持</td>
																												<td>支持</td>
																												<td>不支持</td>
																										</tr>
																										<tr>
																												<td>允许通过数据库验证数据</td>
																												<td>通过ODBC及本地数据库连接</td>
																												<td>自带Database Tester</td>
																												<td>通过ODBC</td>
																										</tr>
																										<tr>
																												<td>应用程序改变后的脚本维护</td>
																												<td>直接修改GUImap</td>
																												<td>更新include 文件。</td>
																												<td>自动更新无需录制</td>
																										</tr>
																										<tr>
																												<td>数据库支持</td>
																												<td>市场流行的数据库</td>
																												<td>市场流行的数据库</td>
																												<td>市场流行的数据库</td>
																										</tr>
																										<tr>
																												<td>无人看管下的自动执行测试</td>
																												<td>通过Testdirector</td>
																												<td>允许</td>
																												<td>允许，通???&gt;????&#x7;??&#x8;师?&#x7;过eTestSuite</td>
																										</tr>
																										<tr>
																												<td>分布式测试控制/同步/执行</td>
																												<td>Testdirector支持</td>
																												<td>支持</td>
																												<td>支持</td>
																										</tr>
																										<tr>
																												<td>自动创建测试结果日志</td>
																												<td>是</td>
																												<td>是</td>
																												<td>是</td>
																										</tr>
																										<tr>
																												<td>非预期错误的恢复</td>
																												<td>允许</td>
																												<td>允许</td>
																												<td>允许</td>
																										</tr>
																										<tr>
																												<td>与测试管理工具接口</td>
																												<td>Testdirector</td>
																												<td>自带Case管理功能。</td>
																												<td>e-test suite</td>
																										</tr>
																										<tr>
																												<td>图形化设计脚本执行集合</td>
																												<td>通过Testdirector设计</td>
																												<td>不支持</td>
																												<td>通过e-test suite设计</td>
																										</tr>
																										<tr>
																												<td>培训</td>
																												<td>有，Onsite及public training</td>
																												<td>有，提供kickoff training</td>
																												<td>有，onsite及public training</td>
																										</tr>
																										<tr>
																												<td>技术支持</td>
																												<td>曾获SSPA STAR荣誉</td>
																												<td>很好</td>
																												<td>客户对其评价</td>
																										</tr>
																										<tr>
																												<td>License</td>
																												<td>灵活的记费方式，既可以按使用次数计费也可以按协议算永久使用费</td>
																												<td>提供floating以及node-locked两种方式</td>
																												<td>提供Floating以及Node-locked两种方式</td>
																										</tr>
																										<tr>
																												<td>价格</td>
																												<td>昂贵</td>
																												<td>较贵</td>
																												<td>一般</td>
																										</tr>
																										<tr>
																												<td>Add-in收费</td>
																												<td>部分收费</td>
																												<td>不收费</td>
																												<td>不收费</td>
																										</tr>
																										<tr>
																												<td>
																														<strong>总论</strong>
																												</td>
																												<td>在全球的市场占有率较高，功能全面，价格昂贵</td>
																												<td>在国内的推广还处于起步阶段</td>
																												<td>价格较低，只支持web的测试，在金融、证券、电子商务等领域有广泛应用。</td>
																										</tr>
																								</tbody>
																						</table>
																				</div>
																		</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">
																		<a href="http://www.51testing.com/html/31/1320.html">
																				<font color="#000000">◎Purify检测的代码错误类型</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/771.html">
																				<font color="#000000">◎实时嵌入式软件测试工具的研究</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/770.html">
																				<font color="#000000">◎CODETEST——嵌入式软件实时测试工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/733.html">
																				<font color="#000000">◎基于GUI的自动化测试工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/641.html">
																				<font color="#000000">◎QALoad优秀的性能测试工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/632.html">
																				<font color="#000000">◎测试覆盖率工具--clover.net</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/631.html">
																				<font color="#000000">◎开发自动化测试脚本的技巧和心得</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/566.html">
																				<font color="#000000">◎GHOST V8.0 使用详解</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/486.html">
																				<font color="#000000">◎水滴石穿C语言之代码检查工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/483.html">
																				<font color="#000000">◎三款Java分析器点评</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/482.html">
																				<font color="#000000">◎嵌入式软件工业化测试工具LOGISCOPE</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/481.html">
																				<font color="#000000">◎WAS服务器负载测试软件导读</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/480.html">
																				<font color="#000000">◎Radview公司的web性能测试和分析系列工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/479.html">
																				<font color="#000000">◎Running Optimizeit from the command line</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/477.html">
																				<font color="#000000">◎Optimizeit Code Coverage概览</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/476.html">
																				<font color="#000000">◎Optimizeit Profiler概览</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/475.html">
																				<font color="#000000">◎JProbe Suite 4.0使用说明</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/474.html">
																				<font color="#000000">◎JProbe Profiler-优秀的剖析工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/473.html">
																				<font color="#000000">◎JProbe使用说明</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/472.html">
																				<font color="#000000">◎JProfiler跟踪和检查系统性能的好工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/459.html">
																				<font color="#000000">◎Running Optimizeit from the command line</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/362.html">
																				<font color="#000000">◎JProbe Profiler-优秀的剖析工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/78.html">
																				<font color="#000000">◎Compuware DevPartner Studio简介</font>
																		</a>
																		<br />
																</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/31/566.html">
																				<font color="#000000">◎GHOST V8.0 使用详解</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/641.html">
																				<font color="#000000">◎QALoad优秀的性能测试工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/486.html">
																				<font color="#000000">◎水滴石穿C语言之代码检查工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/631.html">
																				<font color="#000000">◎开发自动化测试脚本的技巧和心得</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/733.html">
																				<font color="#000000">◎基于GUI的自动化测试工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/481.html">
																				<font color="#000000">◎WAS服务器负载测试软件导读</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/476.html">
																				<font color="#000000">◎Optimizeit Profiler概览</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/78.html">
																				<font color="#000000">◎Compuware DevPartner Studio简介</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/472.html">
																				<font color="#000000">◎JProfiler跟踪和检查系统性能的好工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/473.html">
																				<font color="#000000">◎JProbe使用说明</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/482.html">
																				<font color="#000000">◎嵌入式软件工业化测试工具LOGISCOPE</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/632.html">
																				<font color="#000000">◎测试覆盖率工具--clover.net</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/1362.html">
																				<font color="#000000">◎testview测试工具详介</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/771.html">
																				<font color="#000000">◎实时嵌入式软件测试工具的研究</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/483.html">
																				<font color="#000000">◎三款Java分析器点评</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/770.html">
																				<font color="#000000">◎CODETEST——嵌入式软件实时测试工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/1357.html">
																				<font color="#000000">◎抛砖引玉，GUI自动化测试的设计</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/1329.html">
																				<font color="#000000">◎性能测试软件介绍：SilkPerformer</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/362.html">
																				<font color="#000000">◎JProbe Profiler-优秀的剖析工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/1416.html">
																				<font color="#000000">◎选择正确的GUI测试自动化工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/475.html">
																				<font color="#000000">◎JProbe Suite 4.0使用说明</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/480.html">
																				<font color="#000000">◎Radview公司的web性能测试和分析系列工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/477.html">
																				<font color="#000000">◎Optimizeit Code Coverage概览</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/474.html">
																				<font color="#000000">◎JProbe Profiler-优秀的剖析工具</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/1320.html">
																				<font color="#000000">◎Purify检测的代码错误类型</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/479.html">
																				<font color="#000000">◎Running Optimizeit from the command line</font>
																		</a>
																		<br />
																		<a href="http://www.51testing.com/html/31/459.html">
																				<font color="#000000">◎Running Optimizeit from the command line</font>
																		</a>
																		<br />
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20832.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:03 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/20/20832.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QTP的登陆脚本设计</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20758.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Tue, 19 Dec 2006 01:38:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20758.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20758.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20758.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20758.html</trackback:ping><description><![CDATA[
		<font size="2">由于一直以来事情都比较多，最近上课还有其它的事情，所以本来答应一个朋友把脚本帮他写一些，但是耽误了3-4天了，实在不好意思。这里把脚本简单说一下，我们分析一下。<br />    当时问题是这样的，“我的错误的用户名就没办法登陆”，其实含义就是脚本最好能处理成功的用户名错误的用户名，那么这里涉及到脚本的设计。 <br />目标如下：<br />1.    脚本需要处理成功和失败的用户的登陆 <br />2.   数据驱动</font>
		<p>
				<font size="2">设计开发脚本如下：</font>
		</p>
		<p>
				<br />
				<font size="2">第一步录制脚本如下<br />Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set "吕巍" <br />Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set "" <br />Browser("智能变电巡检仪系统 4.0").Page("Page").Syn <br />Browser("智能变电巡检仪系统 4.0").Close</font>
		</p>
		<p>
				<font size="2">以上为录制的正确的用户名,下边录制错误的用户名<br />Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set "xx" <br />Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set "" <br />出现错误提示“该用户不存在”</font>
		</p>
		<p>
				<font size="2">第二步 增强脚本</font>
		</p>
		<p>
				<font size="2">现在需要设计的是一套脚本驱动所有的测试数据，这样可以驱动所有的用例数据，qtp中提供了datatable。<br />但是有数据驱动也要做一个事情就是如何处理错误的用户名和正确的用户名，如何结合起来呢？<br />这里我把datatable看作存放测试用例的地方，里面放入测试数据，还放入测试的预期结果。这样我的设计已经出现雏形了。<br />我把datatable设计为三列</font>
		</p>
		<p>
				<font size="2">username  password status<br />吕x                <br />xxx       xxxx     该用户不存在</font>
		</p>
		<p>
				<font size="2">第三列放入最后执行的结果,我设计的是空为成功登陆,如果有信息就用实际运行的结果和这一列对比.好了万事俱备只欠东风了</font>
		</p>
		<p>
				<font size="2">修改脚本如下：<br />Dim iStatus</font>
		</p>
		<p>
				<font size="2">Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebEdit("txtLoginName").Set DataTable("username", dtLocalSheet)<br />Browser("智能变电巡检仪系统 4.0").Page("智能变电巡检仪系统 4.0").WebButton("登 录").set DataTable("password", dtLocalSheet)<br />iStatus = DataTable("status", dtLocalSheet)</font>
		</p>
		<p>
				<font size="2">If   iStatus=""  Then<br />  Browser("智能变电巡检仪系统 4.0").Close<br />End If</font>
		</p>
		<p>
				<br />
				<font size="2">If   iStatus="该用户不存在"    Then<br />     Reporter.ReportEvent micFail, "登陆", "登陆失败." <br />End If</font>
		</p>
		<p>
				<font size="2">Browser("智能变电巡检仪系统 4.0").Close</font>
		</p>
		<p>
				<font size="2">第三步，设置脚本运行过程</font>
		</p>
		<p>
				<font size="2">打开 tests-〉settings<br />设置RUN TAB页面下 Datatable iterations中 Run On all rows</font>
		</p>
		<p>
				<font size="2">这样就完成了整个脚本的设计工作，以上通过一个简单例子吧脚本的设计和软件的功能结合起来，达成脚本的设计效果。</font>
		</p>
		<p>
				<font size="2">本文来自51testing博客，转载请注明出处<br />原始链接：http://blog.51testing.com/?85168/action_viewspace_itemid_1139.html<br /> </font>
		</p>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20758.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 09:38 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/19/20758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自动化测试的7个步骤</title><link>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20576.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 15 Dec 2006 13:16:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20576.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20576.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20576.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20576.html</trackback:ping><description><![CDATA[
		<span style="FONT-SIZE: 12pt">
				<strong>自动化测试的7个步骤<br /><table cellspacing="0" cellpadding="0" width="558" border="0"><tbody><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><strong>【摘要】 </strong>我们对自动化测试充满了希望，然而，自动化测试却经常带给我们沮丧和失望。虽然，自动化测试可以把我们从困难的环境中解放出来，在实施自动化测试解决问题的同时，又带来同样多的问题。在开展自动化测试的工作中，关键问题是遵循软件开发的基本规则。本文介绍自动化测试的 7 个步骤：改进自动化测试过程，定义需求，验证概念，支持产品的可测试性，具有可延续性的设计（ design for sustainability ），有计划的部署和面对成功的挑战。按照以上 7 个步骤，安排你的人员、工具和制定你的自动化测试项目计划，你将会通往一条成功之路。 </p><p><a name="fable"></a>一个故事 : <a name="problems"></a></p><p>我在很多软件公司工作过，公司规模有大有小，也和来自其他公司的人员交流，因此经历过或者听说过影响自动化测试效果的各种各样的的问题。本文将提供若干方法规避可能在自动化测试中出现的问题。我先给大家讲一个故事，以便各位了解自动化测试会出现哪些问题。 </p><p>以前，我们有一个软件项目，开发小组内所有的人都认为应该在项目中采用自动化测试。软件项目的经理是 Anita Delegate 。她评估了所有可能采用的自动化测试工具，最后选择了一种，并且购买了几份拷贝。她委派一位员工 ——Jerry Overworked 负责自动化测试工作。 Jerry 除了负责自动化测试工作，还有其他的很多任务。他尝试使用刚刚购买的自动化测试工具。当把测试工具应用到软件产品测试中的时候，遇到了问题。这个测试工具太复杂，难于配置。他不得不给测试工具的客户支持热线打了几个电话。最后， Jerry 认识到，他需要测试工具的技术支持人员到现场帮助安装测试工具，并找出其中的问题。在打过几个电话后，测试工具厂商派过来一位技术专家。技术专家到达后，找出问题所在，测试工具可以正常工作了。这还算是顺利了。但是，几个月后，他们还是没有真正实现测试自动化， Jerry 拒绝继续从事这个项目的工作，他害怕自动化测试会一事无成，只是浪费时间而已。 </p><p>项目经理 Anita 把项目重新指派给 Kevin Shorttimer ，一位刚刚被雇佣来做软件测试的人员。 Kevin 刚刚获得计算机科学的学位，希望通过这份工作迈向更有挑战性的、值得去做的工作。 Anita 送 Kevin 参加工具培训，避免 Kevin 步 Jerry 的后尘 —— 由于使用测试工具遇到困难而变得沮丧，导致放弃负责的项目。 Kevin 非常兴奋。这个项目的测试需要重复测试，有点令人讨厌，因此，他非常愿意采用自动化测试。一个主要的版本发布后， Kevin 准备开始全天的自动化测试，他非常渴望得到一个机会证明自己可以写非常复杂的，有难度的代码。他建立了一个测试库，使用了一些技巧的方法，可以支持大部分的测试，这比原计划多花费了很多时间，不过， Kevin 使整个测试工作开展的很顺利。他用已有的测试套测试新的产品版本，并且确实发现了 bug 。接下来， Kevin 得到一个从事软件开发职位的机会，离开了自动化的岗位。 </p><p>Ahmed Hardluck 接手 Kevin 的工作，从事自动化测试执行工作。他发现 Kevin 留下的文档不仅少，并且没有太多的价值。 Ahmed 花费不少时间去弄清楚已有的测试设计和研究如何开展测试执行工作。这个过程中， Ahmed 经历了很多失败，并且不能确信测试执行的方法是否正确。测试执行中，执行失败后的错误的提示信息也没有太多的参考价值，他不得不更深的钻研。一些测试执行看起来仿佛永远没有结束。另外一些测试执行需要一些特定的测试环境搭建要求，他更新测试环境搭建文档，坚持不懈地工作。后来，在自动化测试执行中，它发现几个执行失败的结果，经过分析，是回归测试的软件版本中有 BUG ，导致测试执行失败，发现产品的 BUG 后，每个人都很高兴。接下来，他仔细分析测试套中的内容，希望通过优化测试套使测试变得更可靠，但是，这个工作一直没有完成，预期的优化结果也没有达到。按照计划，产品的下一个发布版本有几个主要的改动， Ahmed 立刻意识到产品的改动会破坏已有的自动化测试设计。接下来，在测试产品的新版本中，绝大多数测试用例执行失败了， Ahmed 对执行失败的测试研究了很长时间，然后，从其他人那里寻求帮助。经过商讨，自动化测试应该根据产品的新接口做修改，自动化测试才能运转起来。最后，大家根据新接口修改自动化测试，测试都通过了。产品发布到了市场上。接下来，用户立刻打来投诉电话，投诉软件无法工作。大家才发现自己改写了一些自动化测试脚本，导致一些错误提示信息被忽略了。虽然，实际上测试执行是失败的，但是，由于改写脚本时的一个编程错误导致失败的测试执行结果被忽略了。这个产品终于失败了。 </p><p>这是我的故事。或许您曾经亲身经历了故事当中某些情节。不过，我希望你没有这样的相似结局。本文将给出一些建议，避免出现这样的结局。 </p><p>问题 </p><p>这个故事阐明了几个使自动化测试项目陷入困境的原因： </p><p>自动化测试时间不充足：根据项目计划的安排，测试人员往往被安排利用自己的个人时间或者项目后期介入自动化测试。这使得自动化测试无法得到充分的时间，无法得到真正的关注。 </p><p>缺乏清晰的目标：有很多好的理由去开展自动化测试工作，诸如自动化测试可以节省时间，使测试更加简单，提高测试的覆盖率，可以让测试人员保持更好的测试主动性。但是，自动化测试不可能同时满足上述的目标。不同的人员对自动化测试有不同的希望，这些希望应该提出来，否则很可能面对的是失望。 </p><p>缺乏经验：尝试测试自己的程序的初级的程序员经常采用自动化自动化测试。由于缺乏经验，很难保证自动化测试的顺利开展。 </p><p>更新换代频繁（ High turnover ）：测试自动化往往需要花费很多时间学习的，当自动化测试更新换代频繁的时候，你就丧失了刚刚学习到的自动化测试经验。 </p><p>对于绝望的反应：在测试还远没有开始的时候，问题就已经潜伏在软件中了。软件测试不过是发现了这些潜伏的问题而已。就测试本身而言，测试是一件很困难的工作。当在修改过的软件上一遍接一遍的测试时，测试人员变得疲劳起来。测试什么时候后结束？当按照计划的安排，软件应该交付的时候，测试人员的绝望变得尤其强烈。如果不需要测试，那该有多好呀！在这种环境中，自动化测试可能是个可以选择的解决方法。但是，自动化测试却未必是最好的选择，他不是一个现实的解决方法，更像是一个希望。 </p><p>不愿思考软件测试：很多人发现实现产品的自动化测试比测试本身更有趣。在很多软件项目发生这样的情况，自动化工程师不参与到软件测试的具体活动中。由于测试的自动化与测试的人为割裂，导致很多自动化对软件测试并没有太大的帮助。 </p><p><a name="rules"></a>关注于技术：如何实现软件的自动化测试是一个很吸引人的技术问题。不过，过多的关注如何实现自动化测试，导致忽略了自动化测试方案是否符合测试需要。 </p><p>遵守软件开发的规则 </p><p>你可能了解 SEI （软件工程研究所）提出的 CMM （能力成熟度模型）。 CMM 分为 5 个界别，该模型用来对软件开发组织划分等级。 Jerry Weinberg （美国著名软件工程专家）也创建了自己的一套软件组织模型，在他的组织模型中增加了一个额外的级别，他称之为零级别。很显然，一个零模式的组织实际上也是开发软件；零模式组织中，在开发人员和用户之间没有差别 [Weinberg 1992] 。恰恰在这类组织环境中，经常采用自动化测试方法。因此，把资源用于自动化测试，并且把自动化测试当作一个软件开发活动对待，把软件测试自动化提升到一级。这是解决测试自动化的核心的方案。我们应该像运作其他的开发项目一样来运作软件自动化测试项目。 </p><p>像其他软件开发项目一样，我们需要软件开发人员专注于测试自动化的开发任务；像其他软件开发项目一样，自动化测试可以自动完成具体的测试任务，对于具体的测试任务来说，自动化开发人员可能不是这方面的专家，因此，软件测试专家应该提供具体测试任务相关的咨询，并且提供测试自动化的需求；像其他软件开发项目一样，如果在开发编码之前，对测试自动化作了整体设计有助于测试自动化开发的顺利开展。像其他软件开发项目一样，自动化测试代码需要跟踪和维护，因此，需要采用源代码管理。像其他软件开发项目一样，测试自动化也会出现 BUG ，因此，需要有计划的跟踪 BUG ，并且对修改后的 BUG 进行测试。像其他软件开发项目一样，用户需要知道如何使用软件，因此，需要提供用户使用手册。 </p><p>本文中不对软件开发做过多讲述。我假定您属于某个软件组织，该组织已经知道采用何种合理的、有效的方法开发软件。我仅仅是推动您在自动化测试开发过程中遵守已经建立的软件开发规则而已。本文按照在软件开发项目中采用的标准步骤组织的，重点关注测试自动化相关的事宜和挑战。 <a name="process"></a></p><p>•  改进软件测试过程 </p><p>•  定义需求 </p><p>•  验证概念 </p><p>•  支持产品的可测试性 </p><p>•  可延续性的设计（ design for sustainability ） </p><p>•  有计划的部署 </p><p>•  面对成功的挑战 </p><p>步骤一：改进软件测试过程 </p><p>如果你负责提高一个商业交易操作的效率，首先，你应该确认已经很好的定义了这个操作的具体过程。然后，在你投入时间和金钱采用计算机提供一套自动化的商业交易操作系统之前，你想知道是否可以采用更简单、成本更低的的方法。同样的，上述过程也是用于自动化测试。我更愿意把 “ 测试自动化 ” 这个词解释成能够使测试过程简单并有效率，使测试过程更为快捷，没有延误。运行在计算机上的自动化测试脚本只是自动化测试的一个方面而已。 </p><p>例如，很多测试小组都是在回归测试环节开始采用测试自动化的方法。回归测试需要频繁的执行，再执行，去检查曾经执行过的有效的测试用例没有因为软件的变动而执行失败。回归测试需要反复执行，并且单调乏味。怎样才能做好回归测试文档化的工作呢？通常的做法是采用列有产品特性的列表，然后对照列表检查。这是个很好的开始，回归测试检查列表可以告诉你应该测试哪些方面。不过，回归测试检查列表只是合于那些了解产品，并且知道需要采用哪种测试方法的人。 </p><p>在你开始测试自动化之前，你需要完善上面提到的回归测试检查表，并且，确保你已经采用了确定的的测试方法，指明测试中需要什么样的数据，并给出设计数据的完整方法。如果测试掌握了基本的产品知识，这会更好。确认可以提供上面提到的文档后，需要明确测试设计的细节描述，还应该描述测试的预期结果，这些通常被忽略，建议测试人员知道。太多的测试人员没有意识到他们缺少什么，并且由于害怕尴尬而不敢去求助。这样一份详细的文档给测试小组带来立竿见影的效果，因为，现在任何一个具有基本产品知识的人根据文档可以开展测试执行工作了。在开始更为完全意义上的测试自动化之前，必须已经完成了测试设计文档。测试设计是测试自动化最主要的测试需求说明。不过，这时候千万不要走极端去过分细致地说明测试执行的每一个步骤，只要确保那些有软件基本操作常识的人员可以根据文档完成测试执行工作既可。但是，不要假定他们理解那些存留在你头脑中的软件测试执行的想法，把这些测试设计的思路描述清楚就可以了。 </p><p>我以前负责过一个软件模块的自动化测试工作。这个模块的一些特性导致实现自动化非常困难。当我了解到这项工作无需在很短的时间内完成后，决定制定一个详细回归测试设计方案。我仔细地检查了缺陷跟踪库中与该模块相关的每个已经关闭的缺陷，针对每个缺陷，我写了一个能够发现该问题的测试执行操作。我计划采用这种方法提供一个详细的自动化需求列表，这可以告诉我模块的那一部分最适合自动化测试。在完成上述工作后，我没有机会完成测试自动化的实现工作。不过，当我们需要对这个模块做完整回归测试的时候，我将上面提到的文档提供给若干只了解被测试产品但是没有测试经验的测试人员。依照文档的指导，几乎不需要任何指导的情况下，各自完成了回归测试，并且发现了 BUG 。从某种角度看，这实际上是一次很成功的自动化测试。在这个项目中，我们与其开发自动化测试脚本，还不如把测试执行步骤文档化。后来，在其它项目中，我们开发了自动化测试脚本，发现相关人员只有接受相关培训才能理解并执行自动化测试脚本，如果测试自动化设计的很好，可能会好一些。不过，经过实践我们总结出完成一份设计的比较好的测试文档，比完成一份设计良好的测试脚本简单的多。 </p><p>另外一个提高测试效率的简单方法是采用更多的计算机。很多测试人员动辄动用几台计算机，这一点显而易见。我之所以强调采用更多的计算机是因为，我曾经看到一些测试人员被误导在单机上努力的完成某些大容量的自动化测试执行工作，这种情况下由于错误的使用了测试设备、测试环境，导致测试没有效果。因此，自动化测试需要集中考虑所需要的支撑设备。 </p><p>针对改进软件测试过程，我的最后一个建议是改进被测试的产品，使它更容易被测试，有很多改进措施既可以帮助用户更好的使用产品，也可以帮助测试人员更好的测试产品。稍后，我将讨论自动化测试的可测试需求。这里，我只是建议给出产品的改进点，这样对手工测试大有帮助。 </p><p>一些产品非常难安装，测试人员在安装和卸载软件上花费大量的时间。这种情况下，与其实现产品安装的自动化测试，还不如改进产品的安装功能。采用这种解决办法，最终的用户会受益的。另外的一个处理方法是考虑开发一套自动安装程序，该程序可以和产品一同发布。事实上，现在有很多专门制作安装程序的商用工具。 </p><p>另一些产品改进需要利用工具在测试执行的日志中查找错误。采用人工方法，在日志中一页一页的查询报错信息很容易会让人感到乏味。那么，赶快采用自动化方法吧。如果你了解日志中记录的错误信息格式，写出一个错误扫描程序是很容易的事情。如果，你不能确定日志中的错误信息格式，就开始动手写错误扫描程序，很可能面临的是一场灾难。不要忘记本文开篇讲的那个故事中提到的测试套无法判断测试用例是否执行失败的例子。最终用户也不愿意采用通过搜索日志的方法查找错误信息。修改错误信息的格式，使其适合日志扫描程序，便于扫描工具能够准确的扫描到所有的错误信息。这样，在测试中就可以使用扫描工具了。 </p><p>通过改进产品的性能对测试也是大有帮助的。很显然的，如果产品的性能影响了测试速度，鉴别出性能比较差的产品功能，并度量该产品功能的性能，把它作为影响测试进度的缺陷，提交缺陷报告。 </p><p><a name="requirements"></a>上面所述的几个方面可以在无需构建自动化测试系统的情况下，大幅度的提高测试效率。改进软件测试过程会花费你构建自动化测试系统的时间，不过改进测试过程无疑可以使你的自动化测试项目更为顺利开展起来。 </p><p>步骤二：定义需求 </p><p>在前面的故事中，自动化工程师和自动化测试的发起者的目标存在偏差。为了避免这种情况，需要在自动化测试需求上保持一致。应该有一份自动化测试需求，用来描述需要测试什么。测试需求应该在测试设计阶段详细描述出来，自动化测试需求描述了自动化测试的目标。很多人认为自动化测试显然是一件好事情，但是，他们不愿意对自动化测试的目标给出清晰的描述。下面是人们选用自动化测试的几个原因： </p><p>•  加快测试进度从而加快产品发布进度 </p><p>•  更多的测试 </p><p>•  通过减少手工测试降低测试成本 </p><p>•  提高测试覆盖率 </p><p>•  保证一致性 </p><p>•  提高测试的可靠性 </p><p>•  测试工作可以由技术能力不强测试人员完成 </p><p>•  定义测试过程，避免过分依赖个人 </p><p>•  测试变得更加有趣 </p><p>•  提高了编程技能 </p><p>开发管理、测试管理和测试人员实现自动化测试的目标常常是有差别的。除非三者之间达成一致，否则很难定义什么是成功的自动化测试。 </p><p>当然，不同的情况下，有的自动化测试目标比较容易达到，有的则比较难以达到。测试自动化往往对测试人员的技术水平要求很高，测试人员必须能理解充分的理解自动化测试，从而通过自动化测试不断发现软件的缺陷。不过，自动化测试不利于测试人员不断的积累测试经验。不管怎么样，在开始自动化测试之前应该确定自动化测试成功的标准。 </p><p>手工测试人员在测试执行过程中的一些操作能够发现不引人注意的问题。他们计划并获取必要的测试资源，建立测试环境，执行测试用例。测试过程中，如果有什么异常的情况发生，手工测试人员立刻可以关注到。他们对比实际测试结果和预期测试结果，记录测试结果，复位被测试的软件系统，准备下一个软件测试用例的环境。他们分析各种测试用例执行失败的情况，研究测试过程可疑的现象，寻找测试用例执行失败的过程，设计并执行其他的测试用例帮助定位软件缺陷。接下来，他们写作缺陷报告单，保证缺陷被修改，并且总结所有的缺陷报告单，以便其他人能够了解测试的执行情况。 </p><p>千万不要强行在测试的每个部分都采用自动化方式。寻找能够带来最大回报的部分，部分的采用自动化测试是最好的方法。或许你可能发现采用自动化执行和手动确认测试执行结果的方式是个很好的选择，或许你可以采用自动化确认测试结果和手工测试执行相结合和方式。我听到有人讲，除非测试的各个环节都采用自动化方式，否则不是真正意义上的自动化测试，这真是胡言乱语。如果仅仅是为了寻找挑战，可以尝试在测试的每个环节都采用自动化方法。但是，如果寻找成功测试的方法，请关注那些可以快速建立的，可以反复利用的自动化测试。 </p><p><a name="concept"></a>定义自动化测试项目的需求要求我们全面地、清楚地考虑各种情况，然后给出权衡后的需求，并且可以使测试相关人员更加合理的提出自己对自动化测试的期望。通过定义自动化测试需求，距离成功的自动化测试近了一步。 </p><p>步骤三：验证概念 </p><p>在前面的故事当中，那个自动化测试人员在对测试方向一片茫然的情况下一头扎进了自动化测试项目中。不过，在项目的进行中，他得到了来自各个方面的支持。 </p><p>你可能还没有认识到这一点，不过，你必须验证自动化测试项目的可行性。验证过程花费的时间往往比人们预期的要长，并且需要来自你身边的各种人的帮助。 </p><p>很多年前，我从事一个测试自动化项目的工作，参加项目的人员有各种各样的好点子。我们设计了一个复杂的自动化测试系统，并且非常努力工作去实现系统的每个模块。我们定期的介绍测试自动化的设计思路和工作进度，甚至演示已经完成的部分功能。但是，我们没有演示如何利用该套测试自动化系统如何开展实际的测试工作。最后，整个项目被取消了，此后，我再也没有犯这个错误。 </p><p>你需要尽可能快地验证你采用的测试工具和测试方法的可行性，站在产品的角度验证你所测试的产品采用自动化测试的可行性。这通常是很困难的，需要尽快地找出可行性问题的答案，需要确定你的测试工具和测试方法对于被测试的产品和测试人员是否合适。你需要做是验证概念 —— 一个快速、有说服力的测试套可以证明你选在测试工具和测试方法的正确性，从而验证了你的测试概念。你选择的用来验证概念的测试套是评估测试工具的最好的方式。 </p><p>对于很多人来说，自动化测试意味着 GUI 自动化测试，我不同意这种观点。我曾经做过 GUI 和非 GUI 自动化测试，并惊奇的发现这两类测试的测试计划有很大的互补性。不过， GUI 测试工具很昂贵、并且过分讲究。选择合适的 GUI 测试工具是很重要的，因为，如果没有选择合适的测试工具，你会遇到很多不可预测的困难。 Elisabeth Hendrickson 曾经写过一篇关于选择测试的工具的指导性文章 [Hendrickson 1999] 。我建议在评估测试工具中，找出能够验证你的想法的证据是很重要的环节。这需要测试工具至少有一个月试用期，你可能打算现在购买一份测试工具，然后直到评估完成后再购买更多份。你需要在付出大笔金钱购买测试工具的之前，找出工具存在的问题。这样，你可以从测试工具供应商得到更好的帮助，当你打算更换工具的时候，你不会感觉很为难。 </p><p>下面是一些候选的验证概念的试验： </p><p>回归测试：你准备在每个版本运行同样的测试用例吗？回归测试是最宜采用自动化测试的环节。 </p><p>配置测试：你的软件支持多少种不同的平台？你打算在所有支持的平台上测试执行所有的测试用例吗？如果是的，那么采用自动化测试是有帮助的。 </p><p>测试环境建立：对于大量不同的测试用例，可能需要相同的测试环境搭建过程。在开展自动化测试执行之前，先把测试环境搭建实现自动化。 </p><p>非 GUI 测试：实现命令行和 API 的测试自动化比 GUI 自动化测试容易的多。 </p><p><a name="testability"></a>无论采用什么测试方法，定义一个看得见的目标，然后集中在这个目标上。验证你自动化测试概念可以使自动化更进一步迈向成功之路。 </p><p>步骤四：支持产品的可测试性 </p><p>软件产品一般会用到下面三种不同类别的接口：命令行接口（ command line interfaces ，缩写 CLIs) 、应用程序接口（ API ）、图形用户接口（ GUI ）。有些产品会用到所有三类接口，有些产品只用到一类或者两类接口，这些是测试中所需要的接口。从本质上看， API 接口和命令行接口比 GUI 接口容易实现自动化，去找一找你的被测产品是否包括 API 接口或者命令行接口。有些时候，这两类接口隐藏在产品的内部，如果确实没有，需要鼓励开发人员在产品中提供命令行接口或者 API 接口，从而支持产品的可测试性。 </p><p>下面，更多多的讲解 GUI 自动化测试相关内容。这里有几个原因导致 GUI 自动化测试比预期的要困难。第一个原因是需要手工完成部分脚本。绝大多数自动化测试工具都有 “ 录制回放 ” 或者 “ 捕捉回放 ” 功能，这确实是个很好的方法。可以手工执行测试用例，测试工具在后台记住你的所有操作，然后产生可以用来重复执行的测试用例脚本。这是一个很好的方法，但是很多时候却不能奏效。很多软件测试文章的作者得出结论 “ 录制回放 ” 虽然可以生成部分测试脚本，但是有很多问题导致 “ 录制回放 ” 不能应用到整个测试执行过程中。 [Bach 1996, Pettichord 1996, Kaner 1997, Linz 1998, Hendrickson 1999, Kit 1999, Thomson 1999, Groder 1999]. 结果， GUI 测试还是主要由手工完成。 </p><p>第二个原因，把 GUI 自动化测试工和被测试的产品有机的结合在一起需要面临技术上的挑战。经常要在采用众多专家意见和最新的 GUI 接口技术才能使 GUI 测试工具正常工作。这个主要的困难也是 GUI 自动化测试工具价格昂贵的主要原因之一。非标准的、定制的控件会增加测试的困难，解决方法总是有的，可以采用修改产品源代码的方式，也可以从测试工具供应商处升级测试工具。另外，还需要分析测试工具中的 BUG ，并且给工具打补丁。也可能测试工具需要做相当的定制，以便能有效地测试产品界面上的定制控件。 GUI 测试中，困难总是意外出现，让人惊奇。你也可能需要重新设计你的测试以规避那些存在问题的界面控件。 </p><p>第三个原因， GUI 设计方案的变动会直接带来 GUI 自动化测试复杂度的提高。在开发的整个过程中，图形界面经常被修改或者完全重设计，这是出了名的事情。一般来讲，第一个版本的图形界面都是很糟糕。如果处在图形界面方案不停变动的时候，就开展 GUI 自动化测试是不会有任何进展的，你只能花费大量的时间修改测试脚本，以适应图形界面的变更。不管怎样，即便界面的修改会导致测试修改脚本，你也不应该反对开发人员改进图形界面。一旦原始的设计完成后，图形界面接口下面的编程接口就固定下来了。 </p><p>上面提到的这些原因都是基于采用 GUI 自动化测试的方法完成产品的功能测试。图形界面接口当然需要测试，可以考虑实现 GUI 测试自动化。不过，你也应该考虑采用其他方法测试产品的核心功能，并且这些测试不会因为图形界面发生变化而被中断，这类测试应该采用命令行接口或者 API 接口。我曾经看到有人选择 GUI 自动化测试，因为，他们不打算修改被测试产品，但是，最终他们认识到必须对产品做修改，以保证 GUI 测试自动化可以正常工作。无论你选择哪种方法，自动化都需要对被测试的产品做修改。因此，采用可编程的接口是最可靠的。 </p><p>为了让 API 接口测试更为容易，应该把接口与某种解释程序，例如 Tcl 、 Perl 或者 Python 绑定在一起。这使交互式测试成为可能，并且可以缩短自动化测试的开发周期。采用 API 接口的方式，还可以实现独立的产品模块的单元测试自动化。 </p><p>一个关于隐藏可编程接口的例子是关于 InstallShield—— 非常流行的制作安装盘的工具。 InstallShield 有命令行选项，采用这种选项可以实现非 GUI 方式的安装盘，采用这种方式，从提前创建好的文件中读取安装选项。这种方式可能比采用 GUI 的安装方式更简单更可靠。 </p><p>另一个例子是关于如何避免基于 WEB 软件的 GUI 自动化测试。采用 GUI 测试工具可以通过浏览器操作 WEB 界面。 WEB 浏览器是通过 HTTP 协议与 WEB 服务器交互的，所以直接测试 HTTP 协议更为简单。 Perl 可以直接连接 TCP/IP 端口，完成这类的自动化测试。采用高级接口技术，譬如客户端 JAVA 或者 ActiveX 不可能利用这种方法。但是，如果在合适的环境中采用这种方式，你将发现这种方式的自动化测试比 GUI 自动化测试更加便宜更加简单。 </p><p>我曾经受雇在一家公司负责某个产品 GUI 相关的自动化测试，该产品也提供命令行接口，不过，他们已经实现了 GUI 的自动化测试。经过一段时间的研究，我发现找到图形界面中的 BUG 并不困难，不过，用户并不关注图形界面，他们更喜欢使用命令行。我还发现我们还没有针对最新的产品功能（这些功能即可通过 GUI 的方式，也可以通过命令行的方式使用）实现自动化测试。我决定推迟 GUI 自动化测试，扩展命令行测试套，测试新增的产品功能。现在回过头看这个决定，我没有选择 GUI 自动化测试是最大的成功之处，如果采用了 GUI 自动化测试所有的时间和努力都会浪费在其中。他们已经准备好做 GUI 自动化测试了，并且已经购买了一套测试工具和其他需要的东西，但我知道在开展具体的 GUI 自动化测试活动中，会遇到各种各样的困难和障碍。 </p><p><a name="sustainability"></a>无论你需要支持图形界面接口、命令行接口还是 API 接口，如果你尽可能早的在产品设计阶段提出产品的可测试性设计需求，未来的测试工作中，你很可能成功。尽可能早的启动自动化测试项目，提出可测试性需求，会使您走向自动化测试成功之路。 </p><p>步骤五：具有可延续性的设计 </p><p>在开篇的故事中，我们看到由于自动化工程师把注意力仅仅集中在如何使自动化运转起来，导致测试自动化达不到预期的效果。自动化测试是一个长期的过程，为了与产品新版本的功能和其他相关修改保持一致，自动化测试需要不停的维护和扩充。自动化测试设计中考虑自动化在未来的可扩充性是很关键的，不过，自动化测试的完整性也是很重要的。如果自动化测试程序报告测试用例执行通过，测试人员应该相信得到的结果，测试执行的实际结果也应该是通过了。其实，有很多存在问题的测试用例表面上执行通过了，实际上却执行失败了，并且没有记录任何错误日志，这就是失败的自动化。这种失败的自动化会给整个项目带来灾难性的后果，而当测试人员构建的测试自动化采用了很糟糕的设计方案或者由于后来的修改引入了错误，都会导致这种失败的测试自动化。失败的自动化通常是由于没有关注自动化测试的性能或者没有充分的自动化设计导致的。 </p><p><strong>性能： </strong>提高代码的性能往往增加了代码的复杂性，因此，会威胁到代码的可靠性。很少有人关心如何对自动化本身加以测试。通过我对测试套性能的分析，很多测试套都是花费大量的时间等候产品的运行。因此，在不提高产品运行性能的前提下，无法更有效的提高自动化测试执行效率。我怀疑测试自动化工程师只是从计算机课程了解到应该关注软件的性能，而并没有实际的操作经验。如果测试套的性能问题无法改变，那么应该考虑提高硬件的性能；测试套中经常会出现冗余，也可以考虑取出测试套中的冗余或者减少一个测试套中完成的测试任务，都是很好的办法。 </p><p><strong>便于分析： </strong>测试自动化执行失败后应该分析失败的结果，这是一个棘手的问题。分析执行失败的自动化测试结果是件困难的事情，需要从多方面着手，测试上报的告警信息是真的还是假的？是不是因为测试套中存在缺陷导致测试执行失败？是不是在搭建测试环境中出现了错误导致测试执行失败？是不是产品中确实存在缺陷导致测试执行失败？有几个方法可以帮助测试执行失败的结果分析，某些方法可以找到问题所在。通过在测试执行之前检查常见的测试环境搭建问题，从而提高测试套的可靠性；通过改进错误输出报告，从而提高测试自动化的错误输出的可分析性；此外，还可以改进自动化测试框架中存在的问题。训练测试人员如何分析测试执行失败结果。甚至可以找到那些不可靠的、冗余的或者功能比较独立的测试，然后安全地将之删除。上面这些都是减少自动化测试误报告警、提高测试可分析性的积极有效的方法。另外，有一种错误的测试结果分析方法，那就是采用测试结果后处理程序对测试结果自动分析和过滤，尽管也可以采用这种测试结果分析方法，不过这种方法会使自动化测试系统复杂化，更重要的是，后处理程序中的 BUG 会严重损害自动化测试的完整性。如果由于自动化测试本身存在的缺陷误把产品中的正常功能视为异常，那该怎么办？我曾经看到测试小组花费开发测试自动化两倍的时间来修改测试脚本，并且不愿意开展培训过程。那些仅仅关注很浅层次测试技术的测试管理者对这种方法很感兴趣，他们排斥采用隐藏测试复杂度的方法。 </p><p>综上所述，应该集中精力关注可以延续使用的测试套，从以下几方面考虑，测试的可检视性、测试的可维护性、测试的完整性、测试的独立性、测试的可重复性。 </p><p><strong>可读性： </strong>很多情况下，在测试人员开始测试项目之前，公司已经有了一套测试脚本，并且已经存在很多年了。我们可以称之为 “ 聪明的橡树 ”(wise oak tree)[Bach 1996] 。大家很依赖它，但是并不知道它是什么。由于 “ 聪明的橡树 ” 类型的测试脚本缺乏可读性，在具体应用中，那些脚本常常没有多大的实用价值，越来越让人迷惑。因此，测试人员很难确定他们实际在测试什么，反而会导致测试人员对自身的测试能力有过高的估计。测试人员能够检视测试脚本，并且理解测试脚本究竟测试了什么，这是很关键的。好的文档是解决问题的手段之一，对测试脚本全面分析是另外一个手段。由上面两种方法可以引申出其它的相关方法，我曾经在一个项目中使用过引申之后的方法。在测试脚本中插桩，把所有执行的产品相关的命令记录到日志里。这样，当分析日志确定执行了哪些产品命令，命令采用了何种参数配置时，可以提供一个非常好的测试记录，里面记录了自动化测试执行了什么，没有执行什么。如果测试脚本可读性不好，很容易变得过分依赖并没有完全理解的测试脚本，很容易认为测试脚本实际上做的工作比你想象中的还要多。测试套的可读性提高后，可以更容易的开展同行评审活动。 </p><p><strong>可维护性： </strong>在工作中，我曾经使用过一个测试套，它把所有的程序输出保存到文件中。然后，通过对比输出文件内容和一个已有的输出文件内容的差别，可以称已有的输出文件为 “ 标准文件 ” （ “gold file” ）。在回归测试中，用这个方法查找 BUG 是不是明智之举。这种方法太过于敏感了，它会产生很多错误的警告。随着时间的推移，软件开发人员会根据需要修改产品的很多输出信息，这会导致很多自动化测试失败。很明显，为了保证自动化测试的顺利进行，应该在对 “ 标准文件 ” 仔细分析的基础上，根据开发人员修改的产品输出信息对之做相应的修改。比较好的可维护性方法是，每次只检查选定的产品的某些特定输出，而不是对比所有的结果输出。产品的接口变动也会导致原来的测试无法执行或者执行失败。对于 GUI 测试，这是一个更大的挑战。研究由于产品接口变化引起的相关测试修改，并研究使测试修改量最小的方法，测试中采用库是解决问题的方法。当产品发生变化的时候，只需要修改相关的库，保证测试与产品的变动同步修改即可。 </p><p><strong>完整性： </strong>当自动化测试执行后，报告测试执行通过，可以断定这是真的吗？这就是我称之为测试套的完整性。在前面的故事中，当没有对自动化测试完整性给予应有的关注的时候，发生了富有喜剧性的情况。我们应该在多大程度上相信自动化化测试执行结果？自动化测试执行中的误报告警是很大的问题。测试人员特别讨厌由于测试脚本自身的问题或者是测试环境的问题导致测试执行失败，但是，对于自动化测试误报告警的情况，大家往往无能为力。你期望自己设计的测试对 BUG 很敏感、有效，当测试发现异常的时候，能够报告测试执行失败。有的测试框架支持对特殊测试结果的分类方法，分类包括 PASS ， FAIL 和第三种测试结果 NOTRUN 或者 UNRESOLVED 。无论你怎么称呼第三种测试结果，它很好的说明了由于某些测试失败导致其他测试用例无法执行而并非执行失败的情况。得到正确的测试结果是自动化测试完整性定义的一部分，另一部分是能够确认执行成功的测试确确实实已经执行过了。我曾经在一个测试队列中发现一个 BUG ，这个 BUG 引起测试队列中部分测试用例被跳过，没有执行。当测试队列运行完毕后，没有上报任何错误，我不得不通过走读代码的方式发现了这个 BUG 。如果，我没有关注到这个 BUG ，那么可能在认识到自动化测试已经出现问题之前，还在长时间运行部分测试用例。 </p><p><strong>独立性： </strong>采用自动化方法不可能达到和手工测试同样的效果。当写手工测试执行的规程时候，通常假定测试执行将会由一个有头脑、善于思考、具有观察力的测试人员完成的。如果采用自动化，测试执行是由一台不会说话的计算机完成的，你必须告诉计算机什么样的情况下测试执行是失败的，并且需要告诉计算机如何恢复测试场景才能保证测试套可以顺利执行。自动化测试可以作为测试套的一部分或者作为独立的测试执行。测试都需要建立自己所需要的测试执行环境，因此，保证测试执行的独立性是唯一的好方法。手工回归测试通常都相关的指导文档，以便一个接着一个有序地完成测试执行，每个测试执行可以利用前一个测试执行创建的对象或数据记录。手工测试人员可以清楚地把握整个测试过程。在自动化测试中采用上述方法是经常犯的错误，这个错误源于 “ 多米诺骨牌 ” 测试套，当一个测试执行失败，会导致后续一系列测试失败。更糟糕的是，所有的测试关联紧密，无法独立的运行。并且，这使得在自动化测试中分析合法的执行失败结果也困难重重。当出现这种情况后，人们首先开始怀疑自动化测试的价值。自动化测试的独立性要求在自动化测试中增加重复和冗余设计。具有独立性的测试对发现的缺陷的分析有很好的支持。以这种方式设计自动化测试好像是一种低效率的方式，不过，重要的是在不牺牲测试的可靠性的前提下保证测试的独立性，如果测试可以在无需人看守情况下运行，那么测试的执行效率就不是大问题了。 </p><p><strong>可重复性： </strong>自动化测试有时能够发现问题，有时候又无法发现问题，对这种情况实在没有什么好的的处理办法。因此，需要保证每次测试执行的时候，测试是以同样的方式工作。这意味着不要采用随机数据，在通用语言库中构造的随机数据经常隐藏初始化过程，使用这些数据会导致测试每次都以不同的方式执行，这样，对测试执行的失败结果分析是很让人沮丧的。这里有两个使用随机数据发生器的的方法可以避免上述情况。一种方法是使用常量初始化随机数据发生器。如果你打算生成不同种类的测试，需要在可预测，并且可控制的情况下建立不同类型的随机数据发生器。另外一个办法是提前在文件中或数据库中建立生成随机测试数据，然后在测试过程中使用这些数据。这样做看起来似乎很好，但是我却曾经看到过太多违反规则的做法。下面我来解释到底看到了什么。当手动执行测试的时候，往往匆匆忙忙整理文件名和测试数据记录。当对这些测试采用自动化测试方法，该做哪些工作呢？办法之一是，可以为测试中使用的数据记录给固定的命名。如果这些数据记录在测试完成后还要继续使用，那么就需要制定命名规则，避免在不同的测试中命名冲突，采用命名规则是一种很好的方法。然而，我曾经看到有些测试只是随机的命名数据记录，很不幸，事实证明采用这种随机命名的方式不可避免的导致命名冲突，并且影响测试的可重复性。很显然，自动化工程师低估了命名冲突的可能性。下面的情况我遇到过两次，测试数据记录的名字中包含四个随机产生的数字，经过简单的推算如果我们采用这种命名方式的时候，如果测试使用了 46 条记录，会存在 10% 冲突的可能性，如果使用 118 条记录，冲突的几率会达到 50% 。我认为测试当中使用这种随机命名是出于偷懒的想法 —— 避免再次测试之前写代码清除老的数据记录，这样引入了问题，损害了测试的可靠性和测试的完整性。 </p><p><strong>测试库： </strong>自动化测试的一个通用策略是开发可以在不同测试中应用的测试函数库。我曾经看到过很多测试函数库，自己也写了一些。当要求测试不受被测试产品接口变动影响的时候，采用测试库方法是非常有效的。不过，根据我的观察测试库已经使用的太多了，已经被滥用了，并且测试库往往设计的不好，没有相关的文档支撑，因此，使用测试库的测试往往很难开展。当发现问题的时候，往往不知道是测试库自身的问题，还是测试库的使用问题。由于测试库往往很复杂，即便在发现测试库存在问题，相关的维护人员也很不愿意去修改问题。通过前文中的论述，可以得出结论，在一开始就应该保证测试库设计良好。但是，实际情况是测试自动化往往没有花费更多的精力去保证一个优良设计的测试库。我曾经看到有些测试库中的功能根本不再使用了或仅仅使用一次。这与极限编程原则保持一致，即 " 你将不需要它 " 。这会导致在测试用例之间的代码出现一些重复，我发现微小的变化可能仍然存在，很难与测试库功能协调。你可能打算对测试用例作修改，采用源代码的方式比采用库的方式更容易修改。如果有几个测试，他们有某些共同的操作，我使用剪切和粘贴的方式去复制代码，有的人认为我采用的方法不可理喻。这允许我根据需要修改通用代码，我不必一开始尝试和猜测如何重用代码。我认为我的测试是很容易读懂的，因为阅读者不必关心任何测试库的语法。这种办法的优势是很容易理解测试，并且很方便扩展测试套。在开发软件测试项目的时候，大多数程序员找到与他们打算实现功能类似的源代码，并对源代码做修改，而不是从头开始写代码。同样，在写测试套的过程中可以采用上述方法，这也是代码开发方式所鼓励的方法。我比较喜欢写一些规模比较小的测试库，这些库可以被反复的使用。测试库的开发需要在概念阶段充分定义，并且文档化，从始至终都应该保持。我会对测试库作充分的测试后，才在测试中使用这些测试库。采用测试库是对所有面临的情况作权衡的。千万不要打算写一个大而全的测试库，不要希望有朝一日测试人员会利用你的测试库完成大量的测试，这一天恐怕永远不会到来。 </p><p><strong>数据驱动测试： </strong>把测试数据写入到简单表格中，这种测试技术得到了越来越广泛的应用，这种方法被称为表驱动（ table-driven ），数据驱动 (data-driven) 或者 “ 第三代 ” 自动化测试（ "third generation" automation ）。这需要写一个解析器，用来解释表格中的数据，并执行测试。该测试架构的最主要的好处是，它允许把测试内容写在具有一定格式的表格中，这样方便数据设计和数据的检视。如果测试组中有缺少编程经验的业务专家参与测试，采用数据驱动测试方法是很合适的。数据驱动测试的解析器主要是由测试库和上层的少量开发语言写成的代码组成的，所以，上面关于测试库的说明放在这里是同样合适的。在针对上面提到的少量代码的设计、开发、测试的工作，还存在各种困难。代码所采用的编程语言是不断发展的。也许，测试人员认为他们需要把第一部分测试的输出作为第二部分测试的输入，这样，加入了新的变量。接下来，也许有人需要让测试中的某个环节运行一百次，这样加入一个循环。你可以采用其他语言，不过，如果你预料到会面临上述情况的时候，那么做好采用一些能够通过公开的渠道获取的编程语言，比如 Perl,Python 或者 TCL ，这样比设计你自己的语言要快的多。 </p><p><strong>启发式确认： </strong>我曾经看到很多测试自动化没有真正意义上的结果校验，其原因有两个，一个原因是做完全意义上的自动化测试结果确认从技术上讲是很困难的，另外一个原因是通过测试设计规格很难找出自动化测试的预期结果。这很不幸。不过，采用手工校验测试结果的方法是真正意义上的测试校验。标准文件（ Gold file ）是另外一中校验测试结果的方法。首先，捕获被测试程序的输出，并检视程序的输出，然后，把输出信息文档化，并归档，作为标准文件。以后，自动化测试结果与标准文件作比较，从而达到结果校验的目的。采用标准文件的方法，也有弊端。当产品发生变化，自动化测试的环境配置发生变化，产品的输出发生变化的时候，采用标准文方法，会上报大量的误报告警。做好的测试结果校验方法是，对输出结果的特定内容作分析，并作合理的比较。有时候，很难知道正确的输出结果是什么样的，但是你应该知道错误的输出结果是什么样的。开展启发式的结果校验是很有帮助的。我猜想一些人在自动化测试中设计了大而全的测试结果校验方法，是因为担心如果结果校验漏掉了任何信息，可能导致自动化测试自身出现错误。不过，我们在测试过程中往往采用折衷的做法，没有采用大而全的测试结果校验方法，这样就不得不面对少量漏测情况的出现的风险。自动化测试不能改变这种情况的出现。如果自动化工程师不习惯采用这种折衷的方法，那么他必须找相关人员咨询，寻找一种合适的测试结果校验策略，这需要有很大的创造性。目前有很多技术可以保证在不产生误报告警的情况下，找到被测试产品的缺陷。 </p><p><a name="deployment"></a>把注意力放在通过设计保证测试的可延续性上，选择一个合适的测试体系架构，你将进一步迈向成功的自动化测试。 </p><p>步骤六：有计划的部署 </p><p>在前面的故事中，当自动化工程师没有提供打包后的自动化测试程序给测试执行人员，会影响到测试执行，测试执行人员不得不反过来求助自动化工程师指出如何使用自动化测试程序。 </p><p>作为自动化工程师，你知道如何利用自动化方法执行测试和分析执行失败的结果。不过，测试执行人员却未必知道如何使用自动化测试。因此，需要提供自动化测试程序的安装文档和使用文档，保证自动化测试程序容易安装和配置。当安装的环境与安装的要求不匹配，出现安装错误的时候，能够给出有价值的提示信息，便于定位安装问题。 </p><p>能够把自动化测试程序和测试套作为产品对待，那真是太好了。你应该对自动化测试程序和测试套开展测试，保证它们不依赖于任何专用的库或者是设备上的任何其他程序。 </p><p>保证其他测试人员能够随时利用已经提供的自动化测试程序和测试套开展测试工作；保证自动化测试是符合一般测试执行人员的思维习惯的；保证测试执行人员能够理解测试结果，并能够正确分析失败的测试执行结果；这需要自动化工程师提供自动动化测试相关的指导性文档和培训。 </p><p>作为测试管理者，你希望在自动化工程师离开前，能够识别并修改测试套中的所有问题。自动化工程师迟早会离开的，如果你没有及时的把测试套中的问题提出来，就会面临废弃已有的测试套的决定。 </p><p>良好的测试套有多方面的用处。良好的测试套支持对产品新版本的测试；良好的测试套在新的软件平台上可以很方便的验证产品的功能；良好的测试套支持每天晚上开始的软件每日构造过程；甚至开发人员在代码 check in 之前，用良好的测试套验证代码的正确性。 </p><p>测试套的共享也很重要。很难预见以后什么人会继续使用你开发的测试套。因此，尽量让产品开发测试团队中的成员都很容易获得你的测试套。可以把测试套放在公司的内部网络上，这是个很好的办法。这样，大家就不必为了获取一份需要的测试套而四处打听。有些人总是感觉自己的测试套还没有最终完工或者不够完美，而没有拿出来与人分享，这种做法一定要改变，共享出来的测试套不一定非常完美，共享才是关键。 </p><p><a name="challenges"></a>有计划的自动化测试部署，保证你的测试套能够被产品相关人员获取到，你就向成功的自动化测试又迈进了一步。并且你的自动化测试会被一次又一次的重用。 </p><p>步骤七：面对成功的挑战 </p><p>当你完成了所有的事情，测试套已经文档化了，并且文档已经交付了。测试执行人员能够理解要开展的测试，并知道如何完成测试执行。随着你所负责产品的进一步开发和维护，测试被反复重用。虽然，在自动化使测试变简单的同时，也总是使测试过程复杂化。测试人员需要学习如何诊断自动化测试执行失败的情况，如果不这样做，测试执行人员会认为执行失败的情况是由自动化引起，然后，自动化工程师被叫过来帮助诊断每一个执行失败的情况，开发人员往往也会认为执行失败是由于自动化测试自身引起的问题，这样，测试执行人员就不得不学习通过手工的方式，或者通过采用少量脚本的方式重现自动化测试发现的问题，以证明他们确实发现了产品当中的 BUG 。 </p><p>测试套的相关工作还没有结束，为了提高测试覆盖率或者测试新的产品特性，需要增加更多的测试。如果已有的测试不能正常工作，那么需要对之修改；如果已有的测试是冗余的，那么需要删除这部分测试。 </p><p>随着时间的推移，开发人员也会研究你设计的测试，改进产品的设计并且通过模拟你的测试过程对产品做初步测试，研究如何使产品在第一次测试就通过，这样，你设计的测试很可能无法继续发现新的问题，这种现象被称为一种杀虫剂悖论。这时候，会有人对你的测试有效性提出质疑，那么，你必须考虑是否应该挖掘更严格的测试，以便能够发现开发人员优化之后的产品中的缺陷。 </p><p>以前，我提到过一个基本上无法实现的设想，设想通过按下一个按钮就完成了所有的测试工作。自动化测试是不是全能的，手工测试是永远无法完全替代的。 </p><p>有些测试受测试环境的影响很大，往往需要采用人工方法获取测试结果，分析测试结果。因此，很难在预先知道设计的测试用例有多大的重用性。自动化测试还需要考虑成本问题，因此，千万不要陷入到一切测试都采用自动化方法的错误观念中。 </p><p>我曾经主张保证给与测试自动化持续不断的投入。但是，在开展自动化测试的时候，一个问题摆在面前，测试自动化应该及时的提供给测试执行人员，这个不成问题，但是如何保证需求变更后，能够及时提供更新后的自动化测试就是个大问题了。如果自动化测试与需求变更无法同步，那么自动化测试的效果就无法保证了，测试人员就不愿意花费时间学习如何使用新的测试工具和如何诊断测试工具上报的错误。识别项目计划中的软件发布日期，然后把这个日期作为里程碑，并计划达到这个里程碑。当达到这个里程碑后，自动化工程师应该做什么呢？如果自动化工程师关注当前产品版本的发布，他需要为测试执行人员提供帮助和咨询，但是，一旦测试执行人员知道如何使用自动化测试，自动化测试工程师可以考虑下一个版本的测试自动化工作，包括改进测试工具和相关的库。当开发人员开始设计产品下一个版本中的新特性的时候，如果考虑了自动化测试需求，那么自动化测试师的设计工作就很好开展了，采用这种方法，自动化测试工程师可以保持与开发周期同步，而不是与测试周期同步。如果不采用这种方式，在产品版本升级的过程中，自动化测试无法得到进一步的改进。 </p><p>持续在在自动化投入，你会面临成功的挑战，当自动化测试成为测试过程可靠的基础后，自动化测试的道路将会越来越平坦。 </p><p><a name="references"></a>参考文献： </p><p>Bach, James. 1996. “Test Automation Snake Oil.” <em>Windows Technical Journal </em>, (October): 40-44. <a href="http://www.satisfice.com/articles/test_automation_snake_oil.pdf"><font color="#000000" size="2">http://www.satisfice.com/articles/test_automation_snake_oil.pdf </font></a></p><p>Dustin, Elfriede. 1999. “Lessons in Test Automation.” <em>Software Testing and Quality Engineering </em>(September): 16-22. <br /><a href="http://www.stickyminds.com/sitewide.asp?ObjectId=1802&amp;ObjectType=ART&amp;Function=edetail"><font color="#000000" size="2">http://www.stickyminds.com/sitewide.asp?ObjectId=1802&amp;ObjectType=ART&amp;Function=edetail </font></a></p><p>Fewster, Mark and Dorothy Graham. 1999. <em>Software Test Automation </em>, Addison-Wesley. </p><p>Groder, Chip. “Building Maintainable GUI Tests” in [Fewster 1999]. </p><p>Kit, Edward. 1999. “Integrated, Effective Test Design and Automation.” <em>Software Development </em>(February). <a href="http://www.sdmagazine.com/articles/1999/9902/9902b/9902b.htm"><font color="#000000" size="2">http://www.sdmagazine.com/articles/1999/9902/9902b/9902b.htm </font></a></p><p>Hancock, Jim. 1997 “When to Automate Testing.” <em>Testers Network </em>(June). <br /><a href="http://www.data-dimensions.com/Testers'Network/jimauto1.htm"><font color="#000000" size="2">http://www.data-dimensions.com/Testers'Network/jimauto1.htm </font></a></p><p>Hendrickson, Elisabeth. 1999. “Making the Right Choice: The Features you Need in a GUI Test Automation Tool.” <em>Software Testing and Quality Engineering Magazine </em>(May): 21-25. <a href="http://www.qualitytree.com/feature/mtrc.pdf"><font color="#000000" size="2">http://www.qualitytree.com/feature/mtrc.pdf </font></a></p><p>Hoffman, Douglas. 1999. “Heuristic Test Oracles: The Balance Between Exhaustive Comparison and No Comparison at All.” <em>Software Testing and Quality Engineering Magazine </em>(March): 29-32. </p><p>Kaner, Cem. 1997. “Improving the Maintainability of Automated Test Suites.” Presented at Quality Week. <a href="http://www.kaner.com/lawst1.htm"><font color="#000000" size="2">http://www.kaner.com/lawst1.htm </font></a></p><p>Linz , Tilo and Matthias Daigl. 1998. “How to Automate Testing of Graphical User Interfaces.” European Systems and Software Initiative Project No. 24306 (June). <a href="http://www.imbus.de/html/GUI/AQUIS-full_paper-1.3.html"><font color="#000000" size="2">http://www.imbus.de/html/GUI/AQUIS-full_paper-1.3.html </font></a></p><p>Jeffries, Ronald E., 1997, “XPractices,” <br /><a href="http://www.xprogramming.com/Practices/xpractices.htm"><font color="#000000" size="2">http://www.XProgramming.com/Practices/xpractices.htm </font></a></p><p>Marick, Brian. 1998. “When Should a Test Be Automated?” Presented at Quality Week. <a href="http://www.testing.com/writings/automate.pdf"><font color="#000000" size="2">http://www.testing.com/writings/automate.pdf </font></a></p><p>Marick, Brian. 1997. “Classic Testing Mistakes.” Presented at STAR. <a href="http://www.testing.com/writings/classic/mistakes.html"><font color="#000000" size="2">http://www.testing.com/writings/classic/mistakes.html </font></a></p><p>Pettichord, Bret. 1996. “Success with Test Automation.” Presented at Quality Week (May). <a href="http://www.io.com/~wazmo/succpap.htm"><font color="#000000" size="2">http://www.io.com/~wazmo/succpap.htm </font></a></p><p>Thomson, Jim. “A Test Automation Journey” in [Fewster 1999] </p><p>Weinberg, Gerald M. 1992. <em>Quality Software Management: Systems Thinking </em>. Vol 1. Dorset House. </p></div></td></tr></tbody></table></strong>
		</span>
<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20576.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:16 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20576.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/20575.html</link><dc:creator>szdlinxie</dc:creator><author>szdlinxie</author><pubDate>Fri, 15 Dec 2006 13:15:00 GMT</pubDate><guid>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20575.html</guid><wfw:comment>http://www.cnitblog.com/szdlinxie/comments/20575.html</wfw:comment><comments>http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/szdlinxie/comments/commentRss/20575.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/szdlinxie/services/trackbacks/20575.html</trackback:ping><description><![CDATA[软件测试自动化的意义<br /><br />软件测试的工作量很大，据统计，测试时间会占到总开发时间的40%，一些可靠性要求非常高的软件，测试时间甚至占到总开发时间的60%。但测试却是在整个软件过程中极有可能应用计算机进行自动化的工作，原因是测试的许多操作是重复性的、非智力创造性的、需要细致注意力的工作，而计算机就最适合于代替人类去完成这些任务。<br />　　测试自动化是通过开发和使用一些工具自动测试软件系统，特别适合于测试中重复而繁琐的活动，其好处是显而易见的：<br />　　（1） 可以使某些测试任务比手工测试执行的效率高，并可以运行更多更频繁的测试。<br />　　（2） 对程序的新版本可以自动运行已有的测试，特别是在频繁的修改许多程序的环境中，一系列回归测试的开销应是最小的。<br />　　（3） 可以执行一些手工测试困难或不可能做的测试，例如对于200个用户的联机系统，用手工进行并发操作的测试几乎是不可能的，但自动测试工具可以模拟来自200个用户的输入。客户端用户通过定义可以自动回放的测试，随时都可以运行用户脚本，即使是不了解整个商业应用复杂内容的技术人员也可以胜任。<br />　　（4） 更好地利用资源。将繁琐的任务自动化，如重复输入相同的测试输入，可以提高准确性和测试人员的积极性，将测试技术人员解脱出来投入更多精力设计更好的测试用例。另外，可以利用整夜或周末空闲的机器执行自动测试。<br />　　（5） 测试具有一致性和可重复性。对于自动重复的测试可以重复多次相同的测试，如不同的硬件配置、使用不同的操作系统或数据库等，从而获得测试的一致性，这在手工测试中是很难保证的。<br />　　（6） 测试可以重用，而且软件经过自动测试后，人们对其信任度会增加。<br />　　（7） 一旦一系列测试已经被自动化，则可以更快地重复执行，从而缩短了测试时间，使软件更快地推向市场。<img src ="http://www.cnitblog.com/szdlinxie/aggbug/20575.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:15 <a href="http://www.cnitblog.com/szdlinxie/archive/2006/12/15/20575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>