2005年08月18日

高手过招的乐趣

—测试用例预演

作者:关河
        摘要:高手过招,手中无需用剑,只要轻描淡写地以口代手,三两句话便高下立判,胜者胜得痛快,输者也输得潇洒。然而,除了在武侠小说之内,恐怕很难有地方让你感受到这种“会当凌绝顶”的痛快。本文根据作者在测试工作中的体会,提出了一种被称为“测试用例预演”的方法,用模拟的测试用例执行发现程序中潜在的问题,这种方法究竟有何神奇呢?请见内文。
        武侠小说中的高手大抵有三个层次,第一个级别是“静若处子,动如脱兔,身负成名绝技”的高手,印象中这一个级别的基本是杀手或是性情豪爽的江湖侠客,这种人一旦遇到,打杀的场面最为宏伟,刀枪之声不绝,各出奇招,直到一方倒地或是被制;第二个级别是“落叶飞花,片叶支花均可伤人”的高手,这个级别的高手相遇,少了宏伟的场面,却在看似不经意的凝重中展开残酷的厮杀,胜负只在一念之间;第三个级别的高手寥寥无几,多是成名已久、文武双修的名宿,已至“手中无刀,心中无刀”的最高境界,这种高手若是过招,全不闻金戈之声,全无杀伐之意,轻描淡写的以口代手,三两句话便高下立判,赢的赢得痛快,输的输得潇洒,在武侠中看到此,常不免心潮澎湃,艳羡不已,巴不得自己也能有这个机会一尝绝顶高手之间的这种至高默契。可惜身为开发或是测试工程师,又出生在这个真实的世界,恐怕实在是不太会有机会领会这种至高的境界。
        所幸,我们虽不能飞进武侠小说尝试这种生活,却能在我们的测试工作中体会到这种乐趣。真耶?假耶?且与我一起,探究个究竟。
        回到我们的题目“高手过招的乐趣 —— 测试用例预演”,这里我要提出的是一种可以让你体会到高手过招乐趣的方法:“测试用例预演”。且慢试图在头脑中搜索你对这种方法的印象,因为这是我自创的名词(申明:如果很不幸你通过其他途径确实听到或是见过这种描述,请一定告知本人,本人会慎重考虑,至少到目前为止,我还能有把握地说这是我首先命名和以正式文档描述的一种方法)。之所以把这种算不上十分复杂的方法写下来,是因为本人在实际的工作中发现该方法确实能起到比较大的作用,而且更重要的是,那种高手过招的感觉,很希望能和更多有高手梦的朋友能够感受得到。
        测试用例预演是一种非正式的测试用例执行方法,概括说来,这种方法是无需通过测试用例的真正执行(静态或是动态执行),而只需要开发人员和测试人员之间的口头交流,就能发现被测系统中存在的问题。设想一下,无需动手(测试执行),通过以口代手(开发和测试人员之间的口头交流),就能实现我们的目标(发现缺陷),这不是高手过招是什么?
l     测试用例预演的一般步骤是:
        测试工程师与开发工程师以某种方式坐在一起,进入交流状态,这个过程中需要尽可能避免干扰,比较好的时机是坐在一起进餐的时候;
        测试工程师根据测试用例进行提问,甚至可以临时扩展测试用例,但要注意三点:
        1). 不要偏离测试用例太远,以免偏离实际的业务;
        2).可以考虑一些在测试用例中没有明确写明的异常情况处理;
        3).提问的方式是“如果我这么操作,你的系统会如何反应?”;
        开发工程师根据测试工程师的问题,做出应答,对每个问题都只需要回答系统的响应即可,不需要描述具体的实现方法;
        测试工程师仔细聆听开发工程师的回答,需要对开发工程师的答复敏锐反应,不放过任何一个开发人员的迟疑,对拿不准的问题应该记录并需要马上验证;
        双方继续预演直到预期的预演时间结束或是有一方感到疲倦;
        记录预演过程中发现的问题到缺陷跟踪库。
        当然,要说明的是,参与交流的开发和测试工程师不是比武双方,真正的敌人只有一个:系统的缺陷,这点务必要牢记,以免弄错了对手,伤了和气。
        测试用例预演不是一种复杂的方法,但根据我的经验,要想在实际工作中应用这种方法并取得较好的效果,必须了解这种方法的适用范围,遵循一定的使用方法,并需要注意一定的技巧。这里我以FAQ的方式提供秘笈一部,各位请留意:
        Q:测试用例预演可以取代测试执行吗?
        A:这个问题是我捏造出来的,我想大概不会有人真的这么认为:),不过在这个问题的回答中,我希望能尽可能准确地描述测试用例预演方法的适用范围:如前面所提到的,测试用例预演是一种“虚拟”的测试用例执行方法,因为主要是通过口头交互的形式,也就限制了该方法适用的深度,一般来说,针对业务逻辑的较为直观的用例可以采用这样的方法,尤其是那些涉及大量用户复杂交互的用例,采用这种方法非常有效,测试工程师模拟用户或是设备提出各种可能的正常异常情况,很容易发现程序处理中的漏洞。但是,对于那些需要涉及大量地层处理的用例,测试工程师一般不太可能对其机制了解得十分清晰,因此采用这种方式也很难发现问题。
        Q:测试用例预演可以在哪些场合下使用?
        A:测试用例预演的应用场合没有特殊要求,但至少要保证是一个适合双人沟通的场合,没有过多的被打扰,双方都处在能积极思考的状态,这样就可以了。根据我的经验,一起就餐、双方暂时没有明确的工作内容,或是在对设计进行非正式评审的时候是一个比较好的时机,但还要充分考虑双方的喜好,譬如,有人不喜欢在吃饭的时候展开讨论。总之,一个适合双人沟通的场合是最低要求。
        Q:测试用例预演方法可以用在其他地方吗?
        A:中子炮刚发明的时候,科学家们狂热地将中子炮对准任何可以找到的东西;按照这种趋势,测试用例预演方法也必须要考虑是否可以应用在其他地方:)实际上,预演这种方法在评审或是思维游戏的过程中一直都是被广泛应用的,测试用例预演只不过将预演这种方法用到了以往需要真正执行的领域中,除了在测试执行环节,设计评审过程中我们也可以采用这种方法针对设计进行审查,关键在于提问的技巧:“如果我们这么做,你的设计将会怎样反应?”。
        Q:好像我用测试用例预演方法很难达到预期的目标?
        A:测试用例预演方法并非不需要前提条件,至少要保证以下条件才能使测试用例预演发挥较大的作用:
        开发工程师具有良好的配合意识;
        测试工程师对产品具有良好的熟悉程度;
        提问者的提问必须从“如果我这样做,程序会怎样反应”开始;
        参与预演的开发工程师对用于预演的用例涉及的模块要非常熟悉;
        其中,测试工程师对产品具有良好的熟悉程度是非常必要的,测试用例预演的主要对象是针对业务逻辑的用例,这就要求测试工程师熟悉产品,熟悉业务。所谓“棋逢对手”,至少要能和开发工程师是一个级别上的。另外,参与预演的开发工程师必须对用于预演的用例涉及的模块很熟悉,如果参与预演的开发工程师是模块的开发者自然没有问题,如果不是,就要求开发工程师必须能够准确了解模块的行为和实现。
        Q:测试用例预演发现的问题需要记入缺陷库吗?
        A:答案是肯定的,测试用例预演是一种“虚拟”的测试执行,预演过程中发现的问题同样要被记录、跟踪。当然,为了标识测试用例的发现阶段,可以专门在缺陷管理系统中增设一个“预演”阶段,统计预演在缺陷发现方面提供的效果。
        Q:如果开发人员不配合,怎么办?
        A:这个问题……我只能说具体问题具体分析了。关键是弄清楚开发人员为什么不配合,可能是开发人员个性羞涩,不喜欢这样面对面的交流方式;也可能是开发人员觉得这种方式浪费时间;又或者是开发人员对测试人员抱有不信任的态度。不管怎样,发挥你的个人所长,让开发人员放下顾虑和成见,认识到这种做法能给他和项目带来的好处,自然可以解决这个问题。
        Q:还有哪些在测试用例预演过程中应该主要的问题?
        A:当然还有一些需要注意的问题,沟通的技巧、对对方反馈的及时分析等等,这些都可以在实际运用测试用例预演方法的过程中逐渐体会。我总结的几点需要注意的问题包括:
        对每一个开发人员的犹豫都不能放过,一个犹豫很可能就是一个缺陷隐藏的地方;
        如果可能,最好能和开发人员一起,确定那些不确定的问题,以防开发人员一时马虎放过了本来存在的问题;
        预演的方式不适合在正式评审会议上应用,因为预演主要是两个人之间的协同思考,在正式评审会议上容易浪费其他人的时间;
        预演时要注意记录,头脑风暴产生的火花如果不及时记录的话,很可能会在短时间后被遗忘。
 
         【作者简介】
        姓名:关河,真名:段念,测试时代成员;有数年软件测试经验,先后历任软件测试工程师、软件测试组长、软件测试经理等职。对软件测试技术、软件测试管理,以及相关的质量体系和流程都有较为深入的了解和认识,除测试管理外,目前专注于软件性能测试、白盒测试、开源测试软件方向。
        Email:dennis.duan@gmail.com
        个人主页:http://www.guanhe.cn
测试时代:http://www.testage.net

强化测试用例在测试活动中的作用

作者:张振兴
        本文的目的不是将软件测试流程优化的话题阐述的面面俱到,而是从管理角度谈谈测试用例在测试活动中的重要性,以及测试用例管理流程的一些改进思路。
        常闻软件测试者的如此抱怨:
        测试用例在实际中根本没有起多大作用?
        测试人员在实际测试时都没有按测试用例来执行?
        测试执行后没有把需要更新的测试用例补充到用例库中?
        ……
 
当前国内软件企业测试流程不规范的原因分析:
        1) 从事物的发展规律看,软件测试行业在我国还是新兴行业,目前还处于起步和探索期,虽然国外的同行业发展到了一定阶段,但事实上他们也在不断的否定自我并探索着更成熟的方法、寻求着更有效的方案;而国内的测试行业发展期不过10来年,所谓的测试管理流程不规范,也就情有可原了。
        2) 从企业个体角度讲,测试部门的整顿和加强,按照企业自身发展的优先层次,还没有被纳入优先解决的程度,开拓市场、签订定单才是首要问题,也是维系企业生存发展的命脉。当然国内很多优秀的大中型软件公司的测试部门相对完善,如神州数码、用友、联想等,他们和大型跨国软件公司的合作,也从中汲取了宝贵的管理经验。
        3) 还有一个普遍存在的问题。近几年国内软件企业为了加强企业的竞争优势和名气提升,通常大搞特搞ISO/CMM认证;笔者也很支持这么做,但更关注的是通过这些认证后的企业有多少真正按照那些规范、设计的标准在后续的测试或软件开发管理工作中着手开展下去呢?社会上流传着这样的话:任何认证到中国,最后都免不了砸牌儿!笔者读书时很多高校搞的MCSE认证,有培训机构明目张胆声称"百分百通过率"!当年也有专门媒体报道此事。听到这样的话,我们都会寒心,这里真心希望我们的软件企业通过ISO/CMM后真正为企业的内部软件开发流程带来一点新生的曙光。
        4) 最后一个原因,我想是企业内部测试管理人员和技术人员技能的不足,还有自身工作态度的不够端正。有了再好的规范标准,没人遵守不行!没人实施不行!应该说,很多中小软件企业的高层都或多或少的逐渐意识到软件测试的重要性和必要性,以及它的标准化、流程化改革的紧迫性,但也有很多的工程师、技术人员并不理会这套,常常在实际工作中投机取巧;也有很多测试管理人员后天的经验不足、技能不够,对公司测试管理工作考虑不到位,和开发工程师交流不充分,和上层领导反映不及时等等。
        总之,任何问题的出现都不是单方面的原因,从宏观的社会形势到微观的企业个人,都有无可推卸的责任;正因为如此,解决问题也要对症下药,如何完善软件测试流程,就要从小处出发;本文不可能将软件测试流程优化的话题阐述的面面俱到,因此只从管理角度谈谈测试用例在测试活动中的重要性,以及测试用例管理流程的一些改进思路。

1. 强化测试用例在测试活动中的作用

        测试用例在实际中没有起多大作用,在实际测试时根本没有按测试用例执行,测试执行后没有把新的测试用例补充到用例库中……为何如此?我们分析认为,根本原因是对测试用例重要性的认识不够,测试流程不完善,针对测试用例的管理流程更不完善,从三个方面具体来说:
        1) 测试用例的重要性是毋庸置疑的,它是软件测试全部过程的核心,是测试执行环节的基本依据,如果这个依据不能足够发挥它应起的作用,那是不是说这个依据不明确、依据设计的不合理呢?答案是肯定的!
        2) 制定了完备有效的测试用例,为什么不按测试用例执行测试呢?首先是因为企业没有严格和良好的机制促使和保证测试执行者这样做;其次是个别测试人员投机取巧心理作祟的表现。
        3) 测试用例设计得不可能天衣无缝,不可能完全满足软件需求的覆盖要求,测试执行过程里肯定会发现有些测试路径或数据在用例里没有体现,那么事后该将其补充到用例库里,以方便他人和后续版本的测试;如果没有这样做,那么测试部门负责人和每个测试员都难辞其疚,是该重新坐下来思考一下公司的测试用例管理规范和测试流程了。

2. 改进测试用例执行过程

        那么究竟如何做,才能尽量避免上述问题呢?我们不妨从软件开发周期的每个阶段就把这些问题考虑进去,以便从初始就力争将问题缩到最小,将其扼杀在萌芽阶段,以防后期阶段出现问题时互相推卸责任或干脆束手无策!
 
        1) 软件需求分析阶段,笔者从来认为测试人员从软件生命周期的需求阶段就开始介入。通常测试人员的测试工作开展在开发周期的末尾,如果前期不涉入,如何通晓整个系统的需求和架构而对其充分测试呢?虽然该观点被大多数同行所认可,但我知道依然有很多公司为了节省费用,不让测试人员参与前期调研或制定需求,经常的做法是等到系统开发完毕或将近完成,跟测试经理说一声"这边有个项目,你找几个人来测试一下吧!"经验表明,这样的做法实不可取。
        测试人员(指项目的测试负责人和测试工程师)在需求阶段的任务有:
        a. 参与软件需求调研,以测试角度分析需求的可测性,可构思将来对其测试的方法、原则等;更重要的是,对不可测或难以测试性问题要及时与客户或项目经理协调解决。
        b. 全面了解系统需求,从客户角度考虑软件测试需要达到的验证状态,即何些功能点需重点测试、何些无需,以便将来制定测试计划。
推荐企业采用类似于IBM Rational Requisitepro(参考其官方说明:http://www-900.ibm.com/cn/software/rational/products/requisitepro/index.shtml)的需求管理工具来制定和管理软件需求,同时需要测试人员的配合,保证对软件测试环节的充分考虑。
        2) 软件分析设计阶段,测试人员除制定测试计划书等基本工作外,笔者认为还有一个相当必要的任务,那就是将系统的可测性落实到书面文档,以备将来编写测试用例。
之所以要这么做,是因为考虑到很多企业编写测试用例直接参考需求规格说明书或者分析流程图,这样跨度大,难度也大,是造成测试用例不完备、覆盖范围小的重要原因。
如果公司采用类似于IBM Rational Rose(参考官方说明:http://www-900.ibm.com/cn/software/rational/products/rose/index.shtml)的建模分析工具和IBM Rational Rose XDE Developer(参考官方说明:http://www-900.ibm.com/cn/software/rational/products/xde_developer/index.shtml)的可视化设计开发环境,这个工作更好执行;如果没有,那么测试人员更有必要编写一份《软件功能点测试描述书》,它是软件的详细测试分析文档,其主旨是将系统分析人员的开发分析文档加工成以测试为角度的功能点分析文档,重要的是描述对系统分解后每个功能点逐一的校验描述,包括何种方法测试、何种数据测试、期望测试结果等,这些信息都是描述性的,无须具体数据;它的作用是据此编写测试用例,以及测试执行时的参考依据,基于它直接来源于需求,覆盖当然最全,也最能贴近客户要求。
当然该文档不是非要不可,笔者只是提倡一种原则,如果有类似的替代文档或有工具可自动实现此功能,则会倍加受推崇!
        笔者之所以推荐IBM Rational系列产品在软件项目中的应用,是因为IBM Rational倡导的RUP(Rational Unified Process)方法论采用了用例驱动的原则。所谓用例驱动,是以体系结构为中心,采用迭代、增量方式的开发过程;而其Rational工具系列正是将这一理念进行行为表述,是当前软件工程领域一套无可比拟的强大工具集,从需求到测试,它都以用例为基本模型,全面贯穿软件开发的每个环节。
        3) 软件开发阶段,编写测试用例。我不想从技术角度探讨到底如何编写功能强大、质量优秀的测试用例(可参考笔者主页转载的"如何设计编写软件测试用例"),这里只想从管理角度和大家谈谈如何有效控制和增强测试用例在测试活动中的应用。应该遵守的原则是:
        首先,从覆盖率来说,测试用例库的用例要达到最大覆盖软件系统的功能点。按照我上述所言的方式,测试工程师从前期阶段顺次下来,编写测试用例时,基本上就是将《软件功能点测试描述书》中的每个功能点进行操作上的细化:一是从步骤上描述到达校验点的方式,二是从内容上描述以何种数据校验功能点;如此可实现趋向最大需求覆盖率。
        其次,从数量来讲,笔者觉得很多公司的测试用例太少,甚至远远不能覆盖系统需求,这也是很多测试人员在测试工作开展初期按照用例执行、而后渐渐凭"意念"去执行测试的原因。应该说测试用例的数量很难用数学模型来模拟,更没办法衡量,但凭借个人经验来说,一个多于半年开发周期(指从编码开始直到提交客户的时间段)的软件系统,它的用例数量不要低于4000个,甚至更多!也许有人惊讶这一数字,不过了解IBM等大公司测试过程的人士会认为4000还是很少的数目。我们试想,对于一个中小型软件系统,如果设计出5000个用例,那它的测试覆盖率还怕不高么!
        再次,如此众多测试用例的管理问题。是的,需要管理工具软件!笔者从来都反对以word或excel来编写测试用例:
        首先,格式上难于编写–通常方式是企业自己设计表格模版,但编辑上始终存在不便,尤其对于一些共性内容,如测试目标、测试环境、参考说明等,每次都要大量的复制、粘贴。
        其次难于管理–如果把几千个文档文件放在一个共享文件夹里,即便以子目录方式管理,但是每次查找一个特定用例,你的眼睛也必将饱受煎熬!
        更是难于执行–莫非真要针对几千个用例都是打开一个word-执行测试-输入测试结果-关闭word吗?
        最重要的是,根本没办法追踪测试结果–在本轮回归测试输入完测试结果,但是下一轮结果输入到哪里?输入了这些测试结果什么用?能方便的根据其结果统计软件质量吗?还有,可以用它追踪发现的软件缺陷吗?有办法追踪吗?
        使用word等软件编写测试用例的种种不便大致如上,但换个思路思考一下使用集成工具的种种优势便更加一见分晓。测试同业者们都了解的测试用例管理工具便是IBM Rational TestManager(查看官方说明:http://www-900.ibm.com/cn/software/rational/products/testmanager/index.shtml),它是专业的测试用例管理和测试管理工具,其设计出发点就已经考虑到了我们上述的种种困境,因此给予了良好的解决方案。以其为测试管理平台,测试人团队成员可以计划、管理、组织、执行、评诂以及报告等纵向测试活动,如果与IBM Rational Clearquest(查看官方说明:http://www-900.ibm.com/cn/software/rational/products/clearquest/index.shtml)集成使用,还可即时跟踪软件的需求变更,从而增强整个软件团队的横向沟通与合作。
        而且,个人觉得测试行业的快速发展,必将带来从每个环节都逐渐向自动化和标准化方向迈进,尽早适应这一趋势,不仅提高了工作效率,也提高了企业的信誉和名誉。
 
        最后,说一下测试用例格式上一般内容以外的几个要点:
        一、是在测试管理工具中制定适合本公司的测试用例模版
        二、是用例模版里要有关键字索引,以方便按关键字分类查找,如测试方法(分手工/自动两种)
        三、是测试用例要有状态跟踪,可根据用例执行状态索引用例(测试通过、测试失败、测试中断等)
        四、是执行失败的用例要链接到相应的缺陷报告,如有根据缺陷报告检索测试用例的试图更妙,可评估该缺陷影响范围的大小
        五、是测试用例的修改,以及每个测试周期的运行都有日志记录,以便后期追踪和新员工参考
        4) 软件测试阶段,测试负责人划分不同的测试阶段(如集成测试、系统测试、回归测试、性能测试等),再划分不同的子测试周期(如前两个星期做冒烟测试,测试方式是手工/自动,测试版本是**,测试环境是**,包括服务器端与客户端等;接着做第一模块功能测试;如此顺次。),再为项目组测试人员分配测试用例(通常原则是每个人负责几块区域的测试任务),测试人员则按照详细的用例文档去执行测试,测试失败则提交软件缺陷报告。这里要遵循的几个原则是:
        A)有健全且严格的体制保证测试执行者严格按照测试用例执行测试。这并不妨碍测试者创造力的发挥,因为前期用例的设计和编写就是项目全体测试人员智慧的结晶!我们一直苦苦追寻众多测试工程师加班加点辛苦工作的原因,其实大都发生这一阶段;如此实施,即便没有解决根本问题,也会大大提高测试执行效率。
        B)如有对测试用例认识模糊或内容遗漏的地方,可暂做记录待后期解决,或经测试负责人与项目其他管理人员同意方可更新用例库。
        C)测试负责人每日负责跟踪本测试子周期或阶段的测试用例执行情况,以及每日提交的缺陷报告,根据执行进展状态以及缺陷数量或严重等级与项目高层或其他人员展开交流,商议解决途径,并确定或调整未来时间的测试任务。
        D)测试执行者负责执行自己区域的测试用例,还要负责跟踪该区域软件缺陷的修改进展,根据其状态不断验证软件功能点。
        E)应该提及的是,大多数软件公司都采用集成的缺陷管理工具来管理软件缺陷,如IBM Rational ClearQuest(变更管理与缺陷管理工具)等,这是值得称颂的好迹象;这样的集成工具都提供了清晰的报告模版及强大的追踪功能,测试团队的每一成员按照自己的角色和权限访问缺陷管理工具,并不断跟踪软件缺陷的状态。
        F)对于自动测试(包括自动化功能测试和性能、压力测试),有一些特殊要点。本人的原则是自动化测试无须编写测试用例,只要在编写时将用例库里适合或需要自动测试的用例的测试方法(不同工具可能名称不同)设为自动即可,故而到此阶段才提及自动化测试。自动化测试的实施方案有所不同,每款测试工具的使用和测试流程也不同,但都可以从在这一阶段编写测试脚本,并运行自动测试。例如IBM Rational Robot(参考官方说明http://www-900.ibm.com/cn/software/rational/products/robot/index.shtml)或XDE Tester(http://www-900.ibm.com/cn/software/rational/products/xde_tester/index.shtml,现更名为Rational Functional Tester)。针对自动化测试原则,可参阅笔者的"自动化测试要点"译文,这里要提的其他几个基本原则是:
 
        一、是选择恰当的测试工具品牌,并要求提供培训;
        二、是项目的自动化测试工作有专人负责跟踪,以保证工作质量,他们可不参与日常测试;
        三、是确定自动化测试成员在项目中的角色,一般自动化测试成员隶属于项目测试负责人,负责人同样跟踪其工作状态;
        四、是选择最简单、最重用的测试用例使用自动测试方法;
        五、是使用工具厂商提供的测试框架编写脚本,千万别采用单纯录制-加校验点-回放的方式,以开发出健壮且重用性强的测试脚本;
        六、是有专人更新脚本,也有专人跟踪自动测试结果;
        七、是一般选择的测试工具品牌和缺陷管理工具品牌是同一厂商,以方便不同类型缺陷的集中管理;
        八、是在多人协作开发测试脚本、代码量相对较大情况下,应考虑使用配置管理工具来管理测试脚本,IBM Rational ClearCase(参考官方说明:http://www-900.ibm.com/cn/software/rational/products/clearcase/index.shtml)是当前业界功能最强大的配置管理工具,可以将开发代码和测试代码都集中管理,进行高效的版本控制和工作空间管理,保证多人开发大量代码的稳定性。对于局域网范围内的开发工作,使用ClearCase LT版足够。
        由于不同公司开发产品的特殊性,也许需要特殊类型的测试,如安全测试、甚至代码级单元测试等,这些内容需要酌情考虑测试用例的编写,以及测试的执行。
        5) 软件验收阶段,除了提交软件测试评估报告(各种类型测试结果的评估都应有报告)这些基本工作外,对于测试用例,此时要集中时间更新,更新整个测试周期中一切需要更新的内容,以方便未来新版本的测试。即便您开发的是项目软件–提交客户后没有新版本–那也需要后期维护,维护阶段需要重新测试某功能点,然而用例如果不准确,碰巧又是一个新员工来做,那就死翘翘了!
        退一步说,如果您公司的测试部门经历一次这样重大的洗礼,有一个项目真正按照此原则实施一次,也必将对未来测试工作的开展发挥推波助澜的作用、起到事半功倍的效果。
        6) 其他说明:加强测试部门内部人员的培训教育很重要,包括工作技能与个人素质两方面,可通过国内主要的培训机构,也可是购买工具厂商的直接培训。应该说,很多测试新人对于测试用例的书写还存在问题,更别提及测试用例的管理或执行;以此可见,我们的测试工程师需要培训的空间还很大。
        另外,笔者不赞成对人员的强制性管理,例如大张旗鼓整顿公司测试部门的管理,采取缺陷报告数和人员绩效挂钩、不按测试规范执行就适当惩罚等手段;个人认为切不可急功近利,当以人为本,鼓励+促进甚善然、甚妙哉!

3. 总结

        综上所述,我们得出结论– 测试用例在测试中没起到应有的作用,是因为测试用例编写质量不高,覆盖不够,执行不利;测试执行时不遵循测试用例,执行后不更新用例库,是测试部门的整体工作流程不健全、不规范;至于如何解决,笔者提出了微薄建议,供业界朋友参考与交流。
        国内软件测试行业目前仍处在群雄逐鹿、百家争鸣的时期,芸芸纷说,不如从企业自身出发,确立最适合自我的测试管理解决方案,整顿自身的测试工作流程,那才是金玉良言的上上策!
 
        【作者简介】
        网名:Sincky,本名张振兴,是北京的一名测试工程师,擅长软件功能测试和和自动化功能测试,也从事过白盒测试、性能测试与测试管理工作,尤其对IBM Rational工具套件和RUP理论具有深入的了解和研究,多年也积累了一定测试经验和测试思想,在此分享给业界同行。
测试时代:http://www.testage.net

对Web服务进行压力测试

作者:Chris Wilkinson
        Web 服务处于分布式计算的核心位置,它们之间的交互通常很难测试。分布式开发、大型的开发者团队以及对代码日益组件化的期望都有可能使 Web 服务的开发变得越来越容易隐藏错误。这些类型的错误极难检测出来。压力测试是检测这类代码错误的一种有效方法,但是只有在压力系统设计得比较有效的情况下才能发挥作用。本文将让您深入了解一下这种压力系统的基本要求。

1. 测试方法

        传统的测试方法包括某种形式的简单单元测试,通常由开发人员执行。设计这些测试需要了解软件的内部知识,并且这些测试几乎总是针对产品的非常小的、特定的部分。这些类型的测试非常适合与其他代码组件极少交互,甚至没有交互的简单 Web 服务。
        功能验证(Functional Verification)也 是一种测试过程,在这个过程中,对产品源代码了解有限的设计者进行测试以确认产品或服务的核心功能。设计这种测试是为了证明这个核心功能符合某个规范。举个例子,我的在线拍卖显示的是输入的正确出价吗?我的保险经纪人系统找到最便宜的报价了吗?如果这些测试失败,通常就意味着检测到了产品的一个基本问题(这个问题通常是可以直接修复)。这种测试也是适合简单的 Web 服务,使您可以检查服务是否能够正确执行它的各个功能。
        系统测试(System Test)通常是在功能验证阶段完成,验证了核心功能后进行。它倾向于把整个系统作为一个整体来查找问题 — 弄清 Web 服务作为系统的一部分怎样运作,以及 Web 服务相互之间如何交互。由于系统测试是在开发生命周期快结束时才进行,所以通常不能给它分配足够的时间来完成。又因为紧张的发行日程安排以及开发的各个重要阶段的后移,系统测试阶段经常被忽略,并且一些通常都可以发现的、少见的错误都不能被检测到。即使发现了这种错误,这时也来不及确定错误的原因并设法修复它们了。因此,在查找代码错误时,必需把系统测试应用设计得尽可能高效。系统测试通常由三部分组成,它们是:
        性能(Performance):这涉及到确定相关的产品统计数据的过程。例如:每秒有多少条消息?一个服务可同时接受多少个用户?
        案例(Scenario):这是重新创建客户所需的确切配置的过程。因此在案例中发现的任何问题都可以在客户使用该产品之前被检测出来。
        压力(或称工作负载平衡):它与另两个部分不同,因为它被设计为通过应用很大的工作负载来使软件超负荷运转。如果压力测试通过对产品保持高强度的使用(但不超过性能统计数字确定的限制)能有效地执行,那么它就经常能够发现许多隐蔽的错误,而这些错误用上面提到的任何其他技术都是发现不了的(这些错误也经常是最难修复的)。
        从检测代码错误这方面来说,可以证明这三个系统测试组件中效率最高的是压力测试部分。但由于这个过程经常跟系统的其他要素或功能测试混淆在一起,所以这个过程涉及到的方法还没有被正确着手处理或实现。

2. 压力下的错误

        使用压力测试,您有希望找到很多种用其他测试方法更难发现的错误。有两种错误类型是:
        内存泄漏(Memory leak):一种极难检测的现象。内存泄漏经常发生在已发行的产品中,原因很简单,很难设计测试用例来检测它们。使用简单的功能测试,几乎发现不了内存泄漏问题,因为在产品完成之前测试没对产品进行足够多的使用。内存泄漏通常要求操作要重复非常多的次数以使内存消耗达到能引起注意的程度。尽管与其它编程语言(如 C/C++)相比,Java 程序更难引入内存泄漏错误,但只要程序仍保持着对对象的引用,该对象仍有可能被实例化并且它占用的内存永远不会被释放。
        并发与同步(Concurrency and Synchronization):压力测试在查找并发性问题上非常出众,这是因为在任何一个测试生命周期中,它都应用了许多不同的代码路径和定时条件。一般的规则是,压力测试运行的时间越长,涉及并应用的代码路径组合和定时条件就越多。当然,这也的确使得这些问题很难再现(错误可以在 5 分钟或 5 天后发生)。死锁、线程泄漏以及任何一般的同步问题通常只能在压力测试阶段被检测出来。这些类型的问题很难通过执行单元测试来发现。开发人员不会一直考虑他或她的代码将与其他地方的代码(在执行单元测试时这些代码可能还没写出来)进行交互。

3. 现有的压力测试工具

        有许多声称能够对产品进行压力测试的可用工具目前正在开发中。被广泛应用的是针对 Web 服务的那些工具。然而,这些工具中有许多只是简单的 HTML/SOAP 生成器,它们模拟许多客户机连接,并因此对 Web 服务器生成高负载(这对于查找 Web 服务器的问题很有用,但对于查找 Web 服务的问题就没那么有用了)。这些工具对基本的压力测试比较有用,但它们经常是仅仅扩展功能验证阶段来重复地执行相同的功能任务。如果足够的时间和资源可用,就可以通过创建定制构建的压力测试系统来实现更有效的测试。由于压力系统的设计者通常对要测试的产品和 Web 服务有更多的了解,所以他们将能够确保压力系统可以用于哪些具体的代码区域。

4. 设计压力应用

        设计试图对 Web 服务进行压力测试的压力测试系统时,要让它们以某种特定的方式运行代码。这些风格超越了功能验证,目的是要弄清楚被测试的 Web 服务是不是不仅能做我们认为它能做的事,而且在被施加了某些高强度压力的情况下仍然继续正常运行。压力测试必须对 Web 服务应用四个基本条件。许多已建立的压力系统应用了这些条件。有效的压力测试系统将应用以下这些关键条件:
        a. 重复(Repetition):或许最明显的且最容易理解的压力条件就是测试的重复。换句话说,测试的重复就是一遍又一遍地执行某个操作或功能,比如重复调用一个 Web 服务。功能验证测试可以用来被弄清楚一个操作能否正常执行。而压力测试将确定一个操作能否正常执行,并且能否继续在每次执行时都正常。这对于推断一个产品是否适用于某种生产情况至关重要。客户通常会重复使用产品,因此压力测试应该在客户之前发现代码错误。许多最简单的压力系统只实现这一个条件,但简单地扩展功能验证测试来多次重复并不能构成一个有效的压力测试。当与下面的一些原则结合起来使用时,重复就可以发现许多隐蔽的代码错误。
                b. 并发(Concurrency):并发是同时执行多个操作的行为。换句话说,就是在同一时间执行多个测试,例如在同一个服务器上同时调用许多 Web 服务。这个原则不一定适用于所有的产品(比如无状态服务),但是多数软件都具有某个并发行为或多线程行为元素,这一点只能通过执行多个代码示例才能测出来。功能测试或单元测试几乎不会与任何并发设计结合。压力系统必须超越功能测试,要同时遍历多条代码路径。至于怎么做到这一点取决于具体的产品。例如,一个 Web 服务压力测试需要一次模拟多个客户机。Web 服务(或者任何多线程代码)通常会访问多个线程实例间的一些共享数据。因额外方面的编程而增加的复杂性通常意味着代码会具有许多因并发引起的错误。由于引入并发性意味着一个线程中的代码有可能被其他线程中的代码中断,所以错误只在一个指令集以特定的顺序(例如以特定的定时条件)执行时才会被发现。把这个原则与重复原则结合在一起,您可以应用许多代码路径和定时条件。
c. 量级(Magnitude):压力系统应该应用于产品的另一个条件考虑到了每个操作中的负载量。压力测试可以重复执行一个操作,但是操作自身也要尽量给产品增加负担。例如,一个 Web 服务允许客户机输入一条消息,您可以通过模拟输入超长消息的客户机来使这个单独的操作进行高强度的使用。换句话说就是,您增加了这个操作的量级。这个量级总是特定于应用的,但是可以通过查找产品的可被用户计量和修改的值来确定它 — 例如,数据的大小、延迟的长度、资金数量的转移、输入速度以及输入的变化等等。单独的高强度操作自身可能发现不了代码错误(或者仅能发现功能上的缺陷), 但与其他压力原则结合在一起时,您将可以增加发现问题的机会。
        d. 随机变化:最后一点,任何压力系统都多多少少具有一些随机性。如果您随机使用前面的压力原则中介绍的无数变化形式,您就能够在每次测试运行时应用许多不同的代码路径。下面是几个关于怎样在测试生命周期内改变测试的示例。使用重复时,在重新启动或重新连接服务之前,您可以改变重复操作间的时间间隔、重复的次数,或者也可以改变被重复的 Web 服务的顺序。使用并发,您可以改变一起执行的 Web 服务、同一时间运行的 Web 服务数目,或者也可以改变关于是运行许多不同的服务还是运行许多同样的实例的决定。量级或许是最容易更改的 — 每次重复测试时都可以更改应用程序中出现的变量(例如,发送各种大小的消息或数字输入值)。如果测试完全随机的话,因为很难一致地重现压力下的错误,所以一些系统使用基于一个固定随机种子的随机变化。这样,用同一个种子,重现错误的机会就会更大。
        一个压力测试通常会结合上述的所有原则,并且在允许的范围内尽可能长时间地运行。测试被允许的执行时间越长,就可以遍历越多的代码路径,并且发现的错误也越多。当然,一旦找到错误就必须诊断并修复它。由于一个代码错误可以在压力测试运行多日以后自己显示出来,所以系统必须保证当出现错误时所有可用的调试信息都被生成 — 否则可能就必须花费同样多的时间来重现这个错误。

5. 结束语

        测试是软件开发过程中至关重要的部分,并且一个重要的、经常被曲解或忽略的部分是压力测试。遵循上面详细说明的原则,您就可以设计并实现有效的压力测试系统,用来查找一些与您的代码相关的、比较隐蔽的问题。无论是利用预先写好的工具,还是创建一个完全专用的压力系统,压力测试都是用于查找 Web 服务(或其他任何程序)问题的本质方法,并能最终提高您的软件产品质量。
测试时代:http://www.testage.net

性能测试指标介绍

来源:IBM

1. TPC-C

       作为一家非盈利性机构,事务处理性能委员会(TPC)负责定义诸如TPC-C、TPC-H和TPC-W基准测试之类的事务处理与数据库性能基准测试,并依据这些基准测试项目发布客观性能数据。TPC基准测试采用极为严格的运行环境,并且必须在独立审计机构监督下进行。委员会成员包括大多数主要数据库产品厂商以及服务器硬件系统供应商。
       相关企业参与TPC基准测试以期在规定运行环境中获得客观性能验证,并通过应用测试过程中所使用的技术开发出更加强健且更具伸缩性的软件产品及硬件设备。
       TPC-C是一种旨在衡量联机事务处理(OLTP)系统性能与可伸缩性的行业标准基准测试项目。这种基准测试项目将对包括查询、更新及队列式小批量事务在内的广泛数据库功能进行测试。许多IT专业人员将TPC-C视为衡量“真实”OLTP系统性能的有效指示器。
        TPC-C基准测试针对一种模拟订单录入与销售环境测量每分钟商业事务(tpmC)吞吐量。特别值得一提的是,它将专门测量系统在同时执行其它四种事务类型(如支付、订单状态更新、交付及证券级变更)时每分钟所生成的新增订单事务数量。独立审计机构将负责对基准测试结果进行公证,同时,TPC将出据一份全面彻底的测试报告。这份测试报告可以从TPC Web站点(http://www.tpc.org)上获得。
        tpmC定义: TPC-C的吞吐量,按有效TPC-C配置期间每分钟处理的平均交易次数测量,至少要运行12分钟。

2.TPC-C规范概要

        TPC-C是专门针对联机交易处理系统(OLTP系统)的,一般情况下我们也把这类系统称为业务处理系统。
       TPC-C测试规范中模拟了一个比较复杂并具有代表意义的OLTP应用环境:假设有一个大型商品批发商,它拥有若干个分布在不同区域的商品库;每个仓库负责为10个销售点供货;每个销售点为3000个客户提供服务;每个客户平均一个订单有10项产品;所有订单中约1%的产品在其直接所属的仓库中没有存货,需要由其他区域的仓库来供货。
该系统需要处理的交易为以下几种:
  New-Order:客户输入一笔新的订货交易;
  Payment:更新客户账户余额以反映其支付状况;
  Delivery:发货(模拟批处理交易);
  Order-Status:查询客户最近交易的状态;
  Stock-Level:查询仓库库存状况,以便能够及时补货。
       对于前四种类型的交易,要求响应时间在5秒以内;对于库存状况查询交易,要求响应时间在20秒以内。
        逻辑结构图:
        流程图:

3.评测指标

        TPC-C测试规范经过两年的研制,于1992年7月发布。几乎所有在OLTP市场提供软硬件平台的厂商都发布了相应的TPC-C测试结果,随着计算机技术的不断发展,这些测试结果也在不断刷新。

3.1 TPC-C的测试结果主要有两个指标:

● 流量指标(Throughput,简称tpmC)
       按照TPC的定义,流量指标描述了系统在执行Payment、Order-status、Delivery、Stock-Level这四种交易的同时,每分钟可以处理多少个New-Order交易。所有交易的响应时间必须满足TPC-C测试规范的要求。
流量指标值越大越好!
● 性价比(Price/Performance,简称Price/tpmC)
       即测试系统价格(指在美国的报价)与流量指标的比值。
       性价比越小越好!

4.结果发布

       各厂商的TPC-C测试结果都按TPC组织规定的两种形式发布:测试结果概要(Executive Summary)和详细测试报告(Full Disclosure Report)。测试结果概要中描述了主要的测试指标、测试环境示意图以及完整的系统配置与报价,而详细测试报告中除了包含上述内容外,还详细说明了整个测试环境的设置与测试过程。
P690 tpmC测试值:76,389,839.00
$/tpmC:831.00
美国美金报价:6,349,223.0
CPU数:32
数据库:IBM DB2 UDB 8.1
操作系统:AIX 5L V5.2
中间件:TUXEDO 8.0
测试日期:2003.6.30
P690 TPC-C测试的配置:
1.  后台:1 x eServer pSeries 690 with 32 x 1.7GHz POWER4+ processors with 128MB L3 cache per MCM (total of four MCMs), 512GB memory
2.  前端:30 x eServer pSeries 630 Model 6E4 each with 4 x 1.0GHz POWER4 CPUs with 32MB L3 cache, 16GB memory
SPECweb:
       SPECweb96: 在SPECweb96基准测试程序上实现的每秒钟超文本传输协议(HTTP)操作最多次数,响应时间无明显退化。
       SPECweb99: 接入数,网络服务器可用预先确定的工作量支持的同时接入数。SPECweb99检测设备模拟客户通过慢Internet联接,向网络服务器发送HTTP工作量请求。

4.1 SPECweb99 测试Web服务器运行状况

        SPECweb99 是由标准性能评估组织(SPEC)开发的Web服务器基准测试。它测量满足特定吞吐量和客户请求响应速率要求的WEB服务器的最大并发连接数量。并发连接的合计波特率在320 Kbps到400Kbps范围内,则满足相应规范。
       SPECweb99 在一台称为主客户端的机器上运行,这台机器上包含有允许用户加载特定负载请求的配置文件。主客户端也要处理在客户端和服务器或测试中的系统(SUT)之间的传输协调问题。客户端通过许多子进程/线程生成独立HTTP请求流,仿真足够的负载发送给SUT。下图表示客户端/服务器的层次关系。
图:典型的SPECweb99实验环境
       在这个测试中,客户端向测试中的服务器发送请求数据。测试规范要求客户端和服务器之间的连接不能使用片段大小大于1460比特的TCP协议。因此,每一个客户端读取1460比特或更少数据块的响应。
4.2 测试中使用两种类型的负载量:
l      静态负载. 静态负载具有四种类型的文件。最小的文件的增幅为0.1KB,第二种文件类型的增幅为1KB,最后两种类型的文件的增幅为10KB和100KB。每一个目录包含每种类型9个文件共36个文件。
目标请求的文件类型在各类型中分散使用。在每一类中的9个文件中又进行二次分布。最终目标文件混合为:
35%的请求文件小于1 KB
50%的请求文件小于10 KB
14%的请求文件小于100 KB,但是大于或等于10 KB
1%的请求文件小于1000 KB,但是大于或等于100 KB
l      动态负载.动态负载是基于广告和用户注册。共有四种在SPECweb99中使用的请求内容类型,分别是标准动态取操作、动态随机取操作、动态发送操作和客户图形接口动态取操作。标准动态取操作和客户图形接口动态取操作表现web服务器的简单广告轮转特性。带有广告轮转的动态取操作追踪用户和用户选择,所以广告可以由不同的方式来定制。最终,动态发布实施一个用户注册在相应的网站上。
P690 SPECweb99测试值:21,000
Web服务器:Zeus 4.0
操作系统:AIX 5L V5.1 (64-bit)
CPU数:16
测试日期:2001-10-1
测试配置:16 x 1.3GHz POWER-4 Processors w/1440KB unified on chip L2 cache, 192GB memory, 32 x 32 IBM Gigabit Ethernet-SX PCI controllers, 32 x Gigabit Ethernet network (1 Gigabit/sec  ), 96 x Clients (4 x 375MHz POWER3-II, RS/6000 44P-270), Requested Connections = 21000, Max Fileset Size = 67319.6MB
P650 SPECweb99测试值:12,400
Web服务器:Zeus 4.1r3
操作系统:AIX 5L V5.2 (64-bit)
CPU数:8
测试日期:2002-10-1
测试配置:8 x 1.45GHz POWER4+ processors w/1.5MB(I+D) unified on chip L2 cache, 32MB unified off chip/SCM L3 cache, 64GB memory, 8 x Gigabit Ethernet-SX PCI-X controllers, 8 x Gigabit Ethernet network (1 Gigabit/sec ), 48 x Clients (6 x 668MHz RS64-IV, pSeries 620 Model 6F1), Requested Connections = 12400, Max Fileset Size = 39801.28MB
p630 SPECweb99测试值:6,895
Web服务器:Zeus 4.2r1
操作系统:AIX 5L V5.2(64-bit)
CPU数:4
测试日期:2003-2-1
测试配置:4 x 1450MHz POWER4+ Processors w/1536KB(I+D) unified on chip L2 cache, 8MB unified (off chip)/SCM L3 cache, 32GB memory, 4 x Gigabit Ethernet-SX PCI-X controllers, 4 x Gigabit Ethernet networks (1 Gigabit/sec ), 24 x Clients (4 x 375MHz POWER3-II, pSeries 640 Model B80), Requested Connections = 6900, Max Fileset Size = 22199.12MB
NotesBench:
        NotesBench是测试各种不同Lotus Notes方面的驱动程序。目的是执行自定义工作量教本中的命令,模拟客户机的操作。NotesBench测试“仅测试邮件”和“测试邮件和数据库”。所有已经公布的IBM结果均为“仅测试邮件工作量”。
p680 NotesBench测试值:150,197
用户数:108,000
平均反应时间:0.584秒
Domino服务器版本:5.06a
操作系统:AIX 4.3.3
CPU数:4
测试日期:2001.11.20
测试配置:IBM eServer pSeries 680 (24*RS64 IV/600MHz; 96GB RAM, 30 Partitions)
测试时代:http://www.testage.net

自动化测试成功的关键

来自:IBM
        在本文中,我们要讨论为什么进行测试,尤其是自动化测试,是必需的。然后,我们将介绍制定计划的概念:为什么制定计划是如此的重要?在随后的文章中,我们将分解测试计划中的不同因素,并且研究如何进行制定计划的过程才能最大程度地增加成功的机会。
        现代客户端/服务器应用程序是非常复杂的,因此测试也就成为开发过程中关键的并且至关重要的一部分。现在,没有人会考虑(或者承认)不对自己开发的软件进行测试工作。但是,研究和调查表明,在软件开发过程中,制定测试计划却常常是优先级较低的工作项目。而且,更加糟糕的是,计划往往没有被执行,或者即使执行了,也进行的不很完整、不很准确,或者没有持续进行。
       假设我们都赞成测试是必要的,那么我们接下来必须回答这些问题:我们如何进行测试?实际上都包括哪些内容?我们如何保证已经进行了有效的工作,并且真正地改善了应用程序的质量?
       答案很简单:制定计划。
       本文将评审在软件生命周期中制定测试计划的作用,以及有效制定测试计划的有关概念。在本文中,我们要讨论为什么进行测试,尤其是自动化测试,是必需的。然后,我们将介绍制定计划的概念:为什么制定计划是如此的重要?在随后的文章中,我们将分解测试计划中的不同因素,并且研究如何进行制定计划的过程才能最大程度地增加成功的机会。

1. 为什么花费精力制定计划?

       现在看来,没有怎么制定测试计划而造成的后果比以前更加明显了。失败的案例有很多–看看报纸或者杂志就知道了。还有一些明显的低质量软件的案例,它们包括:
       AT&T-一个软件交换系统,系统崩溃造成了美国几乎24小时的长距离通信中断。仅仅修改了一行源代码就解决了问题。
       Denvor机场–软件的缺陷延误了机场的开放几乎长达9个月之久,据估算,每天花费纳税人大概$500,000。
Ashton-Tate–在80年代,Ashton-Tate的DBASE软件是基于PC的数据库应用程序的实际标准。版本中的缺陷导致了利润的减少,最终造成了Ashton-Tate(和DBASE)的转让。Ashton-Tate最后被Borland(拥有极具竞争力的数据库管理应用程序,Paradox)收购。
       当然,这些都是知名度很高的公司和项目。这些问题不会出现在您的公司中,对吗?
       错误!我们都要面对软件的缺陷,在我们的组织中与外界都是一样,这些问题都是关键的,也是很明显的。这里有一些低质量软件的更加共同的症状:
l      生产力损失
系统性能;
缺少功能/特性;
没有满足用户需求–无法销售;
l      用户挫折感
强迫用户以不直观的方式执行任务;
循环工作;
延迟;
没有满足预期目标;
存在用户操作错误与理解错误;
l    系统崩溃,数据丢失/破坏

2.客户端/服务器应用程序到底有什么差别?

       客户端/服务器应用程序为质量保证专家带来了不同的挑战,下面是一些比较重要的内容:

2.1 快速应用程序开发

      大多数的客户端/服务器应用程序都使用快速程序开发(RAD)方法学进行开发。测试人员必须"努力跟上"这些较短的开发周期。早些时候,非客户端/服务器应用程序常常使用18-24个月就完成了整个的开发过程和初始部署。现在,使用RAD,应用程序的发布需要经过多次部署或者"块"。每个块都基于以前的版本,并且包括改善、修改和修理。每个块都需要多次创建或者迭代的原型。每个块都需要进行测试,并且在3-6个月的更短时间内完成。

2.2 客户端/服务器架构

        当前的客户端/服务器应用程序都需要很多的软件组件结合起来以实现功能,包括客户端应用程序、工作站操作系统、网络和数据库管理系统。常常也包括其他的组件,例如为实现正确执行而包含的附加源代码的DLL(动态连接库)、事务处理器或者应用程序与数据库管理服务。软件的每个附加"层"都在客户端/服务器架构中增加了额外的复杂度(并且需要进行测试)。

2.3 多种类型的测试

      另外,测试客户端/服务器应用程序也需要使用许多不同类型的测试方法,例如,功能测试、用户界面、性能测试以及配置测试。这些测试都针对一个或几个测试目标。为了防止测试迂回不前或者尝试同时测试所有内容,每种测试必须制定仔细的计划。当您进行自动化测试时,这一点尤其正确。

2.4 数据

      对于我们执行的每种类型的测试,都必须使用数据。数据对于测试的执行和成功完成来说是至关重要的,因为要使用数据识别最初的应用程序数据状态(条件),并且调用或者引出特定的事件或者操作。而且也要使用数据来验证测试事件或者操作是否运行正常!

3. 制定测试计划的其他原因

      如前所述,现代的应用程序与以前开发的应用程序相比具有很大的不同。客户端/服务器技术加强了我们开发与部署以任务关键型的企业系统的能力,而且花费的周期更短,提供的功能更加强大。客户端/服务器应用程序也为开发人员与终端用户提供了大量的选择和控制。但是使用这些好处的同时,也需要加强测试。

3.1 测试自动化

       逐渐地,测试软件必须使用测试自动化工具和技术,以满足具有挑战性的日程安排。但是,单单使用工具还不足够,成功的测试自动化需要制定测试计划。在没有进行计划的条件下,实施测试自动化只会带来自动化的混乱。使用测试自动化工具,我们可以管理混乱并且识别过程中造成混乱的因素,同时管理项目费用(例如"未被文档化的特性/变更")。
      测试自动化是使软件测试人员跟上开发人员脚步的惟一方式,软件测试人员可以像测试早先构建版本那样,充满信心地、可靠地测试新构建的版本。
       但是测试常常为测试人员带来挑战,他们必须最有效地、生产力极高地使用时间,进行工作。测试自动化引入了一种新型的资源需求–测试开发。手工测试需要进行测试设计,以识别测试的内容和方式,但是由于没有使用工具,所以也没有必要开发任何的测试脚本或过程,仅仅来调试一下系统,然后使用键盘就可以了!如果对于每个要进行的测试,需要使用的资源仅仅是键盘,那么就可以看出,您并没有有效地利用时间。
      测试开发是一种新技术,在设计完成之后,需要使用工具并且创建测试过程。作为一种有效的方式,可以使用三名不同的技术员,并确保将最高级的资源用于设计与制定计划任务上,而将中级资源(或外界资源)用于开发与执行。这样可以增强职员所需的能力,并且共享资源,同时也不会对项目计划产生什么影响。

3.2 缺陷管理与分析

      缺陷是肯定会被发现的。这是进行测试的结果,或者说是目的,所以我们必须对缺陷的生命周期进行识别和沟通,同时分析结果以确保缺陷已被有效地并且高效地处理。制定测试计划能够确保缺陷管理与分析是一笔面向整个项目的宝贵资产,而不会带来阻碍。如果您还没有配备缺陷管理系统和过程,或者已具有但是工作得不是很理想,那么制定测试计划就会给您带来创建(或者修正)它的机会。
      制定测试计划也可以识别应该使用什么样的度量方法。制定测试计划可以处理您所度量软件质量程度的问题。它也可以处理如何度量与沟通缺陷密度或缺陷趋势的问题。
       另外,制定测试计划可以识别与沟通数据收集与分布的方式,也应该指明使用报告的格式,以及作出报告的时间。

3.3 风险分析

      制定测试计划提供了进行风险评估的机会。风险与不利因素对于组织来说是就一场噩梦,但是它们也是可以被控制的。不过首先必须对其进行分析。风险分析有助于制定测试工作的优先级,并且关注所进行的工作,确保测试内容的正确性,以正确的顺序解决正确的问题。(所谓正确,是以组织的风险与可接收度为基础的。)
对于每个项目来说,都要进行风险评估并将其用于识别潜在的风险或者未发现缺陷带来的影响。风险应该用来评估缺陷对于直接终端用户、数据或者其他终端用户和应用程序带来的影响。这些数据可以用来建立测试优先级,并且评估所有约束,例如面市时间、预算或者费用,或者质量问题。
       风险评估还应该包括对于现有标准、指南和需求的评审。其目的就是为了分析这三种文档,判断它们对于项目是否恰当,并且由此进行实施或者修正。
       评审任何可能影响或者对项目带来冲击的外界因素也是很重要的。这些影响可以包括特定用户请求、规范的需求、或者市场条件,这其中的任何一项都可以变更风险或者优先级的评估结果。

3.4 过程改善

       制定测试计划就是为测试过程制定文档。为测试制定计划不仅仅为文档化并且沟通测试工作提供机会,也可以评审测试工作的有效性。
l      您曾听到过以下对话吗:
"用户报告发现缺陷在…,难道你没有测试它吗?";
"这是如此的明显,你怎么能发布带有这种缺陷的产品呢?";
"我知道你已经说了需要三个月的时间进行测试,但是你只有两个…";
       改善产品质量(具有较少的软件缺陷)需要对产品开发过程进行持续的完善工作。开发测试计划可以使测试人员能够识别、执行、度量并且改善他们的测试工作。
       总而言之,可以从几个理由来说明制定良好计划的自动化测试的必要性。首先,不进行测试的组织会大大增加出现重大系统故障的可能,带来延迟,花费巨资进行修复,而且还可能潜在地带来对于客户信心无法修补的破坏。其次,现代客户端/服务器应用程序的本质允许快速地开发出复杂度很高的系统,该系统完全无法使用传统的手工方法进行正确的测试。最后,制定计划的目的就是为了管理不断增加的测试过程,分析并且跟踪已被发现的缺陷,执行关键性风险分析,并且持续改善测试与开发过程。
测试时代:http://www.testage.net

微软公司软件接收测试过程

来自: Microsoft
       一个公司核心业务过程的应用软件对它的经营效率起了关键性的作用。然而,1995年之前,微软没有一个正式的、连续的、面向企业的适当步骤,来确保它内部的应用软件按照一系列统一的公司标准开发。今天,微软信息技术小组的软件接收测试过程确保证关键任务的应用软件能在公司的信息技术硬件设施上高效地运行,与严格的操作标准一致。这些标准建立起来是为了最优化应用软件的运行和集成,减少来自上面的行政管理。
        卓越的产品对公司的成功非常重要;一支有动力的销售力量也是成功关键。但是,如果一个公司二者兼具,但业务过程上的应用程序与它的产品实力、销售力量、领导不相适应,该公司的发展速度仍然会渐渐变慢。这些应用程序帮助管理企业内部最深层次的工作,如对报告系统的指令跟踪和融资、帮助桌面呼叫跟踪系统等所有这些内部开发的用于支持创新性的、竞争性的商业实践的应用软件。
       为了保证它的核心业务过程上的应用软件能够提供最良好的运行、最小程度的上级管理,微软公司依赖于它的信息技术小组的软件接收测试过程。这个过程保证所有内部开发的、为公司环境使用而设计的应用软件都是按照一系列正规的、以公司为基础的标准来建造和测试的。这些标准定义了一个应用软件是如何与其他的软件互相作用,它如何使用公司的数据库,它是如何被建造在世界范围内的网络上最优化地运行。
        结果,内部应用软件开发商能够改进开发周期,微软数据中心的经理能比从前更有效地运行和维护这些内部应用软件。从1995年开始帮助微软减少内部开发和维护费用每年超过两百万美元。它还帮助微软建立了一个更加核心化和强有力的软件环境。

1. 标准的要求

        "我们从1995年的七月开始开发SAT(软件接收测试)过程" 格瑞吉·吉斯维兹说,他是微软信息技术组中SAT小组的高层经理。"在那之前,内部开发的业务过程应用软件是直接到数据中心和直接挂到国际网上的–简而言之,它是自己进入微软的产品环境中去的–没有任何一种运行标准,也没有任何一种正式的软件接收过程。"当开发商在这些应用软件被投放市场之前对它进行常规性的功能测试的时候,这种功能测试并不能保证此应用软件在微软的公司范围内的产品环境中工作得很好。
        在1995年之前,微软的业务过程上的应用软件开发商所面临的一个最基本的问题是,缺乏关于如何为开发业务过程应用软件来最优化微软的产品环境的核心的信息库。这些应用软件的开发在单个经营单元信息技术小组内进行,公司没有集中的工程或开发小组,单个BUIT开发小组很少知道其它BUIT小组的开发商在做什么。并且,没有一个小组和微软公司内负责运行公司的网络与数据库系统的组织直接挂钩,所以不存在正式的过程去协调开发商的努力和他们对管理微软硬件设施的期望。
       结果,当这些应用软件最后被挂到公司的网络上去,并开始和公司的数据库与其它应用软件互相作用的时候,他们并不总能象期望的那样工作。一些应用软件在网络上工作地很差,一些不能与它们的整体融合,还有一些要占用准备进入的服务器和数据库的所有资源。开发商不得不极其费力地降低这些波动性,或者重新修改这些应用软件,直到它们能连续、可靠地运行。

2. 信息、指令以及合法性的唯一资源

        为了开发系列正式的指导性原则,以利于优化微软公司业务过程的应用软件的开发,为了让这些指导性原则在整个BUIT中趋于严格的一致,为了给全公司的开发者、经营单元经理和执行者提供关于开发中的业务过程上应用软件的单一的信息源,ITG创建了一套正规的程序。在微软执行者的支持下,SAT小组与管理公司数据中心和公司网络的组织密切合作,去创建一套业务过程应用软件的正式标准。这些标准现在为内部应用开发提供了最好的实践指导,使微软的开发者能为硬件设计应用软件,在系统软件上运行,并且数据库管理系统在微软的产品环境中工作得更好。

3. 微软的SAT过程

        在SAT过程的最开始,内部应用软件开发商用SAT的局域网工具登记他们的开发计划。登记提醒SAT小组一个新的软件开始进行,由此产生一系列会议,把开发者们、SAT小组成员,和真正管理产品环境中的小组成员召集到一起。局域网工具提供给开发者一套最新版本的微软运行标准文件,其中呈列了最近的硬件、网络、操作系统、业务过程应用软件数据库管理的标准,使这些信息通过SAT在微软局域网上的站点发布,让全公司的开发者、管理者和执行人员非常容易得到。
       在程序开发过程中,开发者不断向SAT的工具数据库添加新信息:安装手册、使用和维护指南、非标准化的模板的文字稿(保证使用者有足够的信息支持程序)。SAT小组和开发者一起工作,建立一个确保企业质量(EQA)的测试以确信程序符合微软操作标准,能够在微软产品环境中正常运行。EQA测试计划和日程被列入SAT工具数据库,并成为永久部分,这样在后来的设计和运行出现问题后可以进行参考。

4. 工程支持于质量保证测试

       新的LOB程序实际测试之前,SAT组和BUIT开发者密切合作来确保大家在合作中能从对方的经验获益。微软公司企业程序服务部总经理Bob Lunn说:"SAT工程小组的每个人从BUIT队伍中获得了经验和知识,然后把这些知识化为最优秀的实践,使所有的BUIT成员都可使用。这样,有助于调整大家一起开发程序。"
        微软企业数据管理主管Tim Thiers说:"我可以给你一个特殊的例子,当遇到了广域网(WAN)中用户的运行问题时,微软公司使用双重的基于客户-服务器的程序跟踪意外情况。SAT组中的工程组就能在程序上进行重点测试,在微软终端服务器上诊断它能否通过广域网解决问题。如果我们使用终端服务器来支持程序,他们就可以提供功能上定量精细的帮助。"
        "在意外跟踪程序的一项关键功能上,SAT工程组证明:对在通常微软带宽为X、延迟率为Y的辅助环境的通常用户,当使用终端服务器时,功能调用的行为将导致z%性能增加。他们能告诉我,反应时间从多少秒到多少秒–反正是一些很难记住的数字–这样就有足够的信息进行成本-收益决策,确定采取什么样的技术。"
         除了为了提供测试支持来开发最佳程序设置,在微软新产品环境下运行时,SAT组中的工程组还可以帮助测试LOB程序性能。作为微软产品销售的SAT过程的部分,微软最大的销售收入和库存数据软件,SAT工程组要测试它在MS SQL 7.0环境下的性能。这不仅使开发者可以提前预见并克服它与新数据库系统合作时的性能问题,还为MS SQL 7.0找到了企业环境的实验台。
        Alan Perkins是SAT组的高级系统分析员,他说"这有助于SQL服务器开发组在发布产品之前强化其功能。他们带来改进型版本,要我们对现有版本进行针对测试。测试后,我们反馈回结果:哪些查询快,哪些慢,什么时候发生饱和,诸如此类的问题。"Gicewicz补充说,"这些反馈对SQL服务器7.0起了积极影响。最新版本响应MS Sales查询的速度比前期版本提高了65%。"
        除了开发过程中的咨询作用、确保SAT过程最终成功外,SAT小组使LOB新程序通过了正常的EQA测试。Gicewicz说"在软件产品真正降生前,它要先获得SAT准生证。这意味着我们已经成功安装,该软件可以跻身于模拟的产品环境,通过了真实条件的测试。"
         作为测试过程的一部分,SAT组应用广域网模拟和一套内置的第三方工具来模拟微软企业产品环境。这些工具包括Network Monitor 和Performance Monitor(应用于Windows NT Server操作系统),RadView 公司的WebLoad、 Optimal公司的Application Expert以及两种内部开发的工具(用来管理和测试SQL服务器)。当成千的用户在Intranet上同时点击应用程序时,这些工具可以模拟服务器的行为,可以通过广域网模拟网络连接来测试程序的表现,甚至可以模拟众多用户同时查询数据库的情况。另外,EQA过程检验程序是否符合微软操作标准规范–以确保它与为LOB程序已建立的引导相匹配。

5. 推出最好的产品

        微软公司有大约250个企业系统,SAT过程是为加强它们的稳定性、可靠性、可度量性设计的,为遍布世界各地的决策者提供有用和高效的信息管理工具。如何把优化程序做得最好,如何在软件进入产品环境前彻底测试–这些知识被集合在一起,为微软公司每年节约200万美元(自1995年开始)。这一过程也缩短了LOB程序返工的时间(目的是优化其性能,使之能在微软产品环境正常工作)。返工时间从1996年起下降了30%。
       微软公司从SAT过程中意识到了另外的切实的、可度量的、本质固有的利益。质保测试过程提供了机会,从中可以发现和改正程序中的缺陷,避免了在演示和发布后引起问题。Gicewicz阐述说,通过EQA测试后的IT基础设施效率更高。对程序不熟悉的人要进行安装测试,这样可以促使开发者注意到并解决一些安装问题–如果是由熟悉程序的人来安装,他们可能对这些问题意识不到。
        最后,通过对所有内部LOB程序开发的巩固和调整,SAT过程对微软公司的所有人起了促进作用:如果微软的雇员想得到关于提供商业支持的程序时,它提供了一个单一答案库。格瑞吉·吉斯维兹说:"如果你是CIO或行政主管,你就想知道在微软公司到底有多少这样的LOB程序。很简单,在微软主页上就能见到答案。你还可能希望了解关于程序框架的不同观点–比如,共有多少种金融信息管理系统。你可以深入钻研SAT数据来发现按商业功能分类的程序。在以前,你对微软的LOB程序是难有知闻的;现在,容易多了!"
       优异的产品、充满激励的销售、一整套的战略协调的LOB程序(已经针对企业优化,并且经过了SAT的严格测试)–这一切,使微软公司的市场表现卓越不凡。
测试时代:http://www.testage.net

游戏软件的测试方法简述

1. 测试的定义

       如果给个定义,我觉得:测试工作是,解决玩家所遇非正常问题的预测工作,同时也是不断调试平衡的一个长期观察任务。无论在什么时间段,功能实现、内测、公测等。测试都应该是分硬件与软件两部分测试。

2. 硬性问题

       硬件的BUG部分是指会引起不能让游戏流程进行的BUG。死机、画面出错等硬性问题。这种问题只要按照一定流程进行游戏,就会发生。但对一些会不断增加服务器负担的高级BUG,应该不会短期测试出来。而对这种在有计算机就出现的问题,现在的游戏在制作过程中都有可自动记录问题的LOG功能,所出现的BUG大多会被程序部门解决掉。部分的LOG功能可保留到正式客户端,以收集因为升级客户端,而不断产生的新问题。这里应该不会在讨论范围内吧。

3. 软性问题

        而软件的逻辑部分大多会在后期进行,比如公测。是各种功能的数值调整。主要为游戏的世界定义一个平衡。除了初级的数值设定外,内部测试人员很少有能把一个功能测试千万遍的。于是有可能产生出猫耍的老虎团团转,这种经典的寓言故事。策划及相关测试人员注重的应该是这部分的测试原理及方法。
       而这部分问题的测试,同硬性问题一样,需要一定流程及要求。而具体流程只有根据具体游戏来决定,大多是将问题分裂存放,并将理由归纳。但有几点是不变的。

3.1 平衡的目标

        而如何让各种设定不偏离主题,明确世界背景及制定等级概念应该是首要的。尤其在一些角色等系统十分复杂的情况下。那种变态ADD的规则,可由主角的5~6种基础属性影响到数十种战斗、非战斗技能。还可根据各种物品来休整这些数值。而无论如何。他们都有个明确的等级观念。从弱到普通,再到强,甚至到最强的龙。这是因为他们知道一个人,最强也不能强过龙。这样就给自己定下上限目标。
       所以,测试时首先不要去看玩家可选择的职业技能等等是否足够多。都会获得什么强大的技能、体力等等。先了解到这个世界里,各个种族之间的关系、职业的互补、各个角色的互相的关系,在整个世界中是什么位置,是否够合理、让常人可以现实中的逻辑去衡量,这个角色在游戏是否合理。之后才需要针对每个种族、每类职业、每个角色的平衡。最后到一个一个角色的测试。有人会说这是前期策划制定讨论的部分,没错,因为测试从这里就已经在策划的头脑中开始了。
       在这里定义的过程,正好与现实世界中相反。现实世界是总结出整体的平衡,而游戏世界则要定义平衡,再将世界整理成平衡的状态。

3.2 划分等级

       测试时同样要明确问题的严重等级,一个数值影响的事物越多,那他的严重等级越高。现在的MMRPG整个属性结构,基本都类似树形结构,之间也有着一些交错的枝叶。力量等最基本的角色属性,为根。这类属性会影响到的其他属性,最终到达游戏的胜负,任务的完成等等。而这些属性的等级自然也就十分明确。根为最高,枝叶最低。而修整树木永远不会从根开始。
       力量,最基础的属性,结合自己的命中率,对方的敏捷等,会影响物理攻击。同样也影响着可拿的武器。但如果这个人攻击力过高。那是谁的原因?是武器,还是角色的力量。需要修改那一个?那些角色的基础属性是最不能随便修改的。因此,还是武器吧。实在不行在从由属性引发的其他部分着手,如技能的熟练度等。越基础的部分,影响力越大,也最容易出错。角色的基础属性是一切测试的根源,同样也是最不能随便更改的一类。更不应该因为某个问题而被指明要求更改。而添加删除任何一个属性,更会让之前的测试工作有2/3付之一炬,也许更多。而对于各种武器,基本可以与角色测试分开。在角色属性有数十条的游戏中,武器更不会容易出现大的问题。
       严重等级之间从高到底可分为,角色,物品,技能。要修正这三大类属性,尽量在自己的范围内修正。不要妄想在其他级别动手,更别想在比自己之前高的级别里动手脚。而在这些属性里面同样还各种属性,就需要根据具体游戏进行划分测试。虽然这里以属性距离,但任务也同样如此,相互关连的任务网同样十分重要。只不过之前变化较属性掠少。

3.3 玩家是否付出与获得成正比

        现实世界中,没有可能可用捷径获得某一种事物、,只有拼搏。游戏世界里是否也是?获得一个强大技能之前,给角色的锻炼是否足够。让他足够珍惜这一种技能或物品。这是游戏中较为关键的一部分,多体现在任务上。时间、精力的消耗,是否足够让玩家获得物品时有足够的满足感。以及对得起测试人员的劳动。

3.4 记录、调整,总结

         软性问题应该同硬性问题一样拥有足够多的文档资料来记录,同时也方便对以往数值的效果再思考。这也应该是所有文档资料应该具备的,记录每次关键更新的工作。
   调整方面Sid Meier说过,每一次调整都要多一些。这样可以看到数值中的巨大差别,从中找到合适的数值。这几乎是知道Sid Meier的人都知道的一句话。(大意相似,具体内容没办法记起来,惭愧)
        很多时候,测试时会直接将测试的内容按自己的想法修改。即便记录下来也是只要改好就好。其实很多时候这些修改都有一定规律,一些修正往往是没改变任何事情。多一些时间去探讨大家是否按照原来制定的目标去修正,会更合理的利用剩下的时间测试。同样,全部结束后的总结也会让下次制作时避免出现需要大量修正的设计。
测试时代:http://www.testage.net
2005年08月03日

软件测试的新模型

作者:Brian Marick 翻译:Blueski
    通常情况下,一个软件模型说明的内容主要包括,在测试过程中你应该考虑到哪些问题,如何对测试进行计划,测试要达到什么目标,什么时候开始,在测试中你要用到哪些信息资源。一个好的模型可以引导你对问题进行思考,而不好的模型则只能使你误入歧途。
    这里我要宣称的是,目前的大多数软件测试模型都是不好的模型。这是因为这些测试模型仅仅是软件开发模型的一些装饰和补充而已。
    人们一直在苦苦寻找软件开发的模型,在创建了新的模型后,就把测试作为一个阶段放在模型的后面部分。因此测试总被作为一种事后行为,测试总是被开发所驱动。总的来说,我们是在检测他们的完成品。但是,作为事后处理的测试,其驱动方式是不正确的。实际上它显而易见地和开发过程中各种行为之间有关,测试没有起到应有的平衡作用。这样的测试只是检测了开发人员做了什么,而并没有检测到他们是否按照规则做了什么,这样的做法割裂了本该紧密联系的行为,剩下的只有那些匆忙而草率的想法所带来的伤害。
    而这样做的结果就是效果很差的、效率很低的测试。效果很差的测试将导致很多bug没有被发现,而效率很低的测试所浪费的是成本。
    在本文中,我要做2件事,其一,我要否定一个不好的模型,即V模型。我希望通过论述来表明,“单元测试”和“集成测试”这2个词汇可以从我们的词汇表中取消了。其二,我将描述一个更好的模型。不过首先我认为,要真正拥有一个充分合理的模型还为时尚早。我仅仅是描述了一些新模型应该符合的重要的要求。这些要求将在本文末尾处列举。

1. V模型有什么问题呢?

    在本文中我要把V模型作为不好的模型的典型来进行分析。我选择V模型作为分析的典型是因为V模型是最广为人知的测试模型。
    最典型的V模型版本一般会在其开始部分对软件开发过程进行描述,如下图所示:
  
图1–V模型的各级开发阶段
    这是古老的瀑布模型。作为开发模型,它有很多问题,不过这里不作讨论。尽管它的各种状态是我们接着要讨论的大家最熟悉的V模型的基础。我的批评意见同时也针对其它的装饰在一些更好的开发模型之上的测试模型,例如螺旋模型[Boehm88]。
    在V模型中,测试过程被加在开发过程的后半部分,如下图所示:
 
 图2–V模型示意图
    单元测试所检测的是,代码的开发是否符合详细设计的要求。集成测试所检测的是,此前测试过的各组成部分是否能完好地结合到一起。系统测试所检测的是,已集成在一起的产品是否符合系统规格说明书的要求。而验收测试则检测产品是否符合最终用户的需求。
    对于测试设计,显而易见的是,V模型的用户往往会把执行测试与测试设计分开对待。在开发文档准备就绪后,就可以开始进行相关的测试设计。如下图所示,相应的测试设计覆盖在了相关的开发过程之上:
  
图3–将测试设计覆盖了开发过程后的V模型
    V模型有着很吸引人的对称外形,并且把很多人都带入了歧途。本文将集中讨论它在单元测试和集成测试中引起的问题。
    为了说明的方便,这里专门制作了以下图片,图中包括一个单独的单元,以及一个单元组,我称之为子系统(subsystem)。
 
 图4–一个假想的子系统
     对于一个单元应该多大才最为合适的问题,已经有过很多的讨论,究竟一个单元仅仅是一个函数,一个类,还是相关的类的集合?这些讨论并不影响我在这里所要阐述的观点。我们权且认为一个单元就是一个具有最小程度的代码块,开发人员可以对进行独立地讨论。
    V模型认为人们首先应该对每一个单元进行测试。当子系统中所有的单元都已经测试完毕,它们将被集中到一起进行测试,以验证它们是否可以构成一个可运行的整体。
    那么,如何针对单元进行测试呢?我们会查看在详细设计中对接口的定义,或者查看源代码,或者同时对两者进行查看,找出符合某些测试设计中的有关准则的输入数据来进行输入,然后检查结果,看其是否正确。由于各单元一般来说不能独立地运行,所以我们不得不另外设计桩模块(Stub)和驱动模块(Driver),如下图所示。
 图5:单元及其外部的驱动模块和桩模块
    图中的箭头代表了测试的执行轨迹。这就是大多数人所说的“单元测试”。我认为这样的方法有时候是一种不好的方法。
    同样的输入也可以有同一子系统中的其它单元来提供,这样,其它的单元既扮演了桩模块,又扮演了驱动模块。如下图所示:
  
图6–子系统内部各单元间的测试执行轨迹
    到底选择哪一种方法,这需要一种折衷和权衡。设计桩模块和驱动模块要付出多少代价?这些模块如何进行维护?子系统是否会由此而掩盖了一些故障?在整个子系统范围内进行排错的困难程度有多大?如果我们的测试直到集成测试时才真正开始,那么一些bug可能较晚才被发现。由此造成的代价同设计桩模块和驱动模块的代价如何比较?等等。
    V模型没有去考虑这些问题,当单元开发完成后就执行单元测试,而当自系统被集中在一起后就执行集成测试,仅此而已。令我奇怪和沮丧的是,人们从不去做一些权衡,他们已经受制于他们的模型。
    因此,一个有用的模型应该允许测试人员考虑节省并推迟测试的可能性。
    一个测试,如果要发现一个特定的单元中的bug,最好是在该单元保持独立的情况下执行,并且在其外部辅以特定的桩模块和驱动模块。而另一种方法则是让它作为子系统的一部分来进行测试,该测试的设计主要是为了发现集成的问题。由于一个子系统本身也需要桩模块和驱动模块来模拟该子系统和其它子系统的联系,因此,单元测试和集成测试可能被推迟到至少整个系统已经部分集成的时候。在这种情况下,测试者可能通过产品的外部接口同时进行单元测试、集成测试和系统测试,同样的,其主要目的还是为了减少总体生命周期的成本,对测试成本和延期进行测试及由此造成延期发现bug的代价成本进行权衡。据此而言,“单元测试”、“集成测试”和“系统测试”的区别已经大大削弱了。其结果可参考下图:
 
 图7–新的方法:在部分阶段延迟进行单元测试和集成测试
    在上图右边的方块中,最好要改成为“执行某些适当的测试并得到相应的结果”。
    图中的左边会怎样?考虑一下系统测试设计,它的主要根据和信息来源是是规格说明。假设你知道有2个单元处在一个特定的子系统中,它们在运行时相互联系,并且要执行规格说明中的一个特定的声明。为什么不在该子系统被集成时立即对此规格说明中的声明进行测试,就象是在设计完成后立即开始测试的设计一样呢?如果该声明的执行和子系统外的子系统没有任何关系,为什么还要等到整个系统完成以后再测试呢?难道越早发现bug成本越低不对吗?
    在上一张图片中,我们用了向上指的箭头(更有效,但在时间上有延迟)。这里还可以把箭头往下指(在时间上提前):


图8–新的方法:在不同阶段上提前进行测试设计
    在这种情况下,左边的方块中最好被标记为:“在当前信息条件和情况下可以做的任何测试设计”。这样,当测试设计得自于系统中某一个组件的描述时,模型必须允许这样的测试在组件被装配之前被执行。我必须承认我的图片非常难看,这些箭头指得到处都是,对此我有2点说明:
    1. 我们所讨论的事情不是创造美,而是想要发现尽可能多的严重错误,同时尽可能地降低成本。
    2. 难看的部分原因也是因为必须按照某些次序来执行的结果,亦即开发人员先提供系统描述文档,然后测试和这些文档进行关联。这些文档就象是坚实的老橡树,而测试设计则象是细细的枝条缠绕在树上。如果我们采用不同的原理来进行组织,图片可能就会变得好看些。但复杂性仍不可避免,因为我们要讨论的问题本身就很复杂。
    V模型失败的原因是它把系统开发过程划分为具有固定边界的不同阶段,这使得人们很难跨过这些边界来采集测试所需要的信息。有些测试应该执行得更早些,有些测试则需要延后进行。而且,它也阻碍了你从系统描述的不同阶段中取得信息进行综合。例如,某些组织有时执行这样的做法,即对完成的工作进行签署。这样的规定也扩展到系统测试的设计。签署表示已经过评估,该测试设计工作已经完成,除非对应的设计文档改变,否则就不会被修订。如果同这些测试相关的信息后来被重新挖掘和认识,例如,架构设计表明有些测试是多余的,或者,详细设计表明有一个内部的边界可以和已存在的系统测试组合在一起进行测试的话,那么实际上还需要继续调整原来的系统测试设计。
    因此,模型必须允许利用不同来源的综合信息进行个别的测试设计。另外,模型还应该允许在新的信息来源出现后重新进行测试的设计。

2.一个不同的模型

    让我们来看本文的第二项内容,一个不同的模型。
    很多时候人们把代码移交给其他人,并且说:“希望你能接受和喜欢它。”这不仅发生在将整个项目放在一张光盘中交给客户的时候,也发生在项目内部。
    例如,一个小组对另一个小组说:“我们已经完成了为COMM库加入了对XML的支持。源代码现在已经放在master库中,可执行库则已经加入到集成与创建的环境中。XARG小组的工作已经没有什么阻碍了,随时去取吧。”
    某个程序员检查了bug的修改并且发出邮件:“我已经修改了Bug列表中的那个Bug,很抱歉!”至此,早先受该问题影响的其它代码就可以继续处理了。
    在这些情况下,人们要把代码移交给其它人,其中有可能会存在一些影响。测试人员需要干预这个过程。在移交之前,测试人员应执行这些代码,发现其中的bug(影响),并且提出问题:“你确实要提交这些吗?”由此,移交的内容可能会被延期,直到bug被修复好。
    尽管你还要做其它的各种测试,这项测试仍然是很基本的测试工作。如果你没有做这样的测试,就不能算是合格的测试人员。
    我们的测试模型必须包含这一重要的现实需要:针对代码移交的测试。由此,测试模型应提示进行针对每一次代码移交的测试。
    就让我以支持XML的COMM库作为例子。这里存在着一个小组把代码移交给XARG小组以进行项目的余下部分。那么谁会遭受影响?
  •  要将这些支持XML的代码直接进行使用的XARG小组可能会立即受到影响;
  •  这可能会在稍后影响到市场人员,他们要在一个行业展示会议上为“合作伙伴发行”版本提供产品演示和宣传,而XML支持是影响他们销售的重要部分;
  • 还有,它可能损害采纳我们的产品的合作伙伴。
    现在我们可以提出一些有趣的关于测试计划的问题了。最简单的可以做的事情是,在移交的时候立即执行XML支持的完整测试。(“完整”的含义是,为此设计尽可能多的测试)但也许一些XML特性并不是XARG小组所需要的,因此可以把它们放在合作伙伴版本封版(下图中的“Partner Release”)的测试中去。这意味着可以把一些XML相关测试放到稍后的移交过程中去。或者基于其它理由,例如在近阶段有其它的测试任务要执行。而XARG小组则要因XML中的bug修复而延迟一小段时间。
    我们的测试计划所表示的进度可以通过在开发的时间线上进行注解的方式来表现,如下图所示:
  
图9:添加在开发计划之上的测试计划
    我们应严格地围绕在XML支持的功能交接的时段里进行测试。测试设计和测试支持工作要早于测试执行。而另外的XML测试则要延迟到基于整个项目范围的“代码完成”(图中的“Code Complete”里程碑),或者要等到全部的子系统被集中在一起,而且整个产品为了行业会议而在经过稳定化处理后创建了版本(图中的“Partner Release”里程碑)。
    显然,有两项内容没有包含在代码完成里程碑中:
  • 还有大量其它的测试工作(包括设计、工具选用)。这些工作可能因为COMM以外的子系统的交接而延期。而且,还有用于完成里程碑中所规定的某些风险的测试,例如,可能还有一组用于运行市场人员的演示Demo脚本的测试,包括她可能在无意中引起的偏离。其目的是要避免这样的情况,即当她站在1000人的观众面前时,她还仅仅是第一次以某种特定的顺序来输入数据。
  •  一些首次交接时进行的XML测试需要在代码完成里程碑上再次执行。
    我的观点是,测试计划是由很多困难的决定所组成,这些决定包括人员组织安排、机器资源配置、测试设计的时间定位、测试支持代码的数量、哪些测试要做自动化,等等。这些决定应根据单独的交接中的内容信息来作出。如果仅有一次交接,那么你可以更顺利一些。测试计划还应继续考虑以下问题:
    1. 风险分析,谁会因此受到损害,以什么方式?
    2. 选定一种测试途径来定位特定的风险。
    3. 对测试设计和执行的周期和成本进行估计。
    4. 在项目进度上的特定位置,将计划纳入执行的行动:
     A. 开始对测试进行设计…
    B. 同时设计和创建一些支持测试的代码…
    C. 在全部测试完成以前就执行部分的测试,因为可能存在不只一次的交接,在每一次交接的测试规划中,可能存在一些潜在的复杂的相互影响。工作安排不得不进行一些调整以达到相互间的平衡。测试支持代码和工具需要在各项任务中得到共享。你还必须考虑到在什么程度上让那些为早先的交接所设计的测试在以后重新执行,等等。
    这看起来很复杂。看上去似乎有太多的内容需要跟踪,而且太多的内容可能被忽略。也许你认为我是在要求你要对每一次交接来执行IEEE 829 [IEEE98]中关于测试计划的要求,然后把它们合并为一份贯穿整个项目的针对交接进行测试的测试计划。
    是,也不是。思考问题总是要占用时间的。太多的计划可能会减少结果的产出。在有些时候,你需要做的是停止计划并开始行动。例如,你无法思考并描述每一个bug修复,尽管bug修复也是一种交接。
    但是bug修复是实际工作中现实存在的问题。总体项目计划中应该包含bug修复。需要强调的是,你应该有一个默认的bug修改处理的标准过程,该过程应包括运行于每一个提交的bug修复的验证过程。你还需要努力地去思考问题。很多时候,各项验证是被放在一起同时进行并完成的。
    比较现实地来说,一个模型应该允许一些机械式行为,例如,“不管是哪一个X类型的交接,都要执行下列操作”。同时我们鼓励对特定的交接执行刚刚够的检查,对于风险越小的交接,就越可以采用机械式的测试行为。
    一个明确考虑到基本的测试现实的模型肯定会比忽略这些现实或者把你的工作复杂性完全抽象化的模型做得更好。文档则是另一个例子。
    我还没有提到需求及规格说明书,或者设计文档。某个交接中产生的一系列变化会引起很多争议。这些文档所扮演的角色是什么呢?它们常常是这么被使用的:
  
图10:测试中对开发文档的利用
    文档可以指导你在一个交接变化时如何做出反应。如果你有一份很好的需求文档,它可能是产品所解决的问题的描述,尽管也许不是很直接。它可以帮助你对风险进行分析。一份好的规格说明应对系统的行为进行描述。这将帮助你把测试方法转化为具体的测试。一份好的架构设计则可以帮助你理解变化可能引起的几种不同的情况:系统的其它部分会受到怎样的影响?什么测试需要再次进行?
     我并不是经常能看到好的文档。需求文档常常象是市场销售用的系统特性列表。规格说明书有时就象是在代码完成后提交的用户手册文件。而设计文档经常不存在。
    好了,通过针对交接所引起的变化的集中讨论,我已把测试过程和软件开发过程相对地分离开了。如果文档中关于“XML支持功能加入到COMM”的描述很薄弱的话,我会尽自己所知来进行尽可能好的测试设计。  然后,假如在项目后期,XML相关的用户文档出来了,我就可以对后来再次提交的交接增加相关的测试。假如市场需求改变了,她们经常会这么做,我还会在此后增加或者去除一些测试。所有这一切看起来是这样的:
 
图11–在文档不完整的条件下进行测试,并在后期补充测试
    这样,虽然项目文档总是不到位,而且经常延迟提交,测试的效果也因此常常被降低,我们还是要避免测试受到项目文档的制约。
    头脑灵活的测试人员并不过于相信文档。毕竟,总是人在犯错误。那么,难道不是人在写这些文档吗?
由于“正式的”文档是很薄弱的,测试模型必须明确地鼓励在测试过程中使用项目文档之外的各种不同信息来源。
   测试人员必须和程序员、用户、市场人员、技术作者以及任何的可能为实现更好测试提供线索的人进行交流。测试人员还应该努力把自己沉浸在某些技术所构建的氛围中。例如,我希望测试人员在做XML测试工作时常去访问W3组织的XML地址(http://www.w3.org/XML/)以及其它XML站点、邮件列表,甚至包括比较特别的如Dave Winer的DaveNet/脚本新闻(http://www.scripting.com/)。这些资源并不是所谓的“辅助通道”,而是可以被列入计划和进度日程的资源。
    另外,所执行的测试本身也是一种有用的信息的资源。好的测试人员会仔细阅读bug报告,因为这些报告讲授了系统所存在的薄弱之处。特别地,这些报告还暗示了一些正式的架构设计所没有提供的架构上的策略。执行测试的行为应该产生一些新的测试想法。如果模型没有考虑到这些,那么它就是一个落后的模型。
因此,测试模型应该包含反馈的循环,让测试设计可以考虑到,在运行测试时还可以继续发现到更多的测试内容。
      在我们的工作中,真正的复杂性来自于所有计划的执行都处于一个不确定的、容易忽略的环境里。代码并不是唯一在不断变化的东西。而计划日程也在改变。新的功能扩充会带来新的里程碑。某些功能会从当前版本中去除。在开发过程中,所有人–市场人员、开发人员和测试人员,都会逐渐对诸如“产品究竟提供什么”这样的问题有越来越清晰的了解。在这些情形下,我们怎么能说测试计划的第一个版本会是完全正确的呢?
    因此,模型应该要求测试计划人制定明确的规定,对已交接的交接内容,新的交接,以及交接内容的变更进行负责。

3. 总结

    V模型有以下致命的缺陷,其它模型实际上也与此相似:
    1. 忽略了这样的事实情况,即软件开发是由一系列的交接所组成,每一次交接内容都改变了前一次交接的行为。
    2. 依赖于开发文档的存在,及文档的精确性、完整性,并且没有对时间进行限制。
    3. 认定一种测试的设计是依据某一个单独的文档,而不包括根据其前后阶段的文档的修改而作相应修改。
    4. 认定这些依赖于某个单独文档的测试一定要在一起执行。
    我大致描述了一个替代模型,但还不够精细。它考虑到了代码的交接和里程碑。对测试成本控制作了以下明确描述:
    测试设计的目标是定义好可能发现bug的测试输入,而测试执行的目标是以各种方式加入这些数据,并检验结果,由此来降低整个生命周期的成本。
    我们的模型假设软件产品总是不完美的,开发过程中有很多变更,而且对产品的测试也是一个不断学习的过程。
    过去,我很少考虑到模型。表面上我一直还在用V模型。虽然我按此制订计划,但我总是还要花费很多额外的精力和时间来考虑模型中没有提到的方面。换言之,模型造成了一些阻碍,因此我有必要对此进行研究。
    对一个新的模型来说,对模型所提出的要求必须非常明确,这就象业务需求对产品开发非常重要一样。我希望自己对本文中所提倡的模型的要求的描述能够和V模型中的描述一样精确,并具有同样的指导意义。
    理想的测试模型应该包括下列要求:
1. 使测试对项目中的每一次代码交接有所反应。
2. 要求测试计划人制定明确的规定,对已交接的交接内容,新的交接,以及交接内容的变更进行负责。
3. 在测试设计中,除了使用项目文档外,还应明确鼓励使用其它各种信息,这些信息有不同来源。
4. 事实上项目文档总是不到位,而且经常延迟提交,测试的效果也因此常常被降低。但我们还是要尽量避免测试受到项目文档的制约。
5. 允许根据多种来源提供的综合信息来设计一些独立的测试。
6. 让测试被重新设计,以新的信息形式进行表现。
7. 包含反馈的循环,让测试设计可以考虑到,在运行测试时还可以继续发现到更多的测试内容。
8. 让测试人员认识到,避免测试的延迟可以节省成本。
9. 在组件被组装到程序中去之前对组件的执行进行测试。
感谢
是James Bach最早让我认识到,在测试计划中应考虑到交接。Noel
Nyman和Johanna Rothman在一份草案中提供了一些有帮助的评论。Kamesh Pemmaraju和Carol Stollmeyer使我终于没有放弃对原理的辩解和阐述,不仅是在细节方面,也在实际生活中,以及每一个实际项目中。他们给了我很大的促进,使我去反复地思考问题。
参考
[Boehm88]
Barry W. Boehm, “A Spiral Model of Software Development and Enhancement,” IEEE Computer, 1988年5月
[IEEE98]
"IEEE Standard for Software Test Documentation," IEEE标准829-1998, 电子和电气工程师学会, 1998
[Marick98]
Brian Marick, “When Should a Test be Automated?” 国际质量周刊,1998年5月(ftp://ftp.rstcorp.com/pub/papers/automate.pdf

嵌入式软件测试策略

作者: admin
       在嵌入式领域目标系统的应用系统日趋复杂,而由于竞争要求产品快速上市,开发技术日新月异,同时硬件发展的日益稳定,而软件故障却日益突出,软件的重要性逐渐引起人们的重视,越来越多的人认识到嵌入式系统的测试势在必行。提到嵌入式软件测试,首先要简单介绍一些软件工程的一些观点,现在,被普遍接受的软件的定义是:软件(software)是计算机系统中与硬件(hardware)相互依存的另一部分,它包括程序(program)、相关数据(data)及其说明文档(document)。其中程序是按照事先设计的功能和性能要求执行的指令序列;数据是是程序能正常操纵信息的数据结构;文档是与程序开发维护和使用有关的各种图文资料。 
   对于一般商用软件的测试,嵌入式软件测试有其自身的特点和测试困难。
  由于嵌入式系统的自身特点,如实时性(Real-timing),内存不丰富,I / O通道少,开发工具昂贵,并且与硬件紧密相关CPU种类繁多,等等。嵌入式软件的开发和测试也就与一般商用软件的开发和测试策略有了很大的不同,可以说嵌入式软件是最难测试的一种软件。
  嵌入式软件测试使用有效的测试策略是唯一的出路,它可以使开发的效率最大化,避免目标系统的瓶颈,使用在线仿真器节省昂贵的目标资源。自从出现高级语言,开发环境与最终运行环境通常都是存在差异的,嵌入式系统更是如此。开发环境被认为是主机平台,软件运行环境为目标平台。相应的测试为host-target测试或cross-testing。
  讨论嵌入式软件测试首先就会遇到一个问题:为什么不把所有测试都放在目标上进行呢?因为若所有测试都放在目标平台上有很多不利的因素:
1)测试软件,可能会造成与开发者争夺时间的瓶颈,避免它只有提供更多的目标环境。
2)目标环境可能还不可行。
3)比起主机平台环境,目标环境通常是不精密的和不方便的。
4)提供给开发者的目标环境和联合开发环境通常是很昂贵的。
5)开发和测试工作可能会妨碍目标环境已存在持续的应用
   从经济上和开发效率上考虑,软件开发周期中尽可能大的比例在主机系统环境中进行, 其中包括测试。

 确定host-target测试环境后,开发测试人员又会遇到以下的问题:
1)多少开发人员会卷入测试工作(单元测试,软件集成,系统测试)?
2)多少软件应该测试,测试会花费多长时间?
3)在主机环境和目标环境有哪些软件工具,价格怎样,适合怎样?
4)多少目标环境可以提供给开发者,什么时候?
5)主机和目标机之间的连接怎样?
6)被测软件下载到目标机有多快?
7)使用主机与目标环境之间有什么限制(如软件安全标准)?
  任何人或组织进行嵌入式软件的测试都应深入考虑以上问题,结合自身实际情况,选定合理测试策略和方案。
对于嵌入式软件测试或叫交叉测试(cross-test),在测试的各个阶段有着通用的策略:

1.单元测试:
    所有单元级测试都可以在主机环境上进行,除非少数情况,特别具体指定了单元测试直接在目标环境进行。最大化在主机环境进行软件测试的比例,通过尽可能小的目标单元访问所有目标指定的界面。
    在主机平台上运行测试速度比在目标平台上快的多,当在主机平台完成测试,可以在目标环境上重复作一简单的确认测试,确认测试结果在主机和目标机上没有被他们的不同影响。在目标环境上进行确认测试将确定一些未知的,未预料到的,未说明的主机与目标机的不同。例如,目标编译器可能有bug,但在主机编译器上没有。
2.集成测试:
    软件集成也可在主机环境上完成,在主机平台上模拟目标环境运行,当然在目标环境上重复测试也是必须的,在此级别上的确认测试将确定一些环境上的问题,比如内存定位和分配上的一些错误。
    在主机环境上的集成测试的使用,依赖于目标系统的具体功能有多少。有些嵌入式系统与目标环境耦合的非常紧密,若在主机环境做集成是不切实际的。一个大型软件的开发可以分几个级别的集成。低级别的软件集成在主机平台上完成有很大优势,越往后的集成越依赖于目标环境。

3.系统测试和确认测试
    所有的系统测试和确认测试必须在目标环境下执行。当然在主机上开发和执行系统测试,然后移植到目标环境重复执行是很方便的。对目标系统的依赖性会妨碍将主机环境上的系统测试移植到目标系统上,况且只有少数开发者会卷入系统测试,所以有时放弃在主机环境上执行系统测试可能更方便。
    确认测试最终的实施舞台必须在目标环境中,系统的确认必须在真实系统之下测试,而不能在主机环境下模拟。这关系到嵌入式软件的最终使用。
包括恢复测试、安全测试、强度测试、性能测试,已超出了软件测试的范畴,本文暂不讨论。
使用有效的cross-test测试策略可极大的提高嵌入式软件开发测试的水平和效率,当然正确的测试工具使用也是必不可少的:
   总结一下,应用以上测试工具进行.Cross-test时的策略:
A) 使用测试工具的插装功能(主机环境)执行静态测试分析,并且为动态覆盖测试准备好一插装好的软件代码。
B) 使用源码在主机环境执行功能测试,修正软件的错误和测试脚本中的错误。
C) 使用插装后的软件代码执行覆盖率测试,添加测试用例或修正软件的错误,保证达到所要求的覆盖率目标。
D) 在目标环境下重复(B),确认软件在目标环境中执行测试的正确性。
E) 若测试需要达到极端的完整性,最好在目标系统上重复(C),确定软件的覆盖率没有改变。
    通常在主机环境执行多数的测试,只是在最终确定测试结果和最后的系统测试才移植到目标环境,这样可以避免发生访问目标系统资源上的瓶颈,也可以减少在昂贵资源如在线仿真器上的费用。另外,若目标系统的硬件由于某种原因而不能使用时,最后的确认测试可以推迟直到目标硬件可用,这为嵌入式软件的开发测试提供了弹性。设计软件的可移植性是成功进行cross-test的先决条件,它通常可以提高软件的质量,并且度软件的维护大有益处。以上所提到的测试工具,都可以通过各自的方式提供测试在主机与目标之间的移植,从而使嵌入式软件的测试得以方便的执行。
    使用有效的cross-test测试策略可极大的提高嵌入式软件开发测试的水平和效率,提高嵌入式软件的质量。

附录:
1). HOST-TARGET的连接方法简介:

图1– 直接连接
   
图2 — 通过仿真器连接

图3 — 使用介质进行间接连接

图4 — 使用PROM等传递被测软件
 
图5 — 测试的交互界面

6 — 无交互界面的连接

Rational ClearQuest技巧集

作者: pyp & http
前提:
Rational ClearQuest的版本为2002.05.00
 
问题一:给某些字段设置使用权限,只有相关人员才能看到某些字段而进行填写,对于一般人员使它变为不见,我该如何设置呢?
解答提示:一个比较简单的方法可以让别人看不到你设置的字段:设置一个新的组,把想看新字段的人加到这个组中,在Designer中,设置Forms的时候,加一个Tab页,把只想让一部分人看到的字段都加到这个页中,鼠标右击这个字段,在属性页中,有“User Group Access”这个选择,选择你想要看的组加到列表中就可以了。在使用的过程中,只有相关的组成员才能看到这个tab页,也就间接的等于别人看不到这些字段了。
 
问题二:在Web端访问的时候,只能看到提示“Restricted Query Not Defined”。
解答提示:一般是因为没有注册的缘故,使用CQ的过程中,必须对Web服务器进行License注册。
 
问题三:如何让一些Database不显示在客户端和Web端的使用列表中。
解答提示:在使用CQ的过程中,必须选择Database才可以进入客户端或Web端。而Database的内容,与选择的Schema Repository(s)有关,下面就是如何让部分Database不显示在列表中。
在Designer中,选择菜单中的Database->Update User Database Properties…,选择不需要显示的Logical Database Name,点击“Properties”按钮,进入配置页面。在配置页面中,把“Production Database”选择为“Test Database”,点击“Update”,则此Database将不会显示在列表中。如果将来想要恢复,只要把“Test Database”再选择成“Production Database”即可。
 
问题四:在project的Forms下,我为项目经理设计了一个下拉列表框,请问:如何将users下面的field:login_name、fullname下面的记录值自动在这个下拉列表框里显示。格式就是:login_name(fullname)。
解答提示:这个我并不清楚你要做什么,是在下拉框中显示所有用户的登陆名和全称,还是显示一个组的,或者是显示当前登陆用户的?
①如果显示当前用户的 ,则比较的简单。直接login_name=session.GetUserLoginName,full_name=login_name.fullname,把login_name和full_name拼成一个字符串显示出来就可以了。
②如果是在组中的,你可以查看安装目录ClearQuest\apihelp\index.htm中Session Object,User Object,Group Object,Groups Object几章。我的想法是:在field的Choice List中,使用程序进行列表内容的控制,建立一个session,使用session.GetUserGroups取到用户组,再for each user in 用户组,在里面choices.additem(user),但是我试验了一个上午,不知道什么原因,一直都没有成功过,你不妨再仔细的看看Rational ClearQuest API Reference里面的东西吧。如果能解决,最好告诉我解决的办法,我也学习学习。
问题五:对于特定的字段,强制要求用户每次Action的时候,都必须填写。
解答提示:在字段的Permission中,用下面的代码控制:
 SetFieldvalue Field1,""  ’把字段的值设置为空
Field_Permission=AD_MANDATORY  ’让字段必填
 在Behaviors中把需要必填的字段状态设置成Hook就可以了。
 
问题六:在Clearquest Designer里设置Field时那些Type都代表什么意思?比如,Type里的REFERENCE,REFERENCE_LIST都是什么类型,设置成这个类型后,会出现什么结果?您能给我详细说一下吗?
解答提示:在ClearQuest Designer Help中的Selecting a field data type中有相应的说明。
 ClearQuest supports the following field data types:   
 Data                     Description/Comments
ATTACHMENT_LIST:    Allows records to store files related to the record.
DATE_TIME:    SQL date and time.
INT:  SQL integer.
MULTILINE_STRING:  A variable-length string of unlimited size.
REFERENCE:    A reference to a unique key in a record type.For REFERENCE type fields, you must select a state-based or stateless record type to refer to. You can also enter an optional back-reference field to create a link from the referenced record back to this field’s record and can specify that the referenced record type is under security control. 
REFERENCE_LIST:  Multiple references to unique keys in record types. Reference-list fields allow you to reference multiple records within a field. You can use reference-list fields with a parent/child control to link related records.For REFERENCE_LIST type fields, you must select a state-based or stateless record type to refer to. You can also enter an optional back-reference field to create a link from the referenced record back to this field’s record.Note: You cannot use the REFERENCE_LIST type when creating a report. Multiple record references within a field will return a report error.
SHORT_STRING:  A variable-length character string with a 254-character maximum. You set the length in the Properties dialog box when defining the field. Enter a value between 1 and 254 in the Maximum Length field. 
DBID:    Reserved for system fields
ID:    Reserved for system fields
JOURNAL:    Reserved for system fields
STATE:    Reserved for system fields
Note:  You cannot modify the data type or the DB Column Name of a field after you check in the schema. To change the data type, delete the existing field and create a new field with the data type you want.
 我感觉,REFERENCE和REFERENCE_LIST都是一种对象类型,也就是说,他并不指代某种具体的概念,比如int或string等,而是一种集合,使用的时候,可以取集合的某个属性内容。比如在例子中有Owner字段就对应Users集合。
选择REFERENCE就会出现reference to,其中对应的就是左侧树中Record Types和Record Types -Stateless下面的各种类型,比如最常用的Defect就是一个集合,你建立的字段可以指向这个集合。 这些是我自己的一些看法,不一定正确,因为我没有用过,
 
问题七:在设置Action时,可不可以源状态和目的状态是同一个的状态?即:虽然作了那个动作,但是不改变他的状态!
解答提示:从CQ的操作来看,是不支持源状态和目标状态一致的,因为没有这个必要(修改除外,修改的时候,状态不改变)。在建立Action时,Action的属性中,可以设定源状态和目标状态,在源状态选定的时候,就无法选择相同的目标状态了。Rational的CQ主要是变更管理,一个通过Action流转State的过程,自建Action的Type为Modify并无多大的意义。
 
问题八:怎样实现输入project和subsystem后就让他自动定位到某个人,也就是通过输入那个人所属的那个项目和模块,就能够自动定位到某人!
解答提示:可以使用代码控制,但是只对客户端有效,对于Web端仍然必须手工选择人员。
 使用case,把字段内容添入里面就可以了。如果是两个字段控制一个,可以使用If。比如:

 if  project="工程1" then
     a=GetFieldvalue(subsystem).Getvalue  ‘取subsystem的内容
     Select case a ’判断subsystem的取值
            case "subsystem1"
          SetFieldvalue people,"tester1"   ’填写subsystem1对应的人员内容
            case "subsystem2"
           SetFieldvalue people,"tester2"   ’填写subsystem2对应的人员内容
                …………
            case "subsystemn"
           SetFieldvalue people,"testern"   ’填写subsystemn对应的人员内容
       End Select
  End if
   if  project="工程2" then
       Select case b
       …………
           End Select
    End if
 
   …………

 问题九:如何使用邮件规则(E-mail rule)?

解答提示:邮件规则的设置,不是在Designer中,而是在客户端。在客户端中,选择菜单中View->E-mail Options设置邮件服务器;Actions->New->Email_Rule设置在什么条件下把缺陷发给什么人。具体的设置,自己查看帮助。
 Designer中的Email rule,是设置客户端中的显示界面内容的,可以根据需要修改。但是一般我觉得不用管这里,因为通常情况下都是测试人员建立邮件规则,开发人员通常看不到邮件规则的界面。而且建立好后,一般就不做改动了,所以是否好看、是否有冗余字段等都可以不在考虑的范围之内。
 
问题十:在clearquest designer中改了提交界面和处理界面后,在clearquest client中提交bug时,界面怎么没有变化
解答提示:Designer设计后,没有变化,那是因为你没有Update数据库。在Designer中设计完成后,点击菜单中的File->Check In保存修改,再选择菜单中的Database->Upgrade Database,在里面选择你修改完毕的数据库,一般会有新的版本,upgrade新版本就可以了。
 
问题十一: 如何将CQ 从一台SQL 服务器迁移到另一台 SQL服务器?
解答提示: 使用 ClearQuest Maintenance Tool 中
的[Move an existing schema repository]选项。注意在这之前,应在目标服务器上先建立好一个空的CQ数据库及Owner. 完成迁移后,在新的服务器上运行 ClearQuest Mantenance Tool , 选择建立一个新的连接 [New Connection]. 输入新的CQ服务器的主数据仓库的名称、服务器名和管理员名称及密码。

问题十二:将CQ从一台SQL 服务器迁移到另一台 SQL服务器后,如何迁移用户数据库?
解答提示: 当CQ主数据仓库迁移完成后,先在新的SQL服务器上建立各用户的空
数据库.然后进入CQ Designer ,选
择 [Databases ]->[Move user database], 分别迁移每个用户数据库。

问题十三:当在CQ Designer 中更新一个Schema 后,如何更新用户数据库?
解答提示: 当在CQ Designer中更新一个Schema 后 ,选

择 [Databases ]-> [Update user database properties], 可分别更新每个用户数据库。

问题十四:如何正确使用 Check Box (hook)?
解答提示:使用Check Box 有几个注意事项:
1.使用它时不能只建立一个字段而保存多个复选项,而应为每个复选项分别建立各自的字段。 
2.建立 Check Box 后,在  Extended Tab 上的check 文本域中输入要选择的内容,而让uncheck 文本域为空。