软件测试两年经验,感觉这两年成长还是不错的,主攻性能测试,望有相关 共同理想的朋友一起探讨交流职业路~

发布新日志

  • 概要设计说明书实例

    2009-07-29 15:36:57

    概要设计说明书
    一. 引言
    1. 编写目的
    从该阶段开发正式进入软件的实际开发阶段,本阶段完成系统的大致设计并明确系统的数据结构与软件结构。在软件设计阶段主要是把一个软件需求转化为软件表示的过程,这种表示只是描绘出软件的总的概貌。本概要设计说明书的目的就是进一步细化软件设计阶段得出的软件总体概貌,把它加工成在程序细节上非常接近于源程序的软件表示。
    2. 项目背景(略)
    3. 定义

    在该概要设计说明书中的专门术语有:

    总体设计

    接口设计

    数据结构设计

    运行设计

    出错设计

    具体的概念与含义在文档后将会解释。

    4. 参考资料
    <软件工程概论> 李存珠 李宣东 编著 南京大学计算机系出版 2001年8月
    二. 任务概述
    1. 目标
    该阶段目的在于明确系统的数据结构和软件结构,此外总体设计还将给出内部软件和外部系统部件之间的接口定义,各个软件模块的功能说明,数据结构的细节以及具体的装配要求。
    2. 运行环境
    软件基本运行环境为Windows环境。
    3. 需求概述(略)
    4. 条件与限制
    为了评价该设计阶段的设计表示的“优劣程度”,必须遵循以下几个准则:

    1.软件设计应当表现出层次结构,它应巧妙地利用各个软件部件之间的控制关系。
    2.设计应当是模块化的,即该软件应当从逻辑上被划分成多个部件,分别实现各种特定功能和子功能。
    3.设计最终应当给出具体的模块(例如子程序或过程),这些模块就具有独立的功能特性。
    4.应当应用在软件需求分析期间得到的信息,采取循环反复的方法来获得设计。
    三. 总体设计
    1.处理流程
    系统的总体处理数据流程如下图:
    图八总体处理流程图
    2.总体结构和模块外部设计
    模块是软件结构的基础,软件结构的好坏完全由模块的属性体现出来,把软件模块化的目的是为了降低软件复杂性,使软件设计,测试,调试,维护等工作变得简易,但随着模块数目的增加,通过接口连接这些模块的工作量也随之增加。从这些特性可得出如图九的一条总的成本(或工作量)曲线,在考虑模块化时,应尽量使模块数接近于图中的M,它使得研制成本最小,而且应尽量避免不足的模块化或超量。
    图九模块化与总体成本
    3.功能分配
    从程序的结构中可以看出,学生的信息输入输出功能是由学生管理系统进行的。课程的信息输入输出是由课程管理系统进行的,而班级的信息流动则是班级管理系统进行的。
    四. 接口设计
    由于系统的各种内外部接口是通过借助数据库开发软件来实现的,是完全在数据库内部操作的,故在此略过此内容。
    1. 外部接口(略)
    2. 内部接口(略)
    五. 数据结构设计
    1. 逻辑结构设计
    student_Info 学生基本信息表
    列名
    数据类型
    可否为空
    说明
    student_ID INT(4) NOT NULL 学生学号(主键)
    student_Name CHAR(10) NULL 学生姓名
    student_Gender CHAR(2) NULL 学生性别
    born_Date DATETIME(8) NULL 出生日期
    class_No INT(4) NULL 班号
    tele_Number CHAR(10) NULL 联系电话
    ru_Date DATETIME(8) NULL 入校时间
    address VARCHAR(50) NULL 家庭住址
    comment VARCHAR(200) NULL 注释
    class_Info 班级信息表格
    列名
    数据类型
    可否为空
    说明
    class_No INT(4) NOT NULL 班号(主键)
    grade CHAR(10) NULL 年级
    Director CHAR(10) NULL 班主任
    Classroom_No CHAR(10) NULL 教室
    course_Info 课程基本信息表
    列名
    数据类型
    可否为空
    说明
    course_No INT(4) NOT NULL 课程编号(主键)
    course_Name CHAR(10) NULL 课程名称
    course_Type CHAR(10) NULL 课程类型
    course_Des CHAR(50) NULL 课程描述
    gradecourse_Info 年级课程设置表
    列名
    数据类型
    可否为空
    说明
    grade CHAR(10) NULL 年级
    course_Name CHAR(10) NULL 课程名称
    result_Info 学生成绩信息表
    列名
    数据类型
    可否为空
    说明
    exam_No CHAR(10) NOT NULL 考试编号
    student_ID INT(4) NOT NULL 学生学号
    student_Name CHAR(10) NULL 学生姓名
    class_No INT(4) NULL 学生班号
    course_Name CHAR(10) NULL 课程名称
    result FLOAT(8) NULL 分数
    user_Info 系统用户表
    列名
    数据类型
    可否为空
    说明
    user_ID CHAR(10) NOT NULL 用户名称(主键)
    user_PWD CHAR(10) NULL 用户密码
    user_DES CHAR(10) NULL 用户描述
    图十数据库逻辑结构图表
    2. 物理结构设计
    系统的物理结构具体由数据库来设计与生成,此处略。
    3. 数据结构与程序的关系
    系统的数据结构由标准数据库语言SQL生成。

    具体的例如创建系统用户表格 user_Info的程序用SQL表示就是:

    CREATE TABLE[dbo].[user_Info](
    [user_ID][char](10)COLLATE Chinese_PRC_CI_AS NOT NULL,
    [user_PWD][char](10)COLLATE Chinese_PRC_CI_AS NULL,
    [user_Des][char](10)COLLATE Chinese_PRC_CI_AS NULL
    ) ON [PRIMARY]

    六. 运行设计
    1. 运行模块的组合
    具体软件的运行模块组合为程序多窗口的运行环境,各个模块在软件运行过程中能较好的交换信息,处理数据。
    2. 运行控制
    软件运行时有较友好的界面,基本能够实现用户的数据处理要求。
    3. 运行时间
    系统的运行时间基本可以达到用户所提出的要求。
    七. 出错处理设计
    1. 出错输出信息
    在用户使用错误的数据或访问没有权限的数据后,系统给出提示:“对不起,你非法使用数据,没有权限!”而且用户的密码管理可以允许用户修改自己的密码,不允许用户的匿名登录。
    2. 出错处理对策
    由于数据在数据库中已经有备份,故在系统出错后可以依靠数据库的恢复功能,并且依靠日志文件使系统再启动,就算系统崩溃用户数据也不会丢失或遭到破坏。但有可能占用更多的数据存储空间,权衡措施由用户来决定。
    八. 安全保密设计
    系统的系统用户管理保证了只有授权的用户才能进入系统进行数据操作,而且对一些重要数据,系统设置为只有更高权限的人员方可读取或是操作。系统安全保密性较高。
    九. 维护设计
    由于系统较小没有外加维护模块,因为维护工作比较简单,仅靠数据库的一些基本维护

  • 测试用例的几种设计方法

    2009-07-20 12:05:06

    一、等价类划分
        等价类划分主要适用于单个输入条件,输入为数值型的情况,如果输入规定了输入区间,可划分出一个有效等价类,两个无效等价类;如果输入只规定了输入范围,可划分出一个有效等价类,一个无效等价类。
    二、边界值
        边界值
    方法也是适用于单个输入条件的情况,输入类型可以数值、字符等,要测试的边界包括上点、下点、离点。
    三、错误推测法
        错误推测法主要是测试
    设计人员的测试经验相关,测试经验不同,设计出来的测试用例也区别很大。
    四、因果图法
        因果图方法考虑输入的组合,特别适用于多个输入条件相关有关联又相互约束的情况。
        设计步骤:
        1)罗列出输入与输出;
        2)根据输入与输出画出因果图;
        3)标出约束跟限制;
        4)把因果图转化成判定表;
        5)根据判定表的每一列设计测试用例。
    五、判定表驱动法
        判定表适合于解决多个逻辑条件的组合。将各种逻辑的组合罗列出来,避免遗漏。不能表达重复的操作。
        判定表包括条件桩、条件项、动作桩、动作项。
        条件桩:列出所有条件,次序无关;
        条件项:列出所对应条件的所有可能情况下的取值;
        动作桩:列出可能采取的操作,次序无关;
        动作项:列出条件项各种取值情况下采取的操作。
        设计步骤:
        1)确定规则个数,条件及各条件取值的组合;
        2)列出条件桩、动作桩;
        3)列出条件项;
        4)列出动作项;
        5)初始化判定表;
        6)规则简化、合并。
    六、正交法
        当输入条件很多时,因果图等设计方法设计出来的用例数往往多的惊人,用正交法可有效减少用例数。正交法的核心思想是从大量测试数据中选取有代表性的点来测试,从而减少测试用例数。
        设计步骤:
        1)确定因子并画出正交表草图;
        2)填充各因子的状态值;
        3)加权筛选;
        4)根据筛选过的正交表设计测试用例。
    七、功能图法
        功能图法适合于用来设计程序的控制结构的测试用例。有顺序、选择、重复三种控制结构。
        设计步骤:
        1)画出功能图;
        2)生成局部测试用例;
        3)生成测试路径;
        4)合成测试用例。
    八、场景法
        场景法特别适用于控制流清晰的系统。
        设计步骤:
        1)画出程序控制流图(如果不能直接画出控制流图,可先画出程序流程图,再把流程图转换成控制流图);
        2)根据控制流图设计出场景;
        3)根据场景设计测试用例。
        中间可能会要计算环路复杂度V(G),计算公式如下:
        V(G)=e-n+2
        其中e是边的数目,n是结点的数目。

    测试用例设计策略:
        1、任何都要用边界值法;
        2、用等价类划分补充测试用例;
        3、根据测试设计人员经验用错误推测法追加测试用例;
        4、根据程序逻辑追加逻辑测试用例;
        5、根据程序情况,选择使用因果图法设计测试用例。

    测试用例设计步骤:
        1、根据设计规格设计基本的功能测试用例;
        2、边界值测试用例;
        3、状态转换测试用例;
        4、错误推测测试用例;
        5、异常测试用例;
        6、性能测试用例。

        另外还需反复利用八种测试用例设计方法对测试用例进行分解与合并,利用发散思维追加测试用例。

  • 关于WEB测试的总结

    2009-07-17 11:29:21

    关于web测试
    1
    页面部分
    1) 页面清单是否完整(是否已经将所需要的页面全部都列出来了)
    2) 页面是否显示(在不同分辨率下页面是否存在,在不同浏览器版本中页面是是否显示)
    3) 页面在窗口中的显示是否正确、美观(在调整浏览器窗口大小时,屏幕刷新是否正确)
    4) 页面特殊效果(如特殊字体效果、动画效果)是否显示
    5) 页面特殊效果显示是否正确

    2
    页面元素部分
    1)页面元素清单(为实现功能,是否将所需要的元素全部都列出来了,如按钮、单选框、复选框、列表框、超连接、输入框等等)
    2)素是否显示(元素是否存在)
    3)页面元素是否显示正确(主要针对文字、图形、签章)
    4)页面元素的外形、摆放位置(如按钮、列表框、核选框、输入框、超连接等)
    5) 页面元素基本功能是否实现(如文字特效、动画特效、按钮、超连接)
    6) 页面元素的容错性列表(如输入框、时间列表或日历)
    7) 页面元素的容错性是否存在
    8) 页面元素的容错性是否正确

    3
    功能部分
    1) 数据初始化是否执行
    2) 数据初始化是否正确
    3) 数据处理功能是否执行
    4) 数据处理功能是否正确
    5) 数据保存是否执行
    6) 数据保存是否正确
    7) 是否对其他功能有影响
    8) 如果影响其他功能,系统能否作出正确的反应
    9) 其他错误
    10) 对模块的具体功能进行测试时可以列出功能模块的所有功能,进行排列组合,测试所有情况
    如:某一功能模块具有最基本的增删改查功能,则需要进行以下测试
    单项功能测试(增加、修改、查询、删除)
    增加——>增加——>增加 (连续增加测试)
    增加——>删除
    增加——>删除——>增加 (新增加的内容与删除内容一致)
    增加——>修改——>删除
    修改——>修改——>修改 (连续修改测试)
    修改——>增加 (新增加的内容与修改前内容一致)
    修改——>删除
    修改——>删除——>增加 (新增加的内容与删除内容一致)
    删除——>删除——>删除 (连续删除测试)
    11)查询功能分为两种情况,验证操作结果。
    一、打开页面时自动显示结果,则不特别强调;
    二、需要手工操作进行查询,则每次在其他功能完成后进行。
    4
    提示信息
    1) 成功、失败提示
    2) 操作结果提示
    3) 确认提示
    4) 危险操作、重要操作提示
    5) 返回页面 提示后显示的页面
    5
    容错性
    注意以下几种情况
    1) 为空、非空
    2) 唯一性
    3)字长、格式
    4) 数字、邮政编码、金额、电话、电子邮件、ID号、密码
    5) 日期、时间
    6) 特殊字符 (对数据库)英文单、双引号,&符号
    6
    权限部分
    功能权限: 指定用户可以使用那些功能,不能使用那些功能
    数据权限: 指定用户可以处理那些数据,不可以处理那些数据。可
    以合并到功能测试
    操作权限: 在逻辑关系上,操作前后顺序、数据处理情况。可以合
    并到功能测试
    权限变化: 可以合并到功能测试

    1) 功能权限是否存在
    2)功能权限是否正确
    3) 数据权限是否存在
    4) 数据权限是否正确
    5)操作权限是否存在
    6) 操作权限是否正确
    7) 引起权限变化的功能列表
    8) 功能权限变化还是数据权限变化,或两者兼有
    9) 权限变化是否正确

    7
    键盘操作
    1Tab键的使用
    2) 上下方向键的使用
    3Enter键的使用
    4) 系统设定快捷键的使用(如果设置有快捷键)

    8
    测试中还应注意的其他事项
    6) 完整性:是否是一个整体,没有功能缺损
    7) 易用性:使用是否方便
    8) 一致性:类似的问题用类似的方法处理
    9) 提示信息:提示信息是否完整、正确、详细
    10) 帮助信息:是否提供帮助信息,帮助信息的表现形式(页面文字、提示信息、帮助文件),帮助信息是否正确、详细
    11) 兼容性:包括操作系统兼容和应用软件兼容,可能还包括硬件兼容
    12) 可扩展性:是否由升级的余地,是否保留了接口
    13) 稳定性:运行所需的软硬件配置,占用资源情况,出现问题时的容错性,对数据的保护
    14) 运行速度:运行的快慢,带宽占用情况

    有几点:
    1.
    功能点测试:是否满足需求所要求的功能
    2.
    字符串长度检查:输入超出需求所说明的字符串长度的内容,看系统是否检查字符串长度,会不会出错.
    3.
    字符类型检查:在应该输入指定类型的内容的地方输入其他类型的内容(如在应该输入整型的地方输入其他字符类型),看系统是否检查字符类型,会否报错.
    4.
    标点符号检查:输入内容包括各种标点符号,特别是空格,各种引号,回车键.看系统处理是否正确.
    5.
    中文字符处理:在可以输入中文的系统输入中文,看会否出现乱码或出错.
    6.
    信息重复:在一些需要命名,且名字应该唯一的信息输入重复的名字或ID,看系统有没有处理,会否报错,重名包括是否区分大小写,以及在输入内容的前后输入空格,系统是否作出正确处理.
    7.
    界面测试:界面的正确性、一致性、友好性、易用性。

    用户界面测试是从最终的使用者用户的角度来看软件,软件难以理解,不易使用就是软件缺陷。可以从以下几个方面重点来检查用户界面:
    1.
    易用性检查:确保软件易于理解,方便使用。
    2.
    一致性检查:
    a.
    注意系统页面的风格是否一致,如字的大小、颜色、字体要相同。
    b.
    提示信息的表达方式是否一致。
    c.
    按钮排列顺序是否一致。
    d.back, cancel
    等按钮跳转页面处理是否一致。
    e.
    各字段的名称,位置、长度、类型是否和设计文档要求一致,如Employee NoLoginName不一致。
    3.
    正确性检查:检查页面上的form, button, table, header, footer,提示信息,还有其他文字拼写,句子的语法等是否正确。
    4.
    友好性检查:
    a.
    提示信息是否友好.
    b.
    系统应该在用户执行错误的操作之前提出警告,提示信息.
    c.
    页面分辨率检查,在各种分辨率浏览系统检查系统界面友好性。
    5.
    合理性检查:做delete, update, add, cancel, back等操作后,查看信息回到的页面是否合理。
    6.
    检查本地化是否通过:英文版不应该有中文信息,英文翻译准确,专业。
    7.
    页面最大化检查:测试最大化/最小化/还原时页面是否做了对应的处理。


  • 关于软件测试必知知识

    2009-07-16 17:36:29

    测试如何更有效说服研发去修改bug?


    问题描述:测试过程中一些bug会被研发认为是无效bug,但从用户角度出发,测试认为该bug需要更改,此时测试如何更有效的说服研发去修改bug?

    精彩回答:

      1. 扭转研发领导的思想,提高研发人员的响应速度:

      a). 让研发团队的领导重视缺陷:

      很多研发团队的领导都是销售出生,懂技术的很少,他们和搞技术的想法明显不一样。我在的第一家公司,发布版本时很多时候,都是没有测试结束,功能开发的差不多就把产品卖掉了,后面再对版本不断升级,结果这个公司没多久大概3年不到就散伙了。后面一家公司的领导是做质量管理出生的,明显对测试的质量要求就不一样,每次要求都特严,对以前测试结束标准都做了进一步的修改。如果领导对缺陷都视而不见,你说研发人员还愿意花大量的力气去修改Bug吗?所以说,团队的领导的想法或意识,对缺陷是否修改起到非常重要的作用。我记得以前测试高手zhuzx也在每周一问中提到过,大家也可以借鉴一下。

      b). 采用常用的缺陷管理工具(QC9.0),提高缺陷的透明度:

      我们公司使用缺陷管理工具(QC9.0),测试经理任管理员,给公司高层领导、项目经理、开发经理都分配了权限,自己可以登录系统查询相关信息。在测试后期,特别是要发布版本前后,领导们一有空,也随时上去浏览一把,无意识给开发人员施加了较大的压力。如果这个时候还有很多Open的缺陷,开发人员自然不敢怠慢。

      c). 把开发人员的修改缺陷的响应速度,记入绩效考核内容:

      由于公司总监特别关注产品质量,我们公司对缺陷修改这一点做得比较好,每次都是递交缺陷以后,开发人员响应特别快。如果有疑问,就马上和测试人员一对一交流,尽快修复或解决该缺陷。我们公司的口号是:“宁愿花出100倍的代价,也不让发现的缺陷留给客户”。还有一点就是开发人员绩效考核的时候,我们测试人员要给开发人员打分,很重要的一点就是:开发人员对测试缺陷的响应速度,如果这一项很低的话,老大要找你谈话的,问具体原因是什么?呵呵。所以,我们公司很少有测试人员追着开发修改缺陷的情况,把修改缺陷的响应速度纳入个人绩效考核,我个人觉的是一种比较好的方式,值得借鉴或推广。

      2. 组建一个合理的研发团队,规范测试规范:

      a). 关键是建立一个完善的研发机制:

      在大多数情况下,是不是软件缺陷或者需不需要修改,怎样修改不是测试人员和开发人员说了算的,应该是靠研发部门的相关制度或相关部门去约束。毕竟在国内软件的软件企业缺少这样的部门,所以说把修改缺陷相关的重任推到了测试人员的头上,其实对测试人员实在是太不公平了。要解决这个问题,最关键就是建立一个完善的研发机制,让QA等相关部门督促解决这类问题,比较好。

      b). 分清团队成员的具体责任:

      对于研发团队中的每个成员,必须责任明确,否则像督促缺陷修改这样的事情本来不是测试人员的责任,现在都推到测试人员头上了。很郁闷!!

      c). 完善测试规范,明确Bug管理制度:

      大部分的公司,都没有单独的部门来单独管理督促缺陷是否修改,都默认为是测试部门的事情。个人觉的最好是赋予项目组中相关人员一定的资质,让他们去处理这些琐事。经常碰到这样的情况,很多争议的缺陷都一直放到后面一个版本,一段时间下来,几个版本争议的缺陷就多于100个,弄得后面版本也不好发布。我们的做法是,发布前几天,对每个争议的缺陷用邮件先发给项目组成员先看,后面在召开缺陷评审会议,如果通过,毫无疑问修改,否则关闭或保留到下一个版本。

    本文出自51Testing软件测试网,感谢会员sun_0910在每周一问(08-10-27)中的精彩回答。
    http://bbs.51testing.com/forum-157-1.html

      3. 从源头上杜绝无效缺陷的递交:

      a). 测试前细化测试需求,避免递交歧义缺陷:

      很多研发不愿意修改的缺陷,大部分都是由于需求不明确或者理解歧义引起的。所以,最好的做法是在测试以前,开个项目会议,细化一下测试需求,让研发去确认或项目组成员集体Review,达成一致观点。尽量减少理解上的歧义,力争尽早消除无效或争议的软件缺陷,避免递交的缺陷成争议的缺陷。测试人员无法说服研发,让研发去修复缺陷,长期这样,测试部的威信就大大降低了。

      b). 把握不准的缺陷,递交以前最好讨论一下:

      特别是在测试初期,由于测试介入项目时间较短,有时候测试人员对业务或需求了解不深,递交错Bug也是常有的事情。这个时候,往往测试认为自己递交正确了,开发人员认为自己开发软件是对的,互不相让,如果处理不好,很容易弄僵关系,弄得大家都不是很愉快。要是项目中出现这样的Bug,是很难说服研发去修改的,还有可能成为研发抓你的“小辫子”的有力证据,要是这样以后就更难做了。个人的一些做法:所有的测试缺陷相互审核后,才递交到缺陷系统上公开,是最为保险的方法。

      c). 清楚无歧义的描述Bug,减少随机测试,带来不可重现的Bug:

      很多时候,测试人员把缺陷描述不清楚或者缺陷有歧义,开发人员看不懂,不明白具体的意思,加上开发人员任务重时间紧,很容易产生逆反心里,这就让开发人员对测试人员有看法,以后递交的缺陷认可度就大大降低了。还有就是要减少随机测试,一定要保证递交的缺陷能够重复出现,最好要有截图、图片或者用数码相机照下来,让开发人员认识到这个问题确实存在,并且更具说服力。

      d). 做好版本配置管理工作,保证测试环境的准确性:

      很多同事发现的缺陷,只有在测试环境下重现,而在开发环境下不能够重现。这样的缺陷开发人员往往是看不到的,他们很容易得出结论,说测试人员递交无效的缺陷而被拒绝,大部分情况发现是版本弄错啦!!我们唯一能做的就是做好源代码的配置管理工作,保证测试环境版本的正确性和独立性,自己编译自己部署测试环境。只有这样,才会减少无效缺陷的递交,避免“费劲周折”说服开发人员修改缺陷。

      4. 正确分析测试中的软件缺陷:

      a). 为递交的每个缺陷准备几条充足的理由:

      一般情况下,我们提到一个Bug时,开发人员都会说出很多可以不修改缺陷的理由,尽量搪塞住我们的口,要求我们关掉缺陷或者置为无效或者延期到下一个版本。如果你很牛,你可以为自己递交的每个缺陷准备很充足的理由去说服开发人员;如果你不是太强,那就可以求助部门同事,集中测试部门团队的力量,想一些好的、站得住脚理由,详细介绍给研发人员听,只要我们递交的Bug,每个都具说服力的话,我想他们也会尽快修改的。这种方法还真是不错,大家不妨试一试。

      b). 详细分析缺陷给项目带来的各种可能影响或缺陷风险:

      比如说,我们递交一个缺陷,如果研发的觉的这个缺陷可以修改或可以不修改时。我们一定要给研发分析修改这个缺陷的必要性,不修改,对客户带来哪种可能影响或存在哪些风险。要在修改缺陷的代价与修复成本的关系上去衡量。相信,当我们对缺陷分析的很详细时,研发人员一定会修改Bug的。

      5. 做一个聪明的测试工程师:

      a). 注意和研发人员的沟通技巧:

      如果测试人员没有做过开发工作,理解也许就比较片面。有的测试人员,对待问题没有耐心,性情比较急,也是常有的事。如果没有较好的沟通技巧,也许就是几句话的功夫,就和同事争吵了起来,弄得大家都比较尴尬。个人建议:谈话时,要注意沟通技巧,要有换位思维的方式,做事情对事不对人,处理事情一定要有一颗宽容的心。只有这样,才能够很好的说服研发去修改Bug。

      b). 和研发人员搞好私人关系,做研发的听众:

      比较明智的测试人员,一定要学会倾听研发人员的心生。很多时候,开发人员碰到工作困难的时候,很希望和人倾述,如果测试人员是他的听众,那么你们的关系一定会不错。搞好了私人关系,工作中你递交的缺陷,他们就不会那么斤斤计较了,毕竟关系是基础,关系好了好说话呀,在中国就是如此。如果私人关系好了,说服研发修改Bug就是很容易的事情。不过得提醒一句:不能因为关系好就把Open的缺陷给关了。

      6. 抓住时机,不要错过千载难逢的好机会:

      a). 求助公司上层领导:

      很多时候,测试到后期,开发人员把缺陷也修改的差不多了,公司领导(比如说老总、总监、项目经理或开发经理)就会随时来测试部门,找测试经理或负责人了解项目测试的具体情况。如果有一些问题都是争议问题,作为测试Leader的你不妨给领导聊聊,把更高层的人拉进来为测试部门说话,为测试部门撑腰,但是凡事都有一个度,不能太过分,否则很伤同事的和气。

      b). 要求客户代表援助:

      很多GUI的缺陷或可改可不该的缺陷,可能作为客户使用不是很方便。我们可以和客户代表聊聊这样的缺陷,如果客户代表同意这样做,那没问题,可以不修改;如果客户不同意,他自然会直接找项目经理或高层人员协调解决这个问题,这就不用我们测试人员操心了。因为客户就是上帝,这招不错吧!!!

      我目前想到的就这么多,希望同行指正!!!

  • CMMI实施的随想(转)

    2008-12-23 09:39:20

    CMMI实施的随想

    字体:        | 上一篇 下一篇 | 打印  | 我要投稿  | 每周一问,答贴有奖

      CMMI随想——

      (思维有点混乱....想到哪写到哪请见谅,现实与理想差距很大,高层要考虑市场和成本等多种因素,本人只从测试的角度阐述个人观点.....)

      项目开发与管理按照CMMI流程有一年多的时间了,个人开始接触CMMI时,感觉它的思想确实值得大家研究和学习。下面就这一年多来的使用感受和体会。软件开发流程最早也是由测试人员提出,这是否是一个件很有趣的事呢。

      由于前一公司是采用ISO质量体系,所以对流程、质检并不是很陌生。我一直从事软件测试工作,对于在软件测试执行的过程中所受的约束深有体会。所以对制定公司软件开发流程、公司级的规范及改进特别的热心。

      CMMI告诉我们应该做什么,遗憾的是并没有告诉我们应该怎么去做!

      我们测试最关心工程过程域,当然为了项目控制好,熟悉项目管理类域也很重要,了解项目特征制定测试策略和方法。CMMI定义这些过程域需要做什么,而这也是我们测试人员最愿意看到的,希望详细知道需求及系统分析分及设计人员是如何实现的,开发人员采用哪些技术和方法实现既定的目标。测试人员根据以上信息制定测试重点及优先级,在测试时可以有的放矢。

      遗憾的是实现以上的目标需要一个强大的团队。现实出现的问题是:

      问题一:需求做不到详尽;这与做需求的人员的能力(交际能力(挖掘客户潜在需求)、需求文档的表现能力)及目标客户有很大关系,在二次或多次需求开发后已开始偏离用户需求。产生的主要原因是人员的技能。

      问题二:设计做不到位。给开发人员留下了发挥的空间。但是最终的结果是开发的过程产品不够规范,并且缺少相应文档,导致维护性差,如果做此模块的人员离职,则需要发费更多的成本。如果此开发人员做的是核心模块,那么将是这个项目的灾难。产生的直接原因是“人”。

      问题三:测试人员不清楚开发人员具体的实现,对深层次逻辑或核心问题测试用例覆盖偏少。可能留下定时“炸弹”!或者老是出现发布的新版本不稳定。但又找不到原因。产生的原因是开发流程没有严格的执行,中间过程没有必要的产品构件的输出。在测试人员这里问题得到了几何级的放大。

      以上也许就是目前国内做项目软件公司的经常出现的问题。这与CMMI好像没有什么直接关系!CMMI告诉我们软件开发主要由三大支柱支撑。人、技能、流程。软件项目开发缺一不可,而上面出现的问题正好覆盖了这三大支柱。也就是造成国内软件水平质量不高的的原因吧。当然在项目开发过程中,存在很多的问题,软件质量水平不高还有其他的原因。

      CMMI在实施中遇到的问题

      1、缺少高水平的合适软件开发管理人员,实施不到位,职责不明确,当出现问题时很混乱

      2、缺少高水平的开发人员,水平高的人都去系分了或项目经理了,代码写得好并不一定是一个好项目经理

      3、公司高层对它重视不够。由于实现这个见效慢、而高层对软件开发并不是十分了解,有一番美好的期望,结果往往是痛苦的

      4、缺乏改进的勇气,改变是痛苦的,成果是丰硕的。改进就是改变,改变需要成本、需要高层的支持和承诺。现实是一般由质保部去实施改进,权利过小涉及的部门过多,接口多很难协调

      5、公司对测试不重视或理解有误差

      6、项目组成员对流程不熟悉,没有接受过专业的软件开发培训

      本人感觉公司高层对实施CMMI的支持及有合适的项目管理人员最重要。其次是帮助项目组成员展开培训(职位技能及开发流程)。

      很多公司在实施CMMI时都是让CMMI适合公司,制定了一整套规程。当然CMMI也允许这样做,我想说的是经过公司本地化改造的CMMI流程是否真的可以达到预期目标。很多公司不去分析公司是否适合实施CMMI流程或者是否达到实施的资质,而是花几十万或几百万搞到了一个证书。也许这就是国外论证的证书到了国内就变质的原因吧。

  • 如何构建一个 LFS 系统(转)

    2008-12-02 16:21:36

       1.1. 如何构建一个 LFS 系统

      我们将用一个已安装好的 Linux 发行版(例如 Debian、Mandrake、Red Hat、SuSE)来构建 LFS 系统。这个已存在的 Linux 系统(宿主系统)作为建立新系统的起点,提供包括编译器、连接器和 Shell 在内的必要的程序。您安装这个发行版的时候,需要选择“开发者”选项,以便可以用上这些工具。

      另一个选择是使用 Linux From Scratch 的 LiveCD。这个CD是一个非常好的宿主系统,它包含了构建一个完整LFS系统所需要的一切工具,另外还包含了所有的软件包源代码、补丁和一个本书的拷贝。使用这个CD,可以不需要任何网络连接或者下载任何额外的东西。要了解更多关于 LFS LiveCD 的信息或者想下载它,请查看:http://www.linuxfromscratch.org/livecd/。

      Chapter 2 描述了怎样创建一个新的 Linux 本地分区和文件系统,新的 LFS 系统将在这上面编译安装。 Chapter 3 解释了构建一个 LFS 系统需要那些软件包和补丁,以及怎样把它们存放到新文件系统上。 Chapter 4 讨论了建立一个适当的工作环境。请仔细阅读 Chapter 4,因为它讨论了在开始完成 Chapter 5 及其后面的步骤之前,开发者需要知道的几个重要问题。

      Chapter 5 解释了形成一个基本开发套件(或称为工具链)所需的许多软件的安装,这个工具链将被用来构建 Chapter 6 中的实际系统。其中一些软件包需要解决循环依赖关系:例如,要编译一个编译器,您首先就需要一个编译器。

      Chapter 5 告诉用户如何编译第一遍工具链,包括 Binutils 和 GCC(第一遍主要的意思就是指这两个核心软件包后面还将第二次安装)。这些软件包里的程序将静态连接以便使用时独立于宿主系统。接下来的步骤是编译 Glibc,就是 C 运行库。Glibc 将由第一遍建立的工具链程序编译。然后将第二遍编译工具链动态连接到刚刚编译好的 Glibc 库上。Chapter 5 余下的软件包将使用第二遍建立的工具链来编译。完成这些步骤之后,LFS 的安装过程除了正在运行的内核外,不再依赖于宿主系统。

      为了不依赖宿主系统,初看起来我们要做很多工作。Chapter 5的开始提供了一个完整的技术说明,包括静态连接的程序和动态连接的程序之间差异的注解。

      Chapter 6将构建完整的 LFS 系统。chroot(改变root)程序用来进入一个虚拟的环境并开始一个新的 Shell,其根目录是 LFS 分区。这非常类似于重启并让内核将 LFS 分区挂载为根分区。系统实际上并没有重启,而是由 chroot 代替了,因为建立一个可启动的系统需要做一些现在还不需要做的额外工作。主要的好处在于“chroot”允许您在构建 LFS 的时候可以继续使用宿主系统。在等待软件包编译完成的时候,用户可以切换到不同的虚拟控制台(VC)或者 X 桌面,就像平常一样继续使用计算机。

      为了完成安装,Chapter 7设置启动脚本,Chapter 8安装内核和启动引导程序。Chapter 9包含在本书之外获得进一步 LFS 体验的信息。在本书中所有步骤都完成之后,计算机就已经准备好重启进入新的 LFS 系统了。

      以上就是概略的过程,在接下来的章节和软件包描述中会讨论每一步的细节。看似复杂的项目将详细阐明,随着开发者踏上 LFS 冒险之路,每一件事情都将依序出现。

  • 一位前辈工程师的忠告!(转)

    2008-12-02 09:34:40

    [1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!

    [2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!

    [3]不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。

    很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!

    [4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!

    [5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务, 法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!

    [6]抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!!
    [7]逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!
    [8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!

    [9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...

    [10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功。

  • Linux系统标点符号的部分编码(转)

    2008-11-20 09:52:46

    1、使用智能拼音时,输入ibdfh 或 ifuhao ,输入 isymbol也可以。

    2、使用五笔输入法时,比如,您需要输入顿号(、),需要输入"顿号"的五笔编码gbkg。

    下面罗列的是常用的中文标点符号编码:

    , 逗号 gkkg

    、 顿号 gbkg

    。 句号 qkkg

    · 圆点 lkhk

    · 间隔号 ubkg

    ? 问号 ukkg

    ; 分号 wvkg

    : 冒号 jhkg

    ! 叹号 kckg

    —— 破折号 drkg

    ~ 波浪号 iikg

    ……  省略号 ilkg

    ‘’ 单引号 uxkg

    “” 双引号 cxkg

    〔〕 方括号 yrkg

    〈〉 单书名号 unqk

    《》 书名号 nqkg

    『』 竖书名号 jnqk

    () 圆括号 lrkg

    {} 大括号 drkg

    〖〗 空心括号 pnrk

    【】 实心括号 pnrk

  • 一、术语session

      二、HTTP协议与状态保持

      三、理解cookie机制

      四、理解session机制

      五、理解javax.servlet.http.HttpSession

      六、HttpSession常见问题

      七、跨应用程序的session共享

      八、总结

      参考文档

      一、术语session

      在我的经验里,session这个词被滥用的程度大概仅次于transaction,更加有趣的是transaction与session在某些语境下的含义是相同的。

      session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个 session。有时候我们可以看到这样的话“在一个浏览器会话期间,...”,这里的会话一词用的就是其本义,是指从一个浏览器窗口打开到关闭这个期间 ①。最混乱的是“用户(客户端)在一次会话期间”这样一句话,它可能指用户的一系列动作(一般情况下是同某个具体目的相关的一系列动作,比如从登录到选购商品到结账登出这样一个网上购物的过程,有时候也被称为一个transaction),然而有时候也可能仅仅是指一次连接,也有可能是指含义①,其中的差别只能靠上下文来推断②。

      然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义, “面向连接”指的是在通信双方在通信之前要先建立一个通信的渠道,比如打电话,直到对方接了电话通信才能开始,与此相对的是写信,在你把信发出去的时候你并不能确认对方的地址是否正确,通信渠道不一定能建立,但对发信人来说,通信已经开始了。“保持状态”则是指通信的一方能够把一系列的消息关联起来,使得消息之间可以互相依赖,比如一个服务员能够认出再次光临的老顾客并且记得上次这个顾客还欠店里一块钱。这一类的例子有“一个TCP session”或者 “一个POP3 session”③。

      而到了web服务器蓬勃发展的时代,session在web开发语境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器之间保持状态的解决方案④。有时候 session也用来指这种解决方案的存储结构,如“把xxx 保存在session 里”⑤。由于各种用于web开发的语言在一定程度上都提供了对这种解决方案的支持,所以在某种特定语言的语境下,session也被用来指代该语言的解决方案,比如经常把Java里提供的javax.servlet.http.HttpSession简称为session⑥。

      鉴于这种混乱已不可改变,本文中session一词的运用也会根据上下文有不同的含义,请大家注意分辨。

      在本文中,使用中文“浏览器会话期间”来表达含义①,使用“session机制”来表达含义④,使用“session”表达含义⑤,使用具体的“HttpSession”来表达含义⑥


      二、HTTP协议与状态保持

      HTTP 协议本身是无状态的,这与HTTP协议本来的目的是相符的,客户端只需要简单的向服务器请求下载某些文件,无论是客户端还是服务器都没有必要纪录彼此过去的行为,每一次请求之间都是独立的,好比一个顾客和一个自动售货机或者一个普通的(非会员制)大卖场之间的关系一样。

      然而聪明(或者贪心?)的人们很快发现如果能够提供一些按需生成的动态信息会使web变得更加有用,就像给有线电视加上点播功能一样。这种需求一方面迫使HTML逐步添加了表单、脚本、DOM等客户端行为,另一方面在服务器端则出现了CGI规范以响应客户端的动态请求,作为传输载体的HTTP协议也添加了文件上载、 cookie这些特性。其中cookie的作用就是为了解决HTTP协议无状态的缺陷所作出的努力。至于后来出现的session机制则是又一种在客户端与服务器之间保持状态的解决方案。

      让我们用几个例子来描述一下cookie和session机制之间的区别与联系。笔者曾经常去的一家咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:

      1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。

      2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。

      3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。

      由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择。

    三、理解cookie机制 

      cookie机制的基本原理就如上面的例子一样简单,但是还有几个问题需要解决:“会员卡”如何分发;“会员卡”的内容;以及客户如何使用“会员卡”。正统的cookie分发是通过扩展HTTP协议来实现的,服务器通过在HTTP的响应头中加上一行特殊的指示以提示浏览器按照指示生成相应的 cookie。然而纯粹的客户端脚本如Javascrīpt或者VBscrīpt也可以生成cookie。

      而cookie 的使用是由浏览器按照一定的原则在后台自动发送给服务器的。浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围大于等于将要请求的资源所在的位置,则把该cookie附在请求资源的HTTP请求头上发送给服务器。意思是麦当劳的会员卡只能在麦当劳的店里出示,如果某家分店还发行了自己的会员卡,那么进这家店的时候除了要出示麦当劳的会员卡,还要出示这家店的会员卡。

      cookie的内容主要包括:名字,值,过期时间,路径和域。

      其中域可以指定某一个域比如.google.com,相当于总店招牌,比如宝洁公司,也可以指定一个域下的具体某台机器比如www.google.com或者froogle.google.com,可以用飘柔来做比。

      路径就是跟在域名后面的URL路径,比如/或者/foo等等,可以用某飘柔专柜做比。

      路径与域合在一起就构成了cookie的作用范围。

      如果不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览器会话期的 cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。

      存储在硬盘上的cookie 可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。对于IE,在一个打开的窗口上按 Ctrl-N(或者从文件菜单)打开的窗口可以与原窗口共享,而使用其他方式新开的IE进程则不能共享已经打开的窗口的内存cookie;对于 Mozilla Firefox0.8,所有的进程和标签页都可以共享同样的cookie。一般来说是用javascrīpt的window.open打开的窗口会与原窗口共享内存cookie。浏览器对于会话cookie的这种只认cookie不认人的处理方式经常给采用session机制的web应用程序开发者造成很大的困扰。

      下面就是一个goolge设置cookie的响应头的例子

     HTTP/1.1 302 Found

     Location: http://www.google.com/intl/zh-CN/

      Set-Cookie: PREF=ID=0565f77e132de138:NW=1:TM=1098082649:LM=1098082649:S=KaeaCFPo49RiA_d8; expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com

     Content-Type: text/html

      这是使用HTTPLook这个HTTP Sniffer软件来俘获的HTTP通讯纪录的一部分

      浏览器在再次访问goolge的资源时自动向外发送cookie

      使用Firefox可以很容易的观察现有的cookie的值

      使用HTTPLook配合Firefox可以很容易的理解cookie的工作原理。

      IE也可以设置在接受cookie前询问

      这是一个询问接受cookie的对话框。

    四、理解session机制

      session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

      当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为 session id,如果已包含一个session id则说明以前已经为此客户端创建过session,服务器就按照session id把这个 session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个 session id将被在本次响应中返回给客户端保存。

      保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于 SEEESIONID,而。比如weblogic对于web应用程序生成的cookie,JSESSIONID= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,它的名字就是 JSESSIONID。

      由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把session id传递回服务器。经常被使用的一种技术叫做URL重写,就是把session id直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http://...../xxx; jsessionid= ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

      另一种是作为查询字符串附加在URL后面,表现形式为http://...../xxx?jsessionid=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764

      这两种方式对于用户来说是没有区别的,只是服务器在解析的时候处理的方式不同,采用第一种方式也有利于把session id的信息和正常程序参数区分开来。

      为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个session id。

      另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。比如下面的表单

      <form. name="testform" action="/xxx">
      <input type="text">
      </form> 

      在被传递给客户端之前将被改写成

      <form. name="testform" action="/xxx">
      <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
      <input type="text">
      </form> 

      这种技术现在已较少应用,笔者接触过的很古老的iPlanet6(SunONE应用服务器的前身)就使用了这种技术。

      实际上这种技术可以简单的用对action应用URL重写来代替。

      在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览器,session就消失了”。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的 HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。

      恰恰是由于关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就可以认为客户端已经停止了活动,才会把session删除以节省存储空间。

      五、理解javax.servlet.http.HttpSession

      HttpSession是Java平台对session机制的实现规范,因为它仅仅是个接口,具体到每个web应用服务器的提供商,除了对规范支持之外,仍然会有一些规范里没有规定的细微差异。这里我们以BEA的Weblogic Server8.1作为例子来演示。

      首先,Weblogic Server提供了一系列的参数来控制它的HttpSession的实现,包括使用cookie的开关选项,使用URL重写的开关选项,session持久化的设置,session失效时间的设置,以及针对cookie的各种设置,比如设置cookie的名字、路径、域, cookie的生存时间等。

      一般情况下,session都是存储在内存里,当服务器进程被停止或者重启的时候,内存里的session也会被清空,如果设置了session的持久化特性,服务器就会把session保存到硬盘上,当服务器进程重新启动或这些信息将能够被再次使用, Weblogic Server支持的持久性方式包括文件、数据库、客户端cookie保存和复制。

      复制严格说来不算持久化保存,因为session实际上还是保存在内存里,不过同样的信息被复制到各个cluster内的服务器进程中,这样即使某个服务器进程停止工作也仍然可以从其他进程中取得session。

      cookie生存时间的设置则会影响浏览器生成的cookie是否是一个会话cookie。默认是使用会话cookie。有兴趣的可以用它来试验我们在第四节里提到的那个误解。

      cookie的路径对于web应用程序来说是一个非常重要的选项,Weblogic Server对这个选项的默认处理方式使得它与其他服务器有明显的区别。后面我们会专题讨论。

    六、HttpSession常见问题

       (在本小节中session的含义为⑤和⑥的混合)

       1、session在何时被创建

       一个常见的误解是以为session在有客户端访问时就被创建,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句 HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的 session对象的来历。

       由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭它。

       2、session何时被删除

       综合前面的讨论,session在下列情况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的session id时间间隔超过了session的超时设置;或c.服务器进程被停止(非持久session)

       3、如何做到在浏览器关闭时删除session

      严格的讲,做不到这一点。可以做一点努力的办法是在所有的客户端页面里使用javascrīpt代码window.oncolose来监视浏览器的关闭动作,然后向服务器发送一个请求来删除session。但是对于浏览器崩溃或者强行杀死进程这些非常规手段仍然无能为力。

       4、有个HttpSessionListener是怎么回事

      你可以创建这样的listener去监控session的创建和销毁事件,使得在发生这样的事件时你可以做一些相应的工作。注意是session的创建和销毁动作触发listener,而不是相反。类似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。

       5、存放在session中的对象必须是可序列化的吗

      不是必需的。要求对象可序列化只是为了session能够在集群中被复制或者能够持久保存或者在必要时server能够暂时把session交换出内存。在 Weblogic Server的session中放置一个不可序列化的对象在控制台上会收到一个警告。我所用过的某个iPlanet版本如果 session中有不可序列化的对象,在session销毁时会有一个Exception,很奇怪。

       6、如何才能正确的应付客户端禁止cookie的可能性

       对所有的URL使用URL重写,包括超链接,form的action,和重定向的URL,具体做法参见[6]

       http://e-docs.bea.com/wls/docs70/webapp/sessions.html#100770

       7、开两个浏览器窗口访问应用程序会使用同一个session还是不同的session

       参见第三小节对cookie的讨论,对session来说是只认id不认人,因此不同的浏览器,不同的窗口打开方式以及不同的cookie存储方式都会对这个问题的答案有影响。

       8、如何防止用户打开两个浏览器窗口操作导致的session混乱

      这个问题与防止表单多次提交是类似的,可以通过设置客户端的令牌来解决。就是在服务器每次生成一个不同的id返回给客户端,同时保存在session里,客户端提交表单时必须把这个id也返回服务器,程序首先比较返回的id与保存在session里的值是否一致,如果不一致则说明本次操作已经被提交过了。可以参看《J2EE核心模式》关于表示层模式的部分。需要注意的是对于使用javascrīpt window.open打开的窗口,一般不设置这个id,或者使用单独的id,以防主窗口无法操作,建议不要再window.open打开的窗口里做修改操作,这样就可以不用设置。

       9、为什么在Weblogic Server中改变session的值后要重新调用一次session.setvalue

       做这个动作主要是为了在集群环境中提示Weblogic Server session中的值发生了改变,需要向其他服务器进程复制新的session值。

       10、为什么session不见了

      排除session正常失效的因素之外,服务器本身的可能性应该是微乎其微的,虽然笔者在iPlanet6SP1加若干补丁的Solaris版本上倒也遇到过;浏览器插件的可能性次之,笔者也遇到过3721插件造成的问题;理论上防火墙或者代理服务器在cookie处理上也有可能会出现问题。

       出现这一问题的大部分原因都是程序的错误,最常见的就是在一个应用程序中去访问另外一个应用程序。我们在下一节讨论这个问题。

    七、跨应用程序的session共享

      常常有这样的情况,一个大项目被分割成若干小项目开发,为了能够互不干扰,要求每个小项目作为一个单独的web应用程序开发,可是到了最后突然发现某几个小项目之间需要共享一些信息,或者想使用session来实现SSO(single sign on),在session中保存login的用户信息,最自然的要求是应用程序间能够访问彼此的session。

      然而按照Servlet 规范,session的作用范围应该仅仅限于当前应用程序下,不同的应用程序之间是不能够互相访问对方的session的。各个应用服务器从实际效果上都遵守了这一规范,但是实现的细节却可能各有不同,因此解决跨应用程序session共享的方法也各不相同。

      首先来看一下Tomcat是如何实现web应用程序之间session的隔离的,从 Tomcat设置的cookie路径来看,它对不同的应用程序设置的cookie路径是不同的,这样不同的应用程序所用的session id是不同的,因此即使在同一个浏览器窗口里访问不同的应用程序,发送给服务器的session id也可以是不同的。

      根据这个特性,我们可以推测Tomcat中session的内存结构大致如下。

      笔者以前用过的iPlanet也采用的是同样的方式,估计SunONE与iPlanet之间不会有太大的差别。对于这种方式的服务器,解决的思路很简单,实际实行起来也不难。要么让所有的应用程序共享一个session id,要么让应用程序能够获得其他应用程序的session id。

      iPlanet中有一种很简单的方法来实现共享一个session id,那就是把各个应用程序的cookie路径都设为/(实际上应该是/NASApp,对于应用程序来讲它的作用相当于根)。

      /NASApp 需要注意的是,操作共享的session应该遵循一些编程约定,比如在session attribute名字的前面加上应用程序的前缀,使得 setAttribute("name", "neo")变成setAttribute("app1.name", "neo"),以防止命名空间冲突,导致互相覆盖。

      在Tomcat中则没有这么方便的选择。在Tomcat版本3上,我们还可以有一些手段来共享session。对于版本4以上的Tomcat,目前笔者尚未发现简单的办法。只能借助于第三方的力量,比如使用文件、数据库、JMS或者客户端cookie,URL参数或者隐藏字段等手段。

      我们再看一下Weblogic Server是如何处理session的。

      从截屏画面上可以看到Weblogic Server对所有的应用程序设置的cookie的路径都是/,这是不是意味着在Weblogic Server中默认的就可以共享session了呢?然而一个小实验即可证明即使不同的应用程序使用的是同一个session,各个应用程序仍然只能访问自己所设置的那些属性。这说明Weblogic Server中的session的内存结构可能如下

      对于这样一种结构,在 session机制本身上来解决session共享的问题应该是不可能的了。除了借助于第三方的力量,比如使用文件、数据库、JMS或者客户端 cookie,URL参数或者隐藏字段等手段,还有一种较为方便的做法,就是把一个应用程序的session放到ServletContext中,这样另外一个应用程序就可以从ServletContext中取得前一个应用程序的引用。示例代码如下,

      应用程序A

      context.setAttribute("appA", session);

      应用程序B

      contextA = context.getContext("/appA");

      HttpSession sessionA = (HttpSession)contextA.getAttribute("appA");

      值得注意的是这种用法不可移植,因为根据ServletContext的JavaDoc,应用服务器可以处于安全的原因对于context.getContext("/appA");返回空值,以上做法在Weblogic Server 8.1中通过。

      那么Weblogic Server为什么要把所有的应用程序的cookie路径都设为/呢?原来是为了SSO,凡是共享这个session的应用程序都可以共享认证的信息。一个简单的实验就可以证明这一点,修改首先登录的那个应用程序的描述符weblogic.xml,把cookie路径修改为/appA 访问另外一个应用程序会重新要求登录,即使是反过来,先访问cookie路径为/的应用程序,再访问修改过路径的这个,虽然不再提示登录,但是登录的用户信息也会丢失。注意做这个实验时认证方式应该使用form,因为浏览器和web服务器对basic认证方式有其他的处理方式,第二次请求的认证不是通过 session来实现的。具体请参看[7] secion 14.8 Authorization,你可以修改所附的示例程序来做这些试验。

      八、总结

      session机制本身并不复杂,然而其实现和配置上的灵活性却使得具体情况复杂多变。这也要求我们不能把仅仅某一次的经验或者某一个浏览器,服务器的经验当作普遍适用的经验,而是始终需要具体情况具体分析。

  • 关于测试用例

    2009-07-15 23:22:58

    测试用例是为特定目标而开发的一组测试输入、执行条件和预期结果,其目标可以是测试某个程序路径或核实是否满足某个特定的需求。

      测试用例(TESt CASe)目前没有经典的定义。比较通常的说法是:指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。

      不同类别的软件,测试用例是不同的。不同于诸如系统、工具、控制、游戏软件,管理软件的用户需求更加不统一,变化更大、更快。笔者主要从事企业管理软件的测试。因此我们的做法是把测试数据和测试脚本从测试用例中划分出来。测试用例更趋于是针对软件产品的功能、业务规则和业务处理所设计的测试方案。对软件的每个特定功能或运行操作路径的测试构成了一个个测试用例。

      要使最终用户对软件感到满意,最有力的举措就是对最终用户的期望加以明确阐述,以便对这些期望进行核实并确认其有效性。测试用例反映了要核实的需求。然而,核实这些需求可能通过不同的方式并由不同的测试员来实施。例如,执行软件以便验证它的功能和性能,这项操作可能由某个测试员采用自动测试技术来实现;计算机系统的关机步骤可通过手工测试和观察来完成;不过,市场占有率和销售数据(以及产品需求),只能通过评测产品和竞争销售数据来完成。

      确定测试用例之所以很重要,原因有以下几方面。

      1、测试用例构成了设计和制定测试过程的基础。

      2、测试的“深度”与测试用例的数量成比例。由于每个测试用例反映不同的场景、条件或经由产品的事件流,因而,随着测试用例数量的增加,您对产品质量和测试流程也就越有信心。

      3、判断测试是否完全的一个主要评测方法是基于需求的覆盖,而这又是以确定、实施和/或执行的测试用例的数量为依据的。类似下面这样的说明:“95 % 的关键测试用例已得以执行和验证”,远比“我们已完成 95 % 的测试”更有意义。

      4、测试工作量与测试用例的数量成比例。根据全面且细化的测试用例,可以更准确地估计测试周期各连续阶段的时间安排。

      5、测试设计和开发的类型以及所需的资源主要都受控于测试用例。

      6、测试用例通常根据它们所关联关系的测试类型或测试需求来分类,而且将随类型和需求进行相应地改变。最佳方案是为每个测试需求至少编制两个测试用例:

      一个测试用例用于证明该需求已经满足,通常称作正面测试用例; 另一个测试用例反映某个无法接受、反常或意外的条件或数据,用于论证只有在所需条件下才能够满足该需求,这个测试用例称作负面测试用例。

      一、测试用例是软件测试的核心

      软件测试的重要性是毋庸置疑的。但如何以最少的人力、资源投入,在最短的时间内完成测试,发现软件系统的缺陷,保证软件的优良品质,则是软件公司探索和追求的目标。每个软件产品或软件开发项目都需要有一套优秀的测试方案和测试方法。

      影响软件测试的因素很多,例如软件本身的复杂程度、开发人员(包括分析、设计、编程和测试的人员)的素质、测试方法和技术的运用等等。因为有些因素是客观存在的,无法避免。有些因素则是波动的、不稳定的,例如开发队伍是流动的,有经验的走了,新人不断补充进来;一个具体的人工作也受情绪等影响,等等。如何保障软件测试质量的稳定?有了测试用例,无论是谁来测试,参照测试用例实施,都能保障测试的质量。可以把人为因素的影响减少到最小。即便最初的测试用例考虑不周全,随着测试的进行和软件版本更新,也将日趋完善。

      因此测试用例的设计和编制是软件测试活动中最重要的。测试用例是测试工作的指导,是软件测试的必须遵守的准则。更是软件测试质量稳定的根本保障。

      二、编制测试用例

      着重介绍一些编制测试用例的具体做法。

      1、测试用例文档

      编写测试用例文档应有文档模板,须符合内部的规范要求。测试用例文档将受制于测试用例管理软件的约束。

      软件产品或软件开发项目的测试用例一般以该产品的软件模块或子系统为单位,形成一个测试用例文档,但并不是绝对的。

      测试用例文档由简介和测试用例两部分组成。简介部分编制了测试目的、测试范围、定义术语、参考文档、概述等。测试用例部分逐一列示各测试用例。每个具体测试用例都将包括下列详细信息:用例编号、用例名称、测试等级、入口准则、验证步骤、期望结果(含判断标准)、出口准则、注释等。以上内容涵盖了测试用例的基本元素:测试索引,测试环境,测试输入,测试操作,预期结果,评价标准。

      2、测试用例的设置

      我们早期的测试用例是按功能设置用例。后来引进了路径分析法,按路径设置用例。目前演变为按功能、路径混合模式设置用例。

      按功能测试是最简捷的,按用例规约遍历测试每一功能。

      对于复杂操作的程序模块,其各功能的实施是相互影响、紧密相关、环环相扣的,可以演变出数量繁多的变化。没有严密的逻辑分析,产生遗漏是在所难免。路径分析是一个很好的方法,其最大的优点是在于可以避免漏测试。

      但路径分析法也有局限性。在一个非常简单字典维护模块就存在十余条路径。一个复杂的模块会有几十到上百条路径是不足为奇的。笔者以为这是路径分析比较合适的使用规模。若一个子系统有十余个或更多的模块,这些模块相互有关联。再采用路径分析法,其路径数量成几何级增长,达5位数或更多,就无法使用了。那么子系统模块间的测试路径或测试用例还是要靠传统方法来解决。这是按功能、路径混合模式设置用例的由来。

      3、设计测试用例

      测试用例可以分为基本事件、备选事件和异常事件。设计基本事件的用例,应该参照用例规约(或设计规格说明书),根据关联的功能、操作按路径分析法设计测试用例。而对孤立的功能则直接按功能设计测试用例。基本事件的测试用例应包含所有需要实现的需求功能,覆盖率达100%。

      设计备选事件和异常事件的用例,则要复杂和困难得多。例如,字典的代码是唯一的,不允许重复。测试需要验证:字典新增程序中已存在有关字典代码的约束,若出现代码重复必须报错,并且报错文字正确。往往在设计编码阶段形成的文档对备选事件和异常事件分析描述不够详尽。而测试本身则要求验证全部非基本事件,并同时尽量发现其中的软件缺陷。

      可以采用软件测试常用的基本方法:等价类划分法、边界值分析法、错误推测法、因果图法、逻辑覆盖法等设计测试用例。视软件的不同性质采用不同的方法。如何灵活运用各种基本方法来设计完整的测试用例,并最终实现暴露隐藏的缺陷,全凭测试设计人员的丰富经验和精心设计。

      三、测试用例在软件测试中的作用

      1、指导测试的实施

      测试用例主要适用于集成测试、系统测试和回归测试。在实施测试时测试用例作为测试的标准,测试人员一定要按照测试用例严格按用例项目和测试步骤逐一实施测试。并对测试情况记录在测试用例管理软件中,以便自动生成测试结果文档。

      根据测试用例的测试等级,集成测试应测试那些用例,系统测试和回归测试又该测试那些用例,在设计测试用例时都已作明确规定,实施测试时测试人员不能随意作变动。

      2、规划测试数据的准备

      在我们的实践中测试数据是与测试用例分离的。按照测试用例配套准备一组或若干组测试原始数据,以及标准测试结果。尤其象测试报表之类数据集的正确性,按照测试用例规划准备测试数据是十分必须的。

      除正常数据之外,还必须根据测试用例设计大量边缘数据和错误数据。

      3、编写测试脚本的“设计规格说明书”

      为提高测试效率,软件测试已大力发展自动测试。自动测试的中心任务是编写测试脚本。如果说软件工程中软件编程必须有设计规格说明书,那么测试脚本的设计规格说明书就是测试用例。

      4、评估测试结果的度量基准

      完成测试实施后需要对测试结果进行评估,并且编制测试报告。判断软件测试是否完成、衡量测试质量需要一些量化的结果。例:测试覆盖率是多少、测试合格率是多少、重要测试合格率是多少,等等。以前统计基准是软件模块或功能点,显得过于粗糙。采用测试用例作度量基准更加准确、有效。

      5、分析缺陷的标准

      通过收集缺陷,对比测试用例和缺陷数据库,分析确证是漏测还是缺陷复现。漏测反映了测试用例的不完善,应立即补充相应测试用例,最终达到逐步完善软件质量。而已有相应测试用例,则反映实施测试或变更处理存在问题。

      四、相关问题

      1、测试用例的评审

      测试用例是软件测试的准则,但它并不是一经编制完成就成为准则。测试用例在设计编制过程中要组织同级互查。完成编制后应组织专家评审,需获得通过才可以使用。评审委员会可由项目负责人、测试、编程、分析设计等有关人员组成,也可邀请客户代表参加。

      2、测试用例的修改更新

      测试用例在形成文档后也还需要不断完善。主要来自三方面的缘故:第一、在测试过程中发现设计测试用例时考虑不周,需要完善;第二、在软件交付使用后反馈的软件缺陷,而缺陷又是因测试用例存在漏洞造成;第三、软件自身的新增功能以及软件版本的更新,测试用例也必须配套修改更新。

      一般小的修改完善可在原测试用例文档上修改,但文档要有更改记录。软件的版本升级更新,测试用例一般也应随之编制升级更新版本。

      3、测试用例的管理软件

      运用测试用例还需配备测试用例管理软件。它的主要功能有三个:第一、能将测试用例文档的关键内容,如编号、名称等等自动导入管理数据库,形成与测试用例文档完全对应的记录;第二、可供测试实施时及时输入测试情况;第三、最终实现自动生成测试结果文档,包含各测试度量值,测试覆盖表和测试通过或不通过的测试用例清单列表。

      有了管理软件,测试人员无论是编写每日的测试工作日志、还是出软件测试报告,都会变得轻而易举。

  • 庆祝51Testing软件测试网成立五周年

    2009-05-07 16:13:06

       庆祝51Testing软件测试网成立五周年,我的测试才五个月。。但做测试的工作之余,都会上来51Testing学习。。希望自己在软件测试这条路走的越来越远。

     51Testing软件测试网:http://www.51testing.com

  • 系统权限的测试方法

    2009-01-08 18:12:58

    1)  赋予一个人员相应的权限后,在界面上看此人员是否具有此权限,并以此人员身份登陆,验证权限设置是否正确(能否超出所给予的权限);

      2)  删除或修改已经登陆系统并正在进行操作的人员的权限,程序能否正确处理;

      3)  重新注册系统变更登陆身份后再登录,看程序是否能正确执行,具有权限是否正确;

      4)  在有工作组或角色管理的情况下,删除包含用户的工作组或角色,程序能否正确处理;

      5)  不同权限用户登录同一个系统,权限范围是否正确;

      6)  覆盖系统所有权限设定;

      7)  能否添加信息为空的用户(其中包括空用户名及空口令、空用户名非空口令、非空用户名及空口令

      8)  能否添加长用户名及长口令,如果允许,新用户能否正确登录;

      9)  系统是否允许删除系统管理员这一特殊用户或修改系统管理员口令,删除或修改后系统的实际情况;

      10)  登录用户能否修改自己的权限;

      11)  添加用户(有标识或编号):标识相同,用户名不同;标识相同,用户名相同;标识不同,用户名相同;标识不同,用户名不同;

      12)  登录用户能否修改本人(或其他人)的信息,删除本人(或其他人);

      13)  修改用户的信息(包括权限,口令,基本信息等),对其他模块的影响;

      14)  修改用户信息:修改后的用户信息和已经存在的用户信息相同;修改后的用户信息和已经存在的用户信息不同;

      15)  不给用户授权,是否允许登录;

      15)  改某些设置时,是否会影响具有上级权限及相同权限人员的设置;

      16)  系统管理员修改了某些数据,以其他人员身份登录时数据是否改变;

      17)  用户能否同时属于多个组,各个组的权限能否交叉;删除后重新添加的用户是否具有以前的权限;更改用户各项属性(包括权限)看对权限是否有影响。

     

  • 安全测试

    2009-01-08 18:11:46

    1.不登录系统,直接输入登录后的页面的url是否可以访问
    2.不登录系统,直接输入下载文件的url是否可以下载,如输入http://url/download?name=file是否可以下载名为file的文件
    3.退出登录后按后退按钮能否访问之前的页面
    4.ID/密码验证方式中能否使用简单密码。如密码标准为6位以上,字母和数字混合,不能包含ID,连续的字母或数字不能超过n位
    5.重要信息(如密码,身份证号码,信用卡号等)在输入或查询时是否用明文显示;在浏览器地址栏里输入命令javascrīpt:alert(doucument.cookie)时是否有重要信息;在html源码中能否看到重要信息
    6.手动更改URL中的参数值能否访问没有权限访问的页面。如普通用户对应的url中的参数为l=e,高级用户对应的url中的参数为l=s,以普通用户的身份登录系统后将url中的参数e改为s来访问本没有权限访问的页面
    7.url里不可修改的参数是否可以被修改
    8.上传与服务器端语言(jsp、asp、php)一样扩展名的文件或exe等可执行文件后,确认在服务器端是否可直接运行
    9.注册用户时是否可以以'--,' or 1=1 --等做为用户名
    10.传送给服务器的参数(如查询关键字、url中的参数等)中包含特殊字符(','and 1=1 --,' and 1=0 --,'or 1=0 --)时是否可  以正常处理
    11.执行新增操作时,在所有的输入框中输入脚本标签(<scrīpt>alert("")</scrīpt>)后能否保存
    12.在url中输入下面的地址是否可以下载:http://url/download.jsp?file=C:\windows\system32   \drivers\etc\hosts,http://url/download.jsp?file=/etc/passwd
    13.是否对session的有效期进行处理
    15.错误信息中是否含有sql语句、sql错误信息以及web服务器的绝对路径等
    16.ID/密码验证方式中,同一个账号在不同的机器上不能同时登录
    17.ID/密码验证方式中,连续数次输入错误密码后该账户是否被锁定
    18.新增或修改重要信息(密码、身份证号码、信用卡号等)时是否有自动完成功能(在form标签中使用autocomplete=off来关闭自动完成功能)
  • 转载--web测试容易忽略的

    2009-01-08 18:10:37

    1.浏览器的后退按钮  51Testing软件测试网'z.Yoq;b y
      提交表单一条已经成功提交的记录,back后再提交,看系统会如何处理。检查多次使用back健的情况在有back的地方,back,回到原来的页面,再back,重复几次,看是否会报错。51Testing软件测试网 k`U$bY
    2.
    通过修改URL中的参数,向服务器发起请求,看看会有什么样的结果 51Testing软件测试网"a${0a ^f2x5ry
      利用一些工具,http watch,可以记录和捕获向服务器发起的URL请求,然后修改其中的参数向服务器发起请求.该功能点可以和安全测试结合起来.51Testing软件测试网­niI qh8z]
    3.
    对表单多次提交
    5L T­r,] j0
      对提交按钮快速多次点击提交,看看会不会在数据库中形成多条记录.网速或响应快时,这点容易被遗漏,但用户的网络可能慢,很容易多次点击提交.如果前端做了处理,试试捕获在提交时生成的URL,绕过页面,再次对服务器发起请求,会有什么结果
    &S%nX1U7k(L(Q&i0]h0cL04.
    光标的跳转51Testing软件测试网7s`7w-g%Zw? ~
      执行操作后,光标是否停留在合适的位置.如邮箱登录,输完用户名回车后,光标应该跳转到密码框内.细节问题,但是影响用户感受

    5.tab键是否功能正确51Testing软件测试网-R])^P
    ~5fJNG

      和光标的跳转类似,特别是在有输入项时,查看tab键的焦点顺序是否正确51Testing软件测试网.y.v3s+G-R7~
    6.
    对全角/半角符号的输入测试
    g[
    a,},Je9E0
      有输入项时,要考虑全/半角字条的输入,GBK字符
    _)x n3ew0r7v+A07.
    多版本IE测试

    [转帖] 电子商务网站--界面测试的测试点51Testing软件测试网+{4?


    u7yO%f `
    界面是软件,网站 与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操

    作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感

    觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。目前界面的设计引起软

    件设计人员的重视的程度还远远不够,直到最近网页制作的兴起,才受到专家的青睐。而且设计良好的界面由于需要具有艺术美的天

    赋而遭拒绝。
    ,VG:A f+K?E0
      目前流行的界面风格有三种方式:多窗体、单窗体以及资源管理器风格,无论那种风格,以下规则是应该被重视的。
    7?wK­e&T&h.Lq{01
    :易用性:
    @E­o*Y A0
      按钮名称应该易懂,用词准确,屏弃没楞两可的字眼,要与同一界面上的其他按钮易于区分,能望文知意最好。理想的情况是用

    户不用查阅帮助就能知道该界面的功能并进行相关的正确操作。51Testing软件测试网 Z"F DY ~4a%iCf


    a C
    易用性细则:51Testing软件测试网1k
    L)db
    OJ[1]r3q.A

    1):
    完成相同或相近功能的按钮用Frame框起来,常用按钮要支持快捷方式。51Testing软件测试网#\8W$yf$i*F
    2):
    完成同一功能或任务的元素放在集中位置,减少鼠标移动的距离。51Testing软件测试网_vookU Tw@
    3):
    按功能将界面划分区域块,用Frame框括起来,并要有功能说明或标题。51Testing软件测试网a DO4s,b
    }[­a;H

    4):
    界面要支持键盘自动浏览按钮功能,即按Tab键、回車鍵的自动切换功能。
    a&C2g?N05):
    界面上首先要输入的和重要信息的控件在Tab顺序中应当靠前,位置也应放在窗口上较醒目的位置。
    ~${
    Q3`Zq­A[ k0
    6):
    同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。


    pzC
    Mx[ j;K0
    7):
    分页界面要支持在页面间的快捷切换,常用组合快捷键Ctrl+Tab51Testing软件测试网 |3y:oIM8kFU W(m
    8):
    默认按钮要支持Enter及选操作,即按Enter后自动执行默认按钮对应操作。51Testing软件测试网Ts|WV
    DIJ1k

    9):
    可寫控制項檢測到非法輸入後應給出說明並能自動獲得焦點。
    +r
    Os
    Q-_
    c,@t{j4y0
    10):Tab
    键的顺序与控件排列顺序要一致,目前流行总体从上到下,同时行间从左到右的方式。51Testing软件测试网c#f(YW1Q
    11):
    核取方塊和選項框按選擇幾率的高底而先後排列。51Testing软件测试网;dMK/O(Q Nc
    12):
    核取方塊和選項框要有默認選項,並支援Tab選擇。51Testing软件测试网(U(Ik%C)d/Ih,IYh
    13):
    選項數相同時多用選項框而不用下拉清單框。51Testing软件测试网w6R
    xH wK*C&wV%R

    14):
    界面空间较小时使用下拉框而不用选项框。
    s­l H@/D015):
    选项数較少时使用选项框,相反使用下拉列表框。51Testing软件测试网yO*L8q0@ bL+S6c
    16):
    专业性强的软件要使用相关的专业术语,通用性界面则提倡使用通用性词语。

    251Testing软件测试网MU


    j@,b-qa
    规范性:
    "n8q[4{
    `m(p:])z#l0
    通常界面设计都按Windows界面的规范来设计,可以说:界面遵循规范化的程度越高,则易用性相应的就越好。小型软件一般不提供

    工具厢。
    q#~"TxY-~ T2M2W4A0
    规范性细则:
    -n5X1WE F5ntd#p01):
    常用菜单要有命令快捷方式。
    &a)rk
    zht0
    2):
    完成相同或相近功能的菜单用横线隔开放在同一位置。
    !L$g"kN*],zt)]03):
    菜单前的图标能直观的代表要完成的操作。51Testing软件测试网 C2x#?Q.`s4D
    4):
    菜单深度一般要求最多控制在三层以内。51Testing软件测试网7sF[1]]*y.s%kY2W
    5):
    工具栏要求可以根据用户的要求自己选择定制。51Testing软件测试网M uu1VO/?$x+U+}O&S
    6):
    相同或相近功能的工具栏放在一起。51Testing软件测试网!eu:d~ Xx
    7):
    工具栏中的每一个按钮要有及时提示信息。

    [)ZSXGz Z
    g0
    8):
    一条工具栏的长度最长不能超出屏幕宽度。


    i.@\,t7GU;p$g09): 工具栏的图标能直观的代表要完成的操作。
    _c5q7Uu$lj010):
    系统常用的工具栏设置默认放置位置。
    S­?[mo/c011):
    工具栏太多时可以考虑使用工具箱。
    (xS%mI*m9z:Y3Y012):
    工具箱要具有可增减性,由用户自己根据需求定制。51Testing软件测试网5R E#Nc
    T"ji H:U4_R

    13):
    工具箱的默认总宽度不要超过屏幕宽度的1/5
    A1@#~&NSF014):
    状态条要能显示用户切实需要的信息,常用的有:51Testing软件测试网^&[V[1]T&^ } u u7m
    目前的操作、系统状态、用户位置、用户信息、提示信息、错误信息等,如果某一操作需要的时间较长,还应该显示进度条和进程提

    示。
    /w7W(a,y]-V015)
    :滚动条的长度要根据显示信息的长度或宽度能及时变换,以利于用户了解显示信息的位置和百分比。51Testing软件测试网M!j Y[P4l!D
    16)
    :状态条的高度以放置五好字为宜,滚动条的宽度比状态条的略窄。51Testing软件测试网1oT0a2Q8zVa1R[1]bh7P C8L
    17)
    :菜单和工具条要有清楚的界限;菜单要求凸出显示,这样在移走工具条时仍有立体感。51Testing软件测试网T4n`/J‑p;j1leQ
    18)
    :菜单和状态条中通常使用5号字体。工具条一般比菜单要宽,但不要宽的太多,否则看起来很不协调。51Testing软件测试网 查看(657) 评论(1) 收藏 分享 管理

  • 博客开通了

    2009-01-08 18:07:29

    经常看到朋友们的博客,里面那么充实,自己也有开通的冲动,这次终于行动了,希望各位能指点,这里将是我半个家。
  • 704/4<1234

    数据统计

    • 访问量: 439795
    • 日志数: 75
    • 图片数: 1
    • 建立时间: 2009-01-08
    • 更新时间: 2012-10-04

    RSS订阅

    Open Toolbar