<?xml version="1.0" encoding="utf-8" ?>
<!-- generator="FEEDCREATOR_VERSION" -->
<rss version="2.0" xmlns:sns="http://blog.sina.com.cn/sns">
    <channel>
        <title>前行的BLOG</title>
        <description></description>
        <link>http://blog.sina.com.cn/eric198286</link>
        <lastBuildDate>Sat, 11 Oct 2008 23:08:13 GMT+8</lastBuildDate>
        <generator>FEEDCREATOR_VERSION</generator>
        <language>zh-cn</language>
        <copyright>Copyright 1996 - 2008 SINA Inc. All Rights Reserved.</copyright>
        <pubDate>Sat, 11 Oct 2008 15:08:13 GMT+8</pubDate>
        <item>
            <title>你的考评是否打了水漂？</title>
            <link>http://blog.sina.com.cn/s/blog_4fb435350100824q.html</link>
            <description><![CDATA[<div STYLE="TEXT-INDENT: 2em">
每个公司都有考评：季度的，年度的，项目的，个人能力的。每个主管都会想尽办法的去不断完善自己的考评天平，让它公平、公正、全面、却又不失针对性。最常见的做法，主管先定制一个通用模板，然后收集手下每个人的自定目标，双方详谈后定制出一份针对个人的考评方案。至于个人技能水平的考评，那就五花八门了。最常见的就是罗列出本行业在当前公司所需的所有技能，分类、细化、给出评判标准。但是考评时，我想基本上不会有公司会组织大家来考一次试，由此来决定个人技能的等级。一般都是从个人的平时工作内容，完成情况来做个大致估计。</DIV>
<div STYLE="TEXT-INDENT: 2em">
说到这，我的本意不是要讨论如何去考评，而是针对考评本身这个事情，有点想法。个人技能的考评结束了，费时费力的做了这么多，除了给提升某人的职级，薪水涨了，我们到底还有多少地方会用到这个考评的结果？大多数主管在分配任务的时候，不否认的会有技能储备的考量，但是有多少主管在分配任务时会拿出每个人的技能考评结果，针对每个人（注意：是每个人）的弱项去有计划的安排工作？我想很多主管都是凭主观感觉，凭自己对手下人的了解去分配任务的吧，或者对于几个自己比较关注的人，去有意识的分配工作，提升他们的技能。但是有几个主管能清楚的说出自己手下的人平时在学些什么，会些什么，掌握的程度如何？我想大多数的技术人员都不是那么的积极主动的来承担任务，就算自己掌握的比所有人好，很多人还是愿意保持沉默。各种各样的原因，造成主管认知上的盲区。</DIV>
<div STYLE="TEXT-INDENT: 2em">
本来还想说点什么，但是粗略读了下，感觉很乱，算了，个人表达太差了,就此打住，免得越说越糊。当然也许想法有些偏颇，但是见人见智，大家笑笑了之吧。</DIV>
<div STYLE="TEXT-INDENT: 2em">
总结一句话：别让考评打水漂。</DIV>]]></description>
            <author>前行</author>
            <category>测试管理</category>
            <comments>http://blog.sina.com.cn/s/blog_4fb435350100824q.html#comment</comments>
            <pubDate>Thu, 13 Dec 2007 06:16:13 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_4fb435350100824q.html</guid>
        </item>
        <item>
            <title>数据分析过程中常用的几个Excel函数</title>
            <link>http://blog.sina.com.cn/s/blog_4fb4353501000b0h.html</link>
            <description><![CDATA[<div><font STYLE="FONT-SIZE: 20px" COLOR="#0000CC"><strong><a HREF="file:///D:/Program%20Files/SUPERC~1/Save/Image1690.JPG" TARGET="_blank"></A><a HREF="file:///D:/Program%20Files/SUPERC~1/Save/Image1690.JPG" TARGET="_blank"></A><a HREF="file:///D:/Program%20Files/SUPERC~1/Save/Image1690.JPG" TARGET="_blank"></A>1.PERCENTILE</STRONG></FONT></DIV>
<div><font STYLE="FONT-SIZE: 12px">之所以会提到这个函数，是因为在LR中有个90％响应时间的概念。在测试过程中，假设总共有100个请求被响应，其中最小响应时间为0.02秒，最大响应时间为110秒，平均事务响应时间为4.7秒，你会不会想到最小和最大响应时间如此大的偏差是否会导致平均值本身并不可信？因此，这种情况下，单纯的求数据的平均值显得没有任何意义。</FONT></DIV>
<div>
<hr></HR></DIV>
<div><font STYLE="FONT-SIZE: 12px">以下引用一位达人的解释：</FONT></DIV>
<div><font STYLE="FONT-SIZE: 12px">我们先来看一张表：</FONT></DIV>
<div><img HEIGHT="66" ALT="" SRC="http://www.uml.org.cn/Test/images/2_200705151157341.jpg" WIDTH="489" BORDER="0"></IMG><br/>
<font STYLE="FONT-SIZE: 12px"><strong>CmdID</STRONG><br/>
测试时被请求的页面<br/>
<strong>NUM</STRONG><br/>
响应成功的请求数量<br/>
<strong>MEAN</STRONG><br/>
所有成功的请求的响应时间的平均值<br/>
<strong>STD DEV</STRONG><br/>
标准差（这个值的作用将在下一篇文章中重点介绍）<br/>
<strong>MIN</STRONG><br/>
响应时间的最小值<br/>
<strong>50 th(60/70/80/90/95 th)</STRONG><br/>
如果把响应时间从小到大顺序排序，那么50％的请求的响应时间在这个范围之内。后面的60/70/80/90/95
th 也是同样的含义<br/>
<strong>MAX</STRONG><br/>
响应时间的最大值<br/>
我想看完了上面的这个表和各列的解释，不用多说大家也可以明白我的意思了。我把结论性的东西整理一下：<br/>

1. 从上面的表中来看，对于Home
Page来说，平均事务响应时间(MEAN)只同70％用户响应时间相一致。也就是说假如我们确定Home
Page的响应时间应该在5秒内，那么从平均事务响应时间来看是满足的，但是实际上有10-20％的用户请求的响应时间是大于这个值的；对于Page
1也是一样，假如我们确定对于Page 1
的请求应该在3秒内得到响应，虽然平均事务响应时间是满足要求的，但是实际上有20-30％的用户请求的响应时间是超过了我们的要求的；<br/>

2. 你可以在95 th之后继续添加96/ 97/ 98/ 99/ 99.9/ 99.99
th，并利用Excel的图表功能画一条曲线，来更加清晰表现出系统响应时间的分布情况。这时候你也许会发现，那个最大值的出现几率只不过是千分之一甚至万分之一，而且99％的用户请求的响应时间都是在性能需求所定义的范围之内的；</FONT></DIV>
<div>
<hr></HR></DIV>
<div><font STYLE="FONT-SIZE: 12px">有了上面的解释，想必大家也应该知道如何去运用这个函数去分析我们的测试数据了～</FONT></DIV>
<div><font STYLE="FONT-SIZE: 12px">关于PERCENTILE函数的计算公式如下：</FONT></DIV>
<div><font STYLE="FONT-SIZE: 12px">设一个序列供有n个数，要求（k%）的Percentile：&nbsp;<br/>

（1）从小到大排序，求(n-1)*k%，记整数部分为i，小数部分为j&nbsp;<br/>

（2）所求结果＝（1－j）*第(i＋1)个数＋j*第(i+2)个数</FONT></DIV>
<div>&nbsp;</DIV>
<div><font STYLE="FONT-SIZE: 12px">例：（注意一定要先从小到大排序的，这里已经排过序啦！）&nbsp;<br/>

｛1，3，4，5，6，7，8，9，19，29，39，49，59，69，79，80｝共16个样本&nbsp;<br/>

&nbsp;<br/>
（1）30%：(16-1)*30%=4.5=4+0.5&nbsp;<br/>
&nbsp;(1-0.5)*第5个数＋0.5*第6个数=0.5*6+0.5*7=6.5&nbsp;<br/>

&nbsp;<br/>
（2）75%：15*75%=11.25=11+0.25&nbsp;（3rd&nbsp;Quartile)&nbsp;<br/>

&nbsp;(1-0.25)*第12个数+0.25*第13个数=0.75*59+0.25*69＝51.5&nbsp;<br/>
</FONT></DIV>
<div><font STYLE="FONT-SIZE: 20px" COLOR="#0000CC"><strong>2.FREQUENCY</STRONG></FONT></DIV>
<div><font STYLE="FONT-SIZE: 12px">&nbsp;该函数可以很容易的统计出一列数据中，各个数据段之间的数据个数，为生成图表提供便利。</FONT></DIV>
<div><img SRC="http://album.sina.com.cn/pic_2/4fb4353543ef503e81f31"></IMG></DIV>
<div><font STYLE="FONT-SIZE: 12px">&nbsp;以上图为例，为了统计各个分数段的成绩个数，先在C2格插入公式=FREQUENCY(A2:A11,B2:B4)
，然后选中C2~C4这3个单元格，按下F2键，再同时按Ctrl+Shift+Enter这三个键，就可以在C2～C4中插入数组公式<font COLOR="#FF0000">={FREQUENCY(A2:A11,B2:B4)}</FONT>了(注意左右大括号必须是系统自动生成的，手输入是无效的)。C2格表示≤60分的成绩个数，C3表示＞60且≤85的成绩个数，C4表示＞85且≤100的成绩个数。</FONT><font STYLE="FONT-SIZE: 20px" COLOR="#0000CC"><strong><a HREF="file:///D:/Program%20Files/SUPERC~1/Save/Image1690.JPG" TARGET="_blank"></A></STRONG></FONT><font STYLE="FONT-SIZE: 20px" COLOR="#0000CC"><strong><a HREF="file:///D:/Program%20Files/SUPERC~1/Save/Image1690.JPG" TARGET="_blank"></A></STRONG></FONT><a HREF="file:///D:/Program%20Files/SUPERC~1/Save/Image1690.JPG" TARGET="_blank"></A></DIV>
<div><font STYLE="FONT-SIZE: 20px" COLOR="#0000CC"><strong>3.QUARTILE</STRONG></FONT></DIV>
<div><font STYLE="FONT-SIZE: 12px">这个函数在使用意义上一定程度上等同于PERCENTILE，再次不做多说，只对他的计算方法做个介绍：</FONT></DIV>
<div><font STYLE="FONT-SIZE: 12px">Quartile（四分位数）：&nbsp;<br/>
&nbsp;<br/>
第0个Quartile实际为通常所说的最小值（MINimum）&nbsp;<br/>

第1个Quartile（En：1st&nbsp;Quartile）&nbsp;<br/>

第2个Quartile实际为通常所说的中分位数（中数、二分位分、中位数：Median）&nbsp;<br/>

第3个Quartile（En：3rd&nbsp;Quartile）&nbsp;<br/>

第4个Quartile实际为通常所说的最大值（MAXimum)&nbsp;<br/>

&nbsp;<br/>
我想大家除了对1st、3rd&nbsp;Quartile不了解外，对其他几个&nbsp;<br/>

统计量的求法都是比较熟悉的了，而求1st、3rd是比较&nbsp;<br/>

麻烦的，下面以求1rd为例:&nbsp;<br/>
&nbsp;<br/>
设样本数为n（即共有n个数），可以按下列步骤求1st&nbsp;Quartile：&nbsp;<br/>

（1）将n个数从小到大排列，求(n-1)/4，设商为i，余数为j&nbsp;<br/>

（2）则可求得1st&nbsp;Quartile为：(第i+1个数)*(4-j)/4+(第i+2个数)*j/4&nbsp;<br/>

&nbsp;<br/>
例（已经排过序啦！）：&nbsp;<br/>
1.设序列为{5}，只有一个样本则：(1-1)/4&nbsp;商0，余数0&nbsp;<br/>

&nbsp;1st=第1个数*4/4+第2个数*0/4=5&nbsp;<br/>

2.设序列为{1,4}，有两个样本则：(2-1)/4&nbsp;商0，余数1&nbsp;<br/>

&nbsp;1st=第1个数*3/4+第2个数*1/4=1.75&nbsp;<br/>

3.设序列为{1,5,7}，有三个样本则：(3-1)/4&nbsp;商0，余数2&nbsp;<br/>

&nbsp;1st=第1个数*2/4+第2个数*2/4=3&nbsp;<br/>

4.设序列为{1,3,6,10}，四个样本：(4-1)/4&nbsp;商0，余数2&nbsp;<br/>

&nbsp;1st=第1个数*1/4+第2个数*3/4=2.5&nbsp;<br/>

5.其他类推！&nbsp;<br/>
&nbsp;<br/>
因为3rd与1rd的位置对称，这是可以将序列从大到小排（即倒过来排），&nbsp;<br/>

再用1rd的公式即可求得：&nbsp;<br/>
例（各序列同上各列，只是逆排）：&nbsp;<br/>
1.序列{5}，3rd=5&nbsp;<br/>
2.{4,1}，3rd=4*3/4+1*1/4=3.25&nbsp;<br/>
3.{7,5,1}，3rd=7*2/4+5*2/4=6&nbsp;<br/>
4.{10,6,3,1}，3rd=10*1/4+6*3/4=7&nbsp;</FONT></DIV>
]]></description>
            <author>前行</author>
            <category>性能测试</category>
            <comments>http://blog.sina.com.cn/s/blog_4fb4353501000b0h.html#comment</comments>
            <pubDate>Thu, 15 Nov 2007 09:57:08 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_4fb4353501000b0h.html</guid>
        </item>
        <item>
            <title>【转】【翻译】User experience, not metrics系列 第三章（2）</title>
            <link>http://blog.sina.com.cn/s/blog_4fb4353501000azp.html</link>
            <description><![CDATA[<div>&nbsp;
<h1><span STYLE="FONT-SIZE: 18pt">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
练习</SPAN></H1>
<p>
<span>为了证明以上提到</SPAN><span>3</SPAN><span>种方法的简单和有效，下面以</SPAN><span>www.wmata.com</SPAN><span>站点（华盛顿市区交通运输的权威站点）为例，来创建用户使用模式的模型。选择这个网站的原因是它具备示例论证所需的各种条件属性，同时你不需要购买或注册任何东西，我也不需要考虑版权问题等。当然，如果你是为网站的所有者测试的话，就不会有这个问题了。你也可以在你喜欢的、含有弹出窗口的静态站点上验证这些方法。</SPAN></P>
<p>
<span>在开始讲解之前，首先我假定你已经掌握了如何录制、回放</SPAN><span>VU</SPAN><span>脚本，如何在录制过程中插入</SPAN><span>Timer</SPAN><span>，以及如何用</SPAN><span>TestManager</SPAN><span>创建脚本套件。同时我也假定你已经阅读了本文的第</SPAN><span>2</SPAN><span>章，因此我会省去有关用户延迟时间方面的内容。下面的练习只需用</SPAN><span>1</SPAN><span>个用户，某些情况下只需</SPAN><span>2</SPAN><span>个用户就可以进行测试了。因此别对</SPAN><span><a HREF="http://www.wmata.com/">www.wmata.com</A></SPAN><span>网站施加大用户量的测试，否则你会被认为是恶意攻击并承担刑事责任，有言在先，我是不会承担任何责任的。</SPAN></P>
<p>
<span>假设通过直觉我们确定用户使用模式如图</SPAN><span>7</SPAN><span>所示。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 103px" HEIGHT="127" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-7.JPG" WIDTH="612" BORDER="0"></IMG></P>
<p><span>图</SPAN><span>7
WMATA</SPAN><span>网站上的用户路径</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">3.1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
全路径脚本方法练习</SPAN></H2>
<p>
<span>使用全路径脚本方法来模拟用户路径，我们需要如图</SPAN><span>8</SPAN><span>的两个脚本。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 151px" HEIGHT="201" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-8.JPG" WIDTH="664" BORDER="0"></IMG></P>
<p><span>图</SPAN><span>8</SPAN>
<span>代表</SPAN><span>WMATA</SPAN><span>用户路径的全路径脚本</SPAN></P>
<p>
<span>我们将通过点击适当的链接，添加注释、</SPAN><span>Timer</SPAN><span>、延迟等来录制这两个浏览路径，与第</SPAN><span>2</SPAN><span>章介绍的方法一样。</SPAN></P>
<p><span>对于上面两个路径中的</SPAN><span>Plan a
Trip</SPAN><span>路径的脚本录制，我们的旅途将从</SPAN><span>Vienna</SPAN><span>地铁站到</SPAN><span>Smithsonian</SPAN><span>地铁站，中间经过多个著名的博物馆。请按下面的步骤：</SPAN></P>
<ul>
<li><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>从主页开始录制</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击屏幕右侧的</SPAN><span>Riding
Metro</SPAN><span>部分的系统地图链接</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>在橙色线路中点击最左边的车站，</SPAN><span>Vienna</SPAN><span>车站</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击右边的</SPAN><span>Riding
Metro</SPAN><span>中的</SPAN><span>Stations</SPAN><span>下拉框</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l&nbsp;&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><span>点击</SPAN><span>Smithsonian</SPAN><span>车站</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN><span>停止录制</SPAN></LI>
</UL>
<p><span>对于</SPAN><span>View General
Information</SPAN><span>脚本，按以下步骤录制：</SPAN></P>
<ul>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>从主页开始录制</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击屏幕右方的</SPAN><span>About Metro</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击</SPAN><span>Metro Police</SPAN><span>链接</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击右边的</SPAN><span>Metro
B2B</SPAN><span>中的</SPAN><span>Solicitation/awards</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>停止录制</SPAN></LI>
</UL>
<p>
<span>现在我们可以在</SPAN><span>TestManager</SPAN><span>创建测试套件来执行这个场景了。点击</SPAN><span>Suites
&gt; New Suite &gt; Blank Performance Testing
Suite</SPAN><span>来创建测试套件，接着通过</SPAN><span>User Groups
&gt; Insert &gt; User
Group</SPAN><span>创建</SPAN><span>2</SPAN><span>个用户组，分别设置</SPAN><span>60</SPAN><span>％和</SPAN><span>40</SPAN><span>％的用户比例，在用户组的右键菜单中通过</SPAN><span>Insert
&gt; Test
Script</SPAN><span>插入相应的脚本。如图</SPAN><span>9</SPAN><span>所示。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 190px" HEIGHT="206" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-9.JPG" WIDTH="542" BORDER="0"></IMG></P>
<p><span>图</SPAN><span>9</SPAN>
<span>用于执行</SPAN><span>WMATA</SPAN><span>全路径脚本的测试套件</SPAN></P>
<p><span>是不是很简单呢？好，我们继续吧。</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">3.2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
路径片段方法练习</SPAN></H2>
<p>
<span>在这个练习里，我们将录制</SPAN><span>3</SPAN><span>个分割脚本，如图</SPAN><span>10</SPAN><span>所示。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 131px" HEIGHT="158" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-10.JPG" WIDTH="602" BORDER="0"></IMG>&nbsp;</P>
<p><span>图</SPAN><span>10</SPAN>
<span>代表</SPAN><span>WMATA</SPAN><span>用户路径的分割脚本</SPAN></P>
<p><span>这种方法也非常的简单。我们在一个</SPAN><span>Record
Session</SPAN><span>中录制</SPAN><span>Home
Seg</SPAN><span>和</SPAN><span>Plan a Trip
Seg</SPAN><span>脚本，在另外的</SPAN><span>Record
Session</SPAN><span>中录制</SPAN><span>View General Info
Seg</SPAN><span>脚本，然后再插入和上一个练习一样的注释、</SPAN><span>Timer</SPAN><span>、延迟等。</SPAN></P>
<p>
<span>首先录制打开主页的操作，通过选择</SPAN><span>Robot</SPAN><span>工具菜单</SPAN><span>Record
&gt; Split
Script</SPAN><span>，或者浮动工具栏上的</SPAN><span>Insert Toolbar
&gt; Split
Script</SPAN><span>按钮来分割脚本，并保存为</SPAN><span>Home
Seg</SPAN><span>。接下来继续录制下一段脚本，步骤如下：</SPAN></P>
<ul>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击</SPAN><span>System map</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击</SPAN><span>Vienna Stop</SPAN></LI>
<li><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击</SPAN><span>Stations</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击</SPAN><span>Smithsonian Stop</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>停止录制，保存为</SPAN><span>Plan a Trip Seg</SPAN></LI>
</UL>
<p><span>View General Info
Seg</SPAN><span>脚本可以有不同的录制方式：</SPAN><span>Network</SPAN><span>或</SPAN><span>API</SPAN><span>（这方面的讨论超出了本文的讨论范围，如果有需要的话可以查看其帮助手册）。在</SPAN><span>API</SPAN><span>的录制方式中，开始录制打开主页然后再分割脚本并随便保存成某个名字，因为我们并不需要这个脚本。接下来的录制：</SPAN></P>
<ul>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击</SPAN><span>About Metro</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击</SPAN><span>Metro police</SPAN><span>链接</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>点击</SPAN><span>Solicitations/awards</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>停止录制并保存为</SPAN><span>View General Info
Seg</SPAN></LI>
</UL>
<p>
<span>如果是以</SPAN><span>Network</SPAN><span>方式录制的话，我们可以在脚本录制之前先访问主页，在开始真正的操作之前才激活录制功能，然后再用和上面一样的步骤进行录制，这样就不必录制一些无用的脚本了。</SPAN></P>
<p>
<span>接着用前面介绍的方法创建一个执行脚本的测试套件，如图</SPAN><span>11</SPAN><span>所示。我们还可以先把脚本加到</SPAN><span>scenario</SPAN><span>中，再把</SPAN><span>scenario</SPAN><span>加到用户组中（图</SPAN><span>5</SPAN><span>就是这种方式的，可以参考）。但其实这两种方式都是一样的。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 235px" HEIGHT="255" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-11.JPG" WIDTH="541" BORDER="0"></IMG></P>
<p>
<span>图</SPAN><span>11</SPAN><span>用于执行</SPAN><span>WMATA</SPAN><span>分割脚本的测试套件</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">3.3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
灵活脚本方法练习</SPAN></H2>
<p>
<span>如果你已经在做这个练习，或曾经访问这个网站的话，你可能会发现在</SPAN><span>WMATA</SPAN><span>网站的</SPAN><span>Plan
a Trip
path</SPAN><span>的最后一页上，有一个关于地铁站之间行程价格和时间的链接。出于好奇心你可能点击来看看。我们把这个可选的路径加到</SPAN><span>Plan
a
Trip</SPAN><span>的脚本中，并假设其中</SPAN><span>50</SPAN><span>％的用户会关心行程的价格和时间的问题，如图</SPAN><span>12</SPAN><span>所示。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 108px" HEIGHT="134" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-12.JPG" WIDTH="615" BORDER="0"></IMG></P>
<p><span>图</SPAN><span>12</SPAN>
<span>添加了可选路径的</SPAN><span>WMATA</SPAN><span>用户路径</SPAN></P>
<p><span>出于练习方面的考虑，我们重点关注</SPAN><span>Plan a
Trip</SPAN><span>部分的模拟。我们先录制一个包含了</SPAN><span>Fares
and
Times</SPAN><span>部分的脚本。这里使用的是全路径脚本方式，虽然也可以用脚本片段方式。</SPAN></P>
<p>
<span>第一部分的脚本，可以用和前面一样的步骤。录制打开主页（</SPAN><span>www.wmata.com</SPAN><span>），点击</SPAN><span>System
map</SPAN><span>，点击</SPAN><span>Vienna
stop</SPAN><span>，点击</SPAN><span>Stations</SPAN><span>，在下拉框中选择</SPAN><span>Smithsonian
stop</SPAN><span>。接下来录制另一段脚本。点击</SPAN><span>Fares
&amp; travel times between
stations</SPAN><span>链接（这里会弹出一个新的浏览窗口，这也就是使用灵活脚本方法的最佳方式），在下拉列表中选择</SPAN><span>Vienna</SPAN><span>，点击</SPAN><span>Get
Fare
Data</SPAN><span>点击，看完结果之后再点击关闭按钮，最后停止录制。</SPAN></P>
<p>
<span>用第二章介绍的方法调整延迟时间后，把这段新录制的代码插入到前面的脚本中，形成一个满足新流程的脚本。代码</SPAN><span>3</SPAN><span>展示了部分的脚本。</SPAN></P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p><span><code><span>#include &lt;VU.h&gt;<br/>
int percent;<br/>
{<br/>
push Http_control = HTTP_PARTIAL_OK | HTTP_CACHE_OK |
HTTP_REDIRECT_OK;<br/>
push Timeout_scale = 200;<br/>
push Think_def = "LR";<br/>
Min_tmout = 120000;<br/>
push Timeout_val = Min_tmout;<br/>
push Think_avg = 0;<br/>
start_time ["Home Page"];<br/>
www_wmata_com = http_request ["Metro_T~001"] "<a HREF="http://www.wmata.com/">www.wmata.com:80</A>",<br/>
. . .<br/>
http_disconnect(www_wmata_com_1);<br/>
stop_time ["Home Page"];<br/>
delay(uniform(6000,14000));<br/>
start_time ["System Map"];<br/>
//set Think_avg = 17525;<br/>
www_wmata_com_2 = http_request ["Metro_T~014"] "<a HREF="http://www.wmata.com/">www.wmata.com:80</A>",<br/>
. . .<br/>
http_nrecv ["Metro_T~057"] 100 %% ;<br/>
stop_time ["System Map"];<br/>
delay(uniform(7000,12000));<br/>
start_time ["Vienna"];<br/>
//set Think_avg = 6650;<br/>
set Server_connection = www_wmata_com_4;<br/>
. . .<br/>
http_nrecv ["Metro_T~078"] 100 %% ;<br/>
stop_time ["Vienna"];<br/>
delay(uniform(9000,13000));<br/>
start_time ["Stations"];<br/>
//set Think_avg = 23514;<br/>
set Server_connection = www_wmata_com_5;<br/>
. . .<br/>
http_disconnect(www_wmata_com_4);<br/>
stop_time ["Stations"];<br/>
delay(uniform(9000,13000));<br/>
start_time ["Smithsonian"];<br/>
//set Think_avg = 13199;<br/>
set Server_connection = www_wmata_com_5;<br/>
. . .<br/>
http_disconnect(www_wmata_com_7);<br/>
stop_time ["Smithsonian"];<br/>
delay(uniform(9000,13000));<br/>
percent = uniform(1,10);<br/>
if (percent &lt; 6)<br/>
{<br/>
start_time ["Fares and Times"];<br/>
//set Think_avg = 13199;<br/>
smartbenefits_wmata_com = http_request ["Metro_T~113"]<br/>
"smartbenefits.wmata.com:443",<br/>
. . .<br/>
http_disconnect(smartbenefits_wmata_com);<br/>
stop_time ["Fares and Times"];<br/>
delay(uniform(12000,15000));<br/>
start_time ["Get Fare Data"];<br/>
//set Think_avg = 19268;<br/>
smartbenefits_wmata_com_1 = http_request ["Metro_T~119"]<br/>
"smartbenefits.wmata.com:443",<br/>
. . .<br/>
http_disconnect(smartbenefits_wmata_com_1);<br/>
stop_time ["Get Fare Data"];<br/>
}<br/>
pop [Think_def, Think_avg, Timeout_val,
Timeout_scale];</SPAN></CODE></SPAN></P>
</DIV>
<p>
列表<span>3</SPAN><span>：添加了查看费用信息的部分脚本</SPAN></P>
<p>
<span>如同前面在线书店的例子一样，这种方法通过变量的随机值来控制脚本的执行路径。</SPAN></P>
<p>
<span>给高级用户：灵活脚本方法看起来非常简单，但需要注意的是，</SPAN><span>if</SPAN><span>语句中浏览的是独立浏览器窗口的会好一些。这种脚本方法可以用在任何可选的导航路径，但前提是开始点和结束点在同一地方，对于个别的</SPAN><span>sockets</SPAN><span>（</SPAN><span>set
Server_connection</SPAN><span>和</SPAN><span>http_disconnect</SPAN><span>命令）来说需要手工维护。这个详细讨论起来就太多了，根据我个人的经验，如果没有非常必要的情况的话，另外录制一个脚本来覆盖那部分的用户模型会没那么痛苦。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
小结</SPAN></H1>
<p>
<span>本文介绍了</SPAN><span>3</SPAN><span>种模拟个别用户行为模式的方法，以及如何在</SPAN><span>Rational
TestManager</SPAN><span>中使用。你可以使用全脚本路径方法、脚本片段方法和灵活脚本方法中的一种或者组合来有效地模拟任何的个别用户行为模式。本系列的下一篇文章将详细介绍如何使用</SPAN><span>TestManager</SPAN><span>创建测试套件来准确模拟全部的用户群，而不仅是个别用户。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
参考</SPAN></H1>
<p><span>“</SPAN><span>Website
Stress-Testing</SPAN><span>”</SPAN> <span>by Serdar Yegulalp
(ExtremeTech Web site)</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
附录（单词）</SPAN></H1>
<p><span>distinction</SPAN><span>：区别</SPAN><span>,</SPAN>
<span>差别<br/></SPAN><span>simplistic</SPAN><span>：过分单纯化的<br/>
</SPAN><span>make
sense</SPAN><span>：有意义<br/></SPAN><span>access
to</SPAN><span>：有权使用<br/></SPAN><span>alternative</SPAN><span>：可供选择的办法<br/>
</SPAN><span>universally</SPAN><span>：普遍地</SPAN><span>,</SPAN><span>全体地</SPAN><span>,</SPAN><span>到处<br/>
</SPAN><span>inherent</SPAN><span>：固有的</SPAN><span>,</SPAN>
<span>内在的</SPAN><span>,</SPAN>
<span>与生俱来的<br/></SPAN><span>drawback</SPAN><span>：缺点</SPAN><span>,</SPAN>
<span>障碍<br/></SPAN><span>redundant</SPAN><span>：多余的</SPAN><span>,</SPAN><span>冗余的<br/>
</SPAN><span>yield</SPAN><span>：出产</SPAN><span>,</SPAN>
<span>生长</SPAN><span>,</SPAN>
<span>生产<br/></SPAN><span>eliminate</SPAN><span>：排除</SPAN><span>,</SPAN>
<span>消除<br/></SPAN><span>surefire</SPAN><span>：准不会有错的</SPAN><span>,</SPAN>
<span>一定能达到目的的<br/></SPAN><span>Survey</SPAN><span>：调查</SPAN><span>,</SPAN><span>测量<br/>
</SPAN><span>in concert
with</SPAN><span>：和</SPAN><span>...</SPAN><span>相呼应［合作］<br/>
</SPAN><span>leave
out</SPAN><span>：省去</SPAN><span>,</SPAN><span>不考虑<br/></SPAN><span>out
of curiosity</SPAN><span>：出于好奇心<br/></SPAN><span>original
version</SPAN><span>：原著</SPAN></P>
</DIV>
]]></description>
            <author>前行</author>
            <category>性能测试</category>
            <comments>http://blog.sina.com.cn/s/blog_4fb4353501000azp.html#comment</comments>
            <pubDate>Tue, 13 Nov 2007 07:20:31 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_4fb4353501000azp.html</guid>
        </item>
        <item>
            <title>【转】【翻译】User experience, not metrics系列 第三章（1）</title>
            <link>http://blog.sina.com.cn/s/blog_4fb4353501000azo.html</link>
            <description><![CDATA[<div>&nbsp;
<p ALIGN="center">&nbsp;<br/>
<span><span STYLE="FONT-SIZE: 24pt"><strong><span><span>第三章</SPAN></SPAN>
<span><span>模拟个别的用户模式</SPAN></SPAN></STRONG></SPAN></SPAN></P>
<p>
<span>Web</SPAN><span>应用特色是做同样的事情可以有多种的操作路径，同样的有多种浏览方式可以到达相同的地方。对用户来说这是一件好事情，但对于测试者来说，这将使测试变得更加复杂，我们不仅需要知道用户在做什么，还要知道他们是如何做的。本文将论述如何使用</SPAN><span>Rational
TestStudio</SPAN><span>来设计和脚本化测试套件（</SPAN><span>suite</SPAN><span>），解决用户可能选择不同浏览路径的问题，使得测试结果能更准确地代表用户的感受。</SPAN></P>
<p>
<span>压力测试专家可能会辩论说测试脚本开发这种层次的详述仅仅是一项额外的工作，并不会增加项目的价值。如果我们的目标是进行压力测试的话，我会认同这种说法。在本系列的第一章中，压力测试定义为“在不包括用户延迟的高用户负载下，各种脚本的组合测试，但对确定用户体验并不合适”。回顾第一章，本系列专注于外部用户的性能体验与客户满意度之间的联系。作为负载测试的一部分，确定用户体验的关键是模拟个别用户的行为模式，而压力测试并不需要关注这些。（请阅读《网站压力测试》（</SPAN><span>Website
Stress-Testing</SPAN><span>），该书对两者的区别做了明确的说明）。下文将论述如何将这些个别用户模式应用到用户组（群）中。</SPAN></P>
<p>
<span>本系列的第二章论述了如何模拟个别用户延迟，类似的，本文将同样的基于在</SPAN><span>Noblestar</SPAN><span>多年的测试经验并以</SPAN><span>TestStudio</SPAN><span>进行示范。本文适用于</SPAN><span>TestStudio</SPAN><span>所有等级的用户，但更适用于中高级用户。我建议你将本文提到的观点应用到一个你清楚其用户负载、用户模式和用户体验度量的网站上进行有效性验证，将用户体验结果与实际结果进行比较。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
确定用户模式</SPAN></H1>
<p>
<span>为了准确地收集到用户体验度量，你必须在适当的时间，将适当的压力应用到系统适当的部分上。这听起来好像很复杂，但实际并非如此。你可以从确定个别的用户模式开始。我会介绍一些不同的方法，并以在线书店为例说明如何确定用户模式。</SPAN></P>
<p>
<span>假设你是书店的经营者，希望从性能视角来了解用户在网站上购书的情况。首先需要回答一个问题：有一个回头客（</SPAN><span>return
user</SPAN><span>）登录网站后想买一个最新的畅销书</SPAN><span>New
York
Times</SPAN><span>，他需要通过哪些页面来完成？我们可以得到如图</SPAN><span>1</SPAN><span>的购书路线图（如何生成这个图将在下文详细论述）。</SPAN></P>
<p>&nbsp;</P>
<div ALIGN="center" SRC_CETEMP="/images/cnblogs_com/pent/UENM/UENM3-1.JPG"><img STYLE="WIDTH: 500px; HEIGHT: 187px" HEIGHT="206" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-1.JPG" WIDTH="550" BORDER="0"></IMG></DIV>
<p ALIGN="center">&nbsp;<span>图</SPAN><span>1</SPAN>
<span>购买小说的主要路线图</SPAN></P>
<p>
<span>上图的例子中，所有用户从首页开始，通过三种方式其中的一种来进行：</SPAN></P>
<ul>
<li><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l<span STYLE="FONT: 7pt 'Times New Roman'">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>搜索书名或作者</SPAN></LI>
<li><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l<span STYLE="FONT: 7pt 'Times New Roman'">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>到小说分类中慢慢查找</SPAN></LI>
<li><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l<span STYLE="FONT: 7pt 'Times New Roman'">&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>直接在畅销书闪烁的链接中找到它</SPAN></LI>
</UL>
<p>
<span>每种路径的用户比例上图已经标示出来了，所有用户都买了书。这是一个非常简单的例子，但这些概念可以很容易地应用到复杂的情况。注意，上图每条路径确定了一种活动，但并未包括活动的具体步骤或访问的页面。</SPAN></P>
<p>
<span>上图的实现方法对你的测试目的来说也许已经足够准确，但也许不够。方法如下：在为此模型选择了购书网站作为例子后，我认为最通常的用户活动就是买书了。接着访问这个网站，找出买书的所有可能的路径，以一个网站用户或测试者的身份，通过自己的经验和直觉，评估自己访问每条路径的可能性。最后完成了上面的图形。</SPAN></P>
<p>
<span>运用你的直觉和最佳猜测的方法，有两方面的好处：（</SPAN><span>1</SPAN><span>）在用科学的方法识别用户模式之前，已经对网站有了一个直观的感受；（</SPAN><span>2</SPAN><span>）以此来验证用更科学的方法获得的用户模式，也很有意义。由于我无法获取到更科学的信息（例如日志文件，流量监控软件，系统设计文档，系统管理权限等等），所以我只能到此为止，但你可以做得更好。</SPAN></P>
<p>
<span>如果你正在进行一个真实的测试，那么可以用以下的任一种方法来测定用户模式：</SPAN></P>
<ul>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>如果测试的是一个已发布的网站，那么可以通过流量监控软件（如</SPAN><span>WebTrends</SPAN><span>、</SPAN><span>LiveStats</SPAN><span>）的统计信息来测定实际的数据和分布情况。这些软件在正确配置之后，能够以易于理解的图表方式告诉你每种用户活动的比例和行为路径。如果没有流量监控软件的话，也可以通过日志文件中的页面点击信息来测定用户活动分布。第四章将会对此进行更详细的论述。</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>如果有网站技术规格说明书的话，它会告诉你用户最可能进行哪些活动，以及用户期望在哪些导航路径的指引下进行操作。有时功能测试脚本或测试用例也有助于用户活动和路径的确定。这些资料不会直接告诉你实际上用户是如何浏览网站的，但你能够间接地知道系统是如何与用户进行交互的。</SPAN></LI>
<li><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>如果测试的网站是新开发的从来没有发布过，那么你可以尝试着从相似网站的管理员处收集到用户使用模式的信息。当然，这类网站通常最有可能的就是你们的竞争对手，因此它们的管理员可能并不会那么合作。</SPAN></LI>
<li><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>如果以上三种方法都行不通的话，你可以进行简单的内部实验，通过员工、客户、朋友或家庭成员的帮助来测定不同用户是如何浏览网站的。如我在第二章提到的，对于从没有发布过的网站来说，我发现这是一种非常高效的数据收集方法，同时也是验证使用其它方法收集到的数据的一种有效途径。</SPAN></LI>
</UL>
<h1><span STYLE="FONT-SIZE: 18pt">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
用TestStudio模拟用户模式</SPAN></H1>
<p><span>Rational
TestStudio</SPAN><span>提供了很多种创建和模拟虚拟测试用户的方法，但就是因为有太多的方法，有时也会变得难以选择。下文将以在线书店为例，描述并论证三种用户模式的模拟方法，这同时也是个人觉得最简单和最通用的方法：</SPAN></P>
<ul>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>全路径脚本方法：为每条浏览路径录制单独的脚本，并在测试套件（</SPAN><span>suite</SPAN><span>）中分配适当的用户比例。</SPAN></LI>
<li><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>路径片段方法：为图形中的每一段线录制单独的脚本，并在测试套件中正确的组织起来。</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>灵活的脚本方法：在录制的脚本中创建灵活的脚本，处理大部分浏览路径中的少数例外。</SPAN></LI>
</UL>
<p>
<span>每个方法都可以与其它方法结合起来使用，模拟更复杂的用户模式。每种方法都有其固有的优点和缺点，下文将会提到。</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">2.1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
全路径脚本方法</SPAN></H2>
<p>
<span>三种方法中全路径脚本方法最容易描述和执行。这种方法为每个可能的浏览路径录制单独的端到端脚本，然后创建测试套件以适当的分布组织执行这些脚本。图</SPAN><span>2</SPAN><span>展示了购买小说的脚本中所包括的三种可能的路径。</SPAN></P>
<p ALIGN="center">&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 196px" HEIGHT="261" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-2.JPG" WIDTH="664" BORDER="0"></IMG></P>
<p ALIGN="center"><span>图</SPAN><span>2</SPAN>
<span>全路径脚本方法的购书路径</SPAN></P>
<p>
<span>录制</SPAN><span>3</SPAN><span>个这样的脚本是相当简单的事情。请注意，图中主页访问和购书活动在所有的脚本中都是重复的，这会在其它方法的论述中再次提到。图</SPAN><span>3</SPAN><span>展示了脚本在</SPAN><span>TestManager</SPAN><span>测试套件中的用户比例情况。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 313px" HEIGHT="324" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-3.JPG" WIDTH="517" BORDER="0"></IMG></P>
<p><span>图</SPAN><span>3</SPAN>
<span>全路径脚本执行方法的测试套件</SPAN></P>
<p>
<span>这是模拟简单用户模式的一个好方法，只需少量的脚本就能覆盖所有可能的用户路径。而且，也不需要手工修改任何脚本来模拟用户模式。由于每种用户都直接匹配一个脚本，当测试有安全的会话</SPAN><span>ID</SPAN><span>或</SPAN><span>cookie</SPAN><span>的站点时比较容易处理安全问题，也许这就是这种方法最大的优势。（我会在后续的文章中论述关于安全会话的处理）</SPAN></P>
<p>
<span>但另一方面，这种方法也有较大的缺陷。首先，脚本中重复的功能意味着更多的开销，会降低当前测试环境下的虚拟测试用户数。如果你的测试实验室和我一样的话，你需要为这些消耗巨大的测试保留所有的资源，而你当然不希望硬件设备成为瓶颈而使得性能测试结果变得很糟糕。就个人而言，在大多数情况下我会尽量使每个套件的测试脚本数量少于</SPAN><span>12</SPAN><span>个。在不影响性能测试结果的情况下，你的主站点和代理站点的硬件越好，测试套件中就能容纳更多的脚本。</SPAN></P>
<p>
<span>其次，还有关于动态数据方面的缺点。脚本中的冗余部分有时会包含一些每个虚拟用户都不同的数据（例如登录信息），可能会用到数据池。这会导致每个脚本都有独立或非常相似的数据池，以及用于控制这些数据逻辑的共享变量或持久变量。如果管理不当的话，这些将产生大量的开销。通常，尽可能地消除持久变量，并减少数据池的数量和大小，只产生必要的数据，是一个不错的做法。</SPAN></P>
<p>
<span>最后，如果脚本中主页或者购书部分发生了变化，所有脚本都需要修改。如果变动较大的话，</SPAN><span>3</SPAN><span>个脚本都需要重新录制。对于已经稳定的已发布应用来说，这可能不会有这个问题，但如果测试的系统还在开发当中，那要好好考虑一下了。</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">2.2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
路径片段方法</SPAN></H2>
<p>
<span>路径片段方法也是一种相当简单的方法。这种方法为每段路径录制一个独立的脚本（也称分割脚本），如图</SPAN><span>4</SPAN><span>所示。这些脚本按适当的顺序和分布组成可被执行的测试套件。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 143px" HEIGHT="195" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-4.JPG" WIDTH="680" BORDER="0"></IMG></P>
<p><span>图</SPAN><span>4</SPAN>
<span>路径片段方法的购书路径</SPAN></P>
<p>
<span>如你所见，和全路径方法相比，这种方法多了两个脚本，但脚本中没有了重复的活动。图</SPAN><span>5</SPAN><span>展示了</SPAN><span>TestManager</SPAN><span>中代表我们的书店浏览模型的一种测试套件组织方法。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 594px" HEIGHT="615" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-5.JPG" WIDTH="517" BORDER="0"></IMG></P>
<p><span>图</SPAN><span>5</SPAN>
<span>路径片段方法的测试套件</SPAN></P>
<p>
<span>这种方法只需更少的脚本，对于简单的用户模式来说相当不错。虽然多了两个脚本，但不会比全路径脚本方法需要更多的开销。在本在线书店的例子中，将产生五个实际的脚本，但每个都比全路径脚本方法产生更少的开销，所以总的开销其实差不多。这种方法真正的优点是通过没有冗余的脚本，消除多脚本访问同一个数据池，以及多个类似或同样的数据池的可能性。</SPAN></P>
<p>
<span>这种方法同时也降低了当被测应用发生局部改变时重新录制脚本的可能性。对于采用迭代式开发和测试的应用来说，这将是一个巨大的好处。</SPAN></P>
<p>
<span>这种方法有两个缺点：（</SPAN><span>1</SPAN><span>）可能需要用到共享变量，（</SPAN><span>2</SPAN><span>）如果脚本或场景运行不正常，调试会变得复杂，并导致共享变量的使用。如果场景的正确运行需要在两个脚本之间传递信息，则只能用共享变量来传递信息。这个复杂的主题会在以后的文章中提到。如果你将录制的分割脚本在场景中组合起来，但与录制时的顺序不同的话，脚本可能会运行不起来。在脚本录制前谁也不知道分割后的脚本是否能运行起来。如果不能正确回放，那通常是没有通过共享变量来传递信息的问题。</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">2.3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
灵活的脚本方法</SPAN></H2>
<p>
<span>灵活的脚本方法能让你模拟在主要的浏览路径中的少量例外路径。例如，在我们的在线书店中，每条路径上的顾客可能都会打开其它信息窗口，也并不是所有的顾客最终都会买书。</SPAN></P>
<p>&nbsp;<img STYLE="WIDTH: 500px; HEIGHT: 179px" HEIGHT="244" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM3-6.JPG" WIDTH="680" BORDER="0"></IMG></P>
<p><span>图</SPAN><span>6</SPAN>
<span>包含了少数例外的购书浏览路径</SPAN></P>
<p>
<span>图中的虚线表示了一些偏离主浏览路径的活动。在</SPAN><span>Name
Search</SPAN><span>路径中有</SPAN><span>10</SPAN><span>％的用户会看帮助，在</SPAN><span>Select
Best
Seller</SPAN><span>路径中有</SPAN><span>25</SPAN><span>％的用户会阅读读者评论，在</SPAN><span>Fiction
Books</SPAN><span>路径中有</SPAN><span>5</SPAN><span>％的用户会参与调查活动。而且，所有用户中的</SPAN><span>25</SPAN><span>％并没有买书就离开了。</SPAN></P>
<p>
<span>在这种方法中，测试套件模型可以保留但必须重新考虑脚本。幸运的是，通过有计划地处理这些可选的偏离活动的脚本，避免了在测试套件中增加任何的全路径脚本、分割脚本、用户组等。我们只需简单地在分割的脚本中增加一些代码就能处理这些偏离。这些处理需要最基本的</SPAN><span>C</SPAN><span>编程经验，但我会和你一起做下去，这样的话即使你没有编程经验也能通过简单的复制、粘贴完成这些代码。</SPAN></P>
<p><span>让我们来看看如何修改</SPAN><span>Name
Search</SPAN><span>这段代码，以满足客户在搜索之前先看帮助这样的场景。列表</SPAN><span>1</SPAN><span>显示了满足场景的部分代码。</SPAN></P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p><span><code><span><br/>
#include &lt;VU.h&gt;<br/>
{<br/>
push Http_control = HTTP_PARTIAL_OK | HTTP_CACHE_OK |
HTTP_REDIRECT_OK;<br/>
push Timeout_scale = 200;<br/>
push Think_def = "LR";<br/>
Min_tmout = 120000;<br/>
push Timeout_val = Min_tmout;<br/>
DP1 = datapool_open("Name_Search_Seg");<br/>
datapool_fetch(DP1);<br/>
push Think_avg = 0;<br/>
start_time ["View Search Page"];<br/>
stop_time ["View Search Page"];<br/>
start_time ["View Help"];<br/>
stop_time ["View Help"];<br/>
start_time ["View Search Results"];<br/>
stop_time ["View Search Results"];<br/>
}</SPAN></CODE></SPAN></P>
</DIV>
<p ALIGN="center">列表<span>1</SPAN>
<span>查看帮助信息的</SPAN><span>Name
Search</SPAN><span>脚本</SPAN></P>
<p>
<span>那么我们如何模拟查看帮助的</SPAN><span>10</SPAN><span>％用户呢？这个简单，我们在每次脚本被调用时生成一个</SPAN><span>1</SPAN><span>～</SPAN><span>10</SPAN><span>之间的随机数字，当数字为</SPAN><span>1</SPAN><span>时将进行查看帮助的操作，否则跳过这一步。请看列表</SPAN><span>2</SPAN><span>。</SPAN></P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p><span><code><span>-&gt;-&gt; Session File Information
&lt;-&lt;-<br/>
*/<br/>
#include &lt;VU.h&gt;<br/>
int percent;<br/>
{<br/>
push Http_control = HTTP_PARTIAL_OK | HTTP_CACHE_OK |
HTTP_REDIRECT_OK;<br/>
push Timeout_scale = 200;<br/>
push Think_def = "LR";<br/>
Min_tmout = 120000;<br/>
push Timeout_val = Min_tmout;<br/>
DP1 = datapool_open("Name_Search_Seg");<br/>
datapool_fetch(DP1);<br/>
push Think_avg = 0;<br/>
start_time ["View Search Page"];<br/>
stop_time ["View Search Page"];<br/>
percent = uniform(1,10);<br/>
if (percent = 1)<br/>
{<br/>
start_time ["View Help"];<br/>
stop_time ["View Help"];<br/>
}<br/>
start_time ["View Search Results"];<br/>
stop_time ["View Search Results"];<br/>
}</SPAN></CODE></SPAN></P>
</DIV>
<p ALIGN="center">列表<span>2</SPAN>
<span>模拟</SPAN><span>10</SPAN><span>％的用户查看帮助信息的脚本</SPAN></P>
<p>
<span>其它</SPAN><span>3</SPAN><span>个可选路径也能够用类似的方法实现。</SPAN></P>
<p>
<span>灵活的脚本方法对于处理这种不需要完成整个脚本，起始点和结束点相同的活动非常有用。这种方法的另一个很好的例子如用户的注册过程，对于初次使用的用户需要进行账号注册才能登录系统，但是，并非所有的用户都需要，因此，这也是脚本中需要考虑的。</SPAN></P>
<p>
<span>比其它两种脚本方法来说，这种脚本方式实现起来更快并且所需的开销更少，同时冗余的代码也更少。把这种方法和其它的两种合起来一起使用，将能模拟几乎所有的用户模式。</SPAN></P>
<p>
<span>这种方式的缺点在运行时就会显露出来。在录制过程中，有些</SPAN><span>socket</SPAN><span>可能会在</SPAN><span>if</SPAN><span>语句外面打开并在</SPAN><span>if</SPAN><span>语句里面引用，回放时如果</SPAN><span>if</SPAN><span>语句里面的脚本不执行的话会导致脚本执行失败。还有其它一些类似的问题。如果遇到这样的问题，你可以进行脚本调试，但这里我不会详细讨论。一般而言，弹出式的独立浏览窗口上的活动不会出现这种问题。</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">2.4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
选择哪种方法</SPAN></H2>
<p>
<span>在大多数情况中，选择使用哪种方法来模拟用户使用模式只是一个个人偏好问题。上面已经提到，每种方法都有其优缺点，你只能根据具体的情况选择最佳的那种。在测试复杂的站点时，我通常会将</SPAN><span>3</SPAN><span>种脚本方法组合起来使用。</SPAN></P>
<p><span>下面有一些选择方法供参考：</SPAN></P>
<p>
<strong><span>当站点满足以下情况时使用全路径脚本方法：</SPAN></STRONG></P>
<ul>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>只有少量的浏览路径冗余</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>浏览路径中只有少量的</SPAN><span>datapool</SPAN><span>冗余</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>使用安全的</SPAN><span>session</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>通过</SPAN><span>URL</SPAN><span>的参数传递数据</SPAN></LI>
</UL>
<p>
<strong><span>当站点满足以下情况时使用路径片段方法：</SPAN></STRONG></P>
<ul>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>有很大的浏览路径冗余</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>浏览路径中有大量的</SPAN><span>datapool</SPAN><span>冗余</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>有限的安全性</SPAN></LI>
<li><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>没有通过</SPAN><span>URL</SPAN><span>的参数传递数据</SPAN></LI>
</UL>
<p>
<strong><span>当站点满足以下情况时使用灵活脚本方法：</SPAN></STRONG></P>
<ul>
<li><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>存在起止都在同一页面的可选浏览路径</SPAN></LI>
<li><span><span><span><span><span><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l</SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN>
<span>存在弹出窗口的链接</SPAN></LI>
</UL>
</DIV>
]]></description>
            <author>前行</author>
            <category>性能测试</category>
            <comments>http://blog.sina.com.cn/s/blog_4fb4353501000azo.html#comment</comments>
            <pubDate>Tue, 13 Nov 2007 07:18:55 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_4fb4353501000azo.html</guid>
        </item>
        <item>
            <title>【转】【翻译】User experience, not metrics系列 第二章（2）</title>
            <link>http://blog.sina.com.cn/s/blog_4fb4353501000azn.html</link>
            <description><![CDATA[<h1><span STYLE="FONT-SIZE: 18pt">4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Now You Try IT</SPAN></H1>
<p>
<span>为了证明这些概念的简单和有效，我建议大家跟着下面的练习一起做，前提是大家已经知道如何录制和回放</SPAN><span>VU</SPAN><span>脚本，以及如何在录制过程中插入</SPAN><span>timer</SPAN><span>。</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">4.1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
确定用户延迟和分布情况的练习</SPAN></H2>
<p>
<span>选择一个完全静态的网站，因为每次都变化的网站只会妨碍学习过程。接着确定一个导航的路径，比如在</SPAN><span>onblestat.com</SPAN><span>网站的首页上，点击</SPAN><span>About
Us</SPAN><span>，然后点击</SPAN><span>Essentials</SPAN><span>，最后点击</SPAN><span>Heritage</SPAN><span>。首先在记事本上记下你认为每个页面可能的用户分布和延迟时间，然后找一些同事根据纸上的指示进行操作，并记录下他们在这些页面的停留时间。看看实际的时间与分布是否接近于记事本上的记录。</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">4.2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
在VuC的练习中模拟用户延迟和分布情况</SPAN></H2>
<p>
<span>在这个网站的不同测试时间，我用尽了</SPAN><span>4</SPAN><span>个方法来确定用户延迟和分布情况。在所有的案例中，根据正态分布曲线获得不同的时间值。出于对于这个例子的考虑，我们假设并非总是如此，这样你才能看到如何使用内置的</SPAN><span>C</SPAN><span>函数和我之前介绍的新的</SPAN><span>normdist</SPAN><span>函数来产生时间延迟。</SPAN></P>
<p>
<span>我重申一点，这个例子中的延迟和分布并不能很好地代表实际网站交互。我会在这篇文章地讨论中创建练习来论证所有的主题。</SPAN></P>
<p>
<span>首先基于一个静态网站录制一个简单的</SPAN><span>VU</SPAN><span>脚本（我用</SPAN><span>noblestat.com</SPAN><span>来录制）。录制时用</SPAN><span>timer</SPAN><span>将每个页面包括起来。（你也可以用</SPAN><span>timer
block</SPAN><span>，但录制出来的原始脚本有点差别，我会在第</SPAN><span>5</SPAN><span>章详细介绍</SPAN><span>timer
block</SPAN><span>）。录制</SPAN><span>3</SPAN><span>个页面，</SPAN><span>Home
Page</SPAN><span>、</SPAN><span>Page1</SPAN><span>、</SPAN><span>Page2</SPAN><span>。</SPAN></P>
<p>
<span>录制完成之后用</SPAN><span>1</SPAN><span>个虚拟用户回放一下，确保没有修改之前的脚本回放成功。然后再用</SPAN><span>Robot</SPAN><span>打开脚本并找到第一个</SPAN><span>stop_time</SPAN><span>命令。这部分的脚本如下：<br/>
</SPAN></P>
<p>&nbsp;</P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
http_header_recv ["RDN_on_~233"] 304;<br/>
http_nrecv ["RDN_on_~234"] 100 %% ;<br/>
stop_time ["Home Page"];<br/>
start_time ["Page1"];<br/>
set Think_avg = 12342;<br/>
<br/>
http_request ["RDN_on_~235"]</DIV>
<p>&nbsp;</P>
<p>
<span>这部分代码停止了计时器对加载主页的时间统计，并开始了对加载</SPAN><span>Page1</SPAN><span>的计时器统计，再等待了差不多</SPAN><span>12</SPAN><span>秒后才开始对</SPAN><span>Page1</SPAN><span>的下载。实际上，你并不想将</SPAN><span>12</SPAN><span>秒的延迟时间也算在计时器里面的，还有并不希望</SPAN><span>12</SPAN><span>秒是静态值，而是一个</SPAN><span>6</SPAN><span>秒到</SPAN><span>18</SPAN><span>秒延迟范围的正态分布。你可以通过删除或注释掉</SPAN><span>start_time</SPAN><span>命令后的</SPAN><span>set
Think_avg</SPAN><span>这一行，同时在</SPAN><span>stop_time</SPAN><span>和</SPAN><span>start_time</SPAN><span>命令之间加入</SPAN><span>delay(uniform(6000,18000))</SPAN><span>来实现。这段代码显示如下：</SPAN></P>
<p>&nbsp;</P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
http_header_recv ["RDN_on_~233"] 304;<br/>
http_nrecv ["RDN_on_~234"] 100 %% ;<br/>
stop_time ["Home Page"];<br/>
delay(uniform(6000,18000));<br/>
start_time ["Page1"];<br/>
<br/>
<br/>
http_request ["RDN_on_~235"]</DIV>
<p>&nbsp;</P>
<p>
<span>现在这段代码将统计主页和</SPAN><span>Page1</SPAN><span>的真正加载时间，等到用户阅读完主页之后才访问</SPAN><span>Page1</SPAN><span>页面，并且等待时间是一个</SPAN><span>6</SPAN><span>到</SPAN><span>18</SPAN><span>秒正态分布下的随机时间。</SPAN></P>
<p>
<span>找到</SPAN><span>Page1</SPAN><span>的</SPAN><span>stop_time</SPAN><span>命令，原始代码如下：</SPAN></P>
<p>&nbsp;</P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
http_header_recv ["RDN_on_~242"] 200;<br/>
http_nrecv ["RDN_on_~243"] 100 %% ;<br/>
stop_time ["Page1"];<br/>
start_time ["Page2"];<br/>
set Think_avg = 8536;<br/>
set Server_connection = www_noblestar_com_1;<br/>
<br/>
http_request ["RDN_on_~244"]</DIV>
<p>&nbsp;</P>
<p>
<span>和上面一样，这段脚本停止了</SPAN><span>Page1</SPAN><span>的计时器，开始了</SPAN><span>Page2</SPAN><span>的计时器，并延迟了</SPAN><span>8.5</SPAN><span>秒左右的时间。这里，你希望把</SPAN><span>8</SPAN><span>秒的静态延迟改为最小值</SPAN><span>6</SPAN><span>秒、最大值</SPAN><span>14</SPAN><span>秒、标准差</SPAN><span>2</SPAN><span>秒的正态分布延迟。如果你没有计算延迟范围标准差的方法，那么将最大延迟时间减去最小延迟时间再乘以</SPAN><span>25</SPAN><span>％是一个比较精确的、可以接受的方式。</SPAN></P>
<p>
<span>将</SPAN><span>normdist</SPAN><span>函数拷贝到脚本中</SPAN><span>#include</SPAN><span>命令的下面，代码如下：</SPAN></P>
<p>&nbsp;</P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
#include<br/>
int func normdist(min, max, stdev)<br/>
int min, max, stdev; // min: Minimum value; max: Maximum
value;<br/>
stdev: degree of deviation allowed<br/>
{<br/>
int range, iterate, result;<br/>
range = max ? min;<br/>
iterate = range / stdev;<br/>
result = 0;<br/>
stdev += 1;<br/>
for (c = iterate; c != 0; c--)<br/>
result += (uniform (1, 100) * stdev) / 100;<br/>
return result + min;<br/>
}<br/>
{<br/>
push Http_control = HTTP_PARTIAL_OK | HTTP_CACHE_OK |
HTTP_REDIRECT_OK;</DIV>
<p>&nbsp;</P>
<p>
<span>然后删除或注释掉</SPAN><span>start_time</SPAN><span>命令下面的</SPAN><span>set
Think_avg</SPAN><span>这一行，并在</SPAN><span>stop_time</SPAN><span>和</SPAN><span>start_time</SPAN><span>命令之间添加</SPAN><span>delay(normdist(6000,14000,2000))</SPAN><span>。这段代码如下：</SPAN></P>
<p>&nbsp;</P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
http_header_recv ["RDN_on_~242"] 200;<br/>
http_nrecv ["RDN_on_~243"] 100 %% ;<br/>
stop_time ["Page1"];<br/>
delay(normdist(6000, 14000, 2000));<br/>
start_time ["Page2"];<br/>
<br/>
set Server_connection = www_noblestar_com_1;<br/>
<br/>
http_request ["RDN_on_~244"]</DIV>
<p>&nbsp;</P>
<p>
<span>再次强调，没有</SPAN><span>normdist</SPAN><span>函数的话脚本执行将会出错。现在这段代码也能正确的统计</SPAN><span>Page1</SPAN><span>、</SPAN><span>Page2</SPAN><span>的加载时间了，并且在用户阅读</SPAN><span>Page1</SPAN><span>之时有一个随机的正态分布时间。如果你愿意的话，可以检查一下全部修改后的脚本。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
高级用户：双峰正态分布</SPAN></H1>
<p><span>为了应用这种分布，你应该有</SPAN><span>Rational
TestStudio</SPAN><span>的性能测试经验以及</SPAN><span>C</SPAN><span>语言的基本了解。我测试过的很多网站就有些这样的页面，它们的用户访问呈双峰正态分布。想象一个有很多文字的页面，首次访问时用户可能会详细地阅读这些文字，下一次你就会直接的跳过这个页面到下一个页面了。这种页面的用户延迟时间如图</SPAN><span>8</SPAN><span>所示。</SPAN></P>
<p ALIGN="center">&nbsp;<img HEIGHT="311" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-8.JPG" WIDTH="420" BORDER="0"></IMG></P>
<p ALIGN="center"><span>图</SPAN><span>8</SPAN>
<span>文字性网页所展现的双峰正态分布</SPAN></P>
<p>
<span>在这个例子中，假设</SPAN><span>60</SPAN><span>％的用户花了</SPAN><span>8</SPAN><span>秒的时间浏览了这个页面并寻找下一个链接，而其它</SPAN><span>40</SPAN><span>％的用户花了</SPAN><span>45</SPAN><span>秒的时间详细的阅读了整个页面。你会发现这是两个有着不同的最小值、最大值、标准差的正态分布。在脚本中模拟这种分布的方法生成一个</SPAN><span>0</SPAN><span>到</SPAN><span>10</SPAN><span>的随机数，并创建一个控制逻辑，当随机数字落在</SPAN><span>1</SPAN><span>～</SPAN><span>6</SPAN><span>之间时实现左边的延迟，在</SPAN><span>7</SPAN><span>～</SPAN><span>10</SPAN><span>时实现右边的延迟。</SPAN></P>
<p>&nbsp;</P>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
y=uniform(1,10);<br/>
if (y&lt;=6)<br/>
{<br/>
delay(normdist(0,16000,2000));<br/>
}<br/>
else<br/>
{<br/>
delay(normdist(34000,64000,6000));<br/>
}<br/>
start_time ["Page2"];</DIV>
<p>&nbsp;</P>
<p>
<span>这段代码执行</SPAN><span>1000</SPAN><span>次后将呈现图</SPAN><span>9</SPAN><span>的数据情况。</SPAN></P>
<p ALIGN="center">&nbsp;<img HEIGHT="311" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-9.JPG" WIDTH="420" BORDER="0"></IMG></P>
<p ALIGN="center"><span>图</SPAN><span>9</SPAN>
<span>我们的脚本生成的双峰正态分布</SPAN></P>
<p>
<span>如你所见，使用同样的方法，利用这段代码就可以轻松的改变分布类型和数值，以及控制每个峰值中不同的用户比例。把这些原理放在一起形成各种不同的组合，就有可能模拟几乎所有用户的延迟分布，并达到相当级别的精确度。举例来说，还可以再添加一个</SPAN><span>10</SPAN><span>秒到</SPAN><span>2</SPAN><span>分钟的均匀分布来模拟其它</SPAN><span>15</SPAN><span>％的用户，而这种可能性是无止境的。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
小结</SPAN></H1>
<p>
<span>这篇文章给你带来的关键点很简单：模拟的用户越精确，性能测试结果的可信度就越高。精确用户模拟的第一步就是模拟用户延迟。本文讨论了如何确定用户延迟时间，以及如何使用</SPAN><span>Rational
TestStudio</SPAN><span>把它应用到你的虚拟用户脚本中。接下来的</SPAN><span>2</SPAN><span>篇文章将论述如何确定和模拟个别用户网站使用模式，以及如何将这些合并到单个用户组模型中。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
附录（单词）</SPAN></H1>
<p><span>It goes without saying：不言而喻，不用说<br/>
make educated guesses：做出有根据的推测<br/>
in-house experiments：内部实验<br/>
in case：万一<br/>
realistic：逼真的<br/>
significantly：意味深长地，值得注目地<br/>
bell curve：贝尔曲线<br/>
negative exponential：负指数<br/>
skew：歪斜的<br/>
programmatic：有纲领性的，计划性的<br/>
in-depth discussion：深入讨论<br/>
represent：代表，表示<br/>
parenthesis/parentheses：圆括号<br/>
jot down：草草记下，摘要记载下来,<br/>
co-worker：合作者，同事<br/>
come up with：提出，拿出<br/>
built-in：内置的，内置<br/>
reiterate：重申，重做<br/>
bracket：括在一起，括弧，支架<br/>
proportion：比例，均衡，面积，部分</SPAN></P>
]]></description>
            <author>前行</author>
            <category>性能测试</category>
            <comments>http://blog.sina.com.cn/s/blog_4fb4353501000azn.html#comment</comments>
            <pubDate>Tue, 13 Nov 2007 07:17:32 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_4fb4353501000azn.html</guid>
        </item>
        <item>
            <title>【转】【翻译】User experience, not metrics系列 第二章（1）</title>
            <link>http://blog.sina.com.cn/s/blog_4fb4353501000azm.html</link>
            <description><![CDATA[<div ALIGN="center"><span><span><strong STYLE="FONT-SIZE: 24pt"><span><span>第二章</SPAN></SPAN>
<span><span>模拟个别的用户延迟</SPAN></SPAN></STRONG></SPAN></SPAN></DIV>
<p><span><br/>
网站的访问者们以不同的速度进行思考、阅读和打字，作为测试过程的一部分，你的责任是解决如何模拟并脚本化这些不同的速度。这些在</SPAN><span>Rational
TestStudio</SPAN><span>中有许多方法可以实现，你将在《</SPAN><span>User
Experience, Not
Metrics</SPAN><span>》系列的第二章中学习到其中的一些。本系列文章的关注点是将客户满意度和外部用户的性能体验关联起来，这已经在本文的第一章解释过。本文及后续文章将提供必要理论，包括关于如何根据测试目的模拟实际用户，并根据多年的性能测试经验以录制或修改脚本作为例子来论证这些原理。</SPAN></P>
<p>
<span>一些业内的专家称用户延迟的变化和实际测试结果并不相关，当用户众多时即使每个用户活动之间有</SPAN><span>20</SPAN><span>秒的延迟也会得到相同的结果。我会争辩说，如果是多年前单服务器架构、静态</SPAN><span>HTML</SPAN><span>脚本的情况下我可能会同意，但对于当今多层次、多功能的网站来说这是不可能的了。《科学的网站负载测试》（</SPAN><span>The
Science of Web-site Load
Testing</SPAN><span>）的作者</SPAN><span>Alberto
Savoia</SPAN><span>对为什么</SPAN><span>20</SPAN><span>秒的理论并非事实进行了相当详细解释并提供了真实世界的实例和数学证明。</SPAN></P>
<p>
<span>本文对各级别的</SPAN><span>TestStudio</SPAN><span>用户均有帮助，但对中高级用户尤佳。这里我介绍了脚本化不同的数学分布的方法，但你必须自己决定哪种才能最精确地匹配特定的场景。统计学的精确度在最终用户群的模拟上，对于每个网站来说是重要而独特的。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
确定用户延迟</SPAN></H1>
<p>
<span>用户登录，浏览主页，填写表格等需要多长时间？通过几种方法并结合网站上的用户活动能够大概获取用户延迟时间。最好的方法当然是使用生产现场上收集到的真实数据，但这几乎是不可能的，因为测试通常发生在网站发布投入使用之前。正因为如此，有时需要根据网站的行为做出有根据的推测。最能接受的四种方法如下：</SPAN></P>
<ul>
<li><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l<span STYLE="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN>当测试的网站已经投入生产时，你可以从每个页面的日志文件中知道浏览（或打字）的时间，并从中提取出平均差和标准差，并确定实际值和分布状态。有了这个信息，每个页面的用户延迟时间就可轻易确定。你的生产现场也可能拥有能直接提供这类信息的网站流量监测软件，例如</SPAN><span>WebTrends</SPAN><span>或</SPAN><span>LiveStat</SPAN><span>等。</SPAN></LI>
<li><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l<span STYLE="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN>在日志文件或时间、资源记录缺乏的情况下无法进行详细的日志分析时，你可以利用一些（调查）公司已经收集到的度量和统计数字。这些统计数据来自于用户或站点的客观抽样，提供了平均页面浏览时间和用户会话持续时间。尽管这些数字不是来源于你的特定站点，但是作为近似值来说已经很不错了。图</SPAN><span>1</SPAN><span>是来自</SPAN><span>NetRatings</SPAN><span>的一个样本数据。<br/>
</SPAN>&nbsp;</LI>
</UL>
<div ALIGN="center" SRC_CETEMP="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-1.JPG">
<img HEIGHT="317" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-1.JPG" WIDTH="402" BORDER="0"></IMG></DIV>
<p ALIGN="center">&nbsp;<span>图</SPAN><span>1
NetRatings</SPAN><span>提供的样本数据</SPAN></P>
<ul>
<li DIR="ltr">
<span>如你所见，这是非常高层次的信息，对模拟实际用户或许有用，也或许没用。图中最有用的信息是“观看页面的持续时间”（</SPAN><span>Duration
of a Page</SPAN>
<span>Viewed</SPAN><span>），报告了用户观看所有类型网页的平均时间。其余的统计信息由浏览网站的庞大的用户群组合统一汇总而成。</SPAN></LI>
<li DIR="ltr"><span><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l<span STYLE="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN></SPAN></SPAN>假如你没有日志文件，或者认为来自其它公司的度量指标不具备代表性的话，你可以通过员工、客户、朋友或家庭成员们运用简单的内部实验来进行，例如，新用户和老用户的页面观看时间是不同的。这种方法也被认为是“剪贴板和秒表法”。对于还没有投入运行的网站，或者通过其它方法收集到的数据进行验证，我觉得这是一种非常有效的数据收集方法。</SPAN></LI>
<li><span><span><span LANG="EN-US" STYLE="FONT-FAMILY: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings" XML:LANG="EN-US"><span STYLE="mso-list: Ignore">l<span STYLE="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></SPAN></SPAN></SPAN>
最后的手段是通过你的直觉或猜测来评估这些延迟的范围。对于逼真的负载测试来说，即使是这种最后的方法也要比忽略用户延迟的变化好得多。每个用户在每个页面消耗同样时间，这样的负载测试虽然简单，但不逼真，并且会产生令人误解的结果。</SPAN>&nbsp;&nbsp;</LI>
</UL>
<h1><span STYLE="FONT-SIZE: 18pt">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
了解延迟的范围和分布情况</SPAN></H1>
<p>
<span>现在你已经知道了用户在页面上所花的时间及其范围，但还没有最终完成对用户延迟的模拟。你必须使用户的延迟时间多样化，否则服务器将会呈现如图</SPAN><span>2</SPAN><span>的负载情况。</SPAN></P>
<p>&nbsp;</P>
<div ALIGN="center" SRC_CETEMP="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-2.JPG">
<img HEIGHT="241" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-2.JPG" WIDTH="420" BORDER="0"></IMG></DIV>
<p ALIGN="center">&nbsp;<span>图</SPAN><span>2</SPAN>
<span>条纹式的响应图</SPAN></P>
<p>
<span>在上面的响应图中，每个红点都代表一个用户活动（在这里是页面请求），水平轴是时间，以秒为单位</SPAN><span>,</SPAN>
<span>从测试开始时计算，垂直轴列出了每个虚拟用户。这个响应图是一个典型的“条纹式”（</SPAN><span>Striping</SPAN><span>）请求，这必须在负载测试中尽量避免的。上图是一个压力测试的好例子，但非负载测试。如果你拿一个尺子垂直地放在图上并从左到右缓慢移动，在垂直方向上，你会看到这些代表了用户活动的红点几乎是在同一线上，这也表示了服务器在同一时间接受到的用户请求。这是对实际用户群的非常差的刻划。现在看看图</SPAN><span>3</SPAN><span>。</SPAN></P>
<p>&nbsp;</P>
<div ALIGN="center" SRC_CETEMP="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-3.JPG">
<img HEIGHT="221" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-3.JPG" WIDTH="420" BORDER="0"></IMG></DIV>
<p ALIGN="center">&nbsp;<span>图</SPAN><span>3</SPAN>
<span>非条纹式的响应图</SPAN></P>
<p>
<span>如果你同样地用尺子来量一量，你会发现这次红点分布得更加均匀一些。虽然还不完善，但明显地更加贴近实际用户的情况。这两个测试运行唯一的区别是后者有了一定的随机延迟，而不是绝对的延迟。</SPAN></P>
<p>
<span>在对上面的两个例子进行有计划地调整之前，有</SPAN><span>3</SPAN><span>点信息是必须知道的。在第一个例子中，我只是使用了脚本录制时的平均延迟时间。第二个中，我加入了最小和最大的延迟值以及分布。有很多这种分布的数学模型，我将重点介绍最常用的两个：均匀分布（</SPAN><span>uniform
distributions</SPAN><span>）和正态分布（</SPAN><span>normal
distributions</SPAN><span>），为了完整起见同样介绍了负指数分布。这个分布并不经常用到但也不是没用，高级程序员可以将这种分布和其它数学函数结合起来进行某些用户模式的模拟。</SPAN></P>
<p>
<span>介于最小值和最大值之间的平均分布是最容易模拟的。这种分布模型只是简单的从上下边界中选择随机的数字并构成均匀分布，这意味着生成的数据并不会只在数据范围的中间或两边。图</SPAN><span>4</SPAN><span>显示了</SPAN><span>1000</SPAN><span>个</SPAN><span>0</SPAN><span>到</SPAN><span>25</SPAN><span>之间的平均分布情况。</SPAN></P>
<p ALIGN="center">&nbsp;<img HEIGHT="245" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-4.JPG" WIDTH="356" BORDER="0"></IMG></P>
<p ALIGN="center"><span>图</SPAN><span>4</SPAN>
<span>最大和最小值之间的均匀分布</SPAN></P>
<p>
<span>正态分布，也称为贝尔曲线，更难以模拟但也更加准确。这种分布模型随机地选择数字，并通过对中心值或平均值的选择频率进行相应的加权。图</SPAN><span>5</SPAN><span>展示了在</SPAN><span>0</SPAN><span>到</SPAN><span>25</SPAN><span>之间产生的</SPAN><span>1000</SPAN><span>个数字的正态分布情况（平均值为</SPAN><span>12.5</SPAN><span>，标准差为</SPAN><span>3.2</SPAN><span>）。在没有可用的实际数据的情况下，正态分布一般都被认为是最准确的数学模型。</SPAN></P>
<p ALIGN="center">&nbsp;<img HEIGHT="250" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-5.JPG" WIDTH="359" BORDER="0"></IMG></P>
<p ALIGN="center"><span>图</SPAN><span>5</SPAN>
<span>理想的正态分布</SPAN></P>
<p>
<span>负指数模型的分布情况如图</SPAN><span>6</SPAN><span>所示，这种模型延迟时间的频率明显地向末端歪斜。我觉得这种分布很少有用，但出于完整性考虑这里还是包括进来了。图</SPAN><span>6</SPAN><span>显示了在</SPAN><span>0</SPAN><span>到</SPAN><span>25</SPAN><span>之间产生</SPAN><span>1000</SPAN><span>个数字的负指数分布情况。</SPAN></P>
<p ALIGN="center">&nbsp;<img HEIGHT="247" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-6.JPG" WIDTH="357" BORDER="0"></IMG></P>
<p ALIGN="center"><span>图</SPAN><span>6</SPAN>
<span>负指数分布</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
在TestStudio中生成时间延迟</SPAN></H1>
<p><span>使用</SPAN><span>Rational
TestStudio</SPAN><span>的</SPAN><span>VuC</SPAN><span>语言，有很多方法可以生成时间延迟。对于如何使用</SPAN><span>Think_avg</SPAN><span>及相关的命令和参数来实现，</SPAN><span>Rational</SPAN><span>的文档和培训资料已经做了详细的说明，这里不做深入讨论，只做简要介绍。这个方法只有在</SPAN><span>Think_avg</SPAN><span>命令不在计时器（</SPAN><span>Timer</SPAN><span>）里面或附近时才有效。我发现</SPAN><span>Think_avg</SPAN><span>命令更容易代表客户端的处理过程，但对用户模型来说并不合适。关于计时器和客户端处理时间模型将在后续的文章中详细讨论。</SPAN></P>
<p>
<span>当脚本中的用户延迟不包含在计数器中的时候使用</SPAN><span>delay</SPAN><span>命令。下面是使用</SPAN><span>delay</SPAN><span>命令创建静态值以及均匀、负指数、正态分布以实现用户延迟的讨论。</SPAN></P>
<p>
<span>如果已经明确某些活动消耗了所有用户</SPAN><span>8</SPAN><span>秒的操作时间（很少，但有可能），可用以下命令：</SPAN></P>
<div>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p><code><span>delay(8000);</SPAN></CODE></P>
</DIV>
</DIV>
<p>
<span>括号中的数值是静态延迟值，以毫秒为单位。此命令的语法是</SPAN><span>delay(value);</SPAN><span>，静态延迟一般只用在精确模型中。</SPAN></P>
<p>
<span>如果确定用户在网站上执行活动的时间在</SPAN><span>6</SPAN><span>到</SPAN><span>12</SPAN><span>秒之间，那么均匀分布能准确地代表实际用户。命令如下：</SPAN></P>
<div>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p><code><span>delay(uniform(6000,12000));</SPAN></CODE></P>
</DIV>
</DIV>
<p>
<span>在这个例子中，</SPAN><span>6000</SPAN><span>是最小值而</SPAN><span>12000</SPAN><span>是最大值，以毫秒为单位。此命令的语法是</SPAN><span>delay(uniform(min_value,
max_value))</SPAN><span>。</SPAN></P>
<p>
<span>如果确定用户在网站上活动的时间在</SPAN><span>9</SPAN><span>到</SPAN><span>15</SPAN><span>秒之间，但大部分用户接近</SPAN><span>9</SPAN><span>秒而不是</SPAN><span>15</SPAN><span>秒，同时没有用户少于</SPAN><span>9</SPAN><span>秒，这时使用负指数分布将最准确。典型的例子比方是只有当</SPAN><span>9</SPAN><span>秒的短片播放完后，下一步的按钮才会显示。命令如下：</SPAN></P>
<div>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p>
<code><span><code><span>delay(negexp(9000,15000));</SPAN></CODE></SPAN></CODE></P>
</DIV>
</DIV>
<p>
<span>在这个例子中，</SPAN><span>9000</SPAN><span>是最小值而</SPAN><span>15000</SPAN><span>是最大值，以毫秒为单位。此命令的语法是</SPAN><span>delay(negexp(min_value,
max_value))</SPAN><span>。</SPAN></P>
<p>
<span>在</SPAN><span>VuC</SPAN><span>函数中并没有创建正态分布的延迟命令。为此，我们用下列的函数以及</SPAN><span>delay</SPAN><span>命令的组合构成了正态分布。注意，</SPAN><span>normdist</SPAN><span>函数在每个脚本中必须直接放在</SPAN><span>#include</SPAN><span>命令下面。</SPAN></P>
<div>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p>int func normdist(min, max, stdev)</P>
<p><br/>
int min, max, stdev;<br/>
{</P>
<p><br/>
int range, iterate, result;</P>
<p><br/>
range = max -min;</P>
<p><br/>
iterate = range / stdev;</P>
<p><br/>
result = 0;</P>
<p><br/>
stdev += 1;<br/>
for (c = iterate; c != 0; c--)<br/>
result += (uniform (1, 100) * stdev) / 100;</P>
<p><br/>
return result + min;<br/>
}</P>
</DIV>
</DIV>
<p>
<span>将这个函数以</SPAN><span>0</SPAN><span>毫秒为最小值，</SPAN><span>25000</SPAN><span>毫秒为最大值，</SPAN><span>3200</SPAN><span>毫秒为标准差，执行</SPAN><span>1000</SPAN><span>次产生的正态分布如图</SPAN><span>7</SPAN><span>所示。需要注意的是，这里使用了与理想正态曲线相同的参数，只是把单位由秒替换成毫秒。大家可以看到，这个曲线图与图</SPAN><span>5</SPAN><span>的理想正态分布几乎是一样的。</SPAN></P>
<p ALIGN="center">&nbsp;<img HEIGHT="246" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM2-7.JPG" WIDTH="358" BORDER="0"></IMG></P>
<p ALIGN="center"><span>图</SPAN><span>7</SPAN>
<span>用</SPAN><span>normdist</SPAN><span>函数生成的正态分布</SPAN></P>
<p>
<span>delay</SPAN><span>函数在正态分布中使用频率最高。可用以下命令来模拟一个</SPAN><span>10</SPAN><span>秒到</SPAN><span>35</SPAN><span>秒之间，标准差为</SPAN><span>3.2</SPAN><span>秒，呈正态分布的用户延迟（对于上面的例子而言，只是将时间右移了</SPAN><span>10</SPAN><span>秒）：</SPAN></P>
<div>
<div STYLE="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
<p><code><span>delay(normdist(10000,25000,3200));</SPAN></CODE></P>
</DIV>
</DIV>
<p>
<span>这里</SPAN><span>10000</SPAN><span>是最小值而</SPAN><span>25000</SPAN><span>是最大值，</SPAN><span>3200</SPAN><span>是标准差，均以毫秒为单位。此命令的语法为：</SPAN><span>delay(normdist(min_value,
max_value,
std_deviation))</SPAN><span>。记住，如果脚本里面没有</SPAN><span>normdist</SPAN><span>函数的代码将会报错。</SPAN></P>
]]></description>
            <author>前行</author>
            <category>性能测试</category>
            <comments>http://blog.sina.com.cn/s/blog_4fb4353501000azm.html#comment</comments>
            <pubDate>Tue, 13 Nov 2007 07:12:12 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_4fb4353501000azm.html</guid>
        </item>
        <item>
            <title>【转】【翻译】User experience, not metrics系列 第一章</title>
            <link>http://blog.sina.com.cn/s/blog_4fb4353501000azk.html</link>
            <description><![CDATA[<div>&nbsp;
<p STYLE="FONT-SIZE: 24pt" ALIGN="center"><strong>第一章</STRONG>
<span STYLE="FONT-SIZE: 24pt"><strong>介绍</STRONG></SPAN></P>
<p><span><br/>
随着越来越多的人依托互联网从事日常业务操作，应用程序的性</SPAN><span>能在成功的电子商务解决方案中变得至关重要</SPAN><span>。为了确保成功，很多公司开发了工具和方法来测试和调整应用程序的性能。但这些工具和方法基本上都是关注在系统度量上的优化，而非用户体验。《</SPAN><span>User
Experience, Not
Metrics</SPAN><span>》系列文章将对如何确定真正的用户体验，以及使用</SPAN><span>Rational
Suite
TestStudio</SPAN><span>测试工具，以一套行之有效的方法对应用程序性能调优的相关方面进行讨论，侧重于最终用户的性能体验上。在本简介中，旨在对整个系列文章中的相关概念和术语进行介绍。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
简介</SPAN></H1>
<p>
<span>有多少次因为网页速度太</SPAN><span>慢，你被迫</SPAN><span>终止了该任务并选择了其它站点？大约有</SPAN><span>46</SPAN><span>％的消费者会因为站点过于技术化或者性能问题而选择了离开。换言之，如果你的站点速度太慢客户就会离去，这是所有的互联网用户都熟知的道理。这时你的第一想法不是“哎呀，不知道站点的吞吐量怎样”，而是“简直太慢了</SPAN><span>!</SPAN><span>我可没有时间在这里等，到别处去吧”。现在想想，人们离开你的站点是否因为性能问题？</SPAN></P>
<p>
<span>基于此，用户不会在乎你的吞吐量、带宽或每秒点击率等指标，他们只要一个良好的用户体验。市场上有大量的书讨论了如何设计良好的性能，还有更多的书把重点放在如何使得站点更加直观、</SPAN><span>生动、令人愉悦和易于操作上。</SPAN><span>关于速度的好处也讨论过，但如何真正预知并调优系统来提高用户体验呢？那就是直接的用户体验测试了。有两种方法做到这一点。可以把站点直接投入到能够进行数据采集和系统调优的生产环境中，并祈祷你的站点不会太慢或崩溃。另一种明智的选择是模拟真实的多用户活动，进行重复的测试和调优，最后再投入到生产环境中。这听起来是一个简单的选择，但如何准确地模拟真实的多用户活动呢？这就是本文尝试着去解答的问题。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
术语和概念</SPAN></H1>
<p>
<span>理解以下的术语和概念对于理解后续的文章非常重要。</SPAN></P>
<p><span>性能测试（</SPAN><span>Performance
Testing</SPAN><span>）：通过运行实际所期望的用户模式，确定和消除应用程序或系统的瓶颈的过程。见图</SPAN><span>1</SPAN><span>。</SPAN></P>
<p>&nbsp;<span LANG="EN-US" STYLE="FONT-SIZE: 10.5pt; FONT-FAMILY: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" XML:LANG="EN-US">
 <img STYLE="WIDTH: 500px; HEIGHT: 542px" HEIGHT="602" ALT="" SRC="http://www.cnblogs.com/images/cnblogs_com/pent/UENM/UENM1-1.JPG" WIDTH="555" BORDER="0"></IMG>
</SPAN></P>
<p><span>工作量分布（</SPAN><span>Workload
Distribution</SPAN><span>）：系统中一组用户功能操作的一种体现，有时被理解为用户群模式。以一个零售站点的一天中使用情况为例，大部分的用户在购物，还有的在搜索特定的商品，有的在结账并最终离开站点，同时可能也有管理员在更新商品价格。负载分布是基于一段时间内用户执行特定功能的比例。在以上的例子中其负载分布可能是：购物－</SPAN><span>83</SPAN><span>％，商品搜索－</SPAN><span>5</SPAN><span>％，结账－</SPAN><span>10</SPAN><span>％，后台管理－</SPAN><span>2</SPAN><span>％。</SPAN></P>
<p><span>从用户体验的角度来看，性能目标（</SPAN><span>Performance
Goals</SPAN><span>）可以表示为执行预定数量的并发用户时所允许的最大响应时间。</SPAN></P>
<p><span>响应时间（</SPAN><span>Response
Time</SPAN><span>）是从最终用户的角度来衡量的。例如，从用户点击登录按钮到下一页面完全加载的时间。</SPAN></P>
<p><span>会话持续时间（</SPAN><span>Session
Duration</SPAN><span>）是单个用户在一次站点访问过程中的所有持续时间总量，会话持续时间因用户类型而异。</SPAN></P>
<p><span>并发用户数（</SPAN><span>The number of Concurrent
Users</SPAN><span>）是特定时间点上实际访问站点或活跃会话的总用户数。</SPAN></P>
<p><span>每小时的使用总量（</SPAN><span>Total Hourly
Usage</SPAN><span>）是一小时内访问站点的期望用户数，通过将会话持续时</SPAN><span>间乘以并发用户数计算得到。</SPAN></P>
<p>
<span>基线（</SPAN><span>Baselines</SPAN><span>）在此理解为用于时间比较起点的单用户、单脚本的测试。</SPAN></P>
<p><span>用户延迟（</SPAN><span>User
Delay</SPAN><span>）是插入脚本的一段等待时间，以便当脚本回放时和实际用户有相同的步调。</SPAN></P>
<p>
<span>在本系列文章中可能用到一些不同的人有不同理解的术语。这些术语说明如下。</SPAN></P>
<p><span>负载测试（</SPAN><span>Load
Test</SPAN><span>）是一种包括等待时间，准确模拟目标用户群操作的多用户测试。负载测试可用于执行不同的用户负载以获取诸如站点所能支持的最大用户数的信息，（并以次判断）是否能够满足预期的性能目标。</SPAN></P>
<p><span>压力测试（</SPAN><span>Stress
Test</SPAN><span>）是由多个脚本组成的在高用户负载下，不包括等待时间的一种测试。这类测试对于评估系统在一定负载下的稳定性和功能性比较有用，但不适合于测定用户体验。</SPAN></P>
<p>
<span>基准（</SPAN><span>Benchmarks</SPAN><span>），收集有关系统硬件、支撑软件的度量指标。例如，可以通过基准测试访问一个大图片来测定</SPAN><span>Web</SPAN><span>服务器的吞吐量和每秒点击率。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
系列文章概览</SPAN></H1>
<p>
<span>本系列每月将会有一篇新文章发布。所有文章将包括所介绍的实际应用的方法和技术的讨论、现实中的例子和（或）代码样本，以及“</SPAN><span>Now
you try
it</SPAN><span>”的练习。每篇文章都会被分成初级、中级还是专家级，这些等级通常指的是技术实现讨论所需代码的复杂性。每篇文章中提到的概念将适用于所有专业知识水平。下面简要描述一下前</SPAN><span>12</SPAN><span>篇文章。</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">3.1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
模拟真实用户（Modeling Real Users）</SPAN></H2>
<p>
<span>确定真正用户体验的关键之一是有效的模拟实际的用户和用户群。本系列的前</SPAN><span>3</SPAN><span>篇文章将讨论如何从应用程序的角度出发，使用</SPAN><span>Rational
Test
Studio</SPAN><span>来准确模拟单个用户或整个用户群。相关主题包括：</SPAN></P>
<p><span>Part 2: Modeling Individual User Delays</SPAN></P>
<p><span>Part 3: Modeling Individual User Patterns</SPAN></P>
<p><span>Part 4: Modeling Groups of Users</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">3.2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
（捕获）有意义的时间</SPAN></H2>
<p>
<span>在模拟实际用户之后，从这些用户的角度获取系统（应用）的响应时间变得相当迫切。只是简单的捕获这些时间是不够的。除非能够解释这些时间的模式，否则这些时间是没有意义的。接下来的</SPAN><span>3</SPAN><span>篇文章讨论了如何使用</SPAN><span>Rational
Test
Studio</SPAN><span>来捕获和解释真正的时间体验。相关主题包括：</SPAN></P>
<p><span>Part 5: What should I time and where do I put my
timers?</SPAN></P>
<p><span>Part 6: What is an outlier and how do I account for
on</SPAN><span>e?</SPAN></P>
<p><span>Part 7: Consolidating and interpreting Times</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">3.3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
向干系人汇报（Reports to Stakeholders）</SPAN></H2>
<p>
<span>我不得不承认干系人和决策者需要测试报告，我们不能只是简单地告诉他们测试结果是“行”或者“不行”。我们需要采集大量的数据并形成简明、有意义的报告。这部分的文章将讨论哪些测试类型将给干系人和决策者带来更多的价值，以及如何使用</SPAN><span>Rational
Test
Manager</SPAN><span>来收集数据和生成各种摘要信息。相关主题包括：</SPAN></P>
<p><span>Part 8: What Tests add value to</SPAN>
<span>stakeholders?</SPAN></P>
<p><span>Part 9: Summarizing across multiple tests with
accuracy</SPAN></P>
<p><span>Part 10: Creating a Degradation Curve</SPAN></P>
<h2><span STYLE="FONT-SIZE: 14pt">3.4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
高级主题</SPAN></H2>
<p>
<span>本系列的最后主题将围绕一些曾经给作者带来困扰的高级问题展开讨论。这些文章采用案例研究的形式。每个案例研究概括了客户问题的特殊需求、作者的形成解决方案的思维过程、可能的解决方案的要点，以及详细描述了挑选办法。相关主题包括：</SPAN></P>
<p><span>Part 11: Handling Secure Session ID’s</SPAN></P>
<p><span>Part 12: Conditional user path navigation (intelligent
surfing)</SPAN></P>
<p><span>Part 13: Working with Unrecognized Protocols</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
小结</SPAN></H1>
<p>
<span>本系列文章是鲜明的：相对于当今的计量习惯，用户视点是一种更加可靠的网站性能衡量的方式。这一系列的文章旨在教导读者如何使用</SPAN><span>Rational
Test
Studio</SPAN><span>来模拟多用户的活动，以及一个经过验证的优化最终用户性能体验的方法。本文将分享一些关于如何有效运用方法学，以及利用</SPAN><span>Rational</SPAN><span>测</SPAN><span>试工具等</SPAN><span>有用的信息，甚至是一些有用的贴士（</SPAN><span>Tips</SPAN><span>）来规避曾经令专家们也感到为难的问题。希望大家喜欢并保持关注。</SPAN></P>
<h1><span STYLE="FONT-SIZE: 18pt">5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
附录（单词）</SPAN></H1>
<p><span>User experience</SPAN> <span>用户体验</SPAN></P>
<p><span>Application’s perspective</SPAN>
<span>应用程序的角度</SPAN></P>
<p><span>Fraction of an
hour</SPAN><span>：以小时为单位的分数形式</SPAN></P>
<p><span>Stakeholders</SPAN> <span>干系人</SPAN></P>
<p><span>Concise and meaningful report</SPAN>
<span>简明、有意义的报告</SPAN></P>
<p><span>imperative</SPAN> <span>紧急的、必要的<br/></SPAN></P>
</DIV>
]]></description>
            <author>前行</author>
            <category>性能测试</category>
            <comments>http://blog.sina.com.cn/s/blog_4fb4353501000azk.html#comment</comments>
            <pubDate>Tue, 13 Nov 2007 06:57:06 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_4fb4353501000azk.html</guid>
        </item>
        <item>
            <title>性能测试的2篇文章</title>
            <link>http://blog.sina.com.cn/s/blog_4fb4353501000azj.html</link>
            <description><![CDATA[<div>&nbsp;
<div>前段时间有同事推荐了2篇性能测试方面的文章给我，一篇是User
experience, not metrics，一篇是Beyond Performance
Testing。到网上查了一下，这2篇文章都十分火爆，推崇者备至。最近抽空读了读，受益不浅。（都是全英文的。。。狠是让我郁闷了一把。N久没用的英语退步的都不行了）</DIV>
<div>这是官方网站的链接地址：<a HREF="http://www.ibm.com/developerworks/rational/library/4228.html" TARGET="_blank">User experience, not
metrics</A>&nbsp;，以及&nbsp;<a HREF="http://www.ibm.com/developerworks/rational/library/4169.html" TARGET="_blank">Beyond Performance
Testing</A>&nbsp;。其中User experience, not
metrics适合初学者阅读，Beyond Performance
Testing用于进阶学习。</DIV>
<div>
<hr></HR></DIV>
<div>
如果嫌打开网页太慢的话，也可以通过下列地址下载PDF文档查阅。</DIV>
<div>&nbsp;</DIV>
<div><strong>User Experience, not Metrics：</STRONG></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM1.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 1:
Introduction</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM2.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 2: Modeling
Individual User Delays</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM3.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 3: Modeling
Individual User Patterns</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM4.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 4: Modeling
Groups of Users</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM5.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 5: What should I
time and where do I put my timers?</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM6.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 6: What is an
outlier and how do I account for one?</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM7.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 7: Consolidating
Test Results</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM8.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 8: Choosing
Tests and Reporting Results to Meet Stakeholders
Needs</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM9.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 9: Summarizing
Across Multiple Tests</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM10.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 10: Creating a
Degradation Curve</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM11.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 11: Handling
Authentication and Session Tracking</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM12.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 12: Scripting
Conditional User Path Navigation</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/UENM13.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 13: Working with
Unrecognized Protocols</FONT></A></DIV>
<div>
<hr></HR></DIV>
<div><strong><font STYLE="BACKGROUND-COLOR: #ffffff">Beyond
Performance Testing</FONT></STRONG></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT1.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 1:
Introduction</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT2.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 2: A Performance
Engineering Strategy</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT3.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 3: How Fast Is
Fast Enough?</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT4.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 4: Accounting
for User Abandonment</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT5.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 5: Determining
the Root Cause of Script Failures</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT6.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 6: Interpreting
Scatter Charts</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT7.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 7: Identifying
the Critical Failure or Bottleneck</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT8.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 8: Modifying
Tests to Focus on Failure or Bottleneck Resolution</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT9.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 9: Pinpointing
the Architectural Tier of the Failure or
Bottleneck</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT10.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 10: Creating a
Test to Exploit the Failure or Bottleneck</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT11.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 11:
Collaborative Tuning</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT12.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 12: Testing and
Tuning Common Tiers</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT13.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 13: Testing and
Tuning Load Balancers and Networks</FONT></A></DIV>
<div><a HREF="http://www.perftestplus.com/resources/BPT14.pdf" TARGET="_blank"><font STYLE="FONT-SIZE: 12px">Part 14: Testing and
Tuning Security</FONT></A></DIV>
<div>&nbsp;</DIV>
<div>&nbsp;</DIV>
</DIV>
]]></description>
            <author>前行</author>
            <category>性能测试</category>
            <comments>http://blog.sina.com.cn/s/blog_4fb4353501000azj.html#comment</comments>
            <pubDate>Tue, 13 Nov 2007 06:31:21 GMT+8</pubDate>
            <guid>http://blog.sina.com.cn/s/blog_4fb4353501000azj.html</guid>
        </item>
    </channel>
</rss>
