发布新日志

  • 软件测试成熟度模型

    2009-08-08 13:29:24

    软件测试成熟度模型
     

    第一级 初始级

    TMM初始级软件测试过程的特点是测试过程无序,有时甚至是混乱的,几乎没有妥善定义的。初始级中软件的测试与调试常常被混为一谈,软件开发过程中缺乏测试资源,工具以及训练有素的测试人员。初始级的软件测试过程没有定义成熟度目标。

    第二级 定义级

    TMM的定义级中,测试己具备基本的测试技术和方法,软件的测试与调试己经明确地被区分开。这时,测试被定义为软件生命周期中的一个阶段,它紧随在编码阶段之后。但在定义级中,测试计划往往在编码之后才得以制订,这显然有背于软件工程的要求。

    TMM的定义级中需实现3个成熟度目标:制订测试与调试目标,启动测试计划过程,制度化基本的测试技术和方法。

    (I)制订测试与调试目标

    软件组织必须消晰地区分软件开发的测试过程与调试过程,识别各自的目标,任务和括动。正确区分这两个过程是提高软件组织测试能力的基础。与调试工作不同,测试工作是一种有计划的活动,可以进行管理和控制。这种管理和控制活动需要制订相应的策略和政策,以确定和协调这两个过程。

    制订测试与调试目标包含5个子成熟度目标:


    1)分别形成测试组织和调试组织,并有经费支持。
    2)规划并记录测试目标。
    3)规划井记录调试目标。
    4)将测试和调试目标形成文档,并分发至项目涉暗乃 泄芾砣嗽焙涂 ⑷嗽薄?
    5)将测试目标反映在测试计划中。

    (II)启动测试计划过程

    制订计划是使一个过程可重复,可定义和可管理的基础。测试计划应包括测试目的,风险分析,测试策略以及测试设计规格说明和测试用例。此外,测试计划还应说明如何分配测试资源,如何划分单元测试,集成测试,系统测试和验收测试的任务。启动测试计划过程包含5个子目标:


    1)建立组织内的测试计划组织并予以经费支持。
    2)建立组织内的测试计划政策框架并予以管理上的支持。
    3)开发测试计划模板井分发至项目的管理者和开发者。
    4)建立一种机制,使用户需求成为测试计划的依据之一。
    5)评价,推荐和获得基本的计划工具并从管理上支持工具的使用。

    (III)制度化基本的测试技术和方法?

    为改进测试过程能力,组织中需应用基本的测试技术和方法,并说明何时和怎样使用这些技术,方法和支持工具。将基本测试技术和方法制度化有2个子目标:


    1)在组织范围内成立测试技术组,研究,评价和推荐基本的测试技术和测试方法,推荐支持这些技术与方法的基本工具。


    2)制订管理方针以保证在全组织范围内一致使用所推荐的技术和方法。

    第三级 集成级

    在集成级,测试不仅仅是跟随在编码阶段之后的一个阶段,它已被扩展成与软件生命周期融为一体的一组已定义的活动。测试活动遵循软件生命周期的V字模型。测试人员在需求分析阶段便开始着手制订测试计划,并根据用户或客户需求建立测试目标,同时设计测试用例并制订测试通过准则。在集成级上,应成立软件测试组织,提供测试技术,关键的测试活动应有相应的测试工具予以支持。在该测试成熟度等级上,没有正式的评审程序,没有建立质量过程和产品属性的测试度量。集成级要实现4个成熟度目标,它们分别是:建立软件测试组织,制订计划,软件全寿命周期测试,控制和监视测试过程。

    (I)建立软件测试组织

    软件测试的过程及质量对软件产品质量有直接影响。由于测试往往是在时间紧,压力大的情况下所完成的一系列复杂的活动,因此应由训练有素的专业人员组成测试组。测试组要完成与测试有关的多种活动,包括负责制订测试计划,实施测试执行,记录测试结果,制订与测试有关的标准和测试度量,建立铡试数据库,测试重用,测试跟踪以及测试评价等。建立软件测试组织要实现4个子目标:


    1)建立全组织范围内的测试组,并得到上级管理层的领导和各方面的支持,包括经费支持。
    2)定义测试组的作用和职责。
    3)由训练有素的人员组成测试组。
    4)建立与用户或客户的联系,收集他们对测试的需求和建议。

    (II)制订计划

    为高效率地完成好测试工作,测试人员必须经过适当的培训。制订技术培训规划有3个子目标:


    1)制订组织的培训计划,并在管理上提供包括经费在内的支持。
    2)制订培训目标和具体的培训计划。
    3)成立培训组,配备相应的工具,设备和教材

    (III)软件全生命周期测试

    提高测试成熟度和改善软件产品质量都要求将测试工作与软件生命周期中的各个阶段联系起来。该目标有4个子目标:


    1)将测试阶段划分为子阶段,并与软件生命周期的各阶段相联系。
    2)基于已定义的测试子阶段,采用软件生命周期V字模型。
    3)制订与渊试相关的工作产品的标准。
    4)建立测试人员与开发人员共同工作的机制。这种机制有利于促进将测试活动集成于软件生命周期中

    (IV)控制和监视测试过程

    为控制和监视测试过程,软件组织需采取相应措施,如:制订测试产品的标准,制订与测试相关的偶发事件的处理预案,确定测试里程碑,确定评估测试效率的度量,建立测试日志等。控制和监视测试过程有3个子目标:


    1)制订控制和监视测试过程的机制和政策。
    2)定义,记录并分配一组与测试过程相关的基本测量。
    3)开发,记录并文档化一组纠偏措施和偶发事件处理预案,以备实际测试严重偏离计划时使用。

    在TMM的定义级,测试过程中引入计划能力,在TMM的集成级,测试过程引入控制和监视活动。两者均为测试过程提供了可见性,为测试过程持续进行提供保证。

    第四级 管理和测量级

    在管理和测量级,测试活动除测试被测程序外,还包括软件生命周期中各个阶段的评审,审查和追查,使测试活动涵盖了软件验证和软件确认活动。根据管理和测量级的要求,软件工作产品以及与测试相关的工作产品,如测试计划,测试设计和测试步骤都要经过评审。因为测试是一个可以量化并度量的过程。为了测量测试过程,测试人员应建立测试数据库。收集和记录各软件工程项目中使用的测试用例,记录缺陷并按缺陷的严重程度划分等级。此外,所建立的测试规程应能够支持软件组终对测试过程的控制和测量。管理和测量级有3个要实现的成熟度目标:建立组织范围内的评审程序,建立测试过程的测量程序和软件质量评价。

    (I)建立组织范围内的评审程序

    软件组织应在软件生命周期的各阶段实施评审,以便尽早有效地识别,分类和消除软件中的缺陷。建立评审程序有4个子目标:


    1)管理层要制订评审政策支持评审过程。
    2)测试组和软件质量保证组要确定并文档化整个软件生命周期中的评审目标,评审计划,评审步骤以及评审记录机制。
    3)评审项由上层组织指定。通过培训参加评审的人员,使他们理解和遵循相牢的评审政策,评审步骤。

    (II)建立测试过程的测量程序

    测试过程的侧量程序是评价测试过程质量,改进测试过程的基础,对监视和控制测试过程至关重要。测量包括测试进展,测试费用,软件错误和缺陷数据以及产品渊量等。建立渊试测量程序有3个子目标:


    1)定义组织范围内的测试过程测量政策和目标。
    2)制订测试过程测量计划。测量计划中应给出收集,分析和应用测量数据的方法。
    3)应用测量结果制订测试过程改进计划。

    (III)软件质量评价

    软件质量评价内容包括定义可测量的软件质量属性,定义评价软件工作产品的质量目标等项工作。软件质量评价有2个子目标:


    1)管理层,测试组和软件质量保证组要制订与质量有关的政策,质量目标和软件产品质量属性。
    2)测试过程应是结构化,己测量和己评价的,以保证达到质量目标。
    第五级? 优化,预防缺陷和质量控制级
    由于本级的测试过程是可重复,已定义,已管理和己测量的,因此软件组织能够优化调整和持续改进测试过程。测试过程的管理为持续改进产品质量和过程质量提供指导,并提供必要的基础设施。优化,预防缺陷和质量控制级有3个要实现的成熟度目标:

    (I)应用过程数据预防缺陷。这时的软件组织能够记录软件缺陷,分析缺陷模式,识别错误根源,制订防止缺陷再次发生的计划,提供跟踪这种括动的办法,并将这些活动贯穿于全组织的各个项目中。应用过程数据预防缺陷有礴个成熟度子目标:


    1)成立缺陷预防组。
    2)识别和记录在软件生命周期各阶段引入的软件缺陷和消除的缺陷。
    3)建立缺陷原因分析机制,确定缺陷原因。
    4)管理,开发和测试人员互相配合制订缺陷预防计划,防止已识别的缺陷再次发生。缺陷预防计划要具有可跟踪性。

    (II)质量控制在本级,软件组织通过采用统计采样技术,测量组织的自信度,测量用户对组织的信赖度以及设定软件可靠性目标来推进测试过程。为了加强软件质量控制,测试组和质量保证组要有负责质量的人员参加,他们应掌握能减少软件缺陷和改进软件质量的技术和工具。支持统计质量控制的子目标有:?

    1)软件测试组和软件质量保证组建立软件产品的质量目标,如:产品的缺陷密度,组织的自信度以及可信赖度等。
    2)测试管理者要将这些质量目标纳入测试计划中。
    3)培训测试组学习和使用统计学方法。
    4)收集用户需求以建立使用模型

    (III)优化测试过程在测试成熟度的最高级,己能够量化测试过程。这样就可以依据量化结果来调整测试过程,不断提高测试过程能力,并且软件组织具有支持这种能力持续增长的基础设施。基础设施包括政策,标准,培训,设备,工具以及组织结构等。优化测试过程包含:


    1)识别需要改进的测试括动
    2)实施改进。
    3)跟踪改进进程。
    4)不断评估所采用的与测试相关的新工具和新方法。
    5)支持技术更新。

    (IV)测试过程优化所需子成熟度目标包括:


    1)建立测试过程改进组,监视测试过程并识别其需要改进的部分。
    2)建立适当的机制以评估改进测试过程能力和测试成熟度的新工具和新技术。
    3)持续评估测试过程的有效性,确定测试终止准则。终止测试的准则要与质盘目标相联系。

  • LR视频

    2009-07-16 00:10:13

  • AQtime资料

    2008-12-31 19:03:59

    学习AQtime时收集的资料,不过网上这方面的中文资料实在太少了,希望学习此工具的朋友能有用。
  • 性能调优

    2008-11-06 15:18:26

    Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了各种工具、写了大量的文章和博客并在各种会议上参与探讨。最佳实践的核心就是旨在提高网站性能。

      Excetional Performance团队总结出了一系列可以提高网站速度的方法。可以分为7大类34条。包括内容、服务器、cookie、CSS、Javascrīpt、图片、移动应用等七部分。

      其中内容部分一共十条建议:

      一、内容部分

      尽量减少HTTP请求

      减少DNS查找

      避免跳转

      缓存Ajxa

      推迟加载

      提前加载

      减少DOM元素数量

      用域名划分页面内容

      使frame数量最少

      避免404错误

      1、尽量减少HTTP请求次数

      终端用户响应的时间中,有80%用于下载各项内容。这部分时间包括下载页面中的图像、样式表、脚本、Flash等。通过减少页面中的元素可以减少HTTP请求的次数。这是提高网页速度的关键步骤。

      减少页面组件的方法其实就是简化页面设计。那么有没有一种方法既能保持页面内容的丰富性又能达到加快响应时间的目的呢?这里有几条减少HTTP请求次数同时又可能保持页面内容丰富的技术

      合并文件是通过把所有的脚本放到一个文件中来减少HTTP请求的方法,如可以简单地把所有的CSS文件都放入一个样式表中。当脚本或者样式表在不同页面中使用时需要做不同的修改,这可能会相对麻烦点,但即便如此也要把这个方法作为改善页面性能的重要一步。

      CSS Sprites是减少图像请求的有效方法。把所有的背景图像都放到一个图片文件中,然后通过CSS的background-image和background-position属性来显示图片的不同部分;

      图片地图是把多张图片整合到一张图片中。虽然文件的总体大小不会改变,但是可以减少HTTP请求次数。图片地图只有在图片的所有组成部分在页面中是紧挨在一起的时候才能使用,如导航栏。确定图片的坐标和可能会比较繁琐且容易出错,同时使用图片地图导航也不具有可读性,因此不推荐这种方法;

      内联图像是使用data:URL scheme的方法把图像数据加载页面中。这可能会增加页面的大小。把内联图像放到样式表(可缓存)中可以减少HTTP请求同时又避免增加页面文件的大小。但是内联图像现在还没有得到主流浏览器的支持。

      减少页面的HTTP请求次数是你首先要做的一步。这是改进首次访问用户等待时间的最重要的方法。如同Tenni Theurer的他的博客Browser Cahe Usage - Exposed!中所说,HTTP请求在无缓存情况下占去了40%到60%的响应时间。让那些初次访问你网站的人获得更加快速的体验吧!

      2、减少DNS查找次数

      域名系统(DNS)提供了域名和IP的对应关系,就像电话本中人名和他们的电话号码的关系一样。当你在浏览器地址栏中输入http://www.dudo.org/时,DNS解析服务器就会返回这个域名对应的IP地址。DNS解析的过程同样也是需要时间的。一般情况下返回给定域名对应的IP地址会花费20到120毫秒的时间。而且在这个过程中浏览器什么都不会做直到DNS查找完毕。

      缓存DNS查找可以改善页面性能。这种缓存需要一个特定的缓存服务器,这种服务器一般属于用户的ISP提供商或者本地局域网控制,但是它同样会在用户使用的计算机上产生缓存。DNS信息会保留在操作系统的DNS缓存中(微软Windows系统中DNS Client Service)。大多数浏览器有独立于操作系统以外的自己的缓存。由于浏览器有自己的缓存记录,因此在一次请求中它不会受到操作系统的影响。

      Internet Explorer默认情况下对DNS查找记录的缓存时间为30分钟,它在注册表中的键值为DnsCacheTimeout。Firefox对DNS的查找记录缓存时间为1分钟,它在配置文件中的选项为network.dnsCacheExpiration(Fasterfox把这个选项改为了1小时)。

      当客户端中的DNS缓存都为空时(浏览器和操作系统都为空),DNS查找的次数和页面中主机名的数量相同。这其中包括页面中URL、图片、脚本文件、样式表、Flash对象等包含的主机名。减少主机名的数量可以减少DNS查找次数。

      减少主机名的数量还可以减少页面中并行下载的数量。减少DNS查找次数可以节省响应时间,但是减少并行下载却会增加响应时间。我的指导原则是把这些页面中的内容分割成至少两部分但不超过四部分。这种结果就是在减少DNS查找次数和保持较高程度并行下载两者之间的权衡了。

      3、避免跳转

      跳转是使用301和302代码实现的。下面是一个响应代码为301的HTTP头:

      HTTP/1.1 301 Moved Permanently

      Location: http://example.com/newuri

      Content-Type: text/html

      浏览器会把用户指向到Location中指定的URL。头文件中的所有信息在一次跳转中都是必需的,内容部分可以为空。不管他们的名称,301和302响应都不会被缓存除非增加一个额外的头选项,如Expires或者Cache-Control来指定它缓存。<meat />元素的刷新标签和Javascrīpt也可以实现URL的跳转,但是如果你必须要跳转的时候,最好的方法就是使用标准的3XXHTTP状态代码,这主要是为了确保“后退”按钮可以正确地使用。

      但是要记住跳转会降低用户体验。在用户和HTML文档中间增加一个跳转,会拖延页面中所有元素的显示,因为在HTML文件被加载前任何文件(图像、Flash等)都不会被下载。

      有一种经常被网页开发者忽略却往往十分浪费响应时间的跳转现象。这种现象发生在当URL本该有斜杠(/)却被忽略掉时。例如,当我们要访问http://astrology.yahoo.com/astrology 时,实际上返回的是一个包含301代码的跳转,它指向的是http://astrology.yahoo.com/astrology/ (注意末尾的斜杠)。在Apache服务器中可以使用Alias 或者 mod_rewrite或者the DirectorySlash来避免。

      连接新网站和旧网站是跳转功能经常被用到的另一种情况。这种情况下往往要连接网站的不同内容然后根据用户的不同类型(如浏览器类型、用户账号所属类型)来进行跳转。使用跳转来实现两个网站的切换十分简单,需要的代码量也不多。尽管使用这种方法对于开发者来说可以降低复杂程度,但是它同样降低用户体验。一个可替代方法就是如果两者在同一台服务器上时使用Alias和mod_rewrite和实现。如果是因为域名的不同而采用跳转,那么可以通过使用Alias或者mod_rewirte建立CNAME(保存一个域名和另外一个域名之间关系的DNS记录)来替代。

      4、可缓存的AJAX

      Ajax经常被提及的一个好处就是由于其从后台服务器传输信息的异步性而为用户带来的反馈的即时性。但是,使用Ajax并不能保证用户不会在等待异步的Javascrīpt和XML响应上花费时间。在很多应用中,用户是否需要等待响应取决于Ajax如何来使用。例如,在一个基于Web的Email客户端中,用户必须等待Ajax返回符合他们条件的邮件查询结果。记住一点,“异步”并不异味着“即时”,这很重要。

      为了提高性能,优化Ajax响应是很重要的。提高Ajxa性能的措施中最重要的方法就是使响应具有可缓存性,具体的讨论可以查看Add an Expires or a Cache-Control Header。其它的几条规则也同样适用于Ajax:

      Gizp压缩文件

      减少DNS查找次数

      精简Javascrīpt

      避免跳转

      配置ETags

      让我们来看一个例子:一个Web2.0的Email客户端会使用Ajax来自动完成对用户地址薄的下载。如果用户在上次使用过Email web应用程序后没有对地址薄作任何的修改,而且Ajax响应通过Expire或者Cacke-Control头来实现缓存,那么就可以直接从上一次的缓存中读取地址薄了。必须告知浏览器是使用缓存中的地址薄还是发送一个新的请求。这可以通过为读取地址薄的Ajax URL增加一个含有上次编辑时间的时间戳来实现,例如,&t=11900241612等。如果地址薄在上次下载后没有被编辑过,时间戳就不变,则从浏览器的缓存中加载从而减少了一次HTTP请求过程。如果用户修改过地址薄,时间戳就会用来确定新的URL和缓存响应并不匹配,浏览器就会重要请求更新地址薄。

      即使你的Ajxa响应是动态生成的,哪怕它只适用于一个用户,那么它也应该被缓存起来。这样做可以使你的Web2.0应用程序更加快捷。

      5、推迟加载内容

      你可以仔细看一下你的网页,问问自己“哪些内容是页面呈现时所必需首先加载的?哪些内容和结构可以稍后再加载?

      把整个过程按照onload事件分隔成两部分,Javascrīpt是一个理想的选择。例如,如果你有用于实现拖放和动画的Javascrīpt,那么它就以等待稍后加载,因为页面上的拖放元素是在初始化呈现之后才发生的。其它的例如隐藏部分的内容(用户操作之后才显现的内容)和处于折叠部分的图像也可以推迟加载

      工具可以节省你的工作量:YUI Image Loader可以帮你推迟加载折叠部分的图片,YUI Get utility是包含JS和 CSS的便捷方法。比如你可以打开Firebug的Net选项卡看一下Yahoo的首页。

      当性能目标和其它网站开发实践一致时就会相得益彰。这种情况下,通过程序提高网站性能的方法告诉我们,在支持Javascrīpt的情况下,可以先去除用户体验,不过这要保证你的网站在没有Javascrīpt也可以正常运行。在确定页面运行正常后,再加载脚本来实现如拖放和动画等更加花哨的效果。

      6、预加载

      预加载和后加载看起来似乎恰恰相反,但实际上预加载是为了实现另外一种目标。预加载是在浏览器空闲时请求将来可能会用到的页面内容(如图像、样式表和脚本)。使用这种方法,当用户要访问下一个页面时,页面中的内容大部分已经加载到缓存中了,因此可以大大改善访问速度。

      下面提供了几种预加载方法:

      无条件加载:触发onload事件时,直接加载额外的页面内容。以Google.com为例,你可以看一下它的spirit image图像是怎样在onload中加载的。这个spirit image图像在google.com主页中是不需要的,但是却可以在搜索结果页面中用到它。

      有条件加载:根据用户的操作来有根据地判断用户下面可能去往的页面并相应的预加载页面内容。在search.yahoo.com中你可以看到如何在你输入内容时加载额外的页面内容。

      有预期的加载:载入重新设计过的页面时使用预加载。这种情况经常出现在页面经过重新设计后用户抱怨“新的页面看起来很酷,但是却比以前慢”。问题可能出在用户对于你的旧站点建立了完整的缓存,而对于新站点却没有任何缓存内容。因此你可以在访问新站之前就加载一部内容来避免这种结果的出现。在你的旧站中利用浏览器的空余时间加载新站中用到的图像的和脚本来提高访问速度。

      7、减少DOM元素数量

      一个复杂的页面意味着需要下载更多数据,同时也意味着Javascrīpt遍历DOM的效率越慢。比如当你增加一个事件句柄时在500和5000个DOM元素中循环效果肯定是不一样的。

      大量的DOM元素的存在意味着页面中有可以不用移除内容只需要替换元素标签就可以精简的部分。你在页面布局中使用表格了吗?你有没有仅仅为了布局而引入更多的<div>元素呢?也许会存在一个适合或者在语意是更贴切的标签可以供你使用。

      YUI CSS utilities可以给你的布局带来巨大帮助:grids.css可以帮你实现整体布局,font.css和reset.css可以帮助你移除浏览器默认格式。它提供了一个重新审视你页面中标签的机会,比如只有在语意上有意义时才使用<div>,而不是因为它具有换行效果才使用它。

      DOM元素数量很容易计算出来,只需要在Firebug的控制台内输入:

      document.getElementsByTagName('*').length

      那么多少个DOM元素算是多呢?这可以对照有很好标记使用的类似页面。比如Yahoo!主页是一个内容非常多的页面,但是它只使用了700个元素(HTML标签)。

      8、根据域名划分页面内容

      把页面内容划分成若干部分可以使你最大限度地实现平行下载。由于DNS查找带来的影响你首先要确保你使用的域名数量在2个到4个之间。例如,你可以把用到的HTML内容和动态内容放在www.example.org上,而把页面各种组件(图片、脚本、CSS)分别存放在statics1.example.org和statics.example.org上。

      你可在Tenni Theurer和Patty Chi合写的文章Maximizing Parallel Downloads in the Carpool Lane找到更多相关信息。


       9、使iframe的数量最小

      ifrmae元素可以在父文档中插入一个新的HTML文档。了解iframe的工作理然后才能更加有效地使用它,这一点很重要。

      <iframe>优点:

      解决加载缓慢的第三方内容如图标和广告等的加载问题

      Security sandbox

      并行加载脚本

      <iframe>的缺点:

      即时内容为空,加载也需要时间

      会阻止页面加载

      没有语意

      10、不要出现404错误

      HTTP请求时间消耗是很大的,因此使用HTTP请求来获得一个没有用处的响应(例如404没有找到页面)是完全没有必要的,它只会降低用户体验而不会有一点好处。

      有些站点把404错误响应页面改为“你是不是要找***”,这虽然改进了用户体验但是同样也会浪费服务器资源(如数据库等)。最糟糕的情况是指向外部Javascrīpt的链接出现问题并返回404代码。首先,这种加载会破坏并行加载;其次浏览器会把试图在返回的404响应内容中找到可能有用的部分当作Javascrīpt代码来执行。

      在本系列的第一节中,讲了提高网站性能中网站“内容”有关的10条原则。除了在网站在内容上的改进外,在网站服务器端上也有需要注意和改进的地方,它们包括:

      使用内容分发网络

      为文件头指定Expires或Cache-Control

      Gzip压缩文件内容

      配置ETag

      尽早刷新输出缓冲

      使用GET来完成AJAX请求

      11、使用内容分发网络

      用户与你网站服务器的接近程度会影响响应时间的长短。把你的网站内容分散到多个、处于不同地域位置的服务器上可以加快下载速度。但是首先我们应该做些什么呢?

      按地域布置网站内容的第一步并不是要尝试重新架构你的网站让他们在分发服务器上正常运行。根据应用的需求来改变网站结构,这可能会包括一些比较复杂的任务,如在服务器间同步Session状态和合并数据库更新等。要想缩短用户和内容服务器的距离,这些架构步骤可能是不可避免的。

      要记住,在终端用户的响应时间中有80%到90%的响应时间用于下载图像、样式表、脚本、Flash等页面内容。这就是网站性能黄金守则。和重新设计你的应用程序架构这样比较困难的任务相比,首先来分布静态内容会更好一点。这不仅会缩短响应时间,而且对于内容分发网络来说它更容易实现。

      内容分发网络(Content Delivery Network,CDN)是由一系列分散到各个不同地理位置上的Web服务器组成的,它提高了网站内容的传输速度。用于向用户传输内容的服务器主要是根据和用户在网络上的靠近程度来指定的。例如,拥有最少网络跳数(network hops)和响应速度最快的服务器会被选定。

      一些大型的网络公司拥有自己的CDN,但是使用像Akamai Technologies,Mirror Image Internet, 或者Limelight Networks这样的CDN服务成本却非常高。对于刚刚起步的企业和个人网站来说,可能没有使用CDN的成本预算,但是随着目标用户群的不断扩大和更加全球化,CDN就是实现快速响应所必需的了。以Yahoo来说,他们转移到CDN上的网站程序静态内容节省了终端用户20%以上的响应时间。使用CDN是一个只需要相对简单地修改代码实现显著改善网站访问速度的方法。

      12、为文件头指定Expires或Cache-Control

      这条守则包括两方面的内容:

      对于静态内容:设置文件头过期时间Expires的值为“Never expire”(永不过期)

      对于动态内容:使用恰当的Cache-Control文件头来帮助浏览器进行有条件的请求

      网页内容设计现在越来越丰富,这就意味着页面中要包含更多的脚本、样式表、图片和Flash。第一次访问你页面的用户就意味着进行多次的HTTP请求,但是通过使用Expires文件头就可以使这样内容具有缓存性。它避免了接下来的页面访问中不必要的HTTP请求。Expires文件头经常用于图像文件,但是应该在所有的内容都使用他,包括脚本、样式表和Flash等。

      浏览器(和代理)使用缓存来减少HTTP请求的大小和次数以加快页面访问速度。Web服务器在HTTP响应中使用Expires文件头来告诉客户端内容需要缓存多长时间。下面这个例子是一个较长时间的Expires文件头,它告诉浏览器这个响应直到2010年4月15日才过期。

      Expires: Thu, 15 Apr 2010 20:00:00 GMT

      如果你使用的是Apache服务器,可以使用ExpiresDefault来设定相对当前日期的过期时间。下面这个例子是使用ExpiresDefault来设定请求时间后10年过期的文件头:

      ExpiresDefault "access plus 10 years"

      要切记,如果使用了Expires文件头,当页面内容改变时就必须改变内容的文件名。依Yahoo!来说我们经常使用这样的步骤:在内容的文件名中加上版本号,如yahoo_2.0.6.js。

      使用Expires文件头只有会在用户已经访问过你的网站后才会起作用。当用户首次访问你的网站时这对减少HTTP请求次数来说是无效的,因为浏览器的缓存是空的。因此这种方法对于你网站性能的改进情况要依据他们“预缓存”存在时对你页面的点击频率(“预缓存”中已经包含了页面中的所有内容)。Yahoo!建立了一套测量方法,我们发现所有的页面浏览量中有75~85%都有“预缓存”。通过使用Expires文件头,增加了缓存在浏览器中内容的数量,并且可以在用户接下来的请求中再次使用这些内容,这甚至都不需要通过用户发送一个字节的请求。

      13、Gzip压缩文件内容

      网络传输中的HTTP请求和应答时间可以通过前端机制得到显著改善。的确,终端用户的带宽、互联网提供者、与对等交换点的靠近程度等都不是网站开发者所能决定的。但是还有其他因素影响着响应时间。通过减小HTTP响应的大小可以节省HTTP响应时间。

      从HTTP/1.1开始,web客户端都默认支持HTTP请求中有Accept-Encoding文件头的压缩格式:

      Accept-Encoding: gzip, deflate

      如果web服务器在请求的文件头中检测到上面的代码,就会以客户端列出的方式压缩响应内容。Web服务器把压缩方式通过响应文件头中的Content-Encoding来返回给浏览器。

      Content-Encoding: gzip

      Gzip是目前最流行也是最有效的压缩方式。这是由GNU项目开发并通过RFC 1952来标准化的。另外仅有的一个压缩格式是deflate,但是它的使用范围有限效果也稍稍逊色。

      Gzip大概可以减少70%的响应规模。目前大约有90%通过浏览器传输的互联网交换支持gzip格式。如果你使用的是Apache,gzip模块配置和你的版本有关:Apache 1.3使用mod_zip,而Apache 2.x使用moflate。

      浏览器和代理都会存在这样的问题:浏览器期望收到的和实际接收到的内容会存在不匹配的现象。幸好,这种特殊情况随着旧式浏览器使用量的减少在减少。Apache模块会通过自动添加适当的Vary响应文件头来避免这种状况的出现。

      服务器根据文件类型来选择需要进行gzip压缩的文件,但是这过于限制了可压缩的文件。大多数web服务器会压缩HTML文档。对脚本和样式表进行压缩同样也是值得做的事情,但是很多web服务器都没有这个功能。实际上,压缩任何一个文本类型的响应,包括XML和JSON,都值得的。图像和PDF文件由于已经压缩过了所以不能再进行gzip压缩。如果试图gizp压缩这些文件的话不但会浪费CPU资源还会增加文件的大小。

      Gzip压缩所有可能的文件类型是减少文件体积增加用户体验的简单方法。

      14、配置ETag

      Entity tags(ETags)(实体标签)是web服务器和浏览器用于判断浏览器缓存中的内容和服务器中的原始内容是否匹配的一种机制(“实体”就是所说的“内容”,包括图片、脚本、样式表等)。增加ETag为实体的验证提供了一个比使用“last-modified date(上次编辑时间)”更加灵活的机制。Etag是一个识别内容版本号的唯一字符串。唯一的格式限制就是它必须包含在双引号内。原始服务器通过含有ETag文件头的响应指定页面内容的ETag。

      HTTP/1.1 200 OK

      Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT

      ETag: "10c24bc-4ab-457e1c1f"

      Content-Length: 12195

      稍后,如果浏览器要验证一个文件,它会使用If-None-Match文件头来把ETag传回给原始服务器。在这个例子中,如果ETag匹配,就会返回一个304状态码,这就节省了12195字节的响应。 GET /i/yahoo.gif HTTP/1.1

      Host: us.yimg.com

      If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT

      If-None-Match: "10c24bc-4ab-457e1c1f"

      HTTP/1.1 304 Not Modified

      ETag的问题在于,它是根据可以辨别网站所在的服务器的具有唯一性的属性来生成的。当浏览器从一台服务器上获得页面内容后到另外一台服务器上进行验证时ETag就会不匹配,这种情况对于使用服务器组和处理请求的网站来说是非常常见的。默认情况下,Apache和IIS都会把数据嵌入ETag中,这会显著减少多服务器间的文件验证冲突。

      Apache 1.3和2.x中的ETag格式为inode-size-timestamp。即使某个文件在不同的服务器上会处于相同的目录下,文件大小、权限、时间戳等都完全相同,但是在不同服务器上他们的内码也是不同的。

      IIS 5.0和IIS 6.0处理ETag的机制相似。IIS中的ETag格式为Filetimestamp:ChangeNumber。用ChangeNumber来跟踪IIS配置的改变。网站所用的不同IIS服务器间ChangeNumber也不相同。 不同的服务器上的Apache和IIS即使对于完全相同的内容产生的ETag在也不相同,用户并不会接收到一个小而快的304响应;相反他们会接收一个正常的200响应并下载全部内容。如果你的网站只放在一台服务器上,就不会存在这个问题。但是如果你的网站是架设在多个服务器上,并且使用Apache和IIS产生默认的ETag配置,你的用户获得页面就会相对慢一点,服务器会传输更多的内容,占用更多的带宽,代理也不会有效地缓存你的网站内容。即使你的内容拥有Expires文件头,无论用户什么时候点击“刷新”或者“重载”按钮都会发送相应的GET请求。

      如果你没有使用ETag提供的灵活的验证模式,那么干脆把所有的ETag都去掉会更好。Last-Modified文件头验证是基于内容的时间戳的。去掉ETag文件头会减少响应和下次请求中文件的大小。微软的这篇支持文稿讲述了如何去掉ETag。在Apache中,只需要在配置文件中简单添加下面一行代码就可以了:

      FileETag none

      15、尽早刷新输出缓冲

      当用户请求一个页面时,无论如何都会花费200到500毫秒用于后台组织HTML文件。在这期间,浏览器会一直空闲等待数据返回。在PHP中,你可以使用flush()方法,它允许你把已经编译的好的部分HTML响应文件先发送给浏览器,这时浏览器就会可以下载文件中的内容(脚本等)而后台同时处理剩余的HTML页面。这样做的效果会在后台烦恼或者前台较空闲时更加明显。

      输出缓冲应用最好的一个地方就是紧跟在<head />之后,因为HTML的头部分容易生成而且头部往往包含CSS和Javascrīpt文件,这样浏览器就可以在后台编译剩余HTML的同时并行下载它们。 例子:

      ... <!-- css, js -->

      </head>

      <?php flush(); ?>

      <body>

      ... <!-- content -->

      为了证明使用这项技术的好处,Yahoo!搜索率先研究并完成了用户测试。

      16、使用GET来完成AJAX请求

      Yahoo!Mail团队发现,当使用XMLHttpRequest时,浏览器中的POST方法是一个“两步走”的过程:首先发送文件头,然后才发送数据。因此使用GET最为恰当,因为它只需发送一个TCP包(除非你有很多cookie)。IE中URL的最大长度为2K,因此如果你要发送一个超过2K的数据时就不能使用GET了。

      一个有趣的不同就是POST并不像GET那样实际发送数据。根据HTTP规范,GET意味着“获取”数据,因此当你仅仅获取数据时使用GET更加有意义(从语意上讲也是如此),相反,发送并在服务端保存数据时使用POST。

      在第一部分和第二部分中我们分别介绍了改善网站性能中页面内容和服务器的几条守则,除此之外,Javascrīpt和CSS也是我们页面中经常用到的内容,对它们的优化也提高网站性能的重要方面:

      CSS:

      把样式表置于顶部

      避免使用CSS表达式(Expression)

      使用外部Javascrīpt和CSS

      削减Javascrīpt和CSS

      避免使用滤镜

      Javascrīpt

      把脚本置于页面底部

      使用外部Javascrīpt和CSS

      削减Javascrīpt和CSS

      剔除重复脚本

      减少DOM访问

      开发智能事件处理程序

      17、把样式表置于顶部

      在研究Yahoo!的性能表现时,我们发现把样式表放到文档的<head />内部似乎会加快页面的下载速度。这是因为把样式表放到<head />内会使页面有步骤的加载显示。

      注重性能的前端服务器往往希望页面有秩序地加载。同时,我们也希望浏览器把已经接收到内容尽可能显示出来。这对于拥有较多内容的页面和网速较慢的用户来说特别重要。向用户返回可视化的反馈,比如进程指针,已经有了较好的研究并形成了正式文档。在我们的研究中HTML页面就是进程指针。当浏览器有序地加载文件头、导航栏、顶部的logo等对于等待页面加载的用户来说都可以作为可视化的反馈。这从整体上改善了用户体验。

      把样式表放在文档底部的问题是在包括Internet Explorer在内的很多浏览器中这会中止内容的有序呈现。浏览器中止呈现是为了避免样式改变引起的页面元素重绘。用户不得不面对一个空白页面。

      HTML规范清楚指出样式表要放包含在页面的<head />区域内:“和<a />不同,<link />只能出现在文档的<head />区域内,尽管它可以多次使用它”。无论是引起白屏还是出现没有样式化的内容都不值得去尝试。最好的方案就是按照HTML规范在文档<head />内加载你的样式表。

     

       18、避免使用CSS表达式(Expression)

      CSS表达式是动态设置CSS属性的强大(但危险)方法。Internet Explorer从第5个版本开始支持CSS表达式。下面的例子中,使用CSS表达式可以实现隔一个小时切换一次背景颜色:

      background-color: expression( (new Date()).getHours()%2 ? "#B8D4FF" : "#F08A00" );

      如上所示,expression中使用了Javascrīpt表达式。CSS属性根据Javascrīpt表达式的计算结果来设置。expression方法在其它浏览器中不起作用,因此在跨浏览器的设计中单独针对Internet Explorer设置时会比较有用。

      表达式的问题就在于它的计算频率要比我们想象的多。不仅仅是在页面显示和缩放时,就是在页面滚动、乃至移动鼠标时都会要重新计算一次。给CSS表达式增加一个计数器可以跟踪表达式的计算频率。在页面中随便移动鼠标都可以轻松达到10000次以上的计算量。

      一个减少CSS表达式计算次数的方法就是使用一次性的表达式,它在第一次运行时将结果赋给指定的样式属性,并用这个属性来代替CSS表达式。如果样式属性必须在页面周期内动态地改变,使用事件句柄来代替CSS表达式是一个可行办法。如果必须使用CSS表达式,一定要记住它们要计算成千上万次并且可能会对你页面的性能产生影响。

      19、使用外部Javascrīpt和CSS

      很多性能规则都是关于如何处理外部文件的。但是,在你采取这些措施前你可能会问到一个更基本的问题:Javascrīpt和CSS是应该放在外部文件中呢还是把它们放在页面本身之内呢?

      在实际应用中使用外部文件可以提高页面速度,因为Javascrīpt和CSS文件都能在浏览器中产生缓存。内置在HTML文档中的Javascrīpt和CSS则会在每次请求中随HTML文档重新下载。这虽然减少了HTTP请求的次数,却增加了HTML文档的大小。从另一方面来说,如果外部文件中的Javascrīpt和CSS被浏览器缓存,在没有增加HTTP请求次数的同时可以减少HTML文档的大小。

      关键问题是,外部Javascrīpt和CSS文件缓存的频率和请求HTML文档的次数有关。虽然有一定的难度,但是仍然有一些指标可以一测量它。如果一个会话中用户会浏览你网站中的多个页面,并且这些页面中会重复使用相同的脚本和样式表,缓存外部文件就会带来更大的益处。

      许多网站没有功能建立这些指标。对于这些网站来说,最好的坚决方法就是把Javascrīpt和CSS作为外部文件引用。比较适合使用内置代码的例外就是网站的主页,如Yahoo!主页和My Yahoo!。主页在一次会话中拥有较少(可能只有一次)的浏览量,你可以发现内置Javascrīpt和CSS对于终端用户来说会加快响应时 间。

      对于拥有较大浏览量的首页来说,有一种技术可以平衡内置代码带来的HTTP请求减少与通过使用外部文件进行缓存带来的好处。其中一个就是在首页中内置Javascrīpt和CSS,但是在页面下载完成后动态下载外部文件,在子页面中使用到这些文件时,它们已经缓存到浏览器了。

      20、削减Javascrīpt和CSS

      精简是指从去除代码不必要的字符减少文件大小从而节省下载时间。消减代码时,所有的注释、不需要的空白字符(空格、换行、tab缩进)等都要去掉。在Javascrīpt中,由于需要下载的文件体积变小了从而节省了响应时间。精简Javascrīpt中目前用到的最广泛的两个工具是JSMin和YUI Compressor。YUI Compressor还可用于精简CSS。

      混淆是另外一种可用于源代码优化的方法。这种方法要比精简复杂一些并且在混淆的过程更易产生问题。在对美国前10大网站的调查中发现,精简也可以缩小原来代码体积的21%,而混淆可以达到25%。尽管混淆法可以更好地缩减代码,但是对于Javascrīpt来说精简的风险更小。

      除消减外部的脚本和样式表文件外,<scrīpt>和<style>代码块也可以并且应该进行消减。即使你用Gzip压缩过脚本和样式表,精简这些文件仍然可以节省5%以上的空间。由于Javascrīpt和CSS的功能和体积的增加,消减代码将会获得益处。

      21、用<link>代替@import

      前面的最佳实现中提到CSS应该放置在顶端以利于有序加载呈现。

      在IE中,页面底部@import和使用<link>作用是一样的,因此最好不要使用它。

      22、避免使用滤镜

      IE独有属性AlphaImageLoader用于修正7.0以下版本中显示PNG图片的半透明效果。这个滤镜的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。在每一个元素(不仅仅是图片)它都会运算一次,增加了内存开支,因此它的问题是多方面的。

      完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替,这种格式能在IE中很好地工作。如果你确实需要使用AlphaImageLoader,请使用下划线_filter又使之对IE7以上版本的用户无效。

      23、把脚本置于页面底部

      脚本带来的问题就是它阻止了页面的平行下载。HTTP/1.1 规范建议,浏览器每个主机名的并行下载内容不超过两个。如果你的图片放在多个主机名上,你可以在每个并行下载中同时下载2个以上的文件。但是当下载脚本时,浏览器就不会同时下载其它文件了,即便是主机名不相同。

      在某些情况下把脚本移到页面底部可能不太容易。比如说,如果脚本中使用了document.write来插入页面内容,它就不能被往下移动了。这里可能还会有作用域的问题。很多情况下,都会遇到这方面的问题。

      一个经常用到的替代方法就是使用延迟脚本。DEFER属性表明脚本中没有包含document.write,它告诉浏览器继续显示。不幸的是,Firefox并不支持DEFER属性。在Internet Explorer中,脚本可能会被延迟但效果也不会像我们所期望的那样。如果脚本可以被延迟,那么它就可以移到页面的底部。这会让你的页面加载的快一点。

      24、剔除重复脚本

      在同一个页面中重复引用Javascrīpt文件会影响页面的性能。你可能会认为这种情况并不多见。对于美国前10大网站的调查显示其中有两家存在重复引用脚本的情况。有两种主要因素导致一个脚本被重复引用的奇怪现象发生:团队规模和脚本数量。如果真的存在这种情况,重复脚本会引起不必要的HTTP请求和无用的Javascrīpt运算,这降低了网站性能。

      在Internet Explorer中会产生不必要的HTTP请求,而在Firefox却不会。在Internet Explorer中,如果一个脚本被引用两次而且它又不可缓存,它就会在页面加载过程中产生两次HTTP请求。即时脚本可以缓存,当用户重载页面时也会产生额外的HTTP请求。

      除增加额外的HTTP请求外,多次运算脚本也会浪费时间。在Internet Explorer和Firefox中不管脚本是否可缓存,它们都存在重复运算Javascrīpt的问题。

      一个避免偶尔发生的两次引用同一脚本的方法是在模板中使用脚本管理模块引用脚本。在HTML页面中使用<scrīpt />标签引用脚本的最常见方法就是:

      <scrīpt type="text/javascrīpt" src="menu_1.0.17.js"></scrīpt>

      在PHP中可以通过创建名为insertscrīpt的方法来替代:

      <?php insertscrīpt("menu.js") ?>

      为了防止多次重复引用脚本,这个方法中还应该使用其它机制来处理脚本,如检查所属目录和为脚本文件名中增加版本号以用于Expire文件头等。

      25、减少DOM访问

      使用Javascrīpt访问DOM元素比较慢,因此为了获得更多的应该页面,应该做到:

      缓存已经访问过的有关元素

      线下更新完节点之后再将它们添加到文档树中

      避免使用Javascrīpt来修改页面布局

      有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章“高性能Ajax应该程序”。

      26、开发智能事件处理程序

      有时候我们会感觉到页面反应迟钝,这是因为DOM树元素中附加了过多的事件句柄并且些事件句病被频繁地触发。这就是为什么说使用event delegation(事件代理)是一种好方法了。如果你在一个div中有10个按钮,你只需要在div上附加一次事件句柄就可以了,而不用去为每一个按钮增加一个句柄。事件冒泡时你可以捕捉到事件并判断出是哪个事件发出的。

      你同样也不用为了操作DOM树而等待onload事件的发生。你需要做的就是等待树结构中你要访问的元素出现。你也不用等待所有图像都加载完毕。

      你可能会希望用DOMContentLoaded事件来代替onload,但是在所有浏览器都支持它之前你可使用YUI 事件应用程序中的onAvailable方法。

      有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章“高性能Ajax应该程序”。

      我们在前面的几节中分别讲了提高网站性能中内容、服务器、Javascrīpt和CSS等方面的内容。除此之外,图片和Coockie也是我们网站中几乎不可缺少组成部分,此外随着移动设备的流行,对于移动应用的优化也十分重要。这主要包括:

      Coockie:

      减小Cookie体积

      对于页面内容使用无coockie域名

      图片:

      优化图像

      优化CSS Spirite

      不要在HTML中缩放图像

      favicon.ico要小而且可缓存

      移动应用:

      保持单个内容小于25K

      打包组件成复合文本

      27、减小Cookie体积

      HTTP coockie可以用于权限验证和个性化身份等多种用途。coockie内的有关信息是通过HTTP文件头来在web服务器和浏览器之间进行交流的。因此保持coockie尽可能的小以减少用户的响应时间十分重要。

      有关更多信息可以查看Tenni Theurer和Patty Chi的文章“When the Cookie Crumbles”。这们研究中主要包括:

      去除不必要的coockie

      使coockie体积尽量小以减少对用户响应的影响

      注意在适应级别的域名上设置coockie以便使子域名不受影响

      设置合理的过期时间。较早地Expire时间和不要过早去清除coockie,都会改善用户的响应时间。

      28、对于页面内容使用无coockie域名

      当浏览器在请求中同时请求一张静态的图片和发送coockie时,服务器对于这些coockie不会做任何地使用。因此他们只是因为某些负面因素而创建的网络传输。所有你应该确定对于静态内容的请求是无coockie的请求。创建一个子域名并用他来存放所有静态内容。

      如果你的域名是www.example.org,你可以在static.example.org上存在静态内容。但是,如果你不是在www.example.org上而是在顶级域名example.org设置了coockie,那么所有对于static.example.org的请求都包含coockie。在这种情况下,你可以再重新购买一个新的域名来存在静态内容,并且要保持这个域名是无coockie的。Yahoo!使用的是ymig.com,YouTube使用的是ytimg.com,Amazon使用的是images-anazon.com等等。

      使用无coockie域名存在静态内容的另外一个好处就是一些代理(服务器)可能会拒绝对coockie的内容请求进行缓存。一个相关的建议就是,如果你想确定应该使用example.org还是www.example.org作为你的一主页,你要考虑到coockie带来的影响。忽略掉www会使你除了把coockie设置到*.example.org(*是泛域名解析,代表了所有子域名译者dudo注)外没有其它选择,因此出于性能方面的考虑最好是使用带有www的子域名并且在它上面设置coockie。

      29、优化图像

      设计人员完成对页面的设计之后,不要急于将它们上传到web服务器,这里还需要做几件事:

      你可以检查一下你的GIF图片中图像颜色的数量是否和调色板规格一致。 使用imagemagick中下面的命令行很容易检查:

      identify -verbose image.gif

      如果你发现图片中只用到了4种颜色,而在调色板的中显示的256色的颜色槽,那么这张图片就还有压缩的空间。

      尝试把GIF格式转换成PNG格式,看看是否节省空间。大多数情况下是可以压缩的。由于浏览器支持有限,设计者们往往不太乐意使用PNG格式的图片,不过这都是过去的事情了。现在只有一个问题就是在真彩PNG格式中的alpha通道半透明问题,不过同样的,GIF也不是真彩格式也不支持半透明。因此GIF能做到的,PNG(PNG8)同样也能做到(除了动画)。下面这条简单的命令可以安全地把GIF格式转换为PNG格式:

      convert image.gif image.png

      “我们要说的是:给PNG一个施展身手的机会吧!”

      在所有的PNG图片上运行pngcrush(或者其它PNG优化工具)。例如:

      pngcrush image.png -rem alla -reduce -brute result.png

      在所有的JPEG图片上运行jpegtran。这个工具可以对图片中的出现的锯齿等做无损操作,同时它还可以用于优化和清除图片中的注释以及其它无用信息(如EXIF信息):

      jpegtran -copy none -optimize -perfect src.jpg dest.jpg

      30、优化CSS Spirite

      在Spirite中水平排列你的图片,垂直排列会稍稍增加文件大小;

      Spirite中把颜色较近的组合在一起可以降低颜色数,理想状况是低于256色以便适用PNG8格式;

      便于移动,不要在Spirite的图像中间留有较大空隙。这虽然不大会增加文件大小但对于用户代理来说它需要更少的内存来把图片解压为像素地图。100x100的图片为1万像素,而1000x1000就是100万像素。

      31、不要在HTML中缩放图像

      不要为了在HTML中设置长宽而使用比实际需要大的图片。如果你需要:

      <img width="100" height="100" src="mycat.jpg" alt="My Cat" />

      那么你的图片(mycat.jpg)就应该是100x100像素而不是把一个500x500像素的图片缩小使用。

      32、favicon.ico要小而且可缓存

      favicon.ico是位于服务器根目录下的一个图片文件。它是必定存在的,因为即使你不关心它是否有用,浏览器也会对它发出请求,因此最好不要返回一个404 Not Found的响应。由于是在同一台服务器上,它每被请求一次coockie就会被发送一次。这个图片文件还会影响下载顺序,例如在IE中当你在onload中请求额外的文件时,favicon会在这些额外内容被加载前下载。

      因此,为了减少favicon.ico带来的弊端,要做到:

      文件尽量地小,最好小于1K

      在适当的时候(也就是你不要打算再换favicon.ico的时候,因为更换新文件时不能对它进行重命名)为它设置Expires文件头。你可以很安全地把Expires文件头设置为未来的几个月。你可以通过核对当前favicon.ico的上次编辑时间来作出判断。

      Imagemagick可以帮你创建小巧的favicon。

      33、保持单个内容小于25K

      这条限制主要是因为iPhone不能缓存大于25K的文件。注意这里指的是解压缩后的大小。由于单纯gizp压缩可能达不要求,因此精简文件就显得十分重要。

      查看更多信息,请参阅Wayne Shea和Tenni Theurer的文件“Performance Research, Part 5: iPhone Cacheability - Making it Stick”。

      34、打包组件成复合文本

      把页面内容打包成复合文本就如同带有多附件的Email,它能够使你在一个HTTP请求中取得多个组件(切记:HTTP请求是很奢侈的)。当你使用这条规则时,首先要确定用户代理是否支持(iPhone就不支持)。

  • 【转】系统瓶颈分析经验举例

    2008-10-27 15:07:45

    经验举例1

    交易的响应时间如果很长,远远超过系统性能需求,表示耗费CPU数据库操作,例如排序,执行aggregate functions(例如summinmaxcount)等较多,可考虑是否有索引以及索引建立的是否合理;尽量使用简单的表联接;水平分割大表格等方法来降低该值。

     

    经验举例2

    分段排除错误。测试工具可以模拟不同的虚拟用户来单独访问Web服务器、应用服务器和数据库服务器,这样,就可以在Web端测出的响应时间减去以上各个分段测出的时间就可以知道瓶颈在哪并着手调优。

     

    经验举例3

    UNIX资源监控(NT操作系统同理)中指标内存页交换速率Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。“Swap in rate”“Swap out rate”也有类似的解释。

     

    经验举例4

    UNIX资源监控(NT操作系统同理)中指标CPU占用率CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器 。合理使用的范围在60%70%

     

    经验举例5

    UNIX资源监控(NT操作系统同理)中指标磁盘交换率Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统、重新部署业务逻辑等,另外设置Tempdb in RAM,减低"max async IO""max lazy writer IO"等措施都会降低该值。

     

    经验举例6

    Tuxedo资源监控中指标队列中的字节数Bytes on queue),队列长度应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。注意:一个Raid Disk实际有多个磁盘。

     

    经验举例7

    SQLServer资源监控中指标缓存点击率Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。

  • Weblogic服务器性能调优(转)

    2008-10-14 11:16:40

    注:在下面做的介绍都是以Weblogic8.1为例的,其它版本的Weblogic可能会有些许不同。

      1) 设置JAVA参数;

      a) 编辑Weblogic Server启动脚本文件;

      * BEA_HOME\user_projects\domains\domain-name\startWebLogic.cmd(startWebLogic.sh on Unix)

      * BEA_HOME\user_projects\domains\domain-name\startManagedWebLogic.cmd(startManagedWebLogic.sh on Unix)

      b) 编辑set JAVA_OPTIONS命令,如:set JAVA_OPTIONS=-Xms256m –Xmx256m;

      c) 保存,重启即可。

      注:在WebLogic中,为了获得更好的性能,BEA公司推荐最小Java堆等于最大Java堆。

      2) 开发模式 vs. 产品模式;

      开发模式和产品模式的一些参数的默认值不同,可能会对性能造成影响,下面是对性能有影响的参数列表:

      参数

      开发模式默认值

      产品模式默认值

      Execute Queue: Thread Count

      15 threads

      25 threads

      JDBC Connection Pool: MaxCapacity

      15 connnections

      25 connections

      3) 尽量开启本地I/O;

      通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)> 配置 > 调整选择启用本地I/O。

      注:此值也可通过手动的修改config.xml配置文件。

      4) 调优执行队列线程;

      a) 修改默认执行线程数

      在这里,执行队列的线程数表示执行队列能够同时执行的操作的数量。但此值不是设的越大越好,应该恰到好处的去设置它,太小了,执行队列中将会积累很多待处理的任务,太大了,则会消耗大量的系统资源从而影响整体的性能。在产品模式下默认为25个执行线程。

      为了设置理想的执行队列的线程数,我们可以启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)> 监视 > 性能中监控最大负载时执行队列的吞吐量和队列中的等待请求数,据此确定理想的数值。

      理想的默认执行线程数是由多方面的因素决定的,比如机器CPU性能、总体体系架构、I/O、操作系统的进程调度机制、JVM的线程调度机制。随着CPU个 数的增加,WebLogic可以近乎线性地提高线程数。线程数越多,花费在线程切换的时间也就越多;线程数越小,CPU可能无法得到充分的利用。为获取一 个理想的线程数,需要经过反复的测试。在测试中,可以以25*CPU个数为基准进行调整。当空闲线程较少,CPU利用率较低时,可以适当增加线程数的大小 (每五个递增)。对于PC Server和Windows 2000,则最好每个CPU小于50个线程,以CPU利用率为90%左右为最佳。

      通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)> Execute Queue > weblogic.kernel.Defalt > 配置中修改线程计数。

      b) 设定执行队列的溢出条件;

      Weblogic Server提供给默认的执行队列或用户自定义的执行队列自定义溢出条件的功能,当满足此溢出条件时,服务器改变其状态为“警告”状态,并且额外的再分配一些线程去处理在队列中的请求,而达到降低队列长度的目的。

      通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)> Execute Queue > weblogic.kernel.Defalt > 配置下面几项:

      * 队列长度:此值表示执行队列中可容纳的最大请求数,默认值是65536,最后不要手动改变此值。

      * 队列长度阈值百分比:此值表示溢出条件,在此服务器指出队列溢出之前可以达到的队列长度大小的百分比。

      * 线程数增加:当检测到溢出条件时,将增加到执行队列中的线程数量。如果CPU和内存不是足够的高,尽量不要改变默认值“0”。因为Weblogic一旦增加后不会自动缩减,虽然最终可能确实起到了降低请求的作用,但在将来的运行中将影响程序的性能。

      * 最大线程数:为了防止创建过多的线程数量,可以通过设定最大的线程数进行控制。

      在实际的应用场景中,应根据具体情况适当的调整以上参数。

      c) 设定执行队列监测行为

      Weblogic Server能够自动监测到当一个执行线程变为“阻塞”。变为“阻塞”状态的执行线程将无法完成当前的工作,也无法再执行新请求。如果执行队列中的所有执 行线程都变为“阻塞”状态,Weblogic server可能改变状态为“警告”或“严重”状态。如果Weblogic server变为“严重”状态,可以通过Node Manager来自动关闭此服务器并重新启动它。具体请参考:Node Manager Capabilities文档。

      通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)>配置 > 调整下可配置下面几项:

      * 阻塞线程最长时间:在此服务器将线程诊断为阻塞线程之前,线程必须连续工作的时间长度(秒)。默认情况下,WebLogic Server 认为线程在连续工作 600 秒后成为阻塞线程。

      * 阻塞线程计时器间隔:WebLogic Server 定期扫描线程以查看它们是否已经连续工作了 "阻塞线程最长时间" 字段中指定的时间长度的间隔时间(秒)。默认情况下,WebLogic Server 将此时间间隔设置为 600 秒。

      5) 调优TCP连接缓存数;

      WebLogic Server用Accept Backlog参数规定服务器向操作系统请求的队列大小,默认值为50。当系统重载负荷时,这个值可能过小,日志中报Connection Refused,导致有效连接请求遭到拒绝,此时可以提高Accept Backlog 25%直到连接拒绝错误消失。对于Portal类型的应用,默认值往往是不够的。Login Timeout和SSL Login Timeout参数表示普通连接和SSL连接的超时时间,如果客户连接被服务器中断或者SSL容量大,可以尝试增加该值。

      通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)>配置 > 调整下可配置“接受预备连接”。

      6) 改变Java编译器;

      标准的Java编译器是javac,但编译JSP servlets速度太慢,为了提高编译速度,可以使用sj或jikes编译器取代javac编译器。下面说说更改Java编译器:

      通过启动管理控制台,在域(如:mydomain)> 服务器 > server实例(如:myserver)>配置 > 常规下改变Java 编译器,默认为javac。输入完整路径,如:c:\visualcafe31\bin\sj.exe。然后打开高级选项,在预规划到类路径填写编译 Java 代码时为 Java 编译器类路径预规划的选项,如:BEA_HOME\jdk141_02\jre\lib\rt.jar。

      7) 使用Webogic Server集群提高性能;

      具体关于如何配置Weblogic集群,我就不细说了。详情可参考:Introduction to WebLogic Server Clustering。

      8) Weblogic EJB调优

      由于EJB2.0已经很少项目在用了,EJB3.0再成熟一点,我再补充这一部分吧!

      9) JDBC应用调优

      JDBC Connection Pool的调优受制于WebLogic Server线程数的设置和数据库进程数,游标的大小。通常我们在一个线程中使用一个连接,所以连接数并不是越多越好,为避免两边的资源消耗,建议设置连 接池的最大值等于或者略小于线程数。同时为了减少新建连接的开销,将最小值和最大值设为一致。

      增加Statement Cache Size对于大量使用PreparedStatement对象的应用程序很有帮助,WebLogic能够为每一个连接缓存这些对象,此值默认为10。在保 证数据库游标大小足够的前提下,可以根据需要提高Statement Cache Size。比如当你设置连接数为25,Cache Size为10时,数据库可能需要打开25*10=250个游标。不幸的是,当遇到与PreparedStatement Cache有关的应用程序错误时,你需要将Cache Size设置为0。

      尽管JDBC Connection Pool提供了很多高级参数,在开发模式下比较有用,但大部分在生产环境下不需调整。这里建议最好不要设置测试表, 同时Test Reserved Connections和Test Released Connections也无需勾上。 当然如果你的数据库不稳定,时断时续,你就可能需要上述的参数打开。

      最后提一下驱动程序类型的选择,以Oracle为例,Oracle提供thin驱动和oci驱动,从性能上来讲,oci驱动强于thin驱动,特别是大数 据量的操作。但在简单的数据库操作中,性能相差不大,随着thin驱动的不断改进,这一弱势将得到弥补。而thin驱动的移植性明显强于oci驱动。所以 在通常情况下建议使用thin驱动。而最新驱动器由于WebLogic server/bin目录下的类包可能不是最新的,请以Oracle网站为准: http://www.oracle.com/technology ... va/sqlj_jdbc/htdocs /jdbc9201.html。

      10) JSP调优

      * 设置jsp-param pageCheckSeconds=-1;

      * 设置serlet-reload-check=-1或ServletReloadCheckSecs=-1;

      * 设置jsp-param precompile=true,关闭JSP预编译选项。

  • 系统构建高性能J2EE应用的五种核心策略(转)

    2008-10-06 14:06:39

    现在当开发一个应用项目时,我们越来越多地注意到了性能和可扩展性的问题。应用性能的问题比应用功能的不丰富问题往往更为
  • lr学习

    2008-11-06 15:16:54

  • 使用LoadRunner监控Linux方法(转) http://www.51testing.com/?172470/action_spacelist_type_blog_itemtypeid_7937.html

    2008-11-03 10:39:55

    一、安装

    LoadRunner监控Linux安装成功,所以共享出来,备忘. 需要下载3个包,到网上google一个吧:

    (1)rsh-0.17-14.i386.rpm

    (2)rsh-server-0.17-14.i386.rpm

    (3)rpc.rstatd-4.0.1.tar.gz

    1.安装rsh,和rsh-server两个服务包。

    a. 卸载rsh

    rpm –q rsh----------查看版本号

    rpm -e 版本号---------卸载该版本。

    b.安装

    rpm –ivh rsh-0.17-14.i386.rpm rsh-server-0.17-14.i386.rpm

    这两个包在我的目录下有共享。

    2.下载并安装rstatd

    gunzip rpc.rstatd-4.0.1.tar.gz

    Tar –cvf rpc.rstatd-4.0.1.tar.

    ./configure ---配置

    make ---编译

    make install ---安装

    rpc.rstatd ---启动rstatd进程

    3. 打开/etc/xinetd.conf

    里面内容是:

    # Simple configuration file for xinetd

    # Some defaults, and include /etc/xinetd.d/

    defaults

    {

    instances = 60

    log_type = SYSLOG authpriv

    log_on_success = HOST PID

    log_on_failure = HOST

    cps = 25 30

    }

    includedir /etc/xinetd.d

    4.重启xinetd:

    A: service xinetd reload

    B: /sbin/service xinetd rstart

    5.修改/etc/xinetd.d/下的三个conf文件 rlogin ,rsh,rexec 这三个配置文件

    打这三个文件,将里面的disable = yes都改成 disable = no (disabled用在默认的{}中禁止服务)

    或是把# default: off都设置成 on ,并把“#”去掉,这个的意思就是在xinetd启动的时候默认都启动上面的三个服务!

    二、验证PRC安装运行成功

    检查是否启动: rsh server 监听的TCP 是514。
      [root@mg04 root]# netstat -an |grep 514
       tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN
       如果能看到514在监听说明rsh服务器已经启动。

    # rpcinfo –p 127.0.0.1 若有性能数据返回 ,具体参见如下步骤

     

    未启动rpc 前,通过rpcinfo 得到的数据为,一个端口号为111的protmapper的服务

    [root@EMS root]# rpcinfo -p 127.0.0.1

       program vers proto   port

        100000    2   tcp    111  portmapper

        100000    2   udp    111  portmapper

        100024    1   udp  32768  status

    100024    1   tcp  32768  status

     

    以上说明 portmapper启动了,但 rstatd 进程还没起来。

     

    如果portmap未启动,会报如下错误:

    Cannot register service: RPC: Unable to receive; errno = Connection refused

     

    启动portmap:

     

    #/etc/rc.d/init.d/portmap start   //启动portmap

     

    [root@EMS root]# whereis rpc.rstatd

    rpc: /usr/src/patch-o-matic-ng-20040302/rpc /sbin/rpc.lockd /sbin/rpc.statd /usr/sbin/rpc.rquotad /usr/sbin/rpc.yppasswdd /usr/sbin/rpc.mountd /usr/sbin/rpc.nfsd /usr/sbin/rpc.ypxfrd /etc/rpc /usr/local/sbin/rpc.rstatd /usr/include/rpc /usr/share/man/man3/rpc.3.gz /usr/share/man/man5/rpc.5.gz

     

       whereis rpc.rstatd 命令是用来找 rpc.rstatd这个执行文件的路径。

     

    [root@EMS root]# /usr/sbin/rpc

    rpc.mountd     rpc.nfsd       rpc.rquotad    rpc.yppasswdd  rpc.ypxfrd     rpcinfo     

     

    通过 /usr/sbin/rpc 敲入制表符,则系统会提示其路径下是些什么文件. (作用类似于ls)

     

    [root@EMS root]# /usr/sbin/rpc.rquotad

    [root@EMS root]# /usr/lo        

    local       lost+found 

    [root@EMS root]# /usr/local/sbin/rpc.rstatd

     

    运行 rpc.rstatd命令

     

    [root@EMS root]# rpcinfo -p 127.0.0.1

       program vers proto   port

        100000    2   tcp    111  portmapper

        100000    2   udp    111  portmapper

        100024    1   udp  32768  status

        100024    1   tcp  32768  status

        100011    1   udp    688  rquotad

        100011    2   udp    688  rquotad

        100011    1   tcp    691  rquotad

        100011    2   tcp    691  rquotad

        100001    5   udp    699  rstatd

        100001    3   udp    699  rstatd

        100001    2   udp    699  rstatd

    100001    1   udp    699  rstatd

     

     

    此时检查到rstatd 已运行。

  • Loadrunner IP欺骗(转)

    2008-10-29 19:10:20

    使用loadrunner进行IP欺骗首先要注意以下两点:

    1、  本地的IP设置不能为“自动获取”,必须指定一个静态IP

    如果本地是动态获取IP,在运行IP Wizard时会弹出提示:

    The IP wizard does not support DHCP-enabled network cards.

    Your cards are either DHCP-enabled or configured with invalid settings.

    Please contact your system administrator.

    此时只需要将IP地址改成静态IP地址就可以了

    2、  所添加的IP只能是局域网内的网段

    只能添加192段,127段,10IP地址

    好下面开始介绍如何使用IP欺骗

    一、添加IP地址

    第一步:

    运行Mercury LoadRunner- Tools-IP Wizard

    弹出的IP设置向导中的各项含义如下:

    1、  create new setting   新建IP列表

    当我们第一次使用IP欺骗或已经释放所添加的IP时,需要选择此项添加新的IP地址

    2、  load previous setting from file   读取IP列表文件

    从以前设置的IP地址列表文件中读取IP地址

    3、  restore original setting   释放已设置的IP

    释放已经添加的IP地址

    说明:loadrunner在做IP欺骗时,真实的虚拟了IP地址,该IP地址均真实存在,可以ping通,可以建立网络链接,在不使用时必须进行释放,否则这些IP地址将一直存在。

     

    第二步:

    选择create new setting,点击“下一步”

    此时出现的页面是让输入服务器的IP地址,loadrunner通过该地址更新路由表。

    客户端计算机上添加新的 IP 地址后,服务器需要将该地址添加到路由表,以便能够识别返回到客户端的路由。如果服务器和客户端具有相同的子网掩码、IP 类和网络,则不需要修改服务器的路由表。

    注意: 如果客户端和服务器计算机之间有一个路由器,则服务器需要识别经过该

    路由器的路径。确保将以下路由添加到服务器路由表:从 Web 服务器到路由器

    的路由,以及从路由器到负载生成器计算机上的所有 IP 地址的路由。

     

    第三步:

    在输入服务器地址的页面中不输入任何地址,直接点击“下一步”

    进入IP添加页面

    点击“add”进行添加

     

    第四步:

    from ip 输入框中输入起始ip,在Number to输入框中输入ip地址的位数

    输入正确的子网掩码

    选中“verify that new ip addresses are not already used

    点击“ok”,此时IP Wizard会自动按照设置生成IP地址,并且将已经占用的IP列出

     

    第五步:

    确认可用IP地址列表内容后,点击“ok

    此时IP Wizard提示需要重新启动计算机,点击“save as”保存IP列表

    点击“ok”,重新启动计算机

     

    第六步:

    计算机重新启动后,在运行行中输入:CMD,在DOS命令窗口中输入:IPCONFIG,此时便可看到虚拟的IP地址均已经被启用

     

    二、在loadrunner中使用虚拟IP

    第一步:

    打开controller,在controller中,选择 Scenario-Enable IP Spoofer,此项设置允许使用IP欺骗。

    第二步:

    设计场景:

    有两种方案来设计场景

    1、  本地使用虚拟IP设计场景(不带负载生成器使用localhost进行测试)

    在设置该类场景时,在场景中添加一个录制好的脚本,该脚本中添加如下代码便可看到虚拟用户在使用哪个IP地址进行消息发送,该场景是通过线程方式进行性能测试。

    char * ip

    ip=lr_get_vuser_ip();

    if (ip)

    {

        lr_vuser_status_message("The ip address is %s",ip);

    }

     else

    lr_vuser_status_message("IP spoofing disabled");

           controller中执行该脚本时,查看虚拟用户运行状态,便可看到当前虚拟用户使用的哪个IP地址发送消息

    2、  负载生成器使用虚拟IP设计场景

    在设置该类场景时,需要添加负载生成器,建立负载生成器时输入创建的虚拟IP,每个负载生成器为一个虚拟用户组,该场景是通过进程方式进行性能测试。

    如何添加负载生成器创建场景在这里就不多描述了。

    但需要注意,选中Tools下的Expert mode,启动专家模式

    再点击Tools下的options

    Genearl选项卡中设置已线程方式或进程方式进行性能测试,这个选项一定要与当前场景的模式相匹配,也就是说使用本地虚拟IP测试时需要选中线程方式,使用负载生成器使用虚拟IP测试时需要选中进程方式

     

    三、使用虚拟IP测试完成后

    打开IP Wizard,释放所有虚拟IP

    重新启动计算机

  • Loadrunner学习笔记之ip欺骗(转)

    2008-10-29 19:02:35

    ip欺骗设置:
    1.在总控机上使用loadrunner->tools->ip wizard工具设置虚拟ip,其中server ip指要监控的服务器的ip,添加ip时选择A、B或C类ip,设置开始ip和要添加的虚拟ip的个数,并选中verify the new ip addresses are not already use,已检查添加的ip是否与局域网中的其它ip冲突
    2.重启机器
    3.在controller的scenario中勾选enable ip spoofer,启用虚拟ip
    3.在controller的tools中选中expert mode,在options->general中设置multiple ip address mode与run-time settings中的multithreading设置保持一致
    4.在load generators中选择localhost
    查看脚本执行过程中是否使用了设置的虚拟ip,可以如下设置:
    在脚本中添加代码:
    char *ip = lr_get_vuser_ip();
    if (ip)
    lr_output_message("The IP address is %s", ip);
    else
    lr_output_message("IP spoofing disabled");
    在脚本运行过程中查看controller的output,view->show output,选择all messages,查看输出的ip是否为设置的虚拟ip

  • 造成HTTP-500错误,可能存在的原因之个人实践总结(转)

    2008-10-27 15:12:26

    造成HTTP-500错误,可能存在的原因之个人实践总结

    1、运行的用户数过多,对服务器造成的压力过大,服务器无法响应,则报HTTP500错误。

    减小用户数或者场景持续时间,问题得到解决。

    2、该做关联的地方没有去做关联,则报HTTP500错误。进行手工或者自动关联,问题得到

    解决。

    3、录制时请求的页面、图片等,在回放的时候服务器找不到,则报HTTP500错误,若该页

    面无关紧要,则可以在脚本中注释掉,问题将会得到解决。例如:有验证码的情况下,尽

    管测试时已经屏蔽了,但是录制的时候提交了请求,但回放的时候不存在响应。

    4、参数化时的取值有问题,则报HTTP500错误。可将参数化列表中的数值,拿到实际应用

    系统中进行测试,可排除问题。

    5、更换了应用服务器(中间件的更换,如tomcat、websphere、jboss等),还是利用原

    先录制的脚本去运行,则很可能报HTTP500错误。因为各种应用服务器处理的机制不一样

    ,所录制的脚本也不一样,解决办法只有重新录制脚本。

    6、Windows xp2 与ISS组件不兼容,则有可能导致HTTP500错误。对ISS组件进行调整后问

    题解决。

    7、系统开发程序写的有问题,则报HTTP500错误。例如有些指针问题没有处理好的,有空

    指针情况的存在。修改程序后问题解决。


    8、如果测试中所进行的操作需要向数据库中插入数据,若大数据量的情况下导致数据库中表空间已满,或者缓冲池较小无法满足数据的存取等,都有可能导致HTTP500错误。调整数据库、修改连接池大小,问题解决。

  • lr_save_string 和 sprintf 的使用(转)

    2008-10-27 11:47:39

    一、lr_save_string 使用介绍
    1.该函数主要是将程序中的常量或变量保存为lr中的参数。
          int lr_save_string (const char *param_value, const char *param_name);

          函数目的:param_value值保存到param_name变量中

          参数介绍:param_value:要保存的值

                             param_name 变量名称
    char *tmp="hello";
    lr_save_string("777","page");
    lr_output_message(lr_eval_string("{page}"));   

    //将变量保存为参数,tmp为变量
    lr_save_string(tmp,"page");

    lr_output_message(lr_eval_string("{page}"));


    结果:777

        hello
        

    二、sprintf函数

    定义函数
    int sprintf( char *str,const char * format,.........);
    函数说明
    sprintf()会根据参数format字符串来转换并格式化数据,然后将结果复制到参数str所指的字符串数组,直到出现字符串结束(’\0’)为止。关于参数format字符串的格式请参考printf()。
    返回值
    成功则返回参数str字符串长度,失败则返回-1,错误原因存于errno中。
    附加说明
    使用此函数得留意堆栈溢出,或改用snprintf()。
    范例
    #include<stdio.h>
    main()
    {
    cha
  • lr常见问题及精华归总结

    2008-10-06 18:10:55

    lr常见问题及精华归总结

     

  • lr破解9.0

    2008-09-22 13:13:12

    之前一直是谈工具色变,每次安装测试工具都是小心翼翼,生怕中间出现什么问题导致不能使用,不能用就要卸载,卸载不干净又影响下次安装,最终以重做系统来告终。。。想到死循环的过程,就打退堂鼓了。
        今天早晨,我想安装LR9.0,可是原来电脑上已经装过了8.1,没办法,撞枪口上了!于是鼓足勇气,走过独木桥也许前面就是阳关道了呢!!上网找了N多解决办法,全都综合着试了一遍,生怕漏下什么细节,整个过程都是在提心吊胆和抱着重装系统的心理状态下进行的。。。
    说说我的步骤:
    一、卸载LR8.1程序
    1.保证所有
    LoadRunner的相关进程(包括Controller、VuGen、Analysis和Agent Process)全部关闭。


    2.在操作系统控制面板的“删除与添加程序”中运行LoadRunner的卸载程序。

    3.删除整个LoadRunner目录。(包括Agent Process)

    4.在搜索中查找下列文件,并且删除它们。
    1) wlrun.*
    2) vugen.*

    二、删除注册表(最重要的)
    1.运行注册表程序(开始- 运行- regedit)

    2.删除下列键值。 
    HKEY_CLASSES_ROOT\Mercury.Lm70Control
    HKEY_CLASSES_ROOT\Mercury.Lm70Control.1
    同时删除
    Mercury.Lm70ControlMgr
    Mercury.Lm70ControlMgr.1
    一定要多查找几遍,发现Lm70Contro字样的东西都要删除掉!

    3.最后删除下面内容:
    HKEY_CURRENT_USER\Software\Mercury Interactive\LoadRunner
    HKEY_LOCAL_MACHINE\SOFTWARE\Mercury Interactive\LoadRunner

        这些步骤都走了一遍,确定注册表里没有那些关键字以后,重启一下电脑,开始安装LR9.0!!
        我的解压过程没有遇到其他网友说的问题,直接双击运行,一直顺利通过!


    loadrunner9.0破解方法

    1、过程和方法:
    打开Loadrunner,发现以下几个dll可能和注册有关,mlr5lprg.dll、licensebundles.dll、lm50.dll、lm70.dll。
    如果熟悉LR的朋友,LR7.8、8.0、8.1中都没有Licensebundles.dll,这是一个新的综合捆绑dll,所以我在之前的一些朋友的帖子里说破解难度大,也是这个原因。
    但是万幸的是,我在LR8.1.4.0中发现了licensebundles.dll,也就是LR8.1打上FP4补丁,并且用我以前的针对LR8.1的办法有效,因此,LR9.0的破解方案也就很快出现:
    a、用LR8.1.4.0中的lm50.dll、licensebundles.dll覆盖LR9.0安装目录下“bin”文件夹中的对应文件;
    b、用LR8.0中的mlr5lprg.dll、lm70.dll覆盖LR9.0安装目录下“bin”文件夹中的对应文件;
    c、然后使用老的注册码就可以使用了;
    d、golba-100: AEAMAUIK-YAFEKEKJJKEEA-BCJGI
          web-10000: AEABEXFR-YTIEKEKJJMFKEKEKWBRAUNQJU-KBYGB

    2、遇到的问题
    在破解的过程中我还遇到了个问题,就是通过上述的方法注册时提示“License security violation……”,无法注册,后通过针对LR注册表删除的工具运行后再注册就通过了。


    (这个问题我也没有遇到,直接输入了License就可以了)

        安装完毕后,通过简单录制查看安装是不是真的成功,就在这时问题出现了!
    1.LR打开IE后IE不自动出来
    2.在LR打开的IE中访问不到服务,并且服务正常

    还好,在网上搜索到了云层老师的博客,里面正好有这方面的解决方法:
    1.这个问题还是IE的,找到IE的高级选项,里面有个第三方扩展支持,去掉就行了
    2.这个问题是LR8.x系列会篡改IE的代理设置,关闭LR,打开IE中的选项,找到代理服务器,把最下面的对本地不使用代理服务器勾上,再把上面的使用代理服务器去掉,打开LR在录制选项中将代理设置为无。

  • 测试网站资料列表

    2008-09-22 12:59:52

    51Testing软件测试网  www.51testing.com
    CSDN——软件测试频道  testing.csdn.net
    希赛网——软件测试频道  testing.csai.cn
    中国软件测试联盟  www.iceshi.com
    一起测试网  www.17testing.com
    北大测试  www.btesting.com
    中国软件测试基地 www.cntesting.com
    中国软件评测中心  www.cstc.org.cn
    中国软件质量网  www.rjzl.gov.cn


    更新说明:
    1.去除了不可用的链接和更新较慢的网站
    2.添加了几个网站的链接


    下列网站中,部分已经不可访问,但作为V1.0的内容仍保留了下来

    软件测试之中文网络资源总汇(顺序是我随意排的,不分先后)

    中国软件测试社区 http://www.sztest.net/forum/

    海松宝的小屋  http://www1.testage.net/haisongbao/

    Alan工作室  http://alanzhou.nease.net/index.htm

    软件工程专家网  http://www.51cmm.com/

    51testing软件测试网(慧谷-博为峰软件测试工作室)  www.51testing.com

    中国软件测试在线  http://www.softtest.cn/

    杨柳清风论坛  http://www.kaiyuanlaw.com/dvbbs/

    天极网的软件测试板块  

    http://www.yesky.com/SoftChannel/72342393369657344/index.shtml

    测试工程师  http://opentest.51.net/index.htm

    自由龙(好像是珠海的)   http://www.freedragon.net/
  • 安全测试工作

    2008-08-26 10:51:37

    Fortify Source Code Analysis Suite是目前在全球使用最为广泛的软件源代码安全扫描,分析和软件安全风险管理软件。该软件多次荣获全球著名的软件安全大奖,包括InforWord, Jolt,SC Magazine….目前众多世界级的软件开发企业都在使用该软件方案在他们的开发团队中加速查找软件安全漏洞的效率,监视和管理软件安全的风险.

    软件安全测试工具

     

    A. Fortify Source Code Analysis Engine(源代码分析引擎) 

    采用数据流分析引擎,语义分析引擎,结构分析引擎,控制流分析引擎,配置分析引擎和特有的X-Tier跟踪器从不同的方面查看代码的安全漏洞,最大化降低代码安全风险。

    B. Fortify Secure Code rules:Fortify  (软件安全代码规则集)

          采用国际公认的安全漏洞规则和众多软件安全专家的建议,辅助软件开发人员、安全人员和管理人员快速掌握软件安全知识、识别软件安全漏洞和修复软件安全漏洞。其规则的分类和定义被众多国际权威机构采用,包括美国国土安全(CWE)标准、OWASP,PCI。。。等。

    C. Fortify Audit Workbench (安全审计工作台)

           辅助开发人员、安全审计人员对Fortify Source Code Analysis Engines(源代码分析引擎)扫描结果进行快速分析、查找、定位和区分软件安全问题严重级别。 

    D. Fortify Rules Builder     (安全规则构建器)

            提供自定义软件安全代码规则功能,满足特定项目环境和企业软件安全的需要。

    E. Fortify Source Code Analysis Suite plug in (Fortify SCA IDE集成开发插件)

            Eclipse, WSAD, Visual Studio 集成开发环境中的插件,便于开发者在编写代码过程中可以直接使用工具扫描代码,立刻识别代码安全漏洞,并立即根据建议修复,消除安全缺陷在最初的编码阶段,及早发现安全问题,降低安全问题的查找和修复的成本。

    F. Fortify Manager(软件安全管理器)

     基于WEB企业用户接口的软件安全信息存储\分析\评估和报告的软件安全管理平台.主要功能是定义和监视软件安全策略、跟踪和报告软件安全趋势、跨多个应用管理软件安全风险。

  • LR性能测试

    2008-07-29 15:24:45

     

    1.概述
            在山东BOSS性能压力 测试 过程中,发现脚本对于整个压力测试过程的重要性,一个压力测试脚本录制和编辑修改得怎么样直接影响后面压力测试的执行。通常情况下,脚本应尽可能的精简,就像写代码一样。针对BOSS系统的特点, 个人 认为把单一业务录制成一个Action,并在脚本中添加Transaction,Find检查(可以采用URL-based scrīpt 方式录制并事先设定),Rendezvous,参数化等基本元素,然而有时我们会发现光有这些基本元素还不能满足我们的要求。比如在Controller中运行我们的脚本时,一旦压力过大或某种原因导致某一业务失败,而此时我们很想尽快地找出错误的原因。当然此时我们第一想到的是,查找 日志 ,但是有时发现查找日志很不方便,因此我们希望寻求一种更快捷的方式,希望能直接从Controller的Errors错误中找到出错的服务号码、在第几次Iteration的哪个Transaction出错。实现的方式,当然是通过简单的编程来调用错误日志里的信息,另外本文中还简单介绍了关于 LoadRunner 工具使用的一些常用注意事项、脚本处理技巧和一些常用性能参数的分析及 性能测试 中机器瓶颈的定义和查看机器瓶颈的相关命令。
            下面再具体的一一介绍。

    2.一个规范的性能测试脚本就像一段规范的程序代码一样,需要基本的说明信息:
    在下面要介绍的脚本中,我把这些信息以注释的形式放在vuser_init最前面:
    /*
    @corporation:Copyright By *** Technologies CO.,LTD. All Rights Reserved.
    @Athour:XuLinLin
    @Date:2005-09-18
    @Name:异地缴费压力测试脚本
    @Parameter:BOSSURL,LogName,PhoneNum,iteration,FanHui
    @Data:BOSSURL:BOSSURL.dat; //由于BOSS压力测试前台展现环境多,故将地址也参数化。
    LogName:LogName.dat; //登录用操作员,选择具备异地缴费权限的操作员,这里选择的是德州操作员300个。
    PhoneNum:PhoneNum.dat; //用于异地缴费的服务号码,这里选择的是烟台的正常在用的标准全球通号码3000个。
    iteration:iteration.dat; //用于压力测试出错时,打印出错所在的循环次数。
    @Descrīption:此脚本用于测试异地缴费的性能及稳定性,选用德州的操作员对烟台的标准全球通号码进行异地缴费,目标是
    通过vuser模仿真实操作员进行异地缴费,达到验证或测试系统性能和稳定性的目的。
    @Notes:脚本的录制使用的是LoadRunner8.0的VU,采用的是URL-based scrīpt方式,需要特别注意的是Recording Options(按Ctrl+F7)
    的Advanced 选项里的Surport Charset一般情况默认为不选,除非字符集合采用的是国际标准才选中UTF-8选项,否则会出现汉字乱码现象。
    */

    3.通常情况下,任何业务必须在登陆成功后才能做,所以有必要对登陆成功与否进行判断:
    下面我从脚本中取出相关部分进行简单介绍:
    vuser_init()
    {
    int status; //定义变量用于判断登陆是否成功
    web_reg_find("Text="山东移动BOSS"",
    LAST);
    …….
    …….
    web_submit_data("reguserAction.do", //登陆提交数据Action。
    "Action="http://{BOSSURL}/boss/reguserAction.do"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/index.jsp"",
    "Snapshot="t12.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="logname"", "Value="{LogName}"", ENDITEM,
    "Name="password"", "Value=", ENDITEM,
    LAST);
    status = web_submit_data("reguserAction.do", // 取成功与否标志
    "Action="http://{BOSSURL}/boss/reguserAction.do"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/index.jsp"",
    "Snapshot="t12.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="logname"", "Value="{LogName}"", ENDITEM,
    "Name="password"", "Value=", ENDITEM,
    LAST);

    if (status ="=" LR_FAIL) //一旦登陆失败,脚本给出提示报错信息。
    {
    lr_error_message("错误信息: %s", "不能正常登陆!");
    return -1;
    }
    }

    4.事务的定义,很简单,也很有必要,尽量是每个定义的事物符合逻辑和小。
    在下面的脚本中,在异地缴费这一业务中定义了两个Transaction:准备异地缴费数据和提交异地缴费,见如下脚本代码:
    lr_start_transaction("准备异地缴费数据");


    web_set_max_html_param_len("4096");
    ……….
    web_submit_data("chargeacc.do",
    "Action="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=queryaccount"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/acccharge.jsp?act=first"",
    "Snapshot="t74.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="isconfirm"", "Value="no"", ENDITEM,
    "Name="chargetype"", "Value="telnumber"", ENDITEM,
    "Name="telnumber"", "Value="{PhoneNum}"", ENDITEM,
    "Name="nowfee"", "Value="0.0"", ENDITEM,
    "Name="factfee"", "Value=", ENDITEM,
    "Name="totalfee"", "Value="0.0"", ENDITEM,
    LAST);
    lr_end_transaction("准备异地缴费数据", LR_AUTO);

    5.增强脚本,对脚本进行简单的编程。
    增强脚本,对脚本进行简单的编程,为性能或压力测试提供方便,这也是写
    本文的宗旨,下面对此做简单的介绍:
            5.1首先,定义成功与否的判断标志或字符串。
            在此,我把判断成功与否的标志定义在异地缴费Action 最前面,具体定义如下:char fanhuiflag[30]="操作业务数据成功!";
    但是大家可能会问,字符串"操作业务数据成功!"从何处而来,可以肯定的不能凭空想象,成功标志可从两三种方式来取得:
    第一种:也是最简单的一种,直接从脚本中取得,具体操作是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里去取。见下面的 图片
    注:Snapshot在录制前要将Recording Options>Advanced里的Save snapshot resources locally 选项选中。

     


            第二种方式,从脚本代码中去取,即取find函数中相关字符串,具体做法是,找到在提交事件前的web_reg_find函数,然后从中取相关字符串。
    web_reg_find("Text="---------操作业务数据成功!--------"",
    LAST);
    值得注意的是要有web_reg_find函数,可以在录制前选中Recording Options>Advanced里的Generate web_reg_find functions for page titles 选项。


            第三种方式,从本地的snapshot里去取,具体操作,首先找到提交数据事件相关脚本,找到snapshot文件的名称,然后从本地的data文件里去找这个snapshot文件,然后丛中找到我们需要的字符串。
    web_reg_find("Text="---------操作业务数据成功!--------"",
    LAST);
    …….
    web_submit_data("chargeacc.do_3",
    "Action="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=submit&atype=commitdata"",
    "Method="POST"",
    "RecContentType="text/html"",
    "Referer="http://{BOSSURL}/boss/charge/commonbusiness/acccharge/chargeacc.do?act=querycustomer"",
    "Snapshot="t129.inf"",
    "Mode="HTTP"",
    ITEMDATA,
    "Name="isconfirm"", "Value="no"", ENDITEM,
    "Name="chargetype"", "Value="telnumber"", ENDITEM,
    "Name="telnumber"", "Value=", ENDITEM,
    "Name="nowfee"", "Value="8.8"", ENDITEM,
    "Name="factfee"", "Value="0.00"", ENDITEM,
    "Name="totalfee"", "Value="8.8"", ENDITEM,
    "Name="accountno"", "Value="{WCSParam_Diff1}"", ENDITEM,
    "Name="factpay"", "Value="8.8"", ENDITEM,
    "Name="grantpercent"", "Value=", ENDITEM,
    "Name="grantfee"", "Value="0"", ENDITEM,
    "Name="takecash"", "Value="8.8"", ENDITEM,
    "Name="zero"", "Value="0"", ENDITEM,
    "Name="paytype"", "Value="Cash"", ENDITEM,
    "Name="remark"", "Value=", ENDITEM,
    "Name="invoice"", "Value="joininvoice"", ENDITEM,
    LAST);

            5.2设置和保存判断成功与否的参数,这也是最关键的地方。
    有一点大家都很清楚,业务成功返回的字符串和失败返回的字符串是不同的,我们所要做的是将返回的字符串做为参数保存下来,然后拿这个参数和我们事先定义好的成功的标志做比较,有两种方式可以设置和保存这一参数,下面简单介绍:
    第一种方式也是最准确的方式,是以View Tree 方式找到相关的界面,然后从Server Response的Snapshot的Body里的成功的返回标志,然后对其进行Create Parameter,这样LoadRunner会自动在脚本中添加web_reg_save_param函数,具体如下:
    // [WCSPARAM WCSParam_Text2 24 操作业务数据成功!_Text2] Parameter {WCSParam_Text2} created by Correlation Studio
    web_reg_save_param("WCSParam_Text2",
    "LB="---------"",
    "RB="-"",
    "Ord="1"",
    "RelFrameId="1"",
    "Search="Body"",
    LAST);

     

            第二种方式是在提交事件前添加web_reg_save_param函数,具体操作是在提交事件前右击鼠标选择Insert Before 选项,然后在弹出的对话框中选择Services里的web_reg_save_param选项,单击OK按纽,然后在弹出的对话框中输入相关的数据。

     


            5.3 编写相关判断代码段。
            在已经定义好判断字符串和设置和保存好成功与否的标志字符串参数后,编写相关判断代码段,这也是最关键的地方,具体代码段如下:
    if (strcmp(fanhuiflag,lr_eval_string("{WCSParam_Text2}"))!="0)
    {
    lr_error_message("消息: %s,在第 %s 次循环时出错,出错号码:%s", "提交异地缴费数据失败!", lr_eval_string("{iteration}"), lr_eval_string("{PhoneNum}"));
    }
    简单解释如下:
    fanhuiflag:前面已经定义好的成功标志字符串的数组名,当然前面也可以用指针来实现,这里不做介绍。
    WCSParam_Text2:为实现设置和保存好的成功与否返回的字符串的参数;
    PhoneNum:服务号码的参数化,具体为电话号码。关于参数化,这里不做分析和解释部分。
    Iteration:为了定位具体的循环而设置的参数。
    Strcmp函数:LoadRunner自带的字符串比较函数,相等时返回0
    lr_eval_string函数:LoadRunner自带求字符串函数,函数格式为
    char * lr_eval_string (const char * instring );
    (另一种判断方式:先事先定义好int rc="1;" char *fanhuiflag="操作业务数据成功!";然后在定义事务的结尾进行判断: rc="strcmp(str_tip,lr_eval_string(""{re_str_tip}"));
    if(rc="=0)"
    {
    lr_end_transaction("异地缴费_提交", LR_PASS);
    }
    else
    {
    lr_error_message("异地缴费_提交失败,号码为:%s",lr_eval_string("{msisdn}"));
    lr_end_transaction("异地缴费_提交", LR_FAIL);
    }
    //lr_end_transaction("异地缴费_提交",LR_AUTO);)

            5.4验证我们的需求是否实现
            下面简单介绍,整个验证过程,在确保脚本正确和测试环境正常的情况下,我们先在VU里验证下是否真正实现了我们想要的功能,为了方便,我特地将判断条件该为="=而不是!=,通过查看日志来检查。

            首先,选中菜单栏里的Run-time Settings子菜单,设置里面的Log选项,选中Enable Logging 和Always send messages 和Extended log 及Parameter substitution。
    设置Run Logic 里的Number of Iterations 为2,然后运行,并查看日志。可以得到如下的日志(只取了关键部分的):
    第一次循环关键部分:
    YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.8459 Wasted Time: 0.0060).
    YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"
    YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 1 [table = iteration].
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "1"
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = "13953555588"
    YiDiJiaoFei.c(607): Error: 消息: 提交异地缴费数据失败!,在第 1 次循环时出错,出错号码:13953555588

    第二次循环关键部分:
    YiDiJiaoFei.c(598): Notify: Transaction "提交异地缴费数据" ended with "Fail" status (Duration: 4.2347 Wasted Time: 0.0064).
    YiDiJiaoFei.c(605): Notify: Parameter Substitution: parameter "WCSParam_Text2" = "操作业务数据成功!"
    YiDiJiaoFei.c(607): Notify: Next row for parameter iteration = 2 [table = iteration].
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "iteration" = "2"
    YiDiJiaoFei.c(607): Notify: Parameter Substitution: parameter "PhoneNum" = "13953572390"
    YiDiJiaoFei.c(607): Error: 消息: 提交异地缴费数据失败!,在第 2 次循环时出错,出错号码:13953572390

            下面验证执行时,能正确找到出错的号码信息,将脚本加入到场景后,同样设置好Run-time Settings。

            设置结果保存路径等相关信息,按Start Scenario 执行场景,等出错是单击右上角的Errors,然后选中错误信息再按Details按纽查看错误信息。

    6.怎么样使多台产生vuser的测试机均匀地对被测试的系统施加压力?
    在测试的过程中,为了尽可能减少或者避免本身的测试机成为测试过程中的瓶颈,需要使用多台测试机产生vuser对被测试系统施加压力,下面对操作步骤做简单介绍:
            在默认模式下使用controller添加多台Generators机器时,不管你怎么加,最终能真正起作用的只有一台(10.19.180.2/3/4或localhost):

    为了让10.19.180.2/3/4机器同时能真正被添加进去,我们需要做以下几步工作
    改变场景模式,将组模式()改变为百分比模式(percentage mode),具体做法是,选择Scenario菜单下的Convert Scenario to the Percentage Mode;

    然后,在已经添加好的Load Generators机器列表中同时选择你想选择的机器;

    最后,点OK按钮就可以得到我们所要的结果了。

    当然,如有必要我们还可以把场景模式改为Vuser Group Mode,具体做法如下:
    选择Scenario菜单下的Convert Scenario to the Vuser Group Mode;

    然后在弹出的对话框中,单击Yes按钮可以得到如下结果,

    到此为止,添加多台Load Generators测试机整个过程就完成了,其实很简单,关键是你发现了没有。

    7. 怎么样在关联时取列表的最后一个值(在测试重打发票取流水号时需要)?
    在压力测试脚本的关联过程中,我们有时可能需要关联最新的值(如最新的流水号,通常情况下,最新的流水号放在列表的最下方),所以找最新的流水号就是最列表最下方,如果保存在数组里,那就是找index值最大的那个元素。下面以重打发票(注:具体流程为先缴费,然后查询缴费历史,然后从缴费历史里找到最新的流水号,然后使用此流水号进行重打发票)为例对整个过程做详细的介绍:
    首先,在缴费历史里找到需要关联的流水号并关联之,具体做法如下,
    7.1以Tree View方式打开脚本并在对应事件的Page View里找到最新的流水号

            找到我们需要关联的流水号(这里为536dxwf0200051031000000)后,需要把它给关联,(因为返回的值是事后才知道的,且对于不同的电话号码,对应的返回值不同,所以对于这样的值是需要关联的。)具体做法是打开Server Response 页面并在Body里找到需要关联的流水号,然后选中此流水号并在右键弹出的菜单中使用Create Parameter关联之。

     


    7.2单击是(Y)按钮,对应的脚本中会增加如下内容。

            单击View scrīpt 图标以scrīpt模式查看关联情况。

    7.3到此为止脚本中多出如下代码段,下面对它做一定的分析:
    web_reg_find("Text="缴费历史查询"",
    LAST);
    // [WCSPARAM WCSParam_Text1 23 536dxwf0200051031000000] Parameter {WCSParam_Text1} created by Correlation Studio
    web_reg_save_param("WCSParam_Text1",
    "LB="formnum="",
    "RB=\"",
    "Ord=8",
    "RelFrameId=1",
    "Search=Body",
    LAST);
    //后面的内容为注释部分,说明流水号536dxwf0200051031000000已经关联并保存到WCSParam_Text1参数中。
            web_reg_save_param()为LoadRunner的保存参数所用的函数,其作用是将返回流水号保存到WCSParam_Text1参数中,以便使用不同的号码进行缴费历史查询出来的流水号能随着时间的变化流水号也跟着变化,而不是录制脚本时的536dxwf0200051031000000,这样可以避免在重打发票时不会报诸如此流水号不存在等类似错误信息。然而现在的问题是怎么将此流水号对应到重打发票对应的地方。另一个问题是,不是所有的号码缴费后查询到的流水号数量都和录制脚本时查询到的流水号相同,事实上每做一笔除查询类的操作都会有一个流水号。而我们关注的是怎么取到最新的缴费的流水号,下面详细介绍相关步骤。

    5.1 修改web_reg_save_param()函数相关部分,很简单,把"Ord="8"",改为"Ord=ALL",目的是找最TOP的那个参数值。

    5.2 光保存和取参数还不够,我们需要把参数能正确传递到重打发票对应的地方,为此我采取的做法如下:
            在缴费历史事件脚本最前面定义两个变量,目的是为了将流水号以字符串的形式保存在变量里(因为LoadRunner不支持在web_submit_data()函数里直接使用变量):具体做法是:
    char WCSParam_Text1Pram[50]; //保存取到的流水号
    char WCSParam_Text1PramVal[50]; //保存以"Value="流水号""取到的流水号。


            将关联好的流水号存到变量里,在此的做法是在对应的web_submit_data()函数后添加如下代码段:
    lr_message("WCSParam_text1:%s",lr_eval_string("{WCSParam_Text1}"));
    //打印出关联的参数WCSParam_Text1的值。
    sprintf(WCSParam_Text1Pram,"{WCSParam_Text1_%s}",lr_eval_string("{WCSParam_Text1_count}"));
    //把取到流水号保存到WCSParam_Text1Pram里,具体形式为
    sprintf(WCSParam_Text1PramVal,"Value="%s"",lr_eval_string(WCSParam_Text1Pram));
    //组合流水号和”Value=”并保存到WCSParam_Text1PramVal变量中。
    lr_message("The value argument is : %s", WCSParam_Text1PramVal);
    //打印出字符串变量WCSParam_Text1PramVal的值。

     

    5.3 找到重打发票中响应的流水号,并把其中的"Value="536dxwf0200051031000000""替换成WCSParam_Text1PramVal,在这里总共有两处。

     

            到此为止,流水号的关联已经基本上处理完毕,下面我们执行脚本,来验证我们想要的是不是真的有效。(注,参数化的问题在本文中不做具体介绍)为了看到明显的效果,我们需要将日志的处理做简单设置。

            然后执行脚本,查看相关执行日志,可以得到类似下面得消息。

     

    8.使用LoadRunner一些常用的注意事项:
    Note1:VuGen仅能录制 Windows平台上的会话,但是,录制的Vuser脚本既可以在Windows 平台上运行,也可以在 UNIX 平台上运行。
    通用 Vuser 函数和特定于协议的函数,它们共同构成了 LoadRunner API,并使Vuser能够直接与服务器通信。

    Note2:用于运行Vuser脚本的C解释器仅支持ANSI C语言。它不支持 Microsoft对ANSI C的任何扩展。
    通常情况下,可以将登录到服务器的活动录制到vuser_init部分中、将客户端活动录制到Actions部分中,并将注销过程录制到vuser_end部分中。

    Note3:只能向Action部分(而不是init或end 部分)添加集合。
    Note:不要从事务内部发送消息,因为这可能使事务执行时间变长,并扭曲事务结果。

    Note4:如果使用日志运行时设置修改脚本的调试级别,则 lr_message、lr_output_message 和 lr_log_message 函数的行为将不会更改,它们将继续发送消息。

    Note5:录制 Java Vuser 脚本时, Vuser 脚本中将不生成 lr_think_time 语句。

    Note6:VuGen 新建参数,但不会自动替换任何在脚本中选定的字符串。

    Note7:不要将参数命名为 unique,因为该名已被 VuGen 使用。

    Note8:如果在常规运行时设置文件夹中将“错误处理”设置为“出现错误时仍继续”,则错误消息仍将被发送到输出窗口。

    Note9:因为生成的服务器消息很长,而且日志记录会降低系统的运行速度,所以请仅为脚本中特定的代码块激活服务器消息日志记录功能。

    Note10:启用“出现错误时仍继续”功能时,将覆盖 0 严重级别;即使发生数据库错误,也将继续执行脚本。然而,如果禁用了“出现错误时仍继续”功能,但将严重级别指定为 1,则当发生数据库错误时仍将继续执行脚本。

    Note11:下列协议不是线程安全协议:Sybase-Ctlib、Sybase-Dblib、Informix、Tuxedo 和 PeopleSoft-Tuxedo。

    Note12:对于支持树视图的协议(如“视图”菜单所示),在树视图中运行 Vuser脚本时, VuGen 将从 Vuser 脚本中的第一个图标开始运行该脚本。

    Note13:要显示运行时查看器,必须安装 Microsoft Internet Explorer 4.0 或更高版本。
    Note:Vuser 生成“结果摘要”报告时,事务时间可能会增加。Vuser 可以仅在从 VuGen 运行时才生成“结果摘要”报告。使用 Controller 运行 Web Vuser 脚本时, Vuser 不能生成报告。

    Note14:当使用 Javascrīpt 和 VBscrīpt Vuser 时,在脚本中用到的 COM 对象必须完全的兼容。这使下列情况成为了可能:一个应用程序操纵另一个应用程序中的对象,或者公开对象以便操纵它们。

    9.性能参数解析:
    WEB资源参数

            每秒点击次数:中Vuser每秒向Web服务器提交的HTTP请求数,依据点击次数来评估Vuser产生的负载量。

            吞吐量:案运行过程中服务器上每秒的吞吐量。吞吐量的度量单位是字节,表示Vuser在任何给定的某一秒上从服务器获得的数据量,依据服务器吞吐量来评估Vuser产生的负载量。

            每秒HTTP响应数:中每秒从Web服务器返回的HTTP状态代码号(表示HTTP请求的状态,例如“the request was successful”、“the page was not found”)

            每秒下载页面数:每秒钟从服务器下载的网页数,依据下载的页面数来评估Vuser产生的负载量。

            每秒重试次数:中每秒钟内服务器尝试的连接次数,在下列情况下将重试服务器连接:初始连接未经授权、要求代理服务器身份验证、服务器关闭了初始连接、初始连接无法连接到服务器或者服务器最初无法解析负载生成者的IP地址。

            连接数:每个时间点上打开的TCP/IP连接数。

            每秒SSL连接数:每秒打开的新的以及重新使用的SSL连接数。当对安全服务器打开TCP/IP连接后,浏览器将打开SSL连接,因为新建SSL连接需要消耗大量的资源,所以应该尽量少地打开新的SSL连接。

    网页细分图
            注意:由于要从客户端测定服务器时间,因此,如果发送初始HTTP请求到发送第一次缓冲这一段时间内网络性能发生变化,则网络时间可能会影响此测定。因此,所显示的服务器时间是一个估计值,可能不太精确。
    DNS解析:显示使用最近的DNS服务器将DNS名称解析为IP地址所需的时间。“DNS 查找”度量是指示DNS解析问题或DNS服务器问题的一个很好的指示器。

            连接:显示与包含指定URL的Web服务器建立初始连接所需的时间。连接度量是一个很好的网络问题指示器。此外,它还可表明服务器是否对请求作出响应。

            第一次缓冲:显示从初始HTTP请求(通常为 GET)到成功收回来自Web服务器的第一次缓冲时为止所经过的时间。第一次缓冲度量是很好的Web服务器延迟和网络滞后指示器。注意:由于缓冲区大小最大为 8K,因此第一次缓冲时间可能也就是完成元素下载所需的时间。

            SSL握手:显示建立SSL连接(包括客户端 hello、服务器hello、客户端公用密钥传输、服务器证书传输和其他部分可选阶段)所用的时间,自此点之后,客户端与服务器之间的所有通信都将被加密。SSL握手度量仅适用于HTTPS通信。

            接收:显示从服务器收到最后一个字节并完成下载之前经过的时间。“接收”度量是很好的网络质量指示器(查看用来计算接收速率的时间/ 大小比率)。

            FTP验证:显示验证客户端所用的时间。如果使用FTP,则服务器在开始处理客户端命令之前,必须验证该客户端。“FTP 验证”度量仅适用于 FTP 协议通信。

            客户端时间:显示因浏览器思考时间或其他与客户端有关的延迟而使客户机上的请求发生延迟时,所经过的平均时间。

            错误时间:显示从发出HTTP请求到返回错误消息(仅限于HTTP错误)这期间经过的平均时间。

            系统资源(UNIX资源参数):
    CPU utilization :CPU的使用时间百分比
    Disk rate :磁盘传输速率
    Paging rate :每秒钟读入物理内存或写入页面文件中的页数
    Page-in rate :每秒钟读入到物理内存中的页数
    Page-out rate :每秒钟写入页面文件和从物理内存中删除的页数
    Collision rate :每秒钟在以太网上检测到的冲突数
    Context switches rate :每秒钟在进程或线程之间的切换次数
    Average load :上一分钟同时处于“就绪”状态的平均进程数
    Swap-in rate :正在交换的进程数
    System mode CPU utilization :在系统模式下使用CPU的时间百分比
    User mode CPU utilization :在用户模式下使用CPU的时间百分比

    网络监视参数

            网络延迟时间:源计算机与目标计算机(例如,数据库服务器和Vuser负载生成器)之间的整个路径的延迟。

            网络子路径时间:从源计算机到路径上每个节点的延迟。注意:从源计算机到每个节点的延迟是同时而又独立地度量的。因此,从源计算机到其中一个节点的延迟可能大于源计算机与目标计算机之间的整个路径上的延迟。

            网络段延:路径上每个段的延迟。

            验证网络是否是瓶颈:可以合并各种图来确定网络是否是瓶颈。例如,通过使用网络延迟时间图和运行Vuser图,可以确定Vuser的数量如何影响网络延迟。网络延迟时间图指示在方案运行期间的网络延迟。

    数据库服务器

            User Calls :在每次登录、解析或执行时, Oracle 会分配资源(Call State 对象)以记录相关的用户调用数据结构。在确定活动时,用户调用与RPI调用的比指明了,因用户发往Oracle的请求类型而生成的内部工作量

            Total file opens :由实例执行的文件打开总数。每个进程需要许多文件(控制文件、日志文件、数据库文件)以便针对数据库进行工作

            Opened cursors current :当前打开的光标总数

            DB block changes :由于与一致更改的关系非常密切,此统计计算对SGA中所有块执行的、作为更新或删除操作一部分的更改总数。这些更改将生成重做日志项,如果事务被提交,将是对数据库的永久性更改。此统计是一个全部数据库作业的粗略指示,并且指出(可能在每事务级上)弄脏缓冲区的速率。

    10.AIX操作系统机器性能瓶颈定义:
    瓶颈定义
    CPU bound : vmstat : when %user+%sys greater than 80%;
    Disk I/O bound : vmstat : when %iowait greater than 40%(AIX4.3.3 or later);
    Application disk bound :vmstat : when %tm_act greater than 70%;
    Paging space low : lsps -a : when used paging space greater than 70% active;
    Paging bound : iostat vmstat : paging logical volumes %tm_act greater than 30% of the I/O(iostat) and paging activity greater than 10* the number of CPUs(vmstat);
    Thrashing : vmstat sar :rising page outs, CPU wait and run queue;

    11.系统性能分析命令:
    cpu : vmstat,iostat,topas,nmon,ps,sar,time,timex,netpmon,trace,trcrpt;
    内存:vmstat,topas,nmon,ps,svmon,lsps,filemon,trace,trcrpt;
    磁盘:iostat,topas,nmon,lvmstat,iostat -d, lvmstat, lsps,filemon,lsattr,lsdev;
    网络:netstat,topas,nmon,entstat,nfsstat,ifconfig,iptrace,ipreport,trace,trcrpt;
    监视CPU使用情况:vmstat 2 ; iostat -t 2 6;sar -P ALL 2 3;
    监视内存使用情况: vmstat 2 10;ps aux;svmon -G;svmon -Pau 10;
    监视I/O使用情况: iostat 5;sar -d 3 3;
    监视网络使用情况: netstat -i ;netstat -m;netstat -v;

  • http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/index.html

    2008-04-28 16:01:16

    暂无
  • LINUX

    2008-04-03 22:59:36

     

    安装LINUX其实和安装WIN98一样容易,不相信,咱走着瞧。

      (一)安装前准备  

      1、由于初次安装RedHat,为了避免与WIN98冲突,我特地找个闲置的640M的硬盘,并把它设置为从盘,打算把RedHalt安装到该硬盘上。进入WIN98后,系统自动识别为D盘。(如何在同一硬盘上安装LINUX与WIN98,请参阅主页上中文HOW文档)

      (二)开始安装Linux:

       开机进入COMS设置,把引导顺序改为CDROM、A、C。把RedHat6.0光盘放入光驱,系统自动进入安装状态。初次安装,还是执行默认值为妙,由于各自硬件不同,我谈谈我的几个主要步骤吧。 

        1、为Linux添加一个分区,用Tab选择Add钮,按回车,屏幕上将出现一个题为“Edit New Partition”的对话框。首先我们在Mount Point项中,输入这个分区(hdb)所对应的系统目录/(根目录);接着在Size(Megs)项中,输入分区的大小600(单位兆);在Type这一项中用光标上、下键选择适当的分区类型,我们选中Linux的文件分区Linux native;最后按OK确认。这样我们就成功地建立起一个为Linux所用的分区了。如果你的硬盘空间允许,你完全可以再建立一个或几个分区给Linux使用。接着用同样的方法给Linux增加一个交换分区,不同的仅是Mount Point项让它空着,在Type项目中选择Linux Swap。输入分区大小(如64),注意,交换分区的大小不能低于物理内存的实际大小。为Linux分好了区,按OK将分区信息写入硬盘。接着就是进行格式化了,执行默认值吧,  

        2、定制安装Linux软件了,硬盘空间有限,使用默认值算了,哦,我需要KDE,我加上KDE项!好了,现在可以安装了。

        3、设置显示器。我的显示器可不是名牌的,,找个替代吧,我选Viewsonic 14ES,显示器才能上到真彩 否则是丑陋的256色(告诉你,这是我多次配置XWindows才得到的答案喔)。

        5、设置显示卡。到显卡列表找吧,找呀找,终于找到了我的SIS6326,要不然就有点麻烦了。

        6、设置系统管理员密码,密码至少六个以上,它不会出现如WIN下的***,千万不要乱打呀,没有正确的密码可进不了Linux系统的哦。  

        7、系统提示制作启动盘,我可要用它启动我的RedHalt的啊,插入软盘后YES。

        8、安装LILO(Linux多操作系统启动管理器)。我想我大多数的时间还是用Win98吧,选SKIP跳过这一步。用Linux时插入启动盘啦。 

  • Linux命令

    2007-05-23 11:55:42

     Linux虽然是免费的,但它的确是一个非常优秀的操作系统,与MS-WINDOWS相比具有可靠、 稳定、速度快等优点,且拥有丰富的根据UNIX版本改进的强大功能。下面,作为一个典型的DOS 和WINDOWS用户,让我们一起来学习Linux的一些主要命令,希望大家能尽快进入到Linux的世界里。

      一、启动

      Linux的启动操作过程和DOS相似(尽管如此,但作为操作系统本身,Linux在启动和退出时所作的工作要比DOS多得多),也可以通过按下Ctrl+Alt+Del三键进行热启动。不同的是Linux启动到最后时,需要进行登录。下面是一个典型的登录过程:

      ……

      RedHat Linux release 5.1

      Kernel 2.0.32 on an i686

      login:

      你键入:root后,计算机显示输口令(password:),输入你的口令(如果是第一次启动,则是你在安装时所输入的口令)即可。当计算机出现一个“#”提示 符时,表明你登录成功!

      [root@localhost root]#_    Linux提示符 (现在的版本都更新了,默认启动到KDE环境,所以看到的是已经类似WINDOWS的桌面了,而root@localhost root仅只是一个终端)

      C:\>_         DOS提示符

     二、常用的一些命令:

      1.显示文件目录命令ls(DOS下为DIR)

      在Linux中用ls命令显示文件及目录(当然,你仍然也可用DIR命令,只不过在这里的参数不同)。例如:#ls

      root mnt boot dev bin usr xiong tmp etc games

      看起来似乎简单(就相当于DOS中的“DIR/W”),但你会发现你看到的有些难懂,连哪些是目录哪些是文件都不清楚,哪些又是可执行文件呢?不要紧,请输入:#ls -F+root/ mnt/ boot/ dev/ bin/ usr/ xiong* tmp/ etc/ games / readme

      看清楚了吧,带*为可执行文件(相当于DOS中的EXE和COM文件),带/为子目录,其它的为通用文件。另外,我们可用ls -l显示文件目录的详细情况(相当于DOS中的DIR命令)。千万注意区分大小写!!如LS -f;Ls等都是错误的。另外,ls命令还有许多参数,你可以用man ls或ls--help去进一步了解。

      2.改变当前目录命令cd(DOS下为CD)

      在DOS中,我们可以用C:\>CD\MNT\cdrom或cd\mnt\cdrom

      C:\mnt\cdrom>cd ..或cd..或CD..

      C:\mnt>cd\或C:\mnt>cd \

      而在Linux中为cd /mnt/cdrom,目录名的大小写必须与实际相同,cd后必须有空格。

      pwd 显示当前目录

      cd .. 必须为小写,必须有空格

      cd / 总目录为/,cd与/必须有空格

      3.建立子目录mkdir(DOS下为MD或MKDIR)

      在Linux中只能用mkdir,可用相对路径和绝对路径,请比较:

      C:\>md xiong或md \xiong或md\xiong

      DOS系统

      [root@localhost /]#mkdir xiong或mkdir /xiong

      Linux系统

      4.删除子目录命令rmdir(DOS下为RD)

      在Linux中用rmdir命令删除子目录,例如:

      rmdir /mnt/cdrom 相当于rd \mnt\cdrom

      注意:同DOS一样,要删除的子目录必须是空的,而且必须在上一级目录中才能删除下一级 子目录。

      5.删除文件命令RM(DOS下为DEL或EARSE)

      在Linux中用RM命令删除文件,例:

      rm /ucdos.bat 相当于del \ucdos.bat

      6.文件改名命令MV(DOS下为REN或RENAME)在Linux中用mv命令给文件改名,例:

      mv /mnt\floppy p相当于 ren \mnt\floppy p

      说明:在Linux中的mv命令除了文件改名外,还有文件移动的功能,请看例子:

      mv /mnt/floppy /bin 相当于DOS中的命令 move \mnt\floppy \bin

      7.文件复制命令cp(DOS下为COPY)

      在Linux中用cp命令进行文件复制,例:

      cp /ucdos/* /fox 相当于copy \ucdos\*.* \fox

      注意:DOS中的*.*在Linux中用*代替。

     二、常用的一些命令:

      1.显示文件目录命令ls(DOS下为DIR)

      在Linux中用ls命令显示文件及目录(当然,你仍然也可用DIR命令,只不过在这里的参数不同)。例如:#ls

      root mnt boot dev bin usr xiong tmp etc games

      看起来似乎简单(就相当于DOS中的“DIR/W”),但你会发现你看到的有些难懂,连哪些是目录哪些是文件都不清楚,哪些又是可执行文件呢?不要紧,请输入:#ls -F+root/ mnt/ boot/ dev/ bin/ usr/ xiong* tmp/ etc/ games / readme

      看清楚了吧,带*为可执行文件(相当于DOS中的EXE和COM文件),带/为子目录,其它的为通用文件。另外,我们可用ls -l显示文件目录的详细情况(相当于DOS中的DIR命令)。千万注意区分大小写!!如LS -f;Ls等都是错误的。另外,ls命令还有许多参数,你可以用man ls或ls--help去进一步了解。

      2.改变当前目录命令cd(DOS下为CD)

      在DOS中,我们可以用C:\>CD\MNT\cdrom或cd\mnt\cdrom

      C:\mnt\cdrom>cd ..或cd..或CD..

      C:\mnt>cd\或C:\mnt>cd \

      而在Linux中为cd /mnt/cdrom,目录名的大小写必须与实际相同,cd后必须有空格。

      pwd 显示当前目录

      cd .. 必须为小写,必须有空格

      cd / 总目录为/,cd与/必须有空格

      3.建立子目录mkdir(DOS下为MD或MKDIR)

      在Linux中只能用mkdir,可用相对路径和绝对路径,请比较:

      C:\>md xiong或md \xiong或md\xiong

      DOS系统

      [root@localhost /]#mkdir xiong或mkdir /xiong

      Linux系统

      4.删除子目录命令rmdir(DOS下为RD)

      在Linux中用rmdir命令删除子目录,例如:

      rmdir /mnt/cdrom 相当于rd \mnt\cdrom

      注意:同DOS一样,要删除的子目录必须是空的,而且必须在上一级目录中才能删除下一级 子目录。

      5.删除文件命令RM(DOS下为DEL或EARSE)

      在Linux中用RM命令删除文件,例:

      rm /ucdos.bat 相当于del \ucdos.bat

      6.文件改名命令MV(DOS下为REN或RENAME)在Linux中用mv命令给文件改名,例:

      mv /mnt\floppy p相当于 ren \mnt\floppy p

      说明:在Linux中的mv命令除了文件改名外,还有文件移动的功能,请看例子:

      mv /mnt/floppy /bin 相当于DOS中的命令 move \mnt\floppy \bin

      7.文件复制命令cp(DOS下为COPY)

      在Linux中用cp命令进行文件复制,例:

      cp /ucdos/* /fox 相当于copy \ucdos\*.* \fox

      注意:DOS中的*.*在Linux中用*代替。

  • Linux命令使用技巧集锦

    2007-05-23 11:50:54

    初用Linux时可能有处处不方便的感觉, 可是等使用一段 时间掌握了一些技巧后就会感到越来越顺手了. 以下就是我 使用Linux以来积累的一些经验与技巧, 相信对初学者会有所帮助的.

      1. 使用虚拟控制台   

      登录后按Alt+F2键这时又可以看到"login:"提示符, 这 个就是第二个虚拟控制台. 一般新安装的Linux有四个虚拟控 制台, 可以用Alt+F1~Alt+F4来访问. 虚拟控制台最有用的时 候是当一个程序出错锁住输入时可以切换到其他虚拟控制台 ?

      2. 拷贝与粘贴  

      字符界面: 不管是Slackware 还是RedHat 安装后每次启 动时都会自动运行一个叫gpm的程序, 该程序运行后就可以用 鼠标来拷贝与粘贴了. 具体做法是按住鼠标左键拖动使要拷贝的地方反白, 这时反白的区域已经被拷贝, 再按鼠标右键拷贝的内容就会被粘贴在光标所在位置了. X-Window下: 拷贝的操作与字符界面下一样, 三键鼠标的话 按中键粘贴, 两键鼠标的话同时按左右键粘贴(须在配置XF86 时在鼠标的设置里选择 Emulate 3 Button).

      3. 快速进入某些目录

      键入 cd ~ 可进入用户的home目录. 键入 cd - 可进入上一个进入的目录.

      4. 软驱的使用

      如果是Linux 的ext2文件系统用如下命令: #mount -t ext2 /dev/fd0 /mnt dos格式的软盘则用命令: #mount -t msdos /dev/fd0 /mnt 然后就可以在/mnt里访问软盘的内容了, 注意在取出软盘之 前要先卸掉软盘上的文件系统, #umount /mnt 否则会导致信息丢失. 在软盘上建立文件系统可用如下命令: #mke2fs /dev/fd0 1440

      5. RedHat下显示彩色目录列表   

      打开/etc/bashrc, 加入如下一行: alias ls="ls --color" 下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下: 蓝色-->目录 绿色-->可执行文件红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件

      6. 显示文件的类型   

      用命令 file 可以使你知道某个文件究竟是ELF格式的可执行文件, 还是shell scrīpt文件或是其他的什么格式 例如: #file startx

    初用Linux时可能有处处不方便的感觉, 可是等使用一段 时间掌握了一些技巧后就会感到越来越顺手了. 以下就是我 使用Linux以来积累的一些经验与技巧, 相信对初学者会有所帮助的.

      1. 使用虚拟控制台   

      登录后按Alt+F2键这时又可以看到"login:"提示符, 这 个就是第二个虚拟控制台. 一般新安装的Linux有四个虚拟控 制台, 可以用Alt+F1~Alt+F4来访问. 虚拟控制台最有用的时 候是当一个程序出错锁住输入时可以切换到其他虚拟控制台 ?

      2. 拷贝与粘贴  

      字符界面: 不管是Slackware 还是RedHat 安装后每次启 动时都会自动运行一个叫gpm的程序, 该程序运行后就可以用 鼠标来拷贝与粘贴了. 具体做法是按住鼠标左键拖动使要拷贝的地方反白, 这时反白的区域已经被拷贝, 再按鼠标右键拷贝的内容就会被粘贴在光标所在位置了. X-Window下: 拷贝的操作与字符界面下一样, 三键鼠标的话 按中键粘贴, 两键鼠标的话同时按左右键粘贴(须在配置XF86 时在鼠标的设置里选择 Emulate 3 Button).

      3. 快速进入某些目录

      键入 cd ~ 可进入用户的home目录. 键入 cd - 可进入上一个进入的目录.

      4. 软驱的使用

      如果是Linux 的ext2文件系统用如下命令: #mount -t ext2 /dev/fd0 /mnt dos格式的软盘则用命令: #mount -t msdos /dev/fd0 /mnt 然后就可以在/mnt里访问软盘的内容了, 注意在取出软盘之 前要先卸掉软盘上的文件系统, #umount /mnt 否则会导致信息丢失. 在软盘上建立文件系统可用如下命令: #mke2fs /dev/fd0 1440

      5. RedHat下显示彩色目录列表   

      打开/etc/bashrc, 加入如下一行: alias ls="ls --color" 下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下: 蓝色-->目录 绿色-->可执行文件红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件

      6. 显示文件的类型   

      用命令 file 可以使你知道某个文件究竟是ELF格式的可执行文件, 还是shell scrīpt文件或是其他的什么格式 例如: #file startx

    初用Linux时可能有处处不方便的感觉, 可是等使用一段 时间掌握了一些技巧后就会感到越来越顺手了. 以下就是我 使用Linux以来积累的一些经验与技巧, 相信对初学者会有所帮助的.

      1. 使用虚拟控制台   

      登录后按Alt+F2键这时又可以看到"login:"提示符, 这 个就是第二个虚拟控制台. 一般新安装的Linux有四个虚拟控 制台, 可以用Alt+F1~Alt+F4来访问. 虚拟控制台最有用的时 候是当一个程序出错锁住输入时可以切换到其他虚拟控制台 ?

      2. 拷贝与粘贴  

      字符界面: 不管是Slackware 还是RedHat 安装后每次启 动时都会自动运行一个叫gpm的程序, 该程序运行后就可以用 鼠标来拷贝与粘贴了. 具体做法是按住鼠标左键拖动使要拷贝的地方反白, 这时反白的区域已经被拷贝, 再按鼠标右键拷贝的内容就会被粘贴在光标所在位置了. X-Window下: 拷贝的操作与字符界面下一样, 三键鼠标的话 按中键粘贴, 两键鼠标的话同时按左右键粘贴(须在配置XF86 时在鼠标的设置里选择 Emulate 3 Button).

      3. 快速进入某些目录

      键入 cd ~ 可进入用户的home目录. 键入 cd - 可进入上一个进入的目录.

      4. 软驱的使用

      如果是Linux 的ext2文件系统用如下命令: #mount -t ext2 /dev/fd0 /mnt dos格式的软盘则用命令: #mount -t msdos /dev/fd0 /mnt 然后就可以在/mnt里访问软盘的内容了, 注意在取出软盘之 前要先卸掉软盘上的文件系统, #umount /mnt 否则会导致信息丢失. 在软盘上建立文件系统可用如下命令: #mke2fs /dev/fd0 1440

      5. RedHat下显示彩色目录列表   

      打开/etc/bashrc, 加入如下一行: alias ls="ls --color" 下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下: 蓝色-->目录 绿色-->可执行文件红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件

      6. 显示文件的类型   

      用命令 file 可以使你知道某个文件究竟是ELF格式的可执行文件, 还是shell scrīpt文件或是其他的什么格式 例如: #file startx

     7 .命令文件的路径   

      当你键入一些命令如find, shutdown, mount, startx时是否 想过要知道这些文件究竟放在哪个目录里? 用命令 whereis 可以实现,如 #whereis startx

      8. 查找文件

      find 命令要加一些参数才能查到文件, 如: #find /usr -name XF86Setup -print 在/usr里查找文件XF86Setup.

      9. 删除无用的core文件

      程序运行出后有时候会产生一个名为core的文件, 这个文件一般很大而且没什么用, 可以删除掉以释放空间.

      10. 一次解开.tar.gz文件

      解开.tar.gz文件一般要先用gunzip解压再用tar解包, 在Linux下可以一次完成, 如: #tar zxpvf sample.tar.gz

      11. 显示win95分区里的长文件名   

      如果你发现win95分区里的长文件命不能显示, 可以重新 用vfat方式来mount. 对于启动时就mount的分区可以修改文 件/etc/fstab, 将里面的msdos字样改为vfat. 如果无法用 vfat mount, 则要重新编译一下核心, 加入对vfat的支持.

      12. Linux 里的Norton Commander   

      在提示符下键入命令mc后你就会看到一个与Norton Commander很相似的界面, 实际上功能也很相似甚至更强大, 比如可以直接对.tar.gz 压缩包里的文件进行操作(有点像 ZipMagic).

      13. 启动后直接进入X

      编辑/etc/inittab文件, 把id:3:initdefautl改为 id:4:initdefautl. 不过搜索路径可能会有些问题, 关机时 你得直接进入/sbin 里去执行 shutdown.

      14. 后台运行 X 程序

      执行一个X程序时别忘了在后面加一个&号,如 #netscape & 否则的话在你推出执行的程序之前再无法在那个终端窗口里输入命盍?

      15. 强行退出 X

      有时候在 X 里由于程序出错鼠标键盘都不起作用, 这时 候不用着急, 因为在Linux下几乎不会像在Win95里那样恶性 死机, 你只须键入Ctrl+Alt+BackSpace键就可以回到字符界 面下了.

     16. 重装Win9x后lilo失效无法启动Linux  

      只须先用软盘启动Linux然后运行一次lilo即可。对于 RedHat可以用命令mkbootdisk来制作启动盘,例如: mkbootdisk --devices /dev/fd0 2.0.34-1 其中2.0.34-1是 /lib/modules下的一个目录。

      17. 把dos/windows改为缺省启动的OS  

      RedHat把Linux作为lilo缺省启动的OS,即出现 boot: 提示符后直接回车启动Linux。如果想改为dos/Windows,修 改文件/etc/lilo.conf,把有关启动dos的部分放在前面,再 运行一次lilo即可。例如把lilo.conf从: boot=/dev/hda

      map=/boot/map

      install=/boot/boot.b

      prompt

      timeout=50

      image=/boot/vmlinuz-2.0.34-1

      label=linux

      root=/dev/hdc5

      read-only

      other=/dev/hda1

      label=dos

      table=/dev/hda

      改为:

      boot=/dev/hda

      map=/boot/map

      install=/boot/boot.b

      prompt

      timeout=50

      other=/dev/hda1

      label=dos

      table=/dev/hda

      image=/boot/vmlinuz-2.0.34-1

      label=linux

      root=/dev/hdc5

      read-only

      18. 去掉引导区内的lilo信息

      安装lilo后如果硬盘数量或分区情况有改变的话将导致硬盘不能启动,这时只须用软盘启动dos再运行 fdisk/mbr 即可。(这个方法还可清除任何引导区病毒)

      19. 让 X 支持 AGP 显卡

      下载一个 AX 4.1 即 AcceleratedX 4.1 , 一个商业版 的 X Server 。除 AGP 显卡外 AX 还支持很多牌号的显卡。 另外还可以用AX 带的设置程序 Xsetup 方便的对分辨率,刷 新率等参数进行设置。不过我也不知道用AGP卡效果如何,因 为我现在还在用老掉牙的 S3 765 。

     20. 把 man 或 info 的信息存为文本文件

      以 tcsh 为例: man tcsh   col -b > tcsh.txt info tcsh -o tcsh.txt -s

      21. 用当前路径作提示符

      对 bash 来说,在 .bashrc 里加一行: PS1="\$PWD\\$" 对 tcsh 来说,在 .tcshrc 里加一行: set prompt="%/>"

      22. 压缩可执行文件

      Linux 下有一个类似 dos 里的 pklite 和 lzexe 的命 令 -- gzexe 。而且压缩率一般都可以超过 50% ,在空间紧 张时很有用。比如:

      /dosc/temp# ls -al

      total 148

      -rwxr-xr-x 1 root root 149564 Dec 8 15:33 gawk

      /dosc/temp# gzexe

      gawk gawk: 54.5%

      /dosc/temp# ls -al

      total 216

      -rwxr-xr-x 1 root root 68710 Dec 8 15:36 gawk

      -rwxr-xr-x 1 root root 149564 Dec 8 15:33 gawk

      /dosc/temp#

      23. 查看 Linux 启动时的信息  

      Linux 启动时屏幕显示的信息来不及看清就一闪而过, 如果对这些信息感兴趣的话可以在启动完后用命令 dmesg 查看。

      24. 处理文件名内含有特殊字符的文件  

      如果有一个文件名叫 -file 如果想删除它,键入 rm -file 会显示 invalid option ,原来由于文件名的第一个字符为 - , Linux 把文件名当作选项了,可以加 -- 解决 这个问题, 如 rm -- -file 。如果是其他特殊字符的话可 以在特殊字符前加一个 \ ,或者用双引号把整个文件名括起来。

      25. 一次处理一整个目录

      Linux/UNIX 的很多常用命令如 rm , cp 等都有一个参 数---- -r , 是递归的意思, 命令里加了参数 -r 就可以对目标目录及其下所有子目录进行操作,如: rm -rf /test (f 是 force 意为强行) , 该命令完全删除 根目录下的子目录 test ,作用类似于 dos 下的 deltree ,当然使用这个命令时要特别小心。再如: cp -r /test /test1 有类似 dos 下 xcopy /s 的作用。

      26. 修改登录画面

      对本机: 先修改文件 /etc/issue 改为相要显示的内容, 再修改文件 /etc/rc.d/rc.local(RedHat) 或 /etc/rc.d/rc.S(Slackware) 把下面几句注释掉:

      # This will overwrite /etc/issue at every boot. So, make any changes you

      # want to make to /etc/issue here or you will lose them when you reboot.

      echo "" > /etc/issue

      echo "Red Hat Linux $R" >> /etc/issue

      echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue  

      cp -f /etc/issue /etc/issue.net

      echo >> /etc/issue

      不然的话每次重新启动 /etc/issue 都会被更改。

      对 telnet 的远地机器: 先把文件 /etc/usr/sbin/in.telnetd 改名,如改为 in.telnetd.exe ,再编一个名为 in.telnetd 的 shell 脚 本, 在显示完需要的内容后再调用 in.telnetd.exe 。如:  

      #!/bin/sh cat /etc/login.banner #需要在登录提示符前显示的内容 echo -n "" exec /usr/sbin/in.telnetd.exe

      27. 几个有用的别名

      几个能方便操作和减少误操作的别名,建议把它们放到启动 文件里, 如 /etc/bashrc 。   

      alias rm='rm -i'

      alias cp='cp -i'

      alias mv='mv -i'

      #前三个别名的作用是在删除、覆盖文件之前先提示确认, RedHat已经自动 #加上了,强烈建议Slackware的用户也加上,因为 Linux/UNIX下文件一旦删 #除就再也无法恢复了。  

      alias l='ls -l'

      alias cd..='cd ..'

      alias utar='tar xvfz' #解 *.tar.gz 文件

      alias inforpm='rpm -qpi' #显示rpm包的信息

      alias instrpm='rpm -Uhv' #安装rpm包

      alias listrpm='rpm -qpl' #列rpm包内的文件

      alias uistrpm='rpm -e' #反安装rpm包

      28. 使用命令补齐

      所谓命令补齐(Command-Line Completion)是指当键入的 字符足以确定目录下一个唯一的文件时只须按 Tab 键就可以 自动补齐该文件名的剩下部分,例如要把目录 /freesoft 下 的文件 gcc-2.8.1.tar.gz 解包,当键入到 tar xvfz /freesoft/g 时如果该文件是该目录下唯一以 g 起头的文件 的话就可以按下 Tab 键,这时命令会被自动补齐为:tar xvfz /freesoft/gcc-2.8.1.tar.gz ,非常方便。

      29. 最后一条技巧  

      有时间的话多看看系统提供的FAQ文件,因为通常遇到的 问题大多数都能在里面找到答案。

  • 多种协议:

    2008-03-24 17:28:19

    在网络的各层中存在着许多协议,它是定义通过网络进行通信的规则,接收方的发送方同层的协议必须一致,否则一方将无法识别另一方发出的信息,下面就对网络协议规范作个概述。在网络的各层中存在着许多协议,它是定义通过网络进行通信的规则,接收方的发送方同层的协议必须一致,否则一方将无法识别另一方发出的信息,以这种规则规定双方完成信息在计算机之间的传送过程。下面就对网络协议规范作个概述。

       1.ARP(Address Resolution Protocol)地址解析协议它是用于映射计算机的物理地址和临时指定的网络地址。启动时它选择一个协议(网络层)地址,并检查这个地址是否已经有别的计算机使用,如果没有被使用,此结点被使用这个地址,如果此地址已经被别的计算机使用,正在使用此地址的计算机会通告这一信息,只有再选另一个地址了。

    2.SNMP(Simple Network Management P)网络管理协议它是TCP/IP协议中的一部份,它为本地和远端的网络设备管理提供了一个标准化途径,是分布式环境中的集中化管理的重要组成部份。

    3.AppleShare protocol(AppleShare协议)它是Apple机上的通信协议,它允许计算机从服务器上请求服务或者和服务器交换文件。AppleShare可以在TCP/IP协议或其它网络协议如IPXAppleTalk上进行工作。使用它时,用户可以访问文件,应用程序,打印机和其它远程服务器上的资源。它可以和配置了AppleShare协议的任何服务器进行通信,MacintoshMac OSWindows NTNovell Netware都支持AppleShare协议。

    4.AppleTalk协议它是Macintosh计算机使用的主要网络协议。Windows NT服务器有专门为Macintosh服务,也能支持该协议。其允许Macintosh的用户共享存储在 Windows NT文件夹的Mac-格式的文件,也可以使用和Windows NT连接的打印机。Windows NT共享文件夹以传统的Mac文件夹形式出现在Mac用户面前。Mac文件名按需要被转换为FAT(8.3)格式和NTFS文件标准。支持MAc 文件格式的DOSWindows客户端能与Mac用户共享这些文件。

    5.BGP4(Border Gateway Protocol Vertion 4)边界网关协议-版本4它是用于在自治网络中网关主机(每个主机有自己的路由)之间交换路由信息的协议,它使管理员能够在已知的路由策略上配置路由加权,可以更方便地使用无级内部域名路由(CIDR),它是一种在网络中可以容纳更多地址的机制,它比外部网关协议(EGP)更新。BGP4经常用于网关主机之间,主机中的路由表包括了已知路由的列表,可达的地址和路由加权,这样就可以在路由中选择最好的通路了。BGP在局域网中通信时使用内部BGP(IBGP),因为IBGP不能很好工作。

    6.BOOTP协议它是一个基于TCP/IP协议的协议,它可以让无盘站从一个中心服务器上获得IP地址,现在我们通常使用DHCP协议进行这一工作。

    7.CMIP(Common Management Information Protocol)通用管理信息协议它是建立在开放系统互连通信模式上的网络管理协议。相关的通用管理信息服务(CMIS)定义了访问和控制网络对象,设备和从对象设备接收状态信息的方法。

    8 Connection-oriented Protocol/Connectionless Protocol面向连接的协议/无连接协议在广域网中,两台计算机建立物理连接过程所使用的协议,这种物理连接要持续到成功地交换完数据为止。在Internet中,TCP(传输控制协议)即这一类型的协议,它为两台连接在网络上的计算机提供了可相互通信且确保数据成功传输的一种手段。面向连接的协议一定要保证数据传送到对方。在广域网中,对接收方的计算机不做在线状态,或接收能力的测试,都能使数据由一台计算机传输到另外一台计算机上的协议。这是包交换网络中的主要协议,在Internet中的IP协议即无连接协议,IP只关注将数据分成数据包进行传输,并在这些数据包被接收后重新组包,而不关注接收方计算机的状态。由面向连接的协议(Internet中的TCP)来确保数据的接收。

    9.DHCP(Dynamic Host Configuration Protocol)动态主机配置协议它是在TCP/IP网络上使客户机获得配置信息的协议,它是基于BOOTP协议,并在BOOTP协议的基础上添加了自动分配可用网络地址等功能。这两个协议可以通过一些机制互操作。DHCP协议在安装TCP/IP协议和使用TCP/IP协议进行通迅时,必须配置IP地址、子网掩码、缺省网关三个参数,这三个参数可以手动配置,也可以使用DHCP自动配置。

    10.Discard Protocol抛弃协议它的作用就是接收到什么抛弃什么,它对调试网络状态的一定的用处。基于TCP的抛弃服务,如果服务器实现了抛弃协议,服务器就会在TCP端口9检测抛弃协议请求,在建立连接后并检测到请求后,就直接把接收到的数据直接抛弃,直到用户中断连接。而基于UDP协议的抛弃服务和基于TCP差不多,检测的端口是UDP端口9,功能也一样。

    11.Echo Protocol协议这个协议主要用于调试和检测中。这个协议的作用也十分简单,接收到什么原封发回就是了。它可以基于TCP协议,服务器就在TCP端口7检测有无消息,如果有发送来的消息直接返回就是了。如果使用UDP协议的基本过程和TCP一样,检测的端口也是7

    12.FTP(File Transfer Protocol)文件传输协议它是一个标准协议,是在计算机和网络之间交换文件的最简单的方法。象传送可显示文件的HTTP和电子邮件的SMTP一样,FTP也是应用TCP/IP协议的应用协议标准。FTP通常用于将网页从创作者上传到服务器上供人使用,而从服务器上下传文件也是一种非常普遍的使用方式。作为用户,您可以用非常简单的DOS界面来使用FTP,也可以使用由第三方提供的图形界面的FTP来更新(删除,重命名,移动和复制)服务器上的文件。现在有许多服务器支持匿名登录,允许用户使用FTPANONYMOUS作为用户名进行登录,通常可使用任何口令或只按回车键。

      13.HDLC(High-Level Data Link Control)高层数据链路协议它是一组用于在网络结点间传送数据的协议。在HDLC中,数据被组成一个个的单元(称为帧)通过网络发送,并由接收方确认收到。HDLC协议也管理数据流和数据发送的间隔时间。HDLC是在数据链路层中最广泛最使用的协议之一。现在作为ISO的标准,HDLC是基于IBMSDLC协议的,SDLC被广泛用于IBM的大型机环境之中。在HDLC中,属于SDLC的被称为通响应模式(NRM)。在通常响应模式中,基站(通常是大型机)发送数据给本地或远程的二级站。不同类型的HDLC被用于使用X.25协议的网络和帧中继网络,这种协议可以在局域网或广域网中使用,无论此网是公共的还是私人的。

    14.HTTP1.1(Hypertext Transfer Protocol Vertion 1.1)超文本传输协议-版本1.1它是用来在Internet上传送超文本的传送协议。它是运行在TCP/IP协议族之上的HTTP应用协议,它可以使浏览器更加高效,使网络传输减少。任何服务器除了包括HTML文件以外,还有一个HTTP驻留程序,用于响应用用户请求。您的浏览器是HTTP客户,向服务器发送请求,当浏览器中输入了一个开始文件或点击了一个超级链接时,浏览器就向服务器发送了HTTP请求,此请求被送往由IP地址指定的URL。驻留程序接收到请求,

  • 因果图的用例

    2008-03-21 13:24:35

    因果图(Cause-Effect Graphing)

    2007-04-16 16:23:19 / 个人分类:计算机软件测试技术(学习笔记)

    利用因果图导出测试用例的步骤:

     

         分析程序规格说明的描述中,哪些是原因,哪些是结果。原因常常是输入条件或是输入条件的等价

     

       类,而结果是输出条件。

     

         分析程序规格说明的描述中语义的内容,并将其表示成连接各个原因与各个结果的“因果图”。

     

         由于语法或环境的限制,有些原因和结果的组合情况是不可能出现的。为表明这些特定的情况,在因

     

       果图上使用若干个特殊的符号标明约束条件。

     

         把因果图转换成判定表。

     

         把判定表中每一列表示的情况写成测试用例。

     

    因果图示例


    因果图的基本符号

    因果图的基本符号

    约束符号

    约束符号

  • GUI测试点

    2008-03-21 11:58:57

    1.1 文本框、按钮等控件测试

    1.1.1 文本框的测试

    如何对文本框进行测试

     a,输入正常的字母或数字。
     b,输入已存在的文件的名称;
     c,输入超长字符。例如在名称框中输入超过允许边界个数的字符,假设最多255个字符,尝试输入 256个字符,检查程序能否正确处理;
     d,输入默认值,空白,空格;
     e,若只允许输入字母,尝试输入数字;反之;尝试输入字母;
     f,利用复制,粘贴等操作强制输入程序不允许的输入数据;
     g,输入特殊字符集,例如,NUL\n等;
     h,输入超过文本框长度的字符或文本,检查所输入的内容是否正常显示;
     i,输入不符合格式的数据,检查程序是否正常校验,如,程序要求输入年月日格式为yy/mm/dd,实际输入yyyy/mm/dd,程序应该给出错误提示

    在测试过程中所用到的测试方法:

     1,输入非法数据;
     2,输入默认值;
     3,输入特殊字符集;
     4,输入使缓冲区溢出的数据;
     5,输入相同的文件名;

    命令按钮控件的测试

    测试方法:

     a,点击按钮正确响应操作。如,单击确定,正确执行操作;单击取消,退出窗口;
     b,对非法的输入或操作给出足够的提示说明,如,输入月工作天数为32时,单击确定后系统应提示:天数不能大于31
     c,对可能造成数据无法恢复的操作必须给出确认信息,给用户放弃选择的机会;

    单选按钮控件的测试

    测试方法:

     a,一组单选按钮不能同时选中,只能选中一个。
     b,逐一执行每个单选按钮的功能。分别选择了”“后,保存到数据库的数据应该相应的分别为”“
     c,一组执行同一功能的单选按钮在初始状态时必须有一个被默认选中,不能同时为空;

    updown控件文本框的测试

    测试方法:

     a,直接输入数字或用上下箭头控制,如,在数目中直接输入10,或者单击向上的箭头,使数目变为10
     b,利用上下箭头控制数字的自动循环,如,当最多数字为253时,单击向上箭头,数目自动变为1;反之亦适用;
     c,直接输入超边界值,系统应该提示重新输入;
     d,输入默认值,空白。如,插入数目为默认值,点击确定;或,删除默认值,使内容为空,单击确定进行测试;
     e,输入字符。此时系统应提示输入有误。

    组合列表框的测试

    测试方法:

     a,条目内容正确,其详细条目内容可以根据需求说明确定;
     b,逐一执行列表框中每个条目的功能;
     c,检查能否向组合列表框输入数据;

    复选框的测试

    测试方法:

     a,多个复选框可以被同时选中;
     b,多个复选框可以被部分选中;
     c,多个复选框可以都不被选中;
     d,逐一执行每个复选框的功能;

    列表框控件的测试

    测试方法:

     a,条目内容正确;同组合列表框类似,根据需求说明书确定列表的各项内容正确,没有丢失或错误;
     b,列表框的内容较多时要使用滚动条;
     c,列表框允许多选时,要分别检查shift选中条目,按ctrl选中条目和直接用鼠标选中多项条目的情况;

    滚动条控件的测试

    要注意一下几点:

     a,滚动条的长度根据显示信息的长度或宽度及时变换,这样有利于用户了解显示信息的位置和百分比,如,word中浏览100页文档,浏览到50页时,滚动条位置应处于中间;
     b,拖动滚动条,检查屏幕刷新情况,并查看是否有乱码;
     c,单击滚动条;
     d,用滚轮控制滚动条;
     e,滚动条的上下按钮。

    各种控件在窗体中混和使用时的测试

     a,控件间的相互作用;
     b,tab键的顺序,一般是从上到下,从左到右;

  • HTTP协议:

    2008-03-21 11:56:36

    HTTP协议的几个重要概念
    HTTP协议的几个重要概念
      1.连接(Connection):一个传输层的实际环流,它是建立在两个相互通讯的应用程序之间。
      2.消息(Message):HTTP通讯的基本单位,包括一个结构化的八元组序列并通过连接传输。
      3.请求(Request):一个从客户端到服务器的请求信息包括应用于资源的方法、资源的标识符和协议的版本号
      4.响应(Response):一个从服务器返回的信息包括HTTP协议的版本号、请求的状态(例如“成功”或“没找到”)和文档的MIME类型。
      5.资源(Resource):由URI标识的网络数据对象或服务。
      6.实体(Entity):数据资源或来自服务资源的回映的一种特殊表示方法,它可能被包围在一个请求或响应信息中。一个实体包括实体头信息和实体的本身内容。
      7.客户机(Client):一个为发送请求目的而建立连接的应用程序。
      8.用户代理(User agent):初始化一个请求的客户机。它们是浏览器、编辑器或其它用户工具。
      9.服务器(Server):一个接受连接并对请求返回信息的应用程序。
      10.源服务器(Origin server):是一个给定资源可以在其上驻留或被创建的服务器。
      11.代理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。
      代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处理没有被用户代理完成的请求。
      12.网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
      网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
      13.通道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。
      14.缓存(Cache):反应信息的局域存储。
    二.
    HTTP状态查询
    HTTP状态查询
    状态代码 状态信息 代码含义
    100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。
    101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议
    200 OK 一切正常,对GET和POST请求的应答文档跟在后面。
    201 Created 服务器已经创建了文档,Location头给出了它的URL。
    202 Accepted 已经接受请求,但处理尚未完成。
    203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝
    204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
    205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容
    206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。
    300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
    301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
    302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved
    303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取
    304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
    305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取
    307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。
    400 Bad Request 请求出现语法错误。
    401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
    403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。
    404 Not Found 无法找到指定位置的资源。这也是一个常用的应答。
    405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。
    406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容
    407 Proxy 类似于401,表示客户必须先经过代理服务器的授权。
    408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。
    409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。
    410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。
    411 Length Require 服务器不能处理请求,除非客户发送一个Content-Length头。
    412 Precondition Failed 请求头中指定的一些前提条件失败
    413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头
    414 Request URI Too Long URI太长 。
    416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。
    500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。
    501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。
    502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。
    503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。
    504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。
    505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。
    3.
    WEB漏洞概述
    WEB漏洞概述

         物理路径泄露:
    物理路径泄露一般是由于WEB服务器处理用户请求出错导致的,如通过提交一个超长的请求,或者是某个精心构造的特殊请求,亦或是请求一个WEB服务器上不存在的文件。这些请求都有一个共同特点,那就是被请求的文件肯定属于CGI脚本,而不是静态HTML页面。
    还有一种情况,就是WEB服务器的某些显示环境变量的程序错误的输出了WEB服务器的物理路径,这应该算是设计上的问题。 

     CGI源代码泄露:
    CGI源代码泄露的原因比较多,例如大小写,编码解码,附加特殊字符或精心构造的特殊请求等都可能导致CGI源代码泄露。

     目录遍历:
    目录遍历对于WEB服务器来说并不多见,通过对任意目录附加“../”,或者是在有特殊意义的目录附加“../”,或者是附加“../”的一些变形,如“..\”或“..//”甚至其编码,都可能导致目录遍历。前一种情况并不多见,但是后面的几种情况就常见得多,去年非常流行的IIS二次解码漏洞和UNICODE解码漏洞都可以看作是变形后的编码。


     执行任意命令:
    执行任意命令即执行任意操作系统命令,主要包括两种情况。一是通过遍历目录,如前面提到的二次解码和UNICODE解码漏洞,来执行系统命令。另外一种就是WEB服务器把用户提交的请求作为SSI指令解析,因此导致执行任意命令。

     缓冲区溢出:
    缓冲区溢出漏洞想必大家都很熟悉,无非是WEB服务器没有对用户提交的超长请求没有进行合适的处理,这种请求可能包括超长URL,超长HTTP Header域,或者是其它超长的数据。这种漏洞可能导致执行任意命令或者是拒绝服务,这一般取决于构造的数据。


     拒绝服务:
    拒绝服务产生的原因多种多样,主要包括超长URL,特殊目录,超长HTTP Header域,畸形HTTP Header域或者是DOS设备文件等。由于WEB服务器在处理这些特殊请求时不知所措或者是处理方式不当,因此出错终止或挂起。

     条件竞争:
    这里的条件竞争主要针对一些管理服务器而言,这类服务器一般是以system或root身份运行的。当它们需要使用一些临时文件,而在对这些文件进行写操作之前,却没有对文件的属性进行检查,一般可能导致重要系统文件被重写,甚至获得系统控制权。

     跨站脚本执行漏洞:
    由于网页可以包含由服务器生成的、并且由客户机浏览器解释的文本和 HTML 标记。如果不可信的内容被引入到动态页面中,则无论是网站还是客户机都没有足够的信息识别这种情况并采取保护措施。攻击者如果知道某一网站上的应用程序接收跨站点脚本的提交,他就可以在网上上提交可以完成攻击的脚本,如java scrīpt、VBscrīpt、ActiveX、HTML 或 Flash 等内容,普通用户一旦点击了网页上这些攻击者提交的脚本,那么就会在用户客户机上执行,完成从截获帐户、更改用户设置、窃取和篡改 cookie 到虚假广告在内的种种攻击行为。


     SQL注入:
    对于和后台数据库产生交互的网页,如果没有对用户输入数据的合法性进行全面的判断,就会使应用程序存在安全隐患。用户可以在可以提交正常数据的URL或者表单输入框中提交一段精心构造的数据库查询代码,使后台应用执行攻击着的SQL代码,攻击者根据程序返回的结果,获得某些他想得知的敏感数据,如管理员密码,保密商业资料等。 

  • 加密技术分类

    2008-03-21 11:46:23

    采用密码技术对信息加密,是最常用的安全交易手段。在电子商务中获得广泛应用的加密技术有以下两种:

    (1)公共密钥和私用密钥(public key and private key)

    这一加密方法亦称为RSA编码法,是由Rivest、Shamir和Adlernan三人所研究发明的。它利用两个很大的质数相乘所产生的乘积来加密。这两个质数无论哪一个先与原文件编码相乘,对文件加密,均可由另一个质数再相乘来解密。但要用一个质数来求出另一个质数,则是十分困难的。因此将这一对质数称为密钥对(Key Pair)。在加密应用时,某个用户总是将一个密钥公开,让需发信的人员将信息用其公共密钥加密后发给该用户,而一旦信息加密后,只有用该用户一个人知道的私用密钥才能解密。具有数字凭证身份的人员的公共密钥可在网上查到,亦可在请对方发信息时主动将公共密钥传给对方,这样保证在Internet上传输信息的保密和安全。

    (2)数字摘要(digital digest)

    这一加密方法亦称安全Hash编码法(SHA:Secure Hash Algorithm)或MD5(MD Standards for Message Digest),由Ron Rivest所设计。该编码法采用单向Hash函数将需加密的明文“摘要”成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。这样这摘要便可成为验证明文是否是“真身”的“指纹”了。

    上述两种方法可结合起来使用,数字签名就是上述两法结合使用的实例。

    3.2数字签名(digital signature)

    在书面文件上签名是确认文件的一种手段,签名的作用有两点,一是因为自己的签名难以否认,从而确认了文件已签署这一事实;二是因为签名不易仿冒,从而确定了文件是真的这一事实。数字签名与书面文件签名有相同之处,采用数字签名,也能确认以下两点:

    a. 信息是由签名者发送的。

    b. 信息在传输过程中未曾作过任何修改。

    这样数字签名就可用来防止电子信息因易被修改而有人作伪;或冒用别人名义发送信息;或发出(收到)信件后又加以否认等情况发生。

    数字签名采用了双重加密的方法来实现防伪、防赖。其原理为:

    (1) 被发送文件用SHA编码加密产生128bit的数字摘要(见上节)。

    (2) 发送方用自己的私用密钥对摘要再加密,这就形成了数字签名。

    (3) 将原文和加密的摘要同时传给对方。

    (4) 对方用发送方的公共密钥对摘要解密,同时对收到的文件用SHA编码加密产生又一摘要。

    (5) 将解密后的摘要和收到的文件在接收方重新加密产生的摘要相互对比。如两者一致,则说明传送过程中信息没有被破坏或篡改过。否则不然。

    3.3数字时间戳(digital time-stamp)

    交易文件中,时间是十分重要的信息。在书面合同中,文件签署的日期和签名一样均是十分重要的防止文件被伪造和篡改的关键性内容。

    在电子交易中,同样需对交易文件的日期和时间信息采取安全措施,而数字时间戳服务(DTS:digital time-stamp service)就能提供电子文件发表时间的安全保护。

    数字时间戳服务(DTS)是网上安全服务项目,由专门的机构提供。时间戳(time-stamp)是一个经加密后形成的凭证文档,它包括三个部分:1)需加时间戳的文件的摘要(digest),2)DTS收到文件的日期和时间,3)DTS的数字签名。

    时间戳产生的过程为:用户首先将需要加时间戳的文件用HASH编码加密形成摘要,然后将该摘要发送到DTS,DTS在加入了收到文件摘要的日期和时间信息后再对该文件加密(数字签名),然后送回用户。由Bellcore创造的DTS采用如下的过程:加密时将摘要信息归并到二叉树的数据结构;再将二叉树的根值发表在报纸上,这样更有效地为文件发表时间提供了佐证。注意,书面签署文件的时间是由签署人自己写上的,而数字时间戳则不然,它是由认证单位DTS来加的,以DTS收到文件的时间为依据。因此,时间戳也可作为科学家的科学发明文献的时间认证。

    3.4数字凭证(digital certificate, digital ID)

    数字凭证又称为数字证书,是用电子手段来证实一个用户的身份和对网络资源的访问的权限。在网上的电子交易中,如双方出示了各自的数字凭证,并用它来进行交易操作,那么双方都可不必为对方身份的真伪担心。数字凭证可用于电子邮件、电子商务、群件、电子基金转移等各种用途。

    数字凭证的内部格式是由CCITT X.509国际标准所规定的,它包含了以下几点:

    (1) 凭证拥有者的姓名,

    (2) 凭证拥有者的公共密钥,

    (3) 公共密钥的有效期,

    (4) 颁发数字凭证的单位,

    (5) 数字凭证的序列号(Serial number),

    (6) 颁发数字凭证单位的数字签名。

    数字凭证有三种类型:

    (1) 个人凭证(Personal Digital ID):它仅仅为某一个用户提供凭证,以帮助其个人在网上进行安全交易操作。个人身份的数字凭证通常是安装在客户端的浏览器内的。并通过安全的电子邮件(S/MIME)来进行交易操作。

    (2) 企业(服务器)凭证(Server ID):它通常为网上的某个Web服务器提供凭证,拥有Web服务器的企业就可以用具有凭证的万维网站点(Web Site)来进行安全电子交易。有凭证的Web服务器会自动地将其与客户端Web浏览器通信的信息加密。

    (3) 软件(开发者)凭证(Developer ID):它通常为Internet中被下载的软件提供凭证,该凭证用于和微软公司Authenticode技术(合法化软件)结合的软件,以使用户在下载软件时能获得所需的信息。

    上述三类凭证中前二类是常用的凭证,第三类则用于较特殊的场合,大部分认证中心提供前两类凭证,能提供各类凭证的认证中心并不普遍
  • ARP原理及防止方法

    2008-03-21 11:43:29

    1.arp病毒原理描述以及防治方法

        arp是一个网络协议,一般用于局域网中,它将IP地址解析为网卡的物理地址,又称为MAC地址。局域网中的所有ip通信最终都必须转换到基于mac地址的通信。一般局域网中每台机器都会缓存一个IP到MAC的转换地址表,使得不用每次要向其他机器发送信息时都要重新解析一遍。 

        由于该协议存在某些缺陷,使得局域网中恶意的机器可以发送虚假的ARP包来欺骗其他机器,使得其它机器获得虚假的ip与mac对应关系。

        局域网一般通过统一的网关来访问外部网络,比如上网浏览网页(http协议),某机器上的恶意代码通过欺骗,让其他机器将网关ip的mac地址都指向自己,又欺骗网关使得其他机器IP的mac地址也指向自己,只有它自己保存着一份真实的ip-mac转换表。这样,基于网中所有机器的上网包都通过该恶意代码的机器进行转发,从而该代码就能截获局域网其他用户的很多上网信息。这种采用arp欺骗的恶意代码就是ARP病毒。

      

    防治方法:

    开始>运行>cmd,输入命令arp -a,可查看本机路由的MAC地址

    做批处理文件farp.bat,内容为

    @echo off
    arp -d    --清除arp缓存
    arp -s   172.16.80.254   00-05-5d-89-37-3d  --将ip和mac地址邦定

    保存为farp.bat,运行此批处理文件

    可将此文件保存到"C:\Documents and Settings\Administrator\「开始」菜单\程序\启动",启动栏项目中,有效解决ARP欺骗

    2.

    深入解读APR病毒
     一、ARP病毒

    ARP地址欺骗类病毒(以下简称ARP病毒)是一类特殊的病毒,该病毒一般属于木马(Trojan)病毒,不具备主动传播的特性,不会自我复制。但是由于其发作的时候会向全网发送伪造的ARP数据包,干扰全网的运行,因此它的危害比一些蠕虫还要严重得多。

    二、ARP病毒发作时的现象

    网络掉线,但网络连接正常,内网的部分PC机不能上网,或者所有电脑不能上网,无法打开网页或打开网页慢,局域网时断时续并且网速较慢等。

    三、ARP病毒原理

    3.1 网络模型简介

    众所周知,按照OSI (Open Systems Interconnection Reference Model 开放系统互联参考模型) 的观点,可将网络系统划分为7层结构,每一个层次上运行着不同的协议和服务,并且上下层之间互相配合,完成网络数据交换的功能,如图1:

                                                             

                                                                         图1 OSI网络体系模型


        然而,OSI的模型仅仅是一个参考模型,并不是实际网络中应用的模型。实际上应用最广泛的商用网络模型即TCP/IP体系模型,将网络划分为四层,每一个层次上也运行着不同的协议和服务,如图2。

                                                              


                                                          图2 TCP/IP四层体系模型及其配套协议


        上图中,蓝色字体表示该层的名称,绿色字表示运行在该层上的协议。由图2可见,我们即将要讨论的ARP协议,就是工作在网际层上的协议。

    3.2 ARP协议简介

    我们大家都知道,在局域网中,一台主机要和另一台主机进行通信,必须要知道目标主机的IP地址,但是最终负责在局域网中传送数据的网卡等物理设备是不识别IP地址的,只能识别其硬件地址即MAC地址。MAC地址是48位的,通常表示为12个16进制数,每2个16进制数之间用“-”或者冒号隔开,如:00-0B-2F-13-1A-11就是一个MAC地址。每一块网卡都有其全球唯一的MAC地址,网卡之间发送数据,只能根据对方网卡的MAC地址进行发送,这时就需要一个将高层数据包中的IP地址转换成低层MAC地址的协议,而这个重要的任务将由ARP协议完成。

    ARP全称为Address Resolution Protocol,地址解析协议。所谓“地址解析”就是主机在发送数据包前将目标主机IP地址转换成目标主机MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。 这时就涉及到一个问题,一个局域网中的电脑少则几台,多则上百台,这么多的电脑之间,如何能准确的记住对方电脑网卡的MAC地址,以便数据的发送呢?这就涉及到了另外一个概念,ARP缓存表。在局域网的任何一台主机中,都有一个ARP缓存表,该表中保存这网络中各个电脑的IP地址和MAC地址的对照关系。当这台主机向同局域网中另外的主机发送数据的时候,会根据ARP缓存表里的对应关系进行发送。

    下面,我们用一个模拟的局域网环境,来说明ARP欺骗的过程。

    3.3 ARP欺骗过程

    假设一个只有三台电脑组成的局域网,该局域网由交换机(Switch)连接。其中一个电脑名叫A,代表攻击方;一台电脑叫S,代表源主机,即发送数据的电脑;令一台电脑名叫D,代表目的主机,即接收数据的电脑。这三台电脑的IP地址分别为192.168.0.2,192.168.0.3,192.168.0.4。MAC地址分别为MAC_A,MAC_S,MAC_D。其网络拓扑环境如图3。

                                        

                                                                                              图3 网络拓扑

    现在,S电脑要给D电脑发送数据了,在S电脑内部,上层的TCP和UDP的数据包已经传送到了最底层的网络接口层,数据包即将要发送出去,但这时还不知道目的主机D电脑的MAC地址MAC_D。这时候,S电脑要先查询自身的ARP缓存表,查看里面是否有192.168.0.4这台电脑的MAC地址,如果有,那很好办,就将 封装在数据包的外面。直接发送出去即可。如果没有,这时S电脑要向全网络发送一个ARP广播包,大声询问:“我的IP是192.168.0.3,硬件地址是MAC_S,我想知道IP地址为192.168.0.4的主机的硬件地址是多少?” 这时,全网络的电脑都收到该ARP广播包了,包括A电脑和D电脑。A电脑一看其要查询的IP地址不是自己的,就将该数据包丢弃不予理会。而D电脑一看IP地址是自己的,则回答S电脑:“我的IP地址是192.168.0.4,我的硬件地址是MAC_D”需要注意的是,这条信息是单独回答的,即D电脑单独向S电脑发送的,并非刚才的广播。现在S电脑已经知道目的电脑D的MAC地址了,它可以将要发送的数据包上贴上目的地址MAC_D,发送出去了。同时它还会动态更新自身的ARP缓存表,将192.168.0.4-MAC_D这一条记录添加进去,这样,等S电脑下次再给D电脑发送数据的时候,就不用大声询问发送ARP广播包了。这就是正常情况下的数据包发送过程。

    这样的机制看上去很完美,似乎整个局域网也天下太平,相安无事。但是,上述数据发送机制有一个致命的缺陷,即它是建立在对局域网中电脑全部信任的基础上的,也就是说它的假设前提是:无论局域网中那台电脑,其发送的ARP数据包都是正确的。那么这样就很危险了!因为局域网中并非所有的电脑都安分守己,往往有非法者的存在。比如在上述数据发送中,当S电脑向全网询问“我想知道IP地址为192.168.0.4的主机的硬件地址是多少?”后,D电脑也回应了自己的正确MAC地址。但是当此时,一向沉默寡言的A电脑也回话了:“我的IP地址是192.168.0.4,我的硬件地址是MAC_A” ,注意,此时它竟然冒充自己是D电脑的IP地址,而MAC地址竟然写成自己的!由于A电脑不停地发送这样的应答数据包,本来S电脑的ARP缓存表中已经保存了正确的记录:192.168.0.4-MAC_D,但是由于A电脑的不停应答,这时S电脑并不知道A电脑发送的数据包是伪造的,导致S电脑又重新动态更新自身的ARP缓存表,这回记录成:192.168.0.4-MAC_A,很显然,这是一个错误的记录(这步也叫ARP缓存表中毒),这样就导致以后凡是S电脑要发送给D电脑,也就是IP地址为192.168.0.4这台主机的数据,都将会发送给MAC地址为MAC_A的主机,这样,在光天化日之下,A电脑竟然劫持了由S电脑发送给D电脑的数据!这就是ARP欺骗的过程。

    如果A这台电脑再做的“过分”一些,它不冒充D电脑,而是冒充网关,那后果会怎么样呢?我们大家都知道,如果一个局域网中的电脑要连接外网,也就是登陆互联网的时候,都要经过局域网中的网关转发一下,所有收发的数据都要先经过网关,再由网关发向互联网。在局域网中,网关的IP地址一般为192.168.0.1。如果A这台电脑向全网不停的发送ARP欺骗广播,大声说:“我的IP地址是192.168.0.1,我的硬件地址是MAC_A”这时局域网中的其它电脑并没有察觉到什么,因为局域网通信的前提条件是信任任何电脑发送的ARP广播包。这样局域网中的其它电脑都会更新自身的ARP缓存表,记录下192.168.0.1-MAC_A这样的记录,这样,当它们发送给网关,也就是IP地址为192.168.0.1这台电脑的数据,结果都会发送到MAC_A这台电脑中!这样,A电脑就将会监听整个局域网发送给互联网的数据包!

    实际上,这种病毒早就出现过,这就是ARP地址欺骗类病毒。一些传奇木马(Trojan/PSW.LMir)具有这样的特性,该木马一般通过传奇外挂、网页木马等方式使局域网中的某台电脑中毒,这样中毒电脑便可嗅探到整个局域网发送的所有数据包,该木马破解了《传奇》游戏的数据包加密算法,通过截获局域网中的数据包,分析数据包中的用户隐私信息,盗取用户的游戏帐号和密码。在解析这些封包之后,再将它们发送到真正的网关。这样的病毒有一个令网吧游戏玩家闻之色变的名字:“传奇网吧杀手”

    3.网络钓鱼(Phishing)一词,是“Fishing”和“Phone”的综合体,由于黑客始祖起初是以电话作案,所以用“Ph”来取代“F”,创造了”Phishing”。

    “钓鱼攻击”是指利用欺骗性的电子邮件和伪造的Web站点来进行诈骗活动,受骗者往往会泄露自己的财务数据,如信用卡号、账户用户名、口令和社保编号等内容。诈骗者通常会将自己伪装成知名银行、在线零售商和信用卡公司等可信的品牌,在所有接触诈骗信息的用户中,有高达5%的人都会对这些骗局做出响应。

    钓鱼攻击的一般步骤:
    1. 钓鱼者入侵初级服务器,窃取用户的名字和邮件地址
    2. 钓鱼者发送有针对性质的邮件
    3. 受害用户访问假冒网址,受害用户被钓鱼邮件引导访问假冒网址。
    4. 受害用户提供秘密和用户信息被钓鱼者取得
    5. 钓鱼者使用受害用户的身份进入其他网络服务器

    钓鱼攻击使用多种技术,使一封电子邮件信息或网页的显示同其运行表现出欺骗性差异。一些较为常见攻击技术:
    · 发送电子邮件,以虚假信息引诱用户中圈套
    · 建立假冒网上银行、网上证券网站,骗取用户帐号密码实施盗窃
    · 利用虚假的电子商务进行诈骗
    · 利用木马和黑客技术等手段窃取用户信息后实施盗窃活动
    · 利用用户弱口令等漏洞破解、猜测用户帐号和密码
    · 复制图片和网页设计、相似的域名
    · URL地址隐藏黑客工具
    · 通过弹出窗口和隐藏提示
    · 利用社会工程学
    · 利用IP地址的形式显示欺骗用户点击

    要预防钓鱼攻击的威胁,一定要牢记以下四招:
    ·一定不要点击邮件的链接网址或回复邮件。若要核实电邮信息,可以通过拨打银行或支付网站的客服电话咨询。
    ·要访问所属银行的网站一定不要使用超级链接方式。同时,千万不要点击诈骗邮件中的网址链接。
    ·养成良好的电脑使用习惯,不要开启来路不明的电子邮件(特别是英文信,特别是往来无国际友人的)及文件,安装杀毒软件并及时升级病毒特征库和操作系统补丁,将敏感信息输入隐私保护,打开个人防火墙。
    ·使用网络银行时,选择使用网络凭证及约定账户方式进行转账交易,不要在网吧、公用计算机上和不明的地下网站做在线交易或转账。

     

     
  • 缺陷管理的流程

    2008-03-21 11:31:20

    缺陷管理的流程

     

        在软件的开发、评审、测试和使用的过程中,我们都可能面临或碰到软件产品没有按照设计要求运行、使用不方便或在某种程度上不能满足用户的要求等此类问题,这些我们可以通称为缺陷。

    软件缺陷是软件开发过程中的 "副产品"。缺陷会存在于软件产品的整个生命周期中:可以是软件代码的问题、系统文档(开发文档和测试文档等)存在的问题,或者是用户的帮助文档和使用指南方面的问题等

    软件缺陷是软件开发过程中的"副产品"缺陷会存在于软件产品的整个生命周期中:可以是软件代码的问题、系统文档(开发文档和测试文档等)存在的问题,或者是用户的帮助文档和使用指南方面的问题等。

    测试是发现缺陷的主要手段,也是它的主要目的。测试活动和开发活动一样,是项目质量保证不可或缺的重要部分。因此,对于测试活动的主要产物:缺陷,我们需要建立一个完善的缺陷管理流程?/font>报告、查询、分类、跟踪、处理和验证等。

    本文主要针对在开发测试活动中发现的缺陷,其相应的缺陷管理流程,以及在流程中主要的缺陷状态、参与缺陷的角色和缺陷相关的主要活动以及缺陷的等级分类等。

     

    1.         缺陷状态的主要处理过程:

     

    Query&Reply

    Declined

    Duplicate

    Deferred

    Unplanned

    New

    Accepted

    Assign

    Open

    Deliver

    CLOSE

    Fixed

    Resolved

    Validation

    Intake test

    Investigate

    NOK

    NOK

        

    2.         缺陷相关的角色:

    l         测试工程师:在这里主要是指发现和报告缺陷的测试人员。在一般流程中,他需要对这个缺陷后续相关的状态负责:包括相关人员对这个缺陷相关信息的询问回答,以及在build中的验证测试和后面正式版本的验证测试。

    l         开发工程师:这里主要指对这个缺陷进行研究和修改的开发人员。同时,他需要对修改后的缺陷在提交测试人员正式测试验证之前需要进行验证测试。

    l         缺陷评审委员会:主要由项目经理、测试经理、质量经理、开发经理以及资深的开发、测试工程师等组成。他们对缺陷进行确认以及将之分配给相应的开发人员进行修改。

    l         版本经理:负责将已经解决的缺陷相关的配置信息融入到新的版本,提交新的测试和相关的验证测试。

    3.         缺陷状态的含义解释:

    l         New(新缺陷):软件中新发现报告的缺陷,一般由测试人员提交。当然也可能是开发人员自己在单元或代码测试过程中提交,或从软件使用的最终用户或测试现场反馈得到的缺陷报告。

    l         Accepted(接受):经过缺陷评审委员会的确认,认为缺陷确实存在。

    l         Assign(分配):将这个缺陷分配给相关的开发人员来进行修改。

    l         Open(打开):处于这个状态时,缺陷已经被确认并已经分配给相关的开发人员进行相关的修改。

    l         Deliver(交付):解决缺陷问题的方法已经找到,并且已经将修改后的代码等打上标签,交付给版本经理。

    l         Resolved(解决):版本经理将相关的标签等融入某个build,交付给相关的开发小组进行验证测试,测试通过,则缺陷状态改为解决状态。

    l         Fixed(已修改):版本经理将已经解决的缺陷标签融入某个版本,交付给相关的测试小组进行验证测试,测试通过,则缺陷状态修改为已修改状态。

    l         Closed(结束):缺陷状态处于已修改后,自动变为结束状态。

       

        上面简单介绍的缺陷状态是在缺陷管理过程中主要的状态,或者是在缺陷处理顺利时所经历的状态。实际上,缺陷还有其他一些其他的状态,或者可以认为是辅助的状态,分别是:

    l         Investigate(研究):当缺陷分配给开发人员时,开发人员并不是都直接可以找到相关的解决方案的。开发人员需要对缺陷和引起缺陷的原因进行调查研究,这时候我们可以将缺陷状态改为研究状态。

    l         Query&Reply(询问和回答):负责缺陷修改的工程师认为相关的缺陷描述信息不够明确、或希望得到更多和缺陷相关的配置和环境条件、或引起缺陷时系统产生的调试命令和信息等。

    l         Declined(拒绝):缺陷评审委员会通过相关的讨论研究,认为不是缺陷。或通过开发人员的调查研究,认为不是缺陷,开发人员可以将具体的理由加入到缺陷描述中,缺陷评审委员会根据此将缺陷状态修改为拒绝状态。

    l         Duplicate(重复):缺陷评审委员会认为这个缺陷和某个已经提交的缺陷是同一个问题,因此设置为重复状态。

    l         Defferred(延期):缺陷不在当前版本解决。

    l         Unplanned(无计划):在用户需求中没有要求或计划。

    4.         缺陷的严重度和优先级分类:

    缺陷的严重度指得是假如缺陷没有修改,由这个缺陷引发的问题对客户的影响程度。而缺陷的优先级指得是解决这个缺陷需要的时间(或者在多少时间内必须解决这个缺陷)。对于一个缺陷,我们首先会给它指定一个严重度,而后给出它的优先级。我们下面来简单介绍缺陷的严重度和优先级的分类,提供一些分类的建议和思想。

    缺陷的严重度,我们可以通过14来划分:

    ·        严重度1-最高级别:产品在正常的运行环境下无法给用户提供服务,并且没有其他的工作方式来补救。我们可以将下面的问题定义为严重度1级:

    1.        问题会自发的影响系统的数据传输。

    2.        用户使用正常的操作步骤,就会影响系统提供的服务。

    ·        严重度2-高级别:极大的影响了系统提供给用户的服务,有其他的工作方式来缓解这种影响。举例:

    1.        系统中的一些单板会自动重启,单没有影响它们所提供的传输性能。

    2.        用户使用正常的命令,会导致系统重启或挂起,但不影响系统的数据传输。

    ·      严重度3-中等级别:系统需要增强的或存在的一些缺陷,但有相应的补救方法来解决这个缺陷。举例:

    1.        系统的一块单板失效了,但系统没有上报相应的告警。

    2.        功能特征设计不符合系统的需求,不影响系统的业务,并且有相应的补救方法。

    ·        严重度4-低级别:细小的问题,不需要补救方法或功能增强的请求。举例:

    1.        上报的信息不符合系统的需求,描述不精确或可能对用户有些误导。

    2.        GUI界面问题,不精确或可能对用户有些歧义。

     

    缺陷的优先级,我们可以进行下面的分类:

    ·        紧急的(Emergency):缺陷会对系统引起重大问题,必须尽快解决。

    ·        必须的(Must):在客户的下个交付之前必须解决。

    ·        应该的(Should):在客户的下个交付之前应该解决。

    ·        可选的(Optional):在客户的下个交付之前可选择的解决。

    ·        不需要(Don’t):在客户的下个交付之前不需要解决(由于解决的风险太大或这个功能特征不需要等)。

  • 一些软件测试点基本概念

    2008-03-21 11:28:54

    1.软件测试:使用人工和自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或是弄清预期结果与实际结果之间的差别。

    2.测试和调试的区别:

    测试的目的是找出存在的错误,而调试的目的是定位错误并修改程序以修正错误。

    调试是测试之后的活动,测试和调试在目标,方法和思路上都有所不同。

    测试是从一个已知的条件开始,使用预先定义的过程,有预知的结果,调试从一个未知的条件开始,结束的过程不可预计。

    测试过程可以实现设计,进度可实现确定;调试不能描述过程或持续时间。 

    3.软件研发的相关要素:人员,工具和过程。

    4.软件研发的四个重要过程:配置管理,需求管理,缺陷管理和同行评审。

    5.软件研发中常见的引入缺陷的原因:

       开发过程缺乏有效的沟通,或者没有进行沟通

       软件复杂度越来越高

       编程中产生错误

       需求不断变更

       项目进度的压力

       不重视开发文档

       软件开发工具本身隐藏的问题

    6.缺陷的类型:遗漏,错误,额外的实现。

    7.软件质量的定义:一个实体的所有特性,基于这些特性可以满足明显的或者隐含的需求,而质量就是实体基于这些特性满足需求的程度。          

    8.软件质量的三个层次:符合需求规格,符合用户显示需求,符合用户实际需求。

    9.影响软件质量的因素:技术,组织,流程。

    10.软件质量的管理体系:ISO9000CMM,六西格玛。

    11CMM的五个等级:初始级,可重复级,已定义级,已管理级,优化级。

    12CMM的五个等级中的关键过程域:

        初始级:无

        可重复级:需求管理,软件配置管理,软件质量保证。

        已定义级:同行评审。

        已管理级:定量的过程管理,软件质量管理。

        优化级:缺陷预防。             

    13ISO9001CMM的关系

        最大的相似点:强调管理,过程,规范化和文档化

        不同点:CMM把焦点严格对准软件

                ISO9001的范围包括:硬件,软件,流程性材料和服务。

        两者之间的联系:CMM2级与ISO9001强相关。

                        CMM的每个关键过程域至少按某种解释与ISO9001弱相关。

    14.六西格玛的实施方式:DMAIC

        定义:define,测量:measure,分析:analyse,改进:improve,控制:control

    15.软件的质量模型:

        质量模型:一组特性与特性之间的关系,它提供规定质量需求和评价质量的基础。包括六大特性,27个子特性  

       六大特性包括:功能性,可靠性,易用性,维护性,效率,可移植性。

     

    16.软件质量活动:

        软件组织主要软件质量活动:软件质量保证(SQA)和测试。

    17SQA和测试的关系:

        软件质量由组织,流程和技术三个方面决定。

        SQA从流程方面保证软件的质量

        测试从技术方面保证软件的质量。

        只要进行SQA活动或只进行测试活动不一定能产生好的软件质量。

    18SQA的主要工作范围:

        指导并监督项目按照过程实施。

        对项目进行度量,分析,增加项目的可视性。

        审核工作产品,评价工作产品和过程质量目标的符合度。

        进行缺陷分析,缺陷预防活动,发现过程的缺陷,提供决策参考,促见过程改进。

    19.质量管理PDCA循环:

        Pplan,计划设计

        Ddo,实施执行。

        Ccheck,检查检测

        Aact,纠正措施,改进。

    20.软件度量的作用:理解,预测,评估,改进。

    21.软件度量的分类:四个基本度量项:规模,工作量,进度,质量-缺陷。

    22.黑盒测试,白盒测试和灰盒测试的区别:

        定义:

        黑盒测试:黑盒测试又称功能测试、数据驱动测试或者基于规格说明的测试,被测试程序当作黑盒处理,只考虑其整体特性,不考虑其内部具体实现。比如系统测试一般采用黑盒测试方法,并参考SRS

    白盒测试:根据被测试程序的内部结构设计测试用例的一类测试,有人也称它为透明盒或者玻璃盒测试,涉及到软件设计的细节。比如单元测试一般采用白盒测试方法,并参考LLD

    区别:

    测试依据:

    黑盒测试:根据用户能看到的规格说明,即针对命令、信息、报表等用户界面以及体现它们的输入数据与输出数据之间的对应关系,特别是针对功能进行测试。

    白盒测试:根据程序的内部结构,比如语句的控制结构、模块间的控制结构以及内部数据结构等进行测试。

    特点:

    黑盒测试:

    优点:能站在用户立场上进行测试。

    对于更大的代码单元来说比白盒测试效率更高;

    有助于暴露任何规格不一致或有歧义的问题;

    测试人员不需要了解实现的细节,包括特定的编程语言。

        缺点:不能测试程序内部特定部位;

    如果规格说明有误,则无法发现;

    白盒测试:

    优点:能够对程序内部的特定部位进行覆盖测试。

    对代码的测试比较彻底;

    最优化;揭示隐藏在代码中的错误;

         缺点:无法检验程序的外部特征;

    无法对未实现规格说明的程序内部欠缺部分进行测试(无法检测代码中遗漏的路径和数据敏感性错误);

    昂贵;

         方法举例:

         黑盒测试:等价类划分、边界值分析、因果图/判定表、错误推测、(功能覆盖率)、

         白盒测试:语句覆盖、判定覆盖、条件覆盖、判定-条件覆盖、路径覆盖、面对对象的覆盖(继承上下文覆盖、基于状态的上下文覆盖、已定义的上下文覆盖等)、另外还有一些静态分析方法。

    22.静态测试与手工测试:

        静态分析技术结构:

    静态分析

      

     


                              手工                                                                     自动

                             

     

     

    正规         技术         走读                                   静态              语法           符号

    检视         评审                                                   验证              分析器        执行器

     

    23.单元,集成,系统测试的比较:

    测试方法不同:

    单元测试属于白盒测试范畴,集成测试属于灰盒测试范畴,

    系统测试属于黑盒测试范畴。

    考察范围不同:

    单元测试主要测试单元内部的数据结构,逻辑控制,异常处理等。

    集成测试主要测试模块之间的接口盒接口数据传递关系,以及模块组合后的整体功能。

    系统测试主要测试整个系统相对于需求的符合度。

    评估基准不同

    单元测试的评估基准主要是逻辑覆盖率。

    集成测试的评估基准主要是接口覆盖率。

    系统测试的评估基准主要是测试用例对需求规格的覆盖率。

    24.回归测试册策略:

    完全重复策略,选择性重复策略(其中包括覆盖修改法,周边影响法,指标达成法)

    25.测试V模型:

    V模型实现了测试设计和测试执行相分离

    V模型揭示了软件测试活动分层和分阶段的本质特性,测试执行的顺序与开发活动相反。

    26.单元测试:

    定义:对软件基本组成单元进行的测试。

    目的:发现各模块内部可能存在的各种错误,验证代码是与设计相符合的,

          发现设计和需求中存在的错误,发现在编码中引入的错误。

    关注的重点:单元接口,局部数据结构,边界条件,独立路径,出错处理。

    单元测试策略:孤立策略,自顶向下策略,自底向上策略。

    单元测试的结束标准:以覆盖率为标准,以遗留缺陷为标准。

    27.集成测试:

        定义:在单元测试的基础上,将所有的函数按照概要设计要求组装成为子系统或系统所进行的测试。

        目的:确保各组件组合在一起后能够按照既定意图协作运行,并确保增量的行为正确,

              验证接口是与设计相符合的,发现设计和需求中存在的错误。

        关注的重点:单元间的接口和集成后的功能。

        集成测试的层次:模块内集成测试,子系统内集成测试,子系统间集成测试。

        集成测试的策略:大爆炸集成,自顶向下,自底向上,三明治,基干集成,分层集成,基于功能的集成,基于消息,基于进度,基于风险。

    28.系统测试:

        定义:是将已经集成好的软件系统,作为整个基于计算机系统的一个元素,与计算机

              硬件,外设,某些支持软件,数据和人员等其他元素结合在一起,在实际运行的

              环境下,对计算机系统进行一系列的测试活动。

        目的:通过与系统的需求定义做比较,发现软件与系统定义不符合或与之矛盾的地方。

        对象:是软硬件集合在一起的系统,不应是独立的软件与硬件环境。

        系统测试类型:功能测试,性能测试,压力测试,容量测试,安全性测试,GUI测试,

                      可用性测试,安装测试,配置测试,异常测试,备份测试,健壮性测试,

                      文档测试,在线帮助测试,网络测试,稳定性测试。

    29.Alpha和Beta测试:大型通用软件,在正式发布前,通常需要执行Alpha和Beta测试,目的是从实际终端用户的使用角度,对软件的功能和性能进行测试,以发现可能只有最终用户才能发现的错误。

    Alpha测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试,Alpha测试不能由程序员或测试员完成。Alpha测试发现的错误,可以在测试现场立刻反馈给开发人员,由开发人员及时分析和处理。目的是评价软件产品的功能、可使用性、可靠性、性能和支持。尤其注重产品的界面和特色。Alpha测试可以从软件产品编码结束之后开始,或在模块(子系统)测试完成后开始,也可以在确认测试过程中产品达到一定的稳定和可靠程度之后再开始。有关的手册(草稿)等应该在Alpha测试前准备好。

    Beta测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试不能由程序员或测试员完成。因而,Beta测试是在开发者无法控制的环境下进行的软件现场应用。在Beta测试中,由用户记下遇到的所有问题,包括真实的以及主管认定的,定期向开发者报告,开发者在综合用户的报告后,做出修改,最后将软件产品交付给全体用户使用。Beta测试着重于产品的支持性,包括文档、客户培训和支持产品的生产能力。只有当Alpha测试达到一定的可靠程度后,才能开始Beta测试。由于Beta测试的主要目标是测试可支持性,所以Beta测试应该尽可能由主持产品发行的人员来管理。

    由于Alpha和Beta测试的组织难度大,测试费用高,测试的随机性强、测试周期跨度较长,测试质量和测试效率难于保证,所以,很多专业软件可能不再进行Beta测试。随着测试技术的提高,以及专业测试服务机构的大量涌现,很多软件的Beta测试外包给这些专业测试机构进行测试
     
     
    负载压力测试基础概念
     
    负载压力测试有助于确认被测系统是否能够支持性能需求,以及预期的负载增长等。负载压力测试不只是关注不同负载场景下的响应时间等指标,它也要通过测试来发现在不同负载场景下会出现的,例如速度变慢、内存泄漏等问题的原因。
         负载压力测试是性能测试的重要组成部分,负载压力测试包括并发性能测试、疲劳强度测试、大数据量测试等内容。一般包括如下:
         1、性能测试
         性能测试用来保证产品发布后系统的性能能够满足用户需求。其中系统性能包括执行效率、资源占用、稳定性、安全性、兼容性、可扩展性、可靠性等。
         2、性能评测
         性能评测包括:在真实环境下,检查系统服务等级的满足情况,评估并报告整个系统的性能;对系统的未来容量作出预测和规划。
         3、性能调优
         性能调优一般的步骤为首先查找形成系统瓶颈或者故障的根本原因,其次是进行性能调整和优化,最后便是评估性能调整的结果。
         4、负载测试
         负载测试时通过逐步增加系统负载,测试系统性能的变化,并最终确定在满足性能指标的情况下,系统所能承受的最大负载量的测试。
         5、压力测试
         压力测试是通过逐步增加系统负载,测试系统性能的变化,并最终确定在什么负载条件下系统性能处于失效状态,并以此来获得系统能提供的最大服务级别的测试。
         6、并发性测试
         并发性测试的过程,是一个负载测试和压力测试的过程。即逐渐增加并发用户数负载,直到系统的瓶颈或者不能接收的性能点。并发性测试分为三类:

         a、应用在客户端性能的测试;
      
         b、应用在网络上性能的测试;
         c、应用在服务器上性能的测试;

         7、疲劳强度测试

         8、大数据量测试
         大数据量测试包括独立的数据量测试和综合数据量测试两类
     
  • 361/212>