选择远行,只顾风雨兼程!

我的最新日志

  • 测试用例设计_如何提高测试覆盖率(三)

    2008-5-30

    三、测试数据的设计

    每一个测试思路最终都要转化成具体的数据才能来执行。关于测试数据设计的方法也不外乎那几种,就不再赘述了。此处单就一些经常易犯的错误,提出一些注意点,作为用例数据设计时的参考:

    1、尽量避免可能出现歧义测试结果的数据:即你设计的数据必须能唯一正确地反映出你所希望测试的结果。比如一组测试数据,有可能得到结果A或结果B,此时单用此数据来测试预期结果为A的用例,那明显就产生了歧义。

    2、对于不便具体列示的数据,则必须详细描述其各项特性:有时我们在设计用例时为节约时间,不一定要到具体的一个数值,这也是允许的,但前提是你必须要详细描述清楚你要测试的数据特性。比如数据库字段限长20,要测试超长数据时,可以描述为:尝试输入长度为21位的半角英文字符;尝试输入长度为19位的半角英文字符,然后切换到中文全角再输入一位全角字符等。千万不能写成:尝试输入超长字符,因为这只能是测试方案,作为方案是可以这样写,但到用例阶段,必须要是具体的、明确的、可操作的。

    3、测试数据的设计必须有明确目的性:即测试数据是从测试方案衍生而来的。如上例测试方案是测超长字符输入控制,所以测试数据就要根据具体字段长度来录入超长数据,如果一味录入长15位、长16位的数据那就没意义了。好的测试数据是可以同时针对多个测试方案的,此时可以在用例边注明一下该数据的测试目的,因为随着时间推移,对着具体的数据你也许会忘了它到底是测什么的,而这对你最后总结测试,查验测试覆盖率是非常不利的,所以随时记下你的思路想法吧,好记性不如烂笔头。

    4、测试数据可省略描述:测试数据描述以能让人看懂为准则。所以写用例时当碰到连续几个用例,仅某几个关键数据值改动,其余均是一样的情况下,不必每个用例都要重复描述所有数据,可以在第一个用例描述完整之后,其余用例中仅列示不同的数据,并标明其余数据同上第X个用例,即可。这样测试时仍能复原测试数据,且该用例的测试目的一眼就明,增加了用例的清晰性。

    至些,我根据测试用例设计的顺序,从测试数据的切面设计(即测试项划分),到详细测试用例设计,再到测试数据设计三个层面,逐一介绍了如何来提高测试用例的覆盖度。因为具体项目中的具体情况太多,以上叙述的内容也只能是管窥蠡测。至于其中的疏漏错误之处应也难免,只希望各位阅后能打开思路,从自己多年的测试经验中多总结、提炼出一些想法思路,进一步补充完善这个文档,使大家的测试用例设计能力都能进一步提升。

  • 测试用例的设计-提高测试覆盖率(二)

    2008-5-30

    二、详细用例的设计

    划分好了测试项,接着就是针对各个测试项,考虑具体的测试用例了。根据测试项的特点,测试用例的设计角度也有所不同。下面我们就来看看通常的功能点测试用例,该从哪些角度出发来进行设计:

    1、功能切面表面用例设计

    (1)、具体功能测试

    根据需求分析设计,按页面提供的各个功能项,采用黑盒测试的各种方法,设计用例。比如页面提供了增、删、改、查功能,那么这四个功能是否正确实现就是我要验证的。这是最简单、最基本,同时也是必须的测试用例,通常我们的编码人员自测也就是做到这个程度。^_^

    (2)、组合操作的测试

    这是从上一角度扩展出来的,相对而言也是编码人员不会去测试的,所以需要测试人员多作考虑。

    所谓组合操作测试,也就是选择某几个操作项,按一定的顺序进行操作,验证系统不会出现意外错误。当然要将所有功能项排列组合一遍来测试不仅不必要,也是不可能的。所以具体要将哪些功能项进行结合,要按怎样的步骤来操作,还是需要测试人员根据实际情况来作设计(所以说在IT业人才就是一切呀,呵呵:)。

    一般来说我们会考虑功能项之间的数据是否会存在关联,若有就需要考虑这种组合了。常见的如查询功能,需要将各条件逐一累加进行测试;增完的数据能否改,改完能否删,删完能否再增,这之间能否查询到正确结果;按钮的连续多次点击会否出现异常;有严格前后顺序要求的几个操作,尝试颠倒顺序去操作,系统能否控制等等。

    不仅在某功能内部,扩展到有关联的多个功能项之间,同样有组合操作测试的存在。如申报完了能才反馈;如申报成功或失败后再尝试申报等。当然对于这类用例既可以写到某个功能切面中,也可以单独写到完整业务流程的切面中,这就取决于可能涉及用例的数量了,若关系比较复杂,当然是单独写比较好;若也就是三五个用例数,那就直接在某个功能的用例中补充好了。

     

    (3)、GUI界面的测试

    这类测试是测试人员的强项,具体测试项目如限长、非法输入等等,就不必赘述了。要提醒的是在测试时,一定要从实际使用者的操作习惯出发。要知道界面原型所能确定的也只是页面的摆放显示,而实际操作时的控制实现仍是编码人员自行实现的,即使有编码指南,其所及范围也是十分有限。而许多编码人员在用户操作方便性上的考虑往往差强人意。所以测试人员就必须要把好这一关。

    (4)、数据初始化情况测试

    不该为空的数据是否有校验;该有默认值的数据默认值是否正确;引用其它功能生成的数据,是否会实时刷新;页面关闭或系统重启后,数据的初始化设置等都是这类用例。

    (5)、业务需求实现是否正确

    这类问题往往是由于我们的需求说明欠详细,而编码人员的需求了解程度又较低造成。作为测试人员自然要对需求进行深刻研究,来对软件实现进行把关。这里常见的一些关注点有:

    u       数据的长度、类型控制是否合理(比如控制纳税人识别号只能为数字,但实际业务中是会有字母出现的);

    u       业务逻辑控制是否合理(比如某数据项不提供修改,但实际业务中该数据项经常会需要改动);

    u       提供的实现方式是否合理(比如只在某一页面提供某数据的获取功能,但根据业务划分有些人员不能操作此页面,却必须要能看到该数据);

    u       所做的数据控制是否合理(比如必须在A功能中新增数据,然后才能在B功能中操作,但实际业务中有可能会出现相反操作);

    u       所做的数据控制是否完整(如授权的方式有普通按月、有买断、有按数量控制,那么当同一企业尝试同时存在以上几种授权方式时,系统是否能有必要的控制);

    u       还有其它一些操作细节上的满足(如业务上需要批量操作的数据有否提供批量操作功能、导入失败的结果文件是否能修改后直接再导入等)。

    对于不满足的需求,经开发组长、需求经理等确认不作修改的,就要作为软件的缺限或限制在测试报告中进行说明民。

    2、功能切面隐含测试项用例设计:

    (1)、数据完整性的测试

    当某数据被其它功能引用;或当前功能要引用其它来源的数据,就会涉及到数据完整性的测试。最常见的如被引用的数据删除了,或关键字被修改了,引用的数据会否出错;两个途径进入的数据会否冲突或重复;此外还有因为相关的几个功能由不同人员编码,从而导致彼此的控制不一致,如A功能进入的数据在可允许的极端情况下,到B功能中引用会否异常(最常见如用户名录入时允许长度10,但引用到某个单子填写时允许长度是8,此时就会异常了)。

    (2)、后台的特殊处理

    是指某功能除了表面所见以外的程序处理。比如订单录入,表面所见的就是订单的保存,但后台还会有重复数据的判断、非法数据的处理、业务逻辑上冲突情况的处理以及其它种种根据需求设计所特有的处理。又比如备份功能,在备份前可能有数据的清空、备份目录的清空、备份目标是否存在的校验、备份文件重复时的处理等等。类似这些在分析设计中就未必会写全了,还是要测试人员多花心思去思考挖掘。

    (3)、功能业务之间的关联与转换

    相关联的几个功能之间数据的传递,会否产生影响。比如新增录入的某种特殊字符,要查询时会引起查询SQL语句异常;又如某下载文件名中存在中文等字符,下载时由于编码问题导致乱码的出现;再有报表填写时到小数点后四位,生成报文时会不会被忽略成两位了等等。象这种问题,通常只能是在每个功能设计用例时,尽量保证用例中的数据能涉及到允许范围的各种情况,即充分运用等价类划分+边界值的方法设计出各种“稀奇古怪”的数据,并需验证这些数据从头流到尾,都还是能保持其正确性,而不仅仅是在当前功能中正确。

    (4)、从设计实现发掘测试点

    这个就是我们测试中最难捉的BUG了,它往往是由编码人员自己在编码时创造出来的,连设计人员都不会知道。

    比如内部管理系统中,正常的产品,其类别通常是2位数字;如果是模块,其类别就以产品代码来取代。这时如何来判断该产品是模块呢?最保险的当然是校验其产品类别字段的值能否在产品表中找到;也有比较简单的方法就是直接判断类别代码大于2位还是小于等于2位。此时若能确切知道采用的是哪种实现方法,就可以直接找到其漏洞所在。比如采用后一种方法,当产品类别长度变化时,明显系统会出错。那么即使确认该实现方式不改,测试人员也应将其作为限制写入测试报告,。让大家知道这个产品类别长度是不能随意变化的。

    而让人郁闷的是,类似这样的实现,有太多的编码人员都是随性处理的,它们细而隐蔽,在系统数据正常情况下根本不会被发现;而在漫漫的软件使用道路中,由于需求变更等原因对原有一些设计做维护变化,这种问题就会突然暴发出来让人措不及防。所以要杜绝这类漏洞,除了测试人员要做土拨鼠,不停地对软件各功能的实现细节进行挖掘外,也要多给编码人员灌输完美实现的理念,多用复杂但抗压性高的代码,来替代简单但依赖性强的代码。

    (5)、并发操作时的测试

    即两个或多个用户同时操作同一功能时,会否引起数据的混乱。通常在C/S结构下,如果有同时操作的可能,是需要作此测试的;而在B/S结构下由于其特殊性,此问题通常难以解决。除非就是某用户一旦使用过某功能后,在一定时间内锁定不允许再用,但这也会带来实际应用中的不便,所以除非是特别核心的数据,一般我们也不会去做此控制,当然对于可能出现的并发冲突也就作为系统的限制进行遗留了。

    3、特定切面用例设计

    所谓特定切面,其实就是从另一个角度切割出来的用例面,所以具体的用例撰写方式其实与功能切面是一致的。

    4、隐含切面用例设计

    隐含切面分以下几种情况:

    (1)、无界面的后台功能

    对这类测试项,需要通过参数设置、代码调用等方式来实现测试,但具体的测试设计其实与普通功能测试并无二致。这里要注意,因为测试时往往前台、后台是分开来分别进行的,而实际运行时两者很可能是交集的,所以测试时要多注意后台功能的执行与前台的一些功能执行会否产生冲突?比如后台有个文件搬运的服务,那有没有可能在前台文件生成过程中,后台执行文件搬运了?若有可能就要注意会否出现问题了。

    (2)、与业务流相关的测试

    这类测试用例的设计,就要从完整业务角度来设计数据了。从理论上来讲,应该要将各个功能可能出现的各种数据排列组合到一起,按业务流程逐一进行测试。但实际上我们不可能去做全覆盖。所以设计这类用例时,最好有一张草稿,将所有相关功能按业务流程逐一列示,然后再将每个功能可能出现的特定数据一一标上,最后将图中最可能出现的、最可能出错的、最核心的数据取出来,分别组合成一个个完整的业务数据用例,来进行测试。这样就可以按清晰的思路,找出最实用、最有效的测试数据。

    (3)、其它测试类型

    这一类的测试通常都有其特定的方法。如要测可靠性就准备大量数据不停地执行;要测安全性就考虑数据的加密、数据的传输、数据的破坏;恢复性一般从网络、电源方面着手;配置安装则根据系统可支持的配置,搭建相应环境进行功能验证,此处的验证也要掌握技巧,即要多测试那些涉及到:数据库读写、磁盘文件读写、文件上传下载、文件加解密、数据统计、图表展现、打印等方面的功能。

  • 测试用例的设计-提高测试覆盖率(转)

    2008-5-30

    测试用例的切面设计

      所谓测试切面设计,其实就是测试用例大项的划分。测试用例划分的经典方法是瀑布模型,也就是从上到下,逐渐细分,大模块包括小模块,小模块包括更小的模块。但仅仅如此是不够的,我们还要从更多的角度切入系统,从不同的角度把系统切分成一块一块的,来进行测试,从而确保测试大项的完整性。

      1、功能点切面

      这是最常见的切面,通常我们认为页面上的一个按钮就是一个功能点。然后我们可以根据功能的复杂程度,按每个功能;或一个功能点分多页;或多个功能点合成一页来进行用例的撰写。

      2、特定切面

      除此以外,还有一种特定切面的划分方法,也是用例撰写时经常会用到的。所谓的特定切面,就是忽略掉表面上的功能点,而关注测试对象的某一个面。比如我们的内部管理系统提供了销售录入导入、注册录入导入等功能,从菜单划分上对应了七八个功能点。但这些功能处理后台有个共同的处理项就是授权记录的生成,这时我们就可以把“授权记录生成”单独拿出来做一个测试项,而在其它测试项中涉及这一部分的用例就不必再一一撰写。此外象一些界面共通的操作用例单独写成一页,也是一种特定切面。所以如果说将用例按功能点划分是一种纵向划分法,那么特定切面就是从横向的角度分析所得到的切面。在普通功能点划分上再根据实际情况设计特定切面,可以使我们的用例阅读性、理解性、操作性更强。

      3、隐含切面

      这类用例是最容易被忽略的。它往往不是明显的某个功能项,可能是功能项后台的隐含处理,也可能是多个功能项之间的关联处理,甚至可能是在某种特定情形下的处理。这都需要测试人员通过对软件的学习了解,来进行挖掘。

      (1)、后台功能

      常见的如一些定时自动启动的服务;以及某种特定情况下自动执行的操作等。它们在界面上往往是不体现的,但许多在需求设计中还是会提到,也有一些比较细小的功能可能会被忽略,就需要测试人员根据对项目的了解程度来进行挖掘。所以说一个熟悉项目的和一个不熟悉的测试人员,写出来的用例就完全是两个层次的。

    (2)、完整业务流程的测试

      我们都知道测试用例的设计是从点、线、面三个层次去考虑的。完整的一个功能项是线,其中的某个按钮是点,多个相关功能结合成完整业务流就是面。从实际来看这类用例往往被我们忽略。

      事实上目前公司的软件本来都是业务型应用软件,将各种功能从业务流中切割出来单独写用例,肯定也会有涉及到整体流程的情况。若不加以区分,将细节与全局搅在一起,不仅思路混乱,也容易考虑不周。因此在系统测试阶段,建议用例设计要有分有合,针对具体功能的就只围着这个功能转:而在业务流程测试项中,再完全从整体的业务流角度出发去考虑用例,这样不仅不容易产生疏漏,用例阅读与执行也更清楚。

      (3)、某种特定情况下的系统运行

      这类用例的设计往往与系统实际业务情况密不可分。比如财务软件,通常需要在月尾一天、月头一天、年尾一天、年头一天,对所有相关功能中的日期处理进行测试;又比如WIN 2000环境开发测试的系统,要测试在98、XP、2003等操作系统下是否能运行自如;再有如存在大量动态图片视频等的网页,在普通网速下的展现速度等等。总之就是要尽可能从实际应用的角度出发考虑,来进行测试补充。

      (4)、其它相关系统

      即指在当前项目中直接使用的其它成果,包括公司自有的系统模块、组件、函数;以及购买或免费得到的一些功能组件。对这些内容需要预先与开发组长等讨论清楚,是否需要测试。若时间紧张或其它原因决定不测的,应在测试计划中说明。若需要测试的,则具体可根据实际情况来设计,可以是通过系统某个功能的测试来涉及,此时就不需要单独划分测试项;若相对比较独立的,也可以通过单独的测试项来对其专门进行测试。

      (5)、除功能测试外的其它测试类型

      包括可靠性、安全性、恢复性、配置安装测试等等,这些测试类型都是一个单独的测试项。

      所谓好的开始是成功的一半,保证测试项划分的完整、合理、正确,会直接影响到本次测试的成效。通常建议该阶段工作要花1-2天的时间来考虑,并要在测试过程中随着对软件的深入了解,不断进行调整补充。可千万不要认为把分析设计中的功能模型图搬搬过来就可以了。

  • 测试用例

    2008-5-23

    【摘要】  测试用例英文名叫Test case,测试用例是开展测试工作的重要一项,测试用例是否完善、质量高低以及执行的情况如何是影响软件测试结果的一个重要方面。可以说测试用例是软件测试中一个举足轻重的因素。本文就有关问题进行阐述。

        【关键词】测试用例

     

    概述

    测试用例(checklist),是关于具体测试步骤的文档,它描述了测试的输入参数、条件及配置、预期的输出结果等,以判断被测软件的工作是否正常。从表现形式上而言,测试用例可以是纯文本的说明文档,也可以是用脚本语言或高级语言编写的一段代码。

     

    测试用例文档由简介和测试用例两部分组成。简介部分编制测试目的、测试范围、定义术语以及测试背景等。测试用例部分逐一列示各测试用例,测试用例应当包括测试标识、测试用例名称、目标、测试条件、测试设置、输入数据要求、步骤、以及预期的结果等。

     

    好测试用例的特点

     

    1.完整

    完整性是对测试用例最基本的要求,尤其是一些基本功能项上,如果有遗漏,那将是不可原谅的。完整性还体现在中断测试、临界测试、压力测试、性能测试等方面,这方面测试用例也要能够涉及到。

     

    2.准确

    测试者按照测试用例的输入一步步测试完成后,要能够根据测试用例描述的输出得出正确的结论,不能出现模糊不清的语言。

     

    3.简洁  

    好的测试用例每一步都应该有响应的作用,有很强的针对性,不应该出现一些冗繁无用的操作步骤。测试用例不应该太简单,也不能够太过复杂,最大操作步骤最好控制在10-15步之间。

     

    4.清晰

         清晰包括描述清晰,步骤条理清晰,测试层次清晰(由简而繁,从基本功能测试到破坏性测试)。清晰简洁对测试用例编写者的逻辑思维和文字表达能力提出了较高的要求。

     

    5.可维护性

    由于软件开发过程中需求变更等原因的影响,常常需要对测试用例进行修改、增加、删除等,以便测试用例符合相应测试要求。测试用例应具备这方面的功能。

     

    6.适当性

    测试例应该适合特定的测试环境以及符合整个团队的测试水平,如纯英语环境下的测试用例最好使用英文编写。

     

    7.可复用性

       要求不同测试者在同样测试环境下使用同样测试用例都能得出相同结论。

     

    8.其他

    如可追朔性、可移植性也是对编写测试用例的一个要求。

     

    测试用例的编写

     

    首先,要充分搜集有关软件需求文档、软件规格等有关资料,充分了解软件的功能特点,在编写测试用例时按照完整准确、清晰简洁的原则,做到有的放矢。

     

    其次,一般而言,具体的测试用例在内容上都包括以下信息:用例编号、用例名称、测试等级、预置条件、操作步骤、预期输出、实际输出、注释等。这也是很多大公司的测试用例的都有包括这些方面内容。

     

    再者,如果有同类产品的测试用例、测试报告等,可以拿来进行参考,参考不是抄袭,而是对比发现自己设计测试用例的不完整之处,以便及时充实、弥补。尤其是开展自己不太熟悉的产品测试的时候,这样做尤为重要,这样可以避免测试用例编写的盲区。

     

    第四,编写测试用例时,应将常用测试方法,如临界测试、等值测试、中断测试等包含进来,这些方法技巧有助于发现更多潜在的问题。

     

    第五,测试用例要根据不同测试阶段有所差异,一套测试用例不应该用于不同阶段的测试,最好能够为不同测试阶段设计不同的测试用例。当然也可以在一套测试用例上进行有关标注,以便区别。

     

    编写测试例的常见错误

     

     (1)    单个测试例太长(一般不要超过15步);

    (2)    不完善,错误,或者杂乱无章的操作步骤.

    (3)    不清楚什么样的结果是通过和出错(要多熟悉软件需求以及软件规格);

    (4)    描述不清,测试员或者测试系统不清楚实际要测试的步骤及内容.

    (5)    不方便维护(添加,删除,更改等).

     

    其他相关问题

    1.用例评审

    测试用例编写完成后,最好做测试用例评审工作,测试用例的评审可以现在测试组内部进行,然后再进行正式评审,通常由开发代表、测试代表以及项目负责人进行,条件允许的情况下也可开展同行评审。测试用例评审是个很重要的一个环节,也是不太容易开展的一个环节。

     

    2.用例管理

       目前测试用例的管理工具很多,有TDBugfreeExcel等,不管哪种工具,只要适合自己就好。

     

    3.可以不写测试用例吗?

     

    有时候对于一些测试经验丰富的测试者而言,在进行一些小项目(一个人足以应付)的测试时,可能会觉得自己经验丰富,项目也小,根本用不着写测试用例。其实,这是个错误的想法,不管测试者经验如何丰富,项目多么小,测试用例该写还是一定要写的,要知道测试用例不光是给自己看的,也是给别人看的,同时也是公司积累有关文档资料所要求的。

  • 算命

    2008-2-13

    ◆成功五大建言:

    1.下定心,找份自己真正喜欢的工作

    2.为自己及同事创造愉快的工作环境。

    3.在工作表现上应采取主动。

    4.做任何事应要加强耐心及毅力。

    5.随时吸收新观念及新技术,充实自我学能。

    ◆失败五大因素:

    1.为了安全感而勉强做不喜欢的工作。

    2.过于固执而不知变通。

    3.喜欢要求别人照着你的方式来处理。

    4.缺乏改变,工作形成一种例行公事。

    5.承受太多工作压力而让自己太过于劳累

  • 测试用例设计白皮书--等价类划分方法

    2008-1-28

    Author: Vince     

    源:http://blog.csdn.net/vincetest 


    一.方法简介

    1.定义
      是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例。该方法是一种重要的,常用的黑盒测试用例设计方法。
       
    2.划分等价类:
      等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试,因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件就可以用少量代表性的测试数据取得较好的测试结果。等价类划分可有两种不同的情况:有效等价类和无效等价类。
      1)有效等价类
        是指对于程序的规格说明来说是合理的、有意义的输入数据构成的集合。利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能。
      2)无效等价类
        与有效等价类的定义恰巧相反。无效等价类指对程序的规格说明是不合理的或无意义的输入数据所构成的集合。对于具体的问题,无效等价类至少应有一个,也可能有多个。
      设计测试用例时,要同时考虑这两种等价类。因为软件不仅要能接收合理的数据,也要能经受意外的考验,这样的测试才能确保软件具有更高的可靠性。
      
    3.划分等价类的标准:
      1)完备测试、避免冗余;
      2)划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合;
      3)并是整个集合:完备性;
      4)子集互不相交:保证一种形式的无冗余性;
      5)同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到"相同的执行路径"。

    4.划分等价类的方法
      1)在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类。如:输入值是学生成绩,范围是0~100;


      2)在输入条件规定了输入值的集合或者规定了"必须如何"的条件的情况下,可确立一个有效等价类和一个无效等价类;
      3)在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类。
      4)在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类。
        例:输入条件说明学历可为:专科、本科、硕士、博士四种之一,则分别取这四种这四个值作为四个有效等价类,另外把四种学历之外的任何学历作为无效等价类。
      5)在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则);
      6)在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类。
     
    5.设计测试用例
      在确立了等价类后,可建立等价类表,列出所有划分出的等价类输入条件:有效等价类、无效等价类,然后从划分出的等价类中按以下三个原则设计测试用例:
      1)为每一个等价类规定一个唯一的编号;
      2)设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步,直到所有的有效等价类都被覆盖为止;
      3)设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步,直到所有的无效等价类都被覆盖为止。
     
    二.实战演习
    1.某程序规定:"输入三个整数 a 、 b 、 c 分别作为三边的边长构成三角形。通过程序判定所构成的三角形的类型,当此三角形为一般三角形、等腰三角形及等边三角形时,分别作计算 … "。用等价类划分方法为该程序进行测试用例设计。(三角形问题的复杂之处在于输入与输出之间的关系比较复杂。)
      分析题目中给出和隐含的对输入条件的要求:
      (1)整数    (2)三个数    (3)非零数   (4)正数  
      (5)两边之和大于第三边     (6)等腰     (7)等边
       如果 a 、 b 、 c 满足条件( 1 ) ~ ( 4 ),则输出下列四种情况之一:
       1)如果不满足条件(5),则程序输出为 " 非三角形 " 。
       2)如果三条边相等即满足条件(7),则程序输出为 " 等边三角形 " 。
       3)如果只有两条边相等、即满足条件(6),则程序输出为 " 等腰三角形 " 。
       4)如果三条边都不相等,则程序输出为 " 一般三角形 " 。
       列出等价类表并编号


       覆盖有效等价类的测试用例:
        a      b      c              覆盖等价类号码
        3      4      5             (1)--(7)
        4      4      5             (1)--(7),(8)
        4      5      5             (1)--(7),(9)   
        5      4      5             (1)--(7),(10)
        4      4      4             (1)--(7),(11)
       覆盖无效等价类的测试用例:


      


    2.设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的"日期检查功能"。
      1)划分等价类并编号,下表等价类划分的结果

    输入等价类
    有效等价类
    无效等价类
    日期的类型及长度
    ①6位数字字符
    ②有非数字字符
    ③少于6位数字字符
    ④多于6位数字字符
    年份范围
    ⑤在1990~2049之间
    ⑥小于1990
    ⑦大于2049
    月份范围
    ⑧在01~12之间
    ⑨等于00
    ⑩大于12

      2)设计测试用例,以便覆盖所有的有效等价类在表中列出了3个有效等价类,编号分别为①、⑤、⑧,设计的测试用例如下:
        测试数据    期望结果      覆盖的有效等价类
        200211      输入有效      ①、⑤、⑧
      3)为每一个无效等价类设计一个测试用例,设计结果如下:
        测试数据   期望结果     覆盖的无效等价类
        95June     无效输入          ②
        20036      无效输入          ③
        2001006   无效输入          ④
        198912     无效输入          ⑥
        200401     无效输入          ⑦
        200100     无效输入          ⑨
        200113     无效输入          ⑩
       
    3.NextDate 函数包含三个变量:month 、 day 和 year ,函数的输出为输入日期后一天的日期。 例如,输入为 2006年3月 7日,则函数的输出为 2006年3月8日 。要求输入变量 month 、 day 和 year 均为整数值,并且满足下列条件:
      ①1≤month≤12
      ②1≤day≤31
      ③1920≤year≤2050 
      1)有效等价类为:
        M1={月份:1≤月份≤12}
        D1={日期:1≤日期≤31}
        Y1={年:1812≤年≤2012}
      2)若条件 ① ~ ③中任何一个条件失效,则 NextDate 函数都会产生一个输出,指明相应的变量超出取值范围,比如 "month 的值不在 1-12 范围当中 " 。显然还存在着大量的 year 、 month 、 day 的无效组合, NextDate 函数将这些组合作统一的输出: " 无效输入日期 " 。其无效等价类为:
        M2={月份:月份<1}
        M3={月份:月份>12}
        D2={日期:日期<1}
        D3={日期:日期>31}
        Y2={年:年<1812}
        Y3={年:年>2012}
      弱一般等价类测试用例
      月份    日期       年               预期输出
       6       15        1912           1912年6月16日
      强一般等价类测试用例同弱一般等价类测试用例
      注:弱--有单缺陷假设;健壮--考虑了无效值
     
      (一)弱健壮等价类测试
      用例ID   月份  日期    年          预期输出
      WR1      6      15    1912      1912年6月16日
      WR2     -1     15    1912      月份不在1~12中
      WR3     13     15    1912      月份不在1~12中
      WR4      6      -1    1912      日期不在1~31中
      WR5      6      32    1912      日期不在1~31中
      WR6      6      15    1811      年份不在1812~2012中
      WR7      6      15    2013      年份不在1812~2012中

      (二)强健壮等价类测试
      用例ID   月份    日期      年          预期输出
      SR1       -1      15       1912      月份不在1~12中
      SR2        6      -1        1912      日期不在1~31中
      SR3        6      15       1811      年份不在1812~2012中
      SR4       -1      -1       1912      两个无效一个有效
      SR5        6      -1        1811      两个无效一个有效
      SR6       -1      15       1811      两个无效一个有效
      SR7       -1      -1       1811      三个无效
     
    4.佣金问题等价类测试用例,它是根据佣金函数的输出值域定义等价类,来改进测试用例集合。
    输出销售额≤1000元     佣金10%
    1000<销售额≤1800     佣金=100+(销售额-1000)*15%
    销售额>1800              佣金=220+(销售额-1800)*20%
    测试用例         枪机(45)    枪托(30)      枪管(25)          销售额     佣金
        1               5             5                5                  500        50
        2              15           15              15                 1500       175
        3              25           25              25                 2500       360
    根据输出域选择输入值,使落在输出域等价类内,可以结合弱健壮测试用例结合。

    相关文章:

      一、测试用例设计白皮书--测试用例基本概念

      二、测试用例设计白皮书--等价类划分方法

      三、测试用例设计白皮书--边界值分析方法

      四、测试用例设计白皮书--错误推测方法

      五、测试用例设计白皮书--因果图方法

      六、测试用例设计白皮书--判定表驱动分析方法

      七、测试用例设计白皮书--正交实验设计方法

      八、测试用例设计白皮书--功能图分析方法

      九、测试用例设计白皮书--场景设计方发

      十、测试用例设计白皮书--测试用例设计综合策略

     

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

    Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1475499

  • 正则表达式

    2008-1-22

    什么是正则表达式
    一个正则表达式,就是用某种模式去匹配一类字符串的一个公式。很多人因为它们看上去比较古怪而且复杂所以不敢去使用——很不幸,这篇文章也不能够改变这一点,不过,经过一点点练习之后我就开始觉得这些复杂的表达式其实写起来还是相当简单的,而且,一旦你弄懂它们,你就能把数小时辛苦而且易错的文本处理工作压缩在几分钟(甚至几秒钟)内完成。正则表达式被各种文本编辑软件、类库(例如Rogue Wave的tools.h++)、脚本工具(像awk/grep/sed)广泛的支持,而且像Microsoft的Visual C++这种交互式IDE也开始支持它了。

    我们将在如下的章节中利用一些例子来解释正则表达式的用法,绝大部分的例子是基于vi中的文本替换命令和grep文件搜索命令来书写的,不过它们都是比较典型的例子,其中的概念可以在sed、awk、perl和其他支持正则表达式的编程语言中使用。你可以看看不同工具中的正则表达式这一节,其中有一些在别的工具中使用正则表达式的例子。还有一个关于vi中文本替换命令(s)的简单说明附在文后供参考。
    正则表达式基础
    正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我们下面会给予解释。

    在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。例如,正则表达式"testing"中没有包含任何元字符,,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。

    要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。

    元字符     描述
      
    .
      匹配任何单个字符。例如正则表达式r.t匹配这些字符串:rat、rut、r t,但是不匹配root。
    $
      匹配行结束符。例如正则表达式weasel$ 能够匹配字符串"He's a weasel"的末尾,但是不能匹配字符串"They are a bunch of weasels."。
    ^
      匹配一行的开始。例如正则表达式^When in能够匹配字符串"When in the course of human events"的开始,但是不能匹配"What and When in the"。
    *
      匹配0或多个正好在它之前的那个字符。例如正则表达式.*意味着能够匹配任意数量的任何字符。
    \
      这是引用府,用来将这里列出的这些元字符当作普通的字符来进行匹配。例如正则表达式\$被用来匹配美元符号,而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符。
    [ ]
    [c1-c2]
    [^c1-c2]
      匹配括号中的任何一个字符。例如正则表达式r[aou]t匹配rat、rot和rut,但是不匹配ret。可以在括号中使用连字符-来指定字符的区间,例如正则表达式[0-9]可以匹配任何数字字符;还可以制定多个区间,例如正则表达式[A-Za-z]可以匹配任何大小写字母。另一个重要的用法是“排除”,要想匹配除了指定区间之外的字符——也就是所谓的补集——在左边的括号和第一个字符之间使用^字符,例如正则表达式[^269A-Z] 将匹配除了2、6、9和所有大写字母之外的任何字符。
    \< \>
      匹配词(word)的开始(\<)和结束(\>)。例如正则表达式\<the能够匹配字符串"for the wise"中的"the",但是不能匹配字符串"otherwise"中的"the"。注意:这个元字符不是所有的软件都支持的。
    \( \)
      将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
    |
      将两个匹配条件进行逻辑“或”(Or)运算。例如正则表达式(him|her) 匹配"it belongs to him"和"it belongs to her",但是不能匹配"it belongs to them."。注意:这个元字符不是所有的软件都支持的。
    +
      匹配1或多个正好在它之前的那个字符。例如正则表达式9+匹配9、99、999等。注意:这个元字符不是所有的软件都支持的。
    ?
      匹配0或1个正好在它之前的那个字符。注意:这个元字符不是所有的软件都支持的。
    \{i\}
    \{i,j\}
      匹配指定数目的字符,这些字符是在它之前的表达式定义的。例如正则表达式A[0-9]\{3\} 能够匹配字符"A"后面跟着正好3个数字字符的串,例如A123、A348等,但是不匹配A1234。而正则表达式[0-9]\{4,6\} 匹配连续的任意4个、5个或者6个数字字符。注意:这个元字符不是所有的软件都支持的。

    最简单的元字符是点,它能够匹配任何单个字符(注意不包括新行符)。假定有个文件test.txt包含以下几行内容:

          he is a rat
          he is in a rut
          the food is Rotten
          I like root beer

    我们可以使用grep命令来测试我们的正则表达式,grep命令使用正则表达式去尝试匹配指定文件的每一行,并将至少有一处匹配表达式的所有行显示出来。命令

          grep r.t test.txt

    在test.txt文件中的每一行中搜索正则表达式r.t,并打印输出匹配的行。正则表达式r.t匹配一个r接着任何一个字符再接着一个t。所以它将匹配文件中的rat和rut,而不能匹配Rotten中的Rot,因为正则表达式是大小写敏感的。要想同时匹配大写和小写字母,应该使用字符区间元字符(方括号)。正则表达式[Rr]能够同时匹配R和r。所以,要想匹配一个大写或者小写的r接着任何一个字符再接着一个t就要使用这个表达式:[Rr].t。

    要想匹配行首的字符要使用抑扬字符(^)——又是也被叫做插入符。例如,想找到text.txt中行首"he"打头的行,你可能会先用简单表达式he,但是这会匹配第三行的the,所以要使用正则表达式^he,它只匹配在行首出现的h。

    有时候指定“除了×××都匹配”会比较容易达到目的,当抑扬字符(^)出现在方括号中是,它表示“排除”,例如要匹配he ,但是排除前面是t or s的情性(也就是the和she),可以使用:[^st]he。

    可以使用方括号来指定多个字符区间。例如正则表达式[A-Za-z]匹配任何字母,包括大写和小写的;正则表达式[A-Za-z][A-Za-z]* 匹配一个字母后面接着0或者多个字母(大写或者小写)。当然我们也可以用元字符+做到同样的事情,也就是:[A-Za-z]+ ,和[A-Za-z][A-Za-z]*完全等价。但是要注意元字符+ 并不是所有支持正则表达式的程序都支持的。关于这一点可以参考后面的正则表达式语法支持情况。

    要指定特定数量的匹配,要使用大括号(注意必须使用反斜杠来转义)。想匹配所有100和1000的实例而排除10和10000,可以使用:10\{2,3\},这个正则表达式匹配数字1后面跟着2或者3个0的模式。在这个元字符的使用中一个有用的变化是忽略第二个数字,例如正则表达式0\{3,\} 将匹配至少3个连续的0。
    简单的例子

    这里有一些有代表性的、比较简单的例子。

    vi 命令  作用

    :%s/ */ /g  把一个或者多个空格替换为一个空格。
    :%s/ *$//  去掉行尾的所有空格。
    :%s/^/ /  在每一行头上加入一个空格。
    :%s/^[0-9][0-9]* //  去掉行首的所有数字字符。
    :%s/b[aeio]g/bug/g  将所有的bag、beg、big和bog改为bug。
    :%s/t\([aou]\)g/h\1t/g  将所有tag、tog和tug分别改为hat、hot和hug(注意用group的用法和使用\1引用前面被匹配的字符)。

    中级的例子(神奇的咒语)
    例1

    将所有方法foo(a,b,c)的实例改为foo(b,a,c)。这里a、b和c可以是任何提供给方法foo()的参数。也就是说我们要实现这样的转换:

    之前     之后
    foo(10,7,2)   foo(7,10,2)
    foo(x+13,y-2,10)   foo(y-2,x+13,10)
    foo( bar(8), x+y+z, 5)   foo( x+y+z, bar(8), 5)

    下面这条替换命令能够实现这一魔法:

          :%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g

    现在让我们把它打散来加以分析。写出这个表达式的基本思路是找出foo()和它的括号中的三个参数的位置。第一个参数是用这个表达式来识别的::\([^,]*\),我们可以从里向外来分析它:

    [^,]     除了逗号之外的任何字符
    [^,]*   0或者多个非逗号字符
    \([^,]*\)   将这些非逗号字符标记为\1,这样可以在之后的替换模式表达式中引用它
    \([^,]*\),   我们必须找到0或者多个非逗号字符后面跟着一个逗号,并且非逗号字符那部分要标记出来以备后用。

    现在正是指出一个使用正则表达式常见错误的最佳时机。为什么我们要使用[^,]*这样的一个表达式,而不是更加简单直接的写法,例如:.*,来匹配第一个参数呢?设想我们使用模式.*来匹配字符串"10,7,2",它应该匹配"10,"还是"10,7,"?为了解决这个两义性(ambiguity),正则表达式规定一律按照最长的串来,在上面的例子中就是"10,7,",显然这样就找出了两个参数而不是我们期望的一个。所以,我们要使用[^,]*来强制取出第一个逗号之前的部分。

    这个表达式我们已经分析到了:foo(\([^,]*\),这一段可以简单的翻译为“当你找到foo(就把其后直到第一个逗号之前的部分标记为\1”。然后我们使用同样的办法标记第二个参数为\2。对第三个参数的标记方法也是一样,只是我们要搜索所有的字符直到右括号。我们并没有必要去搜索第三个参数,因为我们不需要调整它的位置,但是这样的模式能够保证我们只去替换那些有三个参数的foo()方法调用,在foo()是一个重载(overoading)方法时这种明确的模式往往是比较保险的。然后,在替换部分,我们找到foo()的对应实例,然后利用标记好的部分进行替换,是的第一和第二个参数交换位置。
    例2
    假设有一个CSV(comma separated value)文件,里面有一些我们需要的信息,但是格式却有问题,目前数据的列顺序是:姓名,公司名,州名缩写,邮政编码,现在我们希望讲这些数据重新组织,以便在我们的某个软件中使用,需要的格式为:姓名,州名缩写-邮政编码,公司名。也就是说,我们要调整列顺序,还要合并两个列来构成一个新列。另外,我们的软件不能接受逗号前后面有任何空格(包括空格和制表符)所以我们还必须要去掉逗号前后的所有空格。

    这里有几行我们现在的数据:

          Bill Jones,     HI-TEK Corporation ,  CA, 95011
          Sharon Lee Smith,  Design Works Incorporated,  CA, 95012
          B. Amos   ,  Hill Street Cafe,  CA, 95013
          Alexander Weatherworth,  The Crafts Store,  CA, 95014
          ...

    我们希望把它变成这个样子:

          Bill Jones,CA 95011,HI-TEK Corporation
          Sharon Lee Smith,CA 95012,Design Works Incorporated
          B. Amos,CA 95013,Hill Street Cafe
          Alexander Weatherworth,CA 95014,The Crafts Store
          ...

    我们将用两个正则表达式来解决这个问题。第一个移动列和合并列,第二个用来去掉空格。

    下面就是第一个替换命令:

          :%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/

    这里的方法跟例1基本一样,第一个列(姓名)用这个表达式来匹配:\([^,]*\),即第一个逗号之前的所有字符,而姓名内容被用\1标记下来。公司名和州名缩写字段用同样的方法标记为\2和\3,而最后一个字段用\(.*\)来匹配("匹配所有字符直到行末")。替换部分则引用上面标记的那些内容来进行构造。

    下面这个替换命令则用来去除空格:

          :%s/[ \t]*,[ \t]*/,/g

    我们还是分解来看:[ \t]匹配空格/制表符,[ \t]* 匹配0或多个空格/制表符,[ \t]*,匹配0或多个空格/制表符后面再加一个逗号,最后,[ \t]*,[ \t]*匹配0或多个空格/制表符接着一个逗号再接着0或多个空格/制表符。在替换部分,我们简单的我们找到的所有东西替换成一个逗号。这里我们使用了结尾的可选的g参数,这表示在每行中对所有匹配的串执行替换(而不是缺省的只替换第一个匹配串)。
    例3
    假设有一个多字符的片断重复出现,例如:

        Billy tried really hard
        Sally tried really really hard
        Timmy tried really really really hard
        Johnny tried really really really really hard

    而你想把"really"、"really really",以及任意数量连续出现的"really"字符串换成一个简单的"very"(simple is good!),那么以下命令:

        :%s/\(really \)\(really \)*/very /

    就会把上述的文本变成:

        Billy tried very hard
        Sally tried very hard
        Timmy tried very hard
        Johnny tried very hard

    表达式\(really \)*匹配0或多个连续的"really "(注意结尾有个空格),而\(really \)\(really \)* 匹配1个或多个连续的"really "实例。
    困难的例子(不可思议的象形文字)
    Coming soon.

    不同工具中的正则表达式
    OK,你已经准备使用RE(regular expressions,正则表达式),但是你并准备使用vi。所以,在这里我们给出一些在其他工具中使用RE的例子。另外,我还会总结一下你在不同程序之间使用RE可能发现的区别。

    当然,你也可以在Visual C++编辑器中使用RE。选择Edit->Replace,然后选择"Regular expression"选择框,Find What输入框对应上面介绍的vi命令:%s/pat1/pat2/g中的pat1部分,而Replace输入框对应pat2部分。但是,为了得到vi的执行范围和g选项,你要使用Replace All或者适当的手工Find Next and Replace(译者按:知道为啥有人骂微软弱智了吧,虽然VC中可以选中一个范围的文本,然后在其中执行替换,但是总之不够vi那么灵活和典雅)。
    sed

    Sed是Stream EDitor的缩写,是Unix下常用的基于文件和管道的编辑工具,可以在手册中得到关于sed的详细信息。

    这里是一些有趣的sed脚本,假定我们正在处理一个叫做price.txt的文件。注意这些编辑并不会改变源文件,sed只是处理源文件的每一行并把结果显示在标准输出中(当然很容易使用重定向来定制):

    sed脚本     描述
      
    sed 's/^$/d' price.txt   删除所有空行
    sed 's/^[ \t]*$/d' price.txt   删除所有只包含空格或者制表符的行
    sed 's/"//g' price.txt   删除所有引号
    awk
    awk是一种编程语言,可以用来对文本数据进行复杂的分析和处理。可以在手册中得到关于awk的详细信息。这个古怪的名字是它作者们的姓的缩写(Aho,Weinberger和Kernighan)。

    在Aho,Weinberger和Kernighan的书The AWK Programming Language中有很多很好的awk的例子,请不要让下面这些微不足道的脚本例子限制你对awk强大能力的理解。我们同样假定我们针对price.txt文件进行处理,跟sed一样,awk也只是把结果显示在终端上。

    awk脚本     描述
      
    awk ' !~ /^$/' price.txt   删除所有空行
    awk 'NF > 0' price.txt   awk中一个更好的删除所有行的办法
    awk ' ~ /^[JT]/ ' price.txt   打印所有第二个字段是'J'或者'T'打头的行中的第三个字段
    awk ' !~ /[Mm]isc/ {print  + }' price.txt   针对所有第二个字段不包含'Misc'或者'misc'的行,打印第3和第4列的和(假定为数字)
    awk ' !~ /^[0-9]+\.[0-9]*$/ ' price.txt   打印所有第三个字段不是数字的行,这里数字是指d.d或者d这样的形式,其中d是0到9的任何数字
    awk ' ~ /John|Fred/ ' price.txt   如果第二个字段包含'John'或者'Fred'则打印整行
    grep
    grep是一个用来在一个或者多个文件或者输入流中使用RE进行查找的程序。它的name编程语言可以用来针对文件和管道进行处理。可以在手册中得到关于grep的完整信息。这个同样古怪的名字来源于vi的一个命令,g/re/p,意思是global regular expression print。

    下面的例子中我们假定在文件phone.txt中包含以下的文本,——其格式是姓加一个逗号,然后是名,然后是一个制表符,然后是电话号码:

          Francis, John           5-3871
          Wong, Fred              4-4123
          Jones, Thomas           1-4122
          Salazar, Richard        5-2522

    grep命令     描述
      
    grep '\t5-...1' phone.txt   把所有电话号码以5开头以1结束的行打印出来,注意制表符是用\t表示的
    grep '^S[^ ]* R' phone.txt   打印所有姓以S打头和名以R打头的行
    grep '^[JW]' phone.txt   打印所有姓开头是J或者W的行
    grep ', ....\t' phone.txt   打印所有姓是4个字符的行,注意制表符是用\t表示的
    grep -v '^[JW]' phone.txt   打印所有不以J或者W开头的行
    grep '^[M-Z]' phone.txt   打印所有姓的开头是M到Z之间任一字符的行
    grep '^[M-Z].*[12]' phone.txt   打印所有姓的开头是M到Z之间任一字符,并且点号号码结尾是1或者2的行
    egrep
    egrep是grep的一个扩展版本,它在它的正则表达式中支持更多的元字符。下面的例子中我们假定在文件phone.txt中包含以下的文本,——其格式是姓加一个逗号,然后是名,然后是一个制表符,然后是电话号码:

          Francis, John           5-3871
          Wong, Fred              4-4123
          Jones, Thomas           1-4122
          Salazar, Richard        5-2522

    egrep command     Descrīption
      
    egrep '(John|Fred)' phone.txt   打印所有包含名字John或者Fred的行
    egrep 'John|22$|^W' phone.txt   打印所有包含John 或者以22结束或者以W的行
    egrep 'net(work)?s' report.txt   从report.txt中找到所有包含networks或者nets的行
    正则表达式语法支持情况
    命令或环境  .  [ ]  ^  $  \( \)  \{ \}  ?  +  |  ( )
    vi   X    X    X    X    X               
    Visual C++   X    X    X    X    X               
    awk   X    X    X    X          X    X    X    X
    sed   X    X    X    X    X    X            
    Tcl   X    X    X    X    X       X    X    X    X
    ex   X    X    X    X    X    X            
    grep   X    X    X    X    X    X            
    egrep   X    X   X    X    X       X    X    X    X
    fgrep   X    X    X    X    X               
    perl   X   X   X   X   X      X   X   X   X


    vi替换命令简介
    Vi的替换命令:

          :ranges/pat1/pat2/g

    其中

          : 这是Vi的命令执行界面。

          range 是命令执行范围的指定,可以使用百分号(%)表示所有行,使用点(.)表示当前行,使用美元符号($)表示最后一行。你还可以使用行号,例如10,20表示第10到20行,.,$表示当前行到最后一行,.+2,$-5表示当前行后两行直到全文的倒数第五行,等等。

          s 表示其后是一个替换命令。

          pat1 这是要查找的一个正则表达式,这篇文章中有一大堆例子。

          pat2 这是希望把匹配串变成的模式的正则表达式,这篇文章中有一大堆例子。

          g 可选标志,带这个标志表示替换将针对行中每个匹配的串进行,否则则只替换行中第一个匹配串。

    网上有很多vi的在线手册,你可以访问他们以获得更加完整的信息。

    [回到主页]


    目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。
    正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。

    2. 正则表达式的历史
    正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
    1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。
    随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。
    如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分

    3. 正则表达式定义
    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。
    列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。
    正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

    3.1 普通字符
    由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。

    3.2 非打印字符 字符 含义
    \cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
    \f 匹配一个换页符。等价于 \x0c 和 \cL。
    \n 匹配一个换行符。等价于 \x0a 和 \cJ。
    \r 匹配一个回车符。等价于 \x0d 和 \cM。
    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
    \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
    \t 匹配一个制表符。等价于 \x09 和 \cI。
    \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。

    3.3 特殊字符
    所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。

    特别字符 说明
    $ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。
    ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
    * 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
    + 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
    . 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。
    [ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
    ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。
    \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。
    ^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
    { 标记限定符表达式的开始。要匹配 {,请使用 \{。
    | 指明两项之间的一个选择。要匹配 |,请使用 \|。
    构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

    3.4 限定符
    限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或或{n,}或{n,m}共6种。
    *、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
    正则表达式的限定符有:

    字符 描述
    * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
    + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
    ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。
    n 是一个非负整数。匹配确定的 n 次。例如,'o' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
    {n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
    {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

    3.5 定位符
    用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。

    3.6 选择
    用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
    其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

    3.7 后向引用
    对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
    可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。
  • 半年了,还在初始阶段

    2008-1-15

    到今天为止,做测试有半年的时间了,当初一个偶然的机会,让我这个对软件测试一无所知的人走了了软件测试这一岗位。虽然对测试的很多东西有了入门的认识,但自己的确还是停要初始阶段。初始并不一仅是指技术,对一个从毕业后对IT没有半点接触的人来说,半年的时间也不可能有多大的飞跃。可是半年了一直还在迷茫,整天想著要多学点东西,可是不知从何学起,也许是不知道的太多了吧。没有个目标,所以学习起来三天打鱼两天晒网。别人说我可能不适合做测试,像我这样的我觉得可能不适合做任何工作,再这样下去总会被社会淘汰。也曾考虑过换个工作换个环境,因為这里实在太闲了,太懒散了。可是自己没有信心出去找工作,像我这样没技术也没什么能力的能找到什么样的工作呢?不过还是投简历了,虽然收到的答复少得可怜,但至少我要出去看一下,自己离一个测试人员的距离有多远。明天有个面试,希望能有收获...

  • 軟件測試面試題(轉)

    2008-1-11

    面试题目:51Testing软件测试网R8L%dPk&M OD"Ao
    01. 为什么要在一个团队中开展测试\" target=_blank>软件测试工作
    oydGr%K;v1['B}L130362因为没有经过测试的软件很难在发布之前知道该软件的质量,就好比ISO质量认证一样,测试同样也需要质量的保证,这个时候就需要在团队中开展软件测试的工作。在测试的过程发现软件中存在的问题,及时让开发人员得知并修改问题,在即将发布时,从测试报告中得出软件的质量情况。
    L|2JB#{o13036202. 您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?
    v7NE2lb/T@4Q%V130362我曾经做过web测试,后台测试,客户端软件,其中包括功能测试性能测试,用户体验测试。最擅长的是功能测试
    x.nD\+nq"?13036203. 您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同04. 的测试类型的区别与联系(如功能测试、性能测试……)51Testing软件测试网;oo^,[i@ L#z
    测试类型有:功能测试,性能测试,界面测试。
    oo o?+@ c/?p130362功能测试在测试工作中占的比例最大,功能测试也叫黑盒测试。是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。采用黑盒技术设计测试用例的方法有:等价类划分、边界值分析、错误推测、因果图和综合策略。
    7Cq1u/d_ d$b130362性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。51Testing软件测试网Sm%{x)u Z
    界面测试,界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。51Testing软件测试网ETi,t'e
    区别在于,功能测试关注产品的所有功能上,要考虑到每个细节功能,每个可能存在的功能问题。性能测试主要关注于产品整体的多用户并发下的稳定性和健壮性。界面测试更关注于用户体验上,用户使用该产品的时候是否易用,是否易懂,是否规范(快捷键之类的),是否美观(能否吸引用户的注意力),是否安全(尽量在前台避免用户无意输入无效的数据,当然考虑到体验性,不能太粗鲁的弹出警告)?做某个性能测试的时候,首先它可能是个功能点,首先要保证它的功能是没问题的,然后再考虑该功能点的性能测试51Testing软件测试网Dq0Em8^cVtM0n
    05.  请试着比较一下黑盒测试白盒测试单元测试集成测试系统测试、的区别与联系。
    8Z5p'l*N2W+Jv|8[ J130362黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。
    /s;a6i^B3y9V130362白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。51Testing软件测试网 O4V1I,Z}0TXI#O
      软件的黑盒测试意味着测试要在软件的接口处进行。这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试。黑盒测试主要是为了发现以下几类错误:
    }'{4OPs&j\Qz.Y1303621、是否有不正确或遗漏的功能?
    0];Fd$Q,tx1303622、在接口上,输入是否能正确的接受?能否输出正确的结果?51Testing软件测试网q6PMQdm8y1F:Kf#d
    3、是否有数据结构错误或外部信息(例如数据文件)访问错误?51Testing软件测试网{yX~,C%G-vn8i]
    4、性能上是否能够满足要求?51Testing软件测试网F4?}y w.G
    5、是否有初始化或终止性错误?51Testing软件测试网4dk$[.urn"e }[.c
      软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查:51Testing软件测试网r5n4~Q XA6W
    1、对程序模块的所有独立的执行路径至少测试一遍。
    k e ng}QC2o S1303622、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。51Testing软件测试网9n5m!~8L2|/M Fu`-f
    3、在循环的边界和运行的界限内执行循环体。
    dH~Hkx1303624、测试内部数据结构的有效性,等等。
    "VGm*Tih130362单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。
    eOz+J9i'?8@130362      单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。51Testing软件测试网6}AV)^Ohw9K3r'~:o B
    集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。51Testing软件测试网lb&TF,e*x@
    系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。(常见的联调测试)51Testing软件测试网Ysu3O ?
           系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并且遵循系统设计。51Testing软件测试网c!R^\)H
    验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。
    [:w loh6m W&FQi130362验收测试是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。
    1\!hG#mL\QY13036206. 测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?
    /Rkqj h6uv}130362软件测试计划是指导测试过程的纲领性文件,包含了产品概述、测试策略、测试方法、测试区域、测试配置、测试周期、测试资源、测试交流、风险分析等内容。借助软件测试计划,参与测试的项目成员,尤其是测试管理人员,可以明确测试任务和测试方法,保持测试实施过程的顺畅沟通,跟踪和控制测试进度,应对测试过程中的各种变更。
    c3i7tAvl!G~130362测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。所以其中最重要的是测试测试策略和测试方法(最好是能先评审)
    O.y*wE&t13036207. 您认为做好测试计划工作的关键是什么?
    ;Fk6n5lT$M(A*[2Ph1303621. 明确测试的目标,增强测试计划的实用性51Testing软件测试网RT-ab7ih}[ a
    编写软件测试计划得重要目的就是使测试过程能够发现更多的软件缺陷,因此软件测试计划的价值取决于它对帮助管理测试项目,并且找出软件潜在的缺陷。因此,软件测试计划中的测试范围必须高度覆盖功能需求,测试方法必须切实可行,测试工具并且具有较高的实用性,便于使用,生成的测试结果直观、准确
    4c+`z&x u2e!p O1303622.坚持“5W”规则,明确内容与过程51Testing软件测试网iVS-Uuy|l&@
    “5W”规则指的是“What(做什么)”、“Why(为什么做)”、“When(何时做)”、“Where(在哪里)”、“How(如何做)”。利用“5W”规则创建软件测试计划,可以帮助测试团队理解测试的目的(Why),明确测试的范围和内容(What),确定测试的开始和结束日期(When),指出测试的方法和工具(How),给出测试文档和软件的存放位置(Where)。
    h)ijU5nx;h M+sN1303623.采用评审和更新机制,保证测试计划满足实际需求51Testing软件测试网1Y'XSOz%P"L8{MF/~
    测试计划写作完成后,如果没有经过评审,直接发送给测试团队,测试计划内容的可能不准确或遗漏测试内容,或者软件需求变更引起测试范围的增减,而测试计划的内容没有及时更新,误导测试执行人员。51Testing软件测试网`4e Wh)NN&]/y!q1o)L
    4. 分别创建测试计划与测试详细规格、测试用例51Testing软件测试网 f4v#iK?$ezlt
    应把详细的测试技术指标包含到独立创建的测试详细规格文档,把用于指导测试小组执行测试过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。
    2Ka0b9b:O \ W'G~ a13036208. 您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。51Testing软件测试网C(p,R R1W J
    1.等价类划分
    bQMcUw9z-biZ ~130362划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类.
    o9rb]"U(?F1303622.边界值分析法
    m3g `0k.aJ/z @130362  边界值分析方法是对等价类划分方法的补充。测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.51Testing软件测试网 hw X-\~2]vz
      使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.
    Nge'Gr$V#^1303623.错误推测法51Testing软件测试网 \1J#b\g'Be'M
      基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法.51Testing软件测试网/n'ZDw"kT
      错误推测方法的基本思想: 列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例. 例如, 在单元测试时曾列出的许多在模块中常见的错误. 以前产品测试中曾经发现的错误等, 这些就是经验的总结. 还有, 输入数据和输出数据为0的情况. 输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况. 可选择这些情况下的例子作为测试用例.51Testing软件测试网s+H4N&CE
    4.因果图方法
    "I9f.t.v7C!y130362  前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例. 这就需要利用因果图(逻辑模型). 因果图方法最终生成的就是判定表. 它适合于检查程序输入条件的各种组合情况. 51Testing软件测试网X}R&Xv
    08.您认为做好测试用例设计工作的关键是什么?51Testing软件测试网N'~3d3WcsP
    白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果51Testing软件测试网a"]5](gJ8?4{
    黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题
    Ff9o9|_ CR13036209. 请以您以往的实际工作为例,10. 详细的描述一次测试用例设计的完整的过程。
    /j@ Kh^z$Xz.{;a130362就说最近的这次网站功能的测试吧
    g y S:L?*yY130362首先:得到相关文档(需求文档和设计文档),理解需求和设计设计思想后,想好测试策略(测试计划简单点就OK了),考虑到测试环境,测试用例,测试时间等问题。51Testing软件测试网_ N!tR'ww d$D'Ap
    第二步:设计测试用例,测试策略是:把网站部分的功能点测试完,然后在进行系统测试(另外个模块呢有另一个测试人员负责,可以进行联调测试),网站模块的测试基本是功能测试和界面测试(用户并发的可能性很小,所以不考虑):这次的网站的输入数据呢是使用数据库中的某张表记录,如果表中某一数据记录中新加进来的(还没有被处理的,有个标志位),网站启动后会立刻去刷那张表,得到多条数据,然后在进行处理。处理过程中,会经历3个步骤,网站才算完成了它的任务。有3个步骤呢,就可以分别对这3个步骤进行测试用例的设计,尽量覆盖到各种输入情况(包括数据库中的数据,用户的输入等),得出了差不多50个用例。界面测试,也就是用户看的到的地方,包括发送的邮件和用户填写资料的页面展示。
    o%T_)K5l _130362第三步:搭建测试环境(为什么这个时候考虑测试环境呢?因为我对网站环境已经很熟了,只有有机器能空于下来做该功能测试就可以做了),因为网站本身的环境搭建和其他的系统有点不同,它需要的测试环境比较麻烦,需要web服务器(Apache,tomcat),不过这次需求呢,网站部分只用到了tomcat,所以只要有tomcat即可
    7l5I5` a!C8{130362第四步:执行测试
    S1X;T?jD13036211. 您以往是否曾经从事过性能测试工作?如果有,12. 请尽可能的详细描述您以往的性能测试工作的完整过程。51Testing软件测试网B cM2lLP+]3x0?[
    是的,曾经做过网站方面的性能测试,虽然做的时间并不久(2个月吧),当时呢,是有位网站性能测试经验非常丰富的前辈带着我一起做。
    -HYMPF7o130362性能测试类型包括负载测试,强度测试,容量测试等
    g R?k2` P HQQF130362      负载测试:负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。51Testing软件测试网M;~i6d-NDAm
          强度测试: 强度测试是一种性能测试,他在系统资源特别低的情况下软件系统运行情况。51Testing软件测试网 Hx%a#y2s&lY
          容量测试:确定系统可处理同时在线的最大用户数   51Testing软件测试网 T&I+m?1l~:g
    在网站流量逐渐加大的情况下,开始考虑做性能测试了,首先要写好性能测试计划,根据运营数据得出流量最大的页面(如果是第一次的话,一般是首页,下载页,个人帐户页流量最大,而且以某种百分比),
    D)xH5JnV130362Web服务器指标指标:51Testing软件测试网*?8d)[:Ch
    * Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数;
    p]F8QxIc3Z130362* Successful Rounds:成功的请求;
    "zDQU#x,Pc%YK?130362* Failed Rounds :失败的请求; 51Testing软件测试网:u%Y`7NE#}
    * Successful Hits :成功的点击次数; 51Testing软件测试网0_3Yv&Z5j
    * Failed Hits :失败的点击次数;
    )j;H I CM*Z| ^_130362* Hits Per Second :每秒点击次数; 51Testing软件测试网5F-N$Z8wV
    * Successful Hits Per Second :每秒成功的点击次数;
    8@5k"Q8HY/u T.K130362* Failed Hits Per Second :每秒失败的点击次数; 51Testing软件测试网.fF)x)`n+A1G$D+k0jmo
    * Attempted Connections :尝试链接数;

    13. 您在从事性能测试工作时,14. 是否使用过一些测试工具?如果有,15. 请试述该工具的工作原理,16. 并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。51Testing软件测试网ayv3N6P-u Nj5kF%a/E_
    17. 您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?
    6a"WtL0cC;V13036218. 在您以往的工作中,19. 一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?
    %S@ z*kB?x.Id13036220. 您以往所从事的软件测试工作中,21. 是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,22. 请结合该工具描述软件缺陷(Bug)跟踪管理的流程。
    Fn*KK#f'DG5T13036223. 您认为在测试人员同24. 开发人员的沟通过程中,25. 如何提高沟通的效率和改善沟通的效果?维持测试人员同26. 开发团队中其他成员良好的人际关系的关键是什么?
    jF!E7NDa13036227. 在您以往的测试工作中,28. 最让您感到不29. 满意或者不30. 堪回首的事情是什么?您是如何来对待这些事情的?51Testing软件测试网j1yE$P0Y0B#{z8S? z
    31. 在即将完成这次笔试前,32. 您是否愿意谈一些自己在以往的学习和工作中获得的工作经验和心得体会?(可以包括软件测试、过程改进、软件开发或者与此无关的其他方面)
    s0b^#T$@a13036233.     你对测试最大的兴趣在哪里?为什么?51Testing软件测试网*M'f,y(S7M6ct/H-J
    最大的兴趣就是测试有难度,有挑战性!做测试越久越能感觉到做好测试有多难。曾经在无忧测试网上看到一篇文章,是关于如何做好一名测试工程师。一共罗列了11,12点,有部分是和人的性格有关,有部分需要后天的努力。但除了性格有关的1,2点我没有把握,其他点我都很有信心做好它。
    .A5Ms|M4{%v130362刚开始进入测试行业时,对测试的认识是从无忧测试网上了解到的一些资料,当时是冲着做测试需要很多技能才能做的好,虽然入门容易,但做好很难,比开发更难,虽然当时我很想做开发(学校专业课我基本上不缺席,因为我喜欢我的专业),但看到测试比开发更难更有挑战性,想做好测试的意志就更坚定了。
    6fsBi \@T x130362不到一年半的测试工作中,当时的感动和热情没有减退一点(即使环境问题以及自身经验,技术的不足,做测试的你一定也能理解)。
    A"K})za130362我觉得做测试整个过程中有2点让我觉得很有难度(对我来说,有难度的东西我就非常感兴趣),第一是测试用例的设计,因为测试的精华就在测试用例的设计上了,要在版本出来之前,把用例写好,用什么测试方法写?(也就是测试计划或测试策略),如果你刚测试一个新任务时,你得花一定的时间去消化业务需求和技术基础,业务需求很好理解(多和产品经理和开发人员沟通就能达到目的),而技术基础可就没那么简单了,这需要你自觉的学习能力,比如说网站吧,最基本的技术知识你要知道网站内部是怎么运作的的,后台是怎么响应用户请求的?测试环境如何搭建?这些都需要最早的学好。至少在开始测试之前能做好基本的准备,可能会遇到什么难题?需求细节是不是没有确定好?这些问题都能在设计用例的时候发现。51Testing软件测试网AK+B#H-c%o h0S0b)g%b
    第二是发现BUG的时候了,这应该是测试人员最基本的任务了,一般按测试用例开始测试就能发现大部分的bug,还有一部分bug需要测试的过程中更了解所测版本的情况获得更多信息,补充测试用例,测试出bug。还有如何发现bug?这就需要在测试用例有效的情况下,通过细心和耐心去发现bug了,每个用例都有可能发现bug,每个地方都有可能出错,所以测试过程中思维要清晰(测试过程数据流及结果都得看仔细了,bug都在里面发现的)。如何描述bug也很有讲究,bug在什么情况下会产生,如果条件变化一点点,就不会有这个bug,以哪些最少的操作步骤就能重现这个bug,这个bug产生的规律是什么?如果你够厉害的话,可以帮开发人员初步定位问题。
    j+Z;I7jy)q#` I13036234. 你的测试职业发展是什么?
    +xYr$V)o*G2K130362测试经验越多,测试能力越高。所以我的职业发展是需要时间累积的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年累积测试经验,按如何做好测试工程师的11,12点要求自己,不断的更新自己改正自己,做好测试任务。51Testing软件测试网B2yD0~O!_;C
    35. 你自认为测试的优势在哪里?
    7ag"S9Lt130362优势在于我对测试坚定不移的信心和热情,虽然经验还不够,但测试需要的基本技能我有信心在工作中得以发挥。
    +O~MOqb13036236. 你以前工作时的测试流程是什么?51Testing软件测试网+\N%pb xXi
    公司对测试流程没有规定如何做,但每个测试人员都有自己的一套测试流程。我说下我1年来不断改正(自己总结,吸取同行的方法)后的流程吧。需求评审(有开发人员,产品经理,测试人员,项目经理)->需求确定(出一份确定的需求文档)->开发设计文档(开发人员在开始写代码前就能输出设计文档)->想好测试策略,写出测试用例->发给开发人员和测试经理看看(非正式的评审用例)->接到测试版本->执行测试用例(中间可能会补充用例)->提交bug(有些bug需要开发人员的确定(严重级别的,或突然发现的在测试用例范围之外的,难以重现的),有些可以直接录制进TD)->开发人员修改(可以在测试过程中快速的修改)->回归测试(可能又会发现新问题,再按流程开始跑)。51Testing软件测试网 nc4JO(oU5q q$q$CVr
    37. 当开发人员说不38. 是BUG时,39. 你如何应付?51Testing软件测试网Ow;~DuO\ mG
    开发人员说不是bug,有2种情况,一是需求没有确定,所以我可以这么做,这个时候可以找来产品经理进行确认,需不需要改动,3方商量确定好后再看要不要改。二是这种情况不可能发生,所以不需要修改,这个时候,我可以先尽可能的说出是BUG的依据是什么?如果被用户发现或出了问题,会有什么不良结果?程序员可能会给你很多理由,你可以对他的解释进行反驳。如果还是不行,那我可以给这个问题提出来,跟开发经理和测试经理进行确认,如果要修改就改,如果不要修改就不改。其实有些真的不是bug,我也只是建议的方式写进TD中,如果开发人员不修改也没有大问题。如果确定是bug的话,一定要坚持自己的立场,让问题得到最后的确认。51Testing软件测试网$l8FhrXrf\
    23.你为什么想离开目前的职务?
    3E F.o)a%Y8k;Ji{130362因为公司运作情况并不理想,公司需要调整部门体系,公司考虑到缩减部门人员,所以大批量的裁员(有6,7个),这是我的第一份工作,对公司也有较深的感情,因为在这里我找到了职业理想(就是测试),所以公司需要精简人员,我自愿退出。虽然很舍不得,但我将会有新的发挥能力的舞台。51Testing软件测试网fFz}t1Az
      24:你对我们公司了解有多少?

      25:你找工作时,最重要的考虑因素为何?51Testing软件测试网a kw7o1D B;D
    工作的性质和内容是否能让我发挥所长,并不断成长。51Testing软件测试网,j9et1E6N(ExNa%A
    26:为什么我们应该录取你?51Testing软件测试网Jo!M'DV4uc
    您可以由我过去的工作表现所呈现的客观数据,明显地看出我全力以赴的工作态度。51Testing软件测试网ze/XL c[,O qz
      27:请谈谈你个人的最大特色。51Testing软件测试网ai'A&\8j6A9]
    我的坚持度很高,事情没有做到一个令人满意的结果,绝不罢手。
    -M%S-\O e;V OO13036228.白箱测试和黑箱测试是什么?什么是回归测试?
    Aw+S c,Ww+y|:`q^130362    29。单元测试、集成测试、系统测试的侧重点是什么?
    v GLP)B#R Xv130362    30。设计用例的方法、依据有那些?
    OR0V,jngExcW130362    31。一个测试工程师应具备那些素质和技能?
    Pr3x:Yk X#Gg"]#L9U130362    32.集成测试通常都有那些策略?
    G#M[:Pz$u6WS'I130362    33.你用过的测试工具的主要功能、性能及其他?51Testing软件测试网4z_g*x J9l
        34.一个缺陷测试报告的组成
    (eW/d#C)S-X8O&`130362    35.基于WEB信息管理系统测试时应考虑的因素有哪些?
    *D*Lv`Sj13036236.软件测试项目从什么时候开始,?为什么?
    D*a,Tr`C130362     37.需求测试注意事项有哪些?51Testing软件测试网VP0J$[G HM
         38.简述一下缺陷的生命周期
    8o7Ohgg2]IM130362     39.测试分析测试用例注意(事项)?51Testing软件测试网+F*g8m3e#E
    你在你所在的公司是怎么开展测试工作的?是如何组织的?51Testing软件测试网0C!_U| D\!y9M
    你认为理想的测试流程是什么样子?
    1t?;Ia7W zqu:V'O130362你是怎样工作的?
    }X!mtejY~']130362软件测试活动的生命周期是什么?51Testing软件测试网0[.__ oCw"S"~
    请画出软件测试活动的流程图?51Testing软件测试网t@Z%wY+@
    针对缺陷采取怎样管理措施?51Testing软件测试网$NCVyo m:V9e
    什么是测试评估?测试评估的范围是什么?
    )Y0u!ii9m3f*w-i*[&n130362如果能够执行完美的黑盒测试,还需要进行白盒测试吗?为什么?51Testing软件测试网'SW*cM lB/]$x
    测试结束的标准是什么?51Testing软件测试网+R UN"x~$~i
    软件验收测试除了alpha,beta测试以外,还有哪一种?51Testing软件测试网%o9Oe9l1TbvA}
    做测试多久了?51Testing软件测试网8TtQH'Y7UhI7`
    以前做过哪些项目?
    6L#tWa#w130362你们以前测试的流程是怎样的?
    1p5c&e-RZ.[q W130362<答:测试计划-测试用例设计-测试执行-测试分析报告>
    L&D u[!H130362用过哪些测试工具?
    4K9y+x{5mO?130362为什么选择测试这行?51Testing软件测试网 }5_nSJR$b6JR
    <答:它是一个新兴的行业,有发展潜力,而且很锻炼人,需要掌握更多的技能,比做开发要更难>51Testing软件测试网3\C)y#}.M-`K"r6OC#\
    为什么值得他们公司雇用?
    4T7ur6\9p7v130362如果我雇用你,你能给部门带来什么贡献?51Testing软件测试网u&K2Pd |
    如何从工作中看出你是个自动自觉的人
    *y-EC%roz-cSg130362你的工作通常能在时限内完成吗.(我想问一下就是她问这个问题的动机是什么)51Testing软件测试网 k$Q5?%k8H
    通常你对于别人批评你会有什么样的反应51Testing软件测试网4vE"G:E8w
    如果明知这样做不对,你还会依主管的指过去做吗51Testing软件测试网