热爱测试生活

发布新日志

  • 【转】软件项目管理杂谈

    2009-02-03 11:17:16

    在一次由软件项目管理者组成的交流会上,看到过我所写的《软件项目管理原则谈》的朋友向我发问,如何在所学的项目管理理论和实际项目实践中找到一条连接的纽带;软件项目管理的度如何把握;为什么项目协调中更多的是貌合神离;为什么自己觉得自己所管理的项目老是失败等等。这一连串的问题引起了与会的项目管理者的同感,笔者本人也曾经在项目管理中屡遭挫折,目前的项目管理中依然麻烦不断。但是,作为一名软件项目管理者来说,在实施项目管理的过程中,笔者觉得在项目管理中,我们的大多数人常常在管理思维中留下一些空白,而这些空白正是我们公正、客观地评判和成功执行软件项目管理的必要途径。

      空白1: 为效益而实施项目管理

      为什么我们要实施项目管理,是为了提高项目的效益。这里所指的项目的效益是一个综合性的指标,包括低风险、高产出等。为此我们不难得出我们在实施项目管理应该掌握的度。即:引入项目管理后所产生的效益减去项目管理的成本后必须大于未引入项目管理时的效益。由于引入项目管理后所产生的效益与项目管理的复杂度(项目管理的成本)并非线性相关的,因此项目管理的复杂度必然存在一个最优值,这就是我们应该把握的度。也许上面的说法比较抽象。一个实际行之可效的判断项目管理的度规则就是:大家认可并且能够准确地理解和实施。拿美国项目管理专家James P Lewis的话说就是 KISS原则(Keep it simple and stupid),拿物理学家爱因斯坦的话说就是:Keep it simple but not too simple.

      空白2: 考虑所处环境

      任何系统都是建立在一个具体的系统环境中的,一般情况下受上一级系统影响最为显著,这是系统论的观点。项目管理是企业管理的下属层次,因此在很大程度上项目管理的成功与否常常受企业管理的制度制约(比如说设备采购的批复等待会延误工期),这就是为什么常常会出现计划不如变化来的快的原因。因为我们在制定计划时根本就没有考虑自身和客户双方的企业管理的环境,所以我们的计划在实施过程中会受到企业管理环境因素的影响。我敢跟你打赌:在没有人事激励机制常常拖欠或故意克扣员工工资但获得CMM5认证的公司开发效率不会比一个没有实施项目管理的开发团队的效率高多少。因为恶劣的公司人事制度扼杀了开发人员的天才和积极性。因此,作为一个项目管理者,审视自身的项目所处的企业环境并做出准确的判断是非常有必要的。缺少良好的项目环境,项目管理者的心血常常白费。这往往是我们中的一些项目经理在不同的公司里项目管理表现大相径庭的原因。

      此外,正是基于企业环境这样一个观点,目前美国PMI,日本ENAA等提出了项目管理成熟度模型(OPM3和P2M),改变了传统PMBOK的缺陷(忽略外部因素和自身的灵活性)。有兴趣的项目管理者可以参看有关项目管理成熟度和企业管理方面(建议参看职业经理人方面)的资料。

      空白3: 合理评判软件项目管理

      我们总是把过多的项目失败归罪到项目经理的名头上。他们的角色常常是替罪羊而不是领导者,他们拥有的更多的是责任而绝非职权。实际上项目失败并非完全决定于项目管理,比如说信息系统过低的报价。一个项目按时在预算范围内完成了而另外一个则没有按时完成,这不意味着第一个项目管理得比较好。因为前者可能是项目时间和成本宽松的项目而后者根本就是不可能完成的项目。前者项目管理的意义在于获得较高的项目效益而后者的意义在于避免更大的项目损失。很可惜,充满了浮躁的软件企业没有诸如此类的意识,一些项目在未开始前注定就是失败的,项目经理们一上手便被扣以一责任人的镣铐。因此,项目管理有无具体效果,需要合理地进行评判,单纯以出效益为上的观点未必有失偏颇。

      空白4: 心理学的必要性

      没有一个领域像软件项目管理中人的因素更为重要,在软件领域没有实现自动化之前,一切试图取代人的主要作用的机制都是收效甚微的。人的行为是心智活动的表现。开发人员的心理活动决定了其在开发的表现。合适的压力能够勾起开发人员的成功欲望但是过大的压力却直接影响着项目参与者的身心健康。特别是后者一直以来都未能引起软件开发界的重视。很多人曾经有过不明不白的辞职经历,在没有学习《管理心理学》之前,笔者对这些人的"过激"行为有时想想都觉得奇怪。作为一个软件项目管理者,不了解和掌握管理心理学,很难针对复杂多变的人的因素采取合理的应对措施,同时自身的心理健康也未必能够得到保证。为此笔者建议有条件的软件企业,可以通过聘用心理顾问来处理员工的心理问题,以此缓和由于工作压力而导致的员工之间矛盾冲突和项目坍塌。

      空白5: 尊重常识,系统性考虑问题

      这个观点笔者在《软件项目管理原则谈》已经重申过。就像不要指望人一秒钟跑二十米一样指望项目中有过多的奇迹出现。可惜我们中的大多项目管理者在进行项目管理时依然实施"大跃进"。我们的管理者都知道自然规律不可违抗性,但是却很少有人意识到一些社会规律的不可违抗性。他们总以为唯物的主观能动性能够替代实际,产生奇迹。加班被认为是解决资源匮乏的唯一途径,通过开发人员"无上"的生产力来达成项目的成功。很少有人会意识到加班造成的疲劳会再次使工作效率降低这一事实。这是一种缺乏常识和系统性思考问题的表现。诸如此类的表现还有"唯工具论"和"唯方法论"。

      实际上,项目管理涉及各个方方面面,一味提高某一方面作用而忽略该方面对其它方面的影响,并不能提高项目管理的层次和最终产出,这是制止我们的项目管理者走偏激(极端)立场的一剂良药,希望项目管理者们能有所意识。

      空白6: 学会思考

      项目管理不是拿来主义,需要项目管理者进行认真的思考。这就是为什么我们项目管理者中不乏PMP和IPMP但是项目却未能如愿以偿的原因。理论和实践的差距极大地挫伤项目管理者的积极性。"证书无用论"所持的观点其依据也在于此。理论是一种完美的抽象,而现实是各种条件的集合。我们的项目管理者在实践上往往生搬硬套而忽略其依存条件,这就是招聘项目经理"唯经验论"的来源。一位项目管理者跟我交流的时候提到无法使用挣值(Earned Value)的概念,原因是公司人事部和财务部不愿意出示员工的收入清单。我建议他将挣值换为挣时(Earned Time),以时间替代成本。从项目进度的意义上来看这两者其实是一致的,问题马上得到了解决。可惜的是我们的项目管理者往往未学会思考具体概念的真正含义之前并匆匆上驴,提着长枪去和风车做斗争去了(注:唐吉诃德)。

      空白7: 学会计划

      现实中我们往往用补救措施代替计划,其效果便如软件缺陷的放大效应。在项目经理的招聘中,你听到的只是几个项目管理白痴问你项目出了什么问题应该怎样解决的提问,这些项目管理白痴在不断地做各种问题假设,而你必须根据假设采取各种符合这些项目管理白痴口味的回答。但是,作为项目管理的来说,项目管理的真正意义在于事先预防各种偏离项目目标的问题出现而不是在于解决问题。古话说得好"磨刀不误砍柴工"。你不能期望癌症有100%的治愈率,但是你可以通过合理的生活习惯和锻炼来防止癌症的出现。我们在进行项目管理时,首先应该考虑如何防止问题的出现,虽然它不能保证所有的问题(风险)都可以避免,但是通过计划,你将拥有更多问题(风险)应对储备,能够在问题出现时有备无患。一个只会在问题出现时考虑应对措施的项目经理只是一个失败的项目经理。其项目结果无异是把健康交给医生而不是自己。作为项目管理的定位来说,项目管理应该是"管理会计"的角色而不是"成本会计"的角色。

      最后,以某电影的台词来结束本文,人为什么犯病?简单的东西想复杂了,复杂的东西想简单了,人就会犯病"。拿这句台词来形容我们目前的项目管理状况一点也不为过。软件项目管理是一个从"自发"走向"自觉"的过程,也是一个从经验主义走向理性主义的过程。软件项目管理是一个主动的管理,而这一切,需要广大项目管理者的项目管理思维和积极实践。
  • 【转】软件项目管理原则谈

    2009-02-03 11:16:28

    软件开发的残酷的现实告诉我们:没有规则的软件开发过程带来的只可能是无法预料的结果。我们中的大多数项目管理人员在其个人简历中纷纷写到:“拥有多年的丰富的项目管理经验”,但在实际开发中,“丰富的”管理经验变成了软件开发人员可怕的梦魇。一次次的失败、一次次的返工,她所谓的项目管理经验只不过是再一次的游戏于“无间”(十八层地狱)。一次,在与不少项目管理者的交流中,大家纷纷提到的软件变更带来的可怕影响。但是正如完整的法律体制不能制止犯罪,但没有完整的法律体制犯罪会更加猖獗一样,频繁的软件变更固然可怕,但是没有一个完整的项目管理对应机制,我们无法相像项目最终会是一个什么样子。此外还有一次,笔者在求职时,招聘公司的技术主管(40-50岁左右),向我吹嘘公司按CMM4的过程规则来进行软件的开发和管理。殊不知,我一问下面开发人员,她们在经历无数的加班后正在给已经完成的软件项目添加软件概要设计书,这让我大吃一惊。如此这样形式主义的公司,不呆也罢。
       记得一个格言曾经说过“人类最愚蠢的行为在于忘记常识”。另外一句较为相仿的格言则是“不知道历史的人必然会重蹈覆辙”。作为项目管理来说亦为同样的道理。很可惜,我们中的大多数管理者口口声声“软件工程”,工作时“用程序代替用户需求”,极具政客的嘴脸。其结果必然如目前媒体“程序员生存状况”所言,以开发人员在时间的牺牲为代价来换取项目的结束,这是再为普遍不过的现象,在此不再妄加评论。
       如何改善我们的软件开发管理,一条便捷之道便是“尊重常识,尊重历史经验教训”。在软件项目管理中,有许多的原则和经验可以供我们借鉴。
      一、 计划原则
        没有计划,你无从知道什么时候控制和变更。制定一个详尽的计划,以详细到开发人员可以理解的程度为宜。计划能够告诉你什么时候应该做什么。没有计划,你无从知道自己需要做什么。不少项目经理告诉组员需要做什么东西后扬长而去,丝毫没有一个相关任务(活动)之间的说明。由于没有计划或是计划太粗糙、不切实际,很多项目1/3甚至1/2的时间花在返工上面。因为计划中遗漏了某一项关键任务,项目就有可能宣告失败。试想一下,制定一个周密合理的计划需要耗费这么多的时间吗?需要付出项目失败的代价吗?还有很多项目管理人员常常错误认为“变化比计划快”,但实际的情况是,由于没有计划,你无法预测和估量变化给你的项目所带来影响,你所面临的将会是比面条还难以理清的“混沌”状态。此外,对于开发人员来说,“目标导向(Objective Oriented)”是充分调动其工作积极性的最佳方法,每一个任务阶段的成果能够将员工的工作效率维持在一个较高的水平。因为近期目标总是比远期目标来说更容易看到和达到。为此,制定一个计划吧,让它符合目标导向(通过各个具体任务计划促使项目总计划的达成)。
      二、 Brooks原则
       向一个已经滞后的项目添加人员,可能会使项目更加滞后。因为作为新加入的员工来说,相关培训、环境熟悉和人员之间的沟通通路的增加,迫使项目的工作效率急剧下跌。工作效率下降需要加班来进行弥补,但加班造成的疲劳会再次使工作效率降低。同时工作成本却不断的向上攀升。不过就目前来说,项目管理人员丝毫不会理会这一点,“人多力量大”也许更能引人入胜。不少项目管理人员抱怨到时间的急迫性,须知很多项目内时间的急迫性来自于项目管理人员不假思索和不基于常理的邀功表现,没有充分考虑的开发人员能力的多样性所致。为此,正规的企业不得不耗费大量的加班费用于加班人员的津贴,同时亦要承担违反《劳动法》的潜在法律危险。现在一种万不得已的做法是,假设项目开发人员之间的任务的关联性不是太大的情况下,采取两班倒或是三班倒的方法来保证时间的延续性和相关开发人员的工作高效性。
      三、 验收标准原则
       我们在进行某项任务,往往会为以何种结果为宜而感到困惑。不求质量的开发人员往往凭据经验草草了事,追求完美的开发人员则在该项任务上耗费太多的精力,但此番耗费未必针对该项任务,因而常常吃力不讨好。这是由于没有验收标准而导致的情景。因为没有验收标准,你无法知道你要进行的任务需要一个什么样的结果,需要达到什么样的质量标准。在很多情况下,你的活动会与期望结果背道而驰,而此时的你还在沉醉于自己的辛勤耕耘之中。作为项目经理来说,只有制定好每个任务的验收标准,才能够严格把好每一个质量关、同时了解项目的进度情况。
      四、 默认无效原则
       你的项目成员理解和赞成项目的范围、目标和你所制定的项目策略吗?不少项目管理人员认为“沉默意味着同意”。实际上我们或多或少都会陷入这样的一个思维误区。试想一下,你作为职员或项目开发人员时的沉默完全代表你赞成你的领导的意见吗?不见得,这就是答案。这一点在项目沟通中极为重要,项目管理者切不可为沉默认为是同意,沉默在很大的程度上说明项目开发人员还尚未弄清楚项目的范围、任务和目标。为此项目管理者还需要同开发人员进行充分沟通,了解开发人员的想法。在对项目没有一个共同的一致的理解的前提下,一个团队是不可能成功的。
      五、 80-20原则
        80-20原则在软件开发和项目管理方面有许多“实例”。其一便是我们在20%的项目要求上耗费了80%的时间。仔细分析一下,这些项目要求分为必须的非必须的,因此我们建议是压缩非必须的部分或是暂时将其放在一边不必太重视。软件项目开发事实告诉我们,开发人员在非必须的项目要求上耗费了太多的精力,用户的需求变更的大部分出现在“最好有”这一部分,实际上用户并不看重这些需求(即使去除这些需求),而我们所做的,往往是舍本求末。
        80-20原则的另外一个实例是我们项目中的20%的人员担当了80%的项目任务(这样讲在实际实施中一点都不过分)。考虑到开发人员能力的多样性,聪明的项目管理人员决不会采取任务均分的愚蠢做法,因为就系统论的观点来看,互补结构比对等结构要更稳定一些。此外作为项目管理人员来说,了解属下员工的能力特点,将其放在合适的位置上,会更有利于项目的顺利进行。很多管理人员常常抱怨属下能力问题,究其实质,往往是这些项目管理人员未能发现开发人员潜能所在之处。她们看待问题往往以“经验”这样的思维定势来做决定。导致的结果如系统论所言:由于“抱怨”的作用和反作用循环,结果是大家都不欢而散。
      六、 帕金森原则
       帕金森原则原是用于反映政府部门机构臃肿,效率低下的代名词。不过它在软件开发中一样适用。没有时限限制的话,工作可能无限延期。在软件开发中,如果没有严格的时间限制,开发人员往往比较懈怠。这是人的天性所决定的。千万不要指望奇迹的发生――“所有员工的思想觉悟异常崇高”。作为项目管理者而言,此时应充分考虑到员工的工作效率和项目变更带来的负面影响,制定合理的项目工期并鼓动开发人员尽快完成。
      七、时间分配原则
        在项目计划编制过程中,我们常常将资源可用率(人、设备)等设置为100%,殊不知你曾想过,由于开发人员需要休息、吃饭、开会等,根本不可能把所有的时间放在项目开发工作上,而且这还不考虑到开发人员的工作效率是否保持在一恒定水平上。所谓一天8小时工时制实际上是徒有虚名。由于项目管理人员的“无知”,不少开发人员被迫拼命加班。结果依旧出现Brooks原则所出现问题。在实际开发中,开发员工的时间利用率能够达到80%就已经时很不错的了,我个人比较倾向于60%左右(黄金分割点)。一个常用的经验是如果项目人员不懂技术的话,项目时间可能是原计划(该计划没有考虑到资源可用率)的4/3-5/3。如果项目人员不懂技术、管理人员不懂管理的话,这个数字可能是2倍到3倍。现实就是这么严酷。这很大范围内“归功于项目管理人员。是的,我们的确没有必要责备开发人员,因为我们对资源可用率的判断完全违反常识。
      八、变化原则
        也许有人问过你,在项目管理中唯一不变的东西是什么?我可以告诉你,项目中唯一不变的就是“变化”。在项目中不考虑可能发生的变化是不可思议的。不过在面对项目可能发生变化而带来的项目风险时,我们的项目管理人员往往会怀有逃避的态度。经济学里大名鼎鼎的风险规避原则便是项目管理人员心理的有效描述。作为项目管理人员来说,应该及早预测可能出现的风险,做好风险储备。虽然风险储备不能解决所有的问题,但是“预防胜于治疗”。可惜的是我们绝大多数人没有这方面的意识,否则医院的生意未必如此红火,项目开发之途未必如此坎坷。
      九、作业标准原则
           一个团队要完成项目的开发需要有一定的章法。很可惜,在国内目前仍然以“作坊式”为主,高举“我们符合国际CMM X规范(ISO某某规范)”的环境下,未必有多少项目团队注意到这一点。我们曾经惊叹印度的高中生都能编程序,而国内却非本科、硕士不收眼帘。究其原因,在于没有开发章法或是章法粗糙,犹如牛皮圣旨一般。一个好的代码模板和代码规范能够解决大多数人编写程序随心所欲的问题,很可惜,没有多少项目管理人员有此意识,也没有多少人愿意去做这项基础任务。业务软件开发需要高超的开发技巧吗?不需要,那是故弄玄虚的开发人员的伎俩。软件开发的美在于其简洁性和规范性,不在于奇技淫巧。因为缺乏作业标准,我们付出的代价是客户的抱怨和无休止的返工。此外,对于那些以形式主意蒙人的项目团队来说,如果你实质如同你口头所说那样,也许你就不会是今天的这副狼狈相。
      十、 复用和组织变革原则-解决项目问题的未来之路
       如何解决日益突出的项目工期、成本、质量等问题,这是大多数项目管理者最为关心的问题。从实践来看加强复用的力度,建立项目复用体系和实施组织变革是效果较好的途径之一。复用能够提高项目的生产率,降低项目风险。通过复用,项目管理者能够快速的进入项目问题定义之中,减少项目开发人员的工作量,从而尽可能的解决项目在时间、资源方面的过载问题。另外一条途径是实施项目团队的组织变革(Moc),精简项目管理机构、重新定义工作职责,制定柔性的项目工作流程,改善项目开发人员的沟通状况,提高项目人员的开发效率,努力营造一个良好的项目开发环境。这样才能从根本上解决项目开发的种种棘手问题。 
      
       结论:作为一个项目管理者来说,了解和运用上述原则是不够的,若要深入的掌握项目管理知识和技巧,还必须深入学习项目管理(建议参看PMI《PMBOK》)、管理心理学、质量管理学、组织变革、系统论等方面的知识,并在工作中不断的总结和实践。唯有如此,我们的项目管理人员看自己个人简历时方不会觉得脸红,才能在公司中树立自己的管理权威性,同样也才会有一个良好的职业经理生涯的开端。 
  • 【转】多项目管理

    2009-02-03 11:15:28

     多项目管理是站在企业层面对现行组织中所有的项目进行筛选、评估、计划、执行与控制的项目管理方式。与单个项目管理不同的是,单项目管理是在假定项目的资源得到保障的前提下进行的项目管理,思考角度采取"由因索果"的综合法方式。多项目管理则是在假定存在多个项目的前提下,如何协调和分配现有项目资源、获取最佳项目实施组合的管理过程,其思考角度一般采取"由果索因"的分析方式。

      作为一个软件企业来说,实施多项目管理具有非常重要的意义。首先作为一个软件企业来说,同时可能有多个软件项目在实施,这些项目之间在资金、时间、人力资源方面往往存在争夺关系,项目之间的这种关系往往导致公司资源的调配方面出现激烈地争执,恶化企业的政治环境,造成员工大量流失,所造成的间接损失更加突出。其次多项目管理的实施成功与否,直接影响企业的经济利益。企业的最终目的在于盈利,良好的多项目管理可以降低项目成本,

      优化企业资源配置,从而提高的企业的利润率。

      在实施多项目管理之前,我们有必要在众多项目中进行筛选,根据项目的成本、范围大小、项目利润率并结合公司自身的技术能力、专长筛选项目,切忌贪多求全,出现"一颗老鼠屎搅怀一锅汤"的情形。有关这方面的决策知识,可以参看管理会计方面的书籍。

      软件复用与管理组织变革(MOC)是达成多项目管理的一个有利途径,能够缓解多项目管理对资源的争夺,解决多项目在时间、资源方面的过载问题,同时亦能解决多项目沟通的效率。不过对于没有技术积累的软件公司来说,很难做到这一点。

      其次是利用时间差,在进行多项目管理中,尽量错开项目间在同一时间对资源和开发人员的争夺。让关键资源(多项目资源集合的交集)保持非过载状态。如果无法解决时间差问题时我们一般采取增加资源或确定项目资源优先使用级(短平快的项目具有较高优先使用权,但不能一直在整个项目阶段中独占资源)的途径来解决。不过对于大多数软件公司来说,前者一般不太可能,因为它增加了项目成本。后者作为下策虽然保证了成本,但不可避免地影响到项目的工期。实际场合中应在成本和时间中进行权衡。

      企业的多个软件项目间根据其相关程度,常常分为两种类型(更为详细的分类需要用到聚类分析):多个项目均与实施某一目标直接相关,这样的项目集合我们称之为"计划"(Program),其对应的管理方式成为计划管理(Program Management),计划管理的任务在于通过实现一些相互关联的目标来促成某一战略的达成。如果多个项目之间互不关联,这样的项目集合管理我们称为分组项目管理(Grouping Project For Management),分组项目不针对某一战略(目的)。

      对于计划型项目,我们可以采取类似单项目的管理方式,建立计划与项目的映射,计划中的各个子项目对应于单项目管理中的任务。通过映射方式来促成计划型项目的解决。

      分组项目管理的解决并无定法可言,一般我们通过遵循一些原则和管理决策来达成分组管理目标的实现。

      针对分组项目管理来说,在对项目进行分组时应遵循"相似性"原则,以减少和优化资源配置,这体现在:
    同组的项目所需的软件技术相似。技术相似有利于减少同组开发人员的培训成本,提高相关技术复用率,对多项目管理的效率具有很大的提高。例如,将.Net项目与Java项目分开管理。

      项目业务领域相似。仿上,相似的业务领域有利于经验的复用和管理效率的提高,比如将ERP、MRPII项目分在一组,而OA项目分在另外一组。

      优先级相同,同组的项目应该具有相同的重要度(重视程度),否则会导致重要度较低的项目无法得到必要资源得以完成(这与利用时间差中的确定项目资源优先使用级并不矛盾)。

      在实际的多项目管理活动中,更多的情况是项目经理(部门经理)根据项目的实际情况进行相应的项目资源占用取舍,这往往需要项目经理(部门经理)综合各种因素,确定这些因素的重要度来作出相应的决断。但是需要指出的是,解决资源(人、材、时间)问题才是解决多项目管理问题的关键。
  • 【转】代码走查表

    2009-02-03 11:14:27

    走查前准备
    1    得到一份解释代码的最新的设计文档       
    2    代码解释时使用了严格的警告和错误检查参数并被解释通过       
    3    代码使用带ISO标准的xxxx编译器进行解释   
    程序结构   
    4    所有代码的结构清晰,具有良好的结构外观和整齐
    5    所有的模块(函数和外部接口)定义清晰,模块分解清楚       
    6    所有的功能需求都明显的覆盖        
    7    高层设计独立于OS/环境        
    8    结构设计能够满足机能变更        
    9    代码体系结构描述了如何把代码重用到其他体系结构中        
    10    整个代码体系结构组合合理        
    11    所有主要的数据构造描述清楚,合理       
    12    模块中所有的数据结构都定义为局部的,并且通过定义好的函数进行访问        
    13    为外部定义了良好的函数接口        
    14    所有的接口模块化,因此修改时不影响其他代码模块        
    15    内存使用方法和内存管理策略描述清楚和正确        
    16    代码体系构架对空间和速度都已经进行考虑        
    17    提供了处理数据的策略        
    18    具有同一的错误处理策略        
    19    通过一套清晰的函数接口提供错误信息
    目录文件组织       
    20    所有的文件名符合文件命名规范,见名知意        
    21    文件和模块分组清晰        
    22    每个文件有文件头和标准的习惯一致(描述文件的用途,作者,对外提供的函数)23    每个文件都组织的有序 - 文件头,类型定义,原型,函数        
    24    所有的代码行在80字符以内        
    25    每个程序文件都小于2000行        
    26    每个文件只包含一个完整功能模块的代码
    函数组织       
    27    每个函数都有一个标准的函数头声明        
    28    函数组织:头,函数名,参数,函数体        
    29    函数定义符合ANSI或者用标准PERL的编译开关        
    30    每个函数都能够在最多2页纸可以打印       
    31    所有的变量声明每行只声明一个        
    32    所有的函数名都小于64个字符        
    33    每个函数之间都用2空行进行分开
    代码组织       
    34    每行代码都小于80字符        
    35    所有的变量名都小于32字符        
    36    所有的行每行最多只有一句代码或一个表达式        
    37    复杂的表达式具备可读性        
    38    续行缩进        
    39    括号在合适的位置        
    40    每个顺序的小块用空行隔开        
    41    注解和代码对齐或接续在代码之后    
    移植性   
    42    代码与操作系统无关,不需要任何假设条件
    函数       
    43    函数头清楚地描述函数和它的功能        
    44    代码中有相关注解        
    45    函数的名字清晰的定义了它的目标以及函数所做的事情       
    46    函数的功能清晰定义       
    47    函数中所有的部分都合理的组成函数,相关独立的语句组组成函数        
    48    函数高内聚 只做一件事情,并做好        
    49    函数和其他代码松耦合       
    50    参数遵循一个明显的顺序;        
    51    所有的参数都被使用       
    52    函数的参数接口关系清晰        
    53    如果一个函数有返回值,在所有的出口都有返回值        
    54    函数使用了最少数目的return语句        
    55    函数的参数个数小于7个       
    56    所有的假设和接口清楚        
    57    使用的算法说明清楚       
    58    函数检查了输入数据的合法性        
    59    函数异常处理清楚       
    60    函数设计已经考虑了将来的变化        
    61    调试信息存在于代码中并容易激活        
    62    代码检查调用函数的返回值,参数和调用匹配       
    63    函数确保了没有影响函数外代码       
    64    递归定义了出口        
    65    递归局限于一个函数        
    66    堆栈大小支持递归调用的深度
    数据类型与变量       
    67    数据类型存在数据类型解释        
    68    代码为每种可能改变数据类型的数据使用一个不同的类型        
    69    代码避免了重新定义预先定义的数据类型        
    70    数据结构简单以便降低复杂性       
    71    每一种变量分配了正确的长度、类型和存储空间        
    72    静态变量明确区分        
    73    所有的声明与编译器或具体的机器长度无关        
    74    每一个变量都初始化了        
    75    每一个变量都在接近使用它的地方才初始化        
    76    每一个变量都在将要使用它的时候才初始化       
    77    变量的命名完全、明确的描述了该变量代表什么        
    78    命名和现实生活中的事务接近而不仅仅是一个程序类型        
    79    同一种类型或指针命名的前缀指出类型或指针        
    80    命名不与标准库中的命名相冲突        
    81    程序没有使用特别的、易误解的、发音相似的命名        
    82    所有的变量都有最小的活动范围        
    83    所有的全局变量都描述清楚        
    84    使用函数访问取代全局数据的访问        
    85    所有的变量都用到了       
    86    存取数据的程序与全局数据的用法是兼容的        
    87    变量按照它的命名用途进行使用    
    特殊   
    88    所有的数组访问在它们的边界内        
    89    代码已经处理了-1错误        
    90    代码处理了指针异常        
    91    所有常量定义和使用替代代码中的数字        
    92    类型转换明确指明
    其他注意项       
    93    代码与比较,计算变量的大小无关        
    94    代码与操作符的优先级无关        
    95    所有的表达式使用了正确的操作符   
    条件判断   
    96    条件检查和结果在代码中清晰        
    97    If/else 使用正确       
    98    普通的情况在if下处理而不是else        
    99    判断的次数降到最小        
    100    判断的次数不大于6次,无嵌套的if链        
    101    数字,字符,指针和0/NULL/FLSE 判断明确        
    102    boolen表达式表示清楚       
    103    最常用的情况最先判断        
    104    所有的情况都考虑       
    105    判断体足够短,以使得一次可以看清楚        
    106    嵌套层次小于3次
    循环       
    107    循环体不为空        
    108    循环之前做好初始化代码        
    109    循环体能够一次看清楚        
    110    当有明确的多次循环操作,使用For循环       
    111    当有不明确的多次循环操作,while循环被使用        
    112    代码中不存在无穷次循环        
    113    循环的头部进行循环控制        
    114    循环索引具有有意义的命名        
    115    循环设计得很好它,只干一件事情        
    116    循环终止的条件清晰        
    117    循环体内的循环变量起到指示作用        
    118    循环嵌套的次数小于3次    
    输入输出   
    119    所有文件的属性描述清楚        
    120    所有OPEN/CREATE调用描述清楚        
    121    文件结束的条件进行检查        
    122    显示的文本无拼写和语法错误
    注释       
    123    有一个简单的说明,用于描述代码的结构        
    124    每个文件和模块均以给予解释        
    125    源代码能够自我解释        
    126    每个人看到代码就能很快理解        
    127    解释说明代码功能,准确描述代码意义       
    128    解释不过于简单        
    129    注解清楚正确        
    130    注解为用户服务        
    131    所有的假设和限制进行注解        
    132    长的控制体结束,进行注解
    总括       
    133    代码直观        
    134    代码中的用语符合广告用语,而不是技术化的描述        
    135    代码和设计文档对应        
    136    无用的代码已经删除       
    137    无用的注解已经删除 
  • 【转】数据库设计走查表

    2009-02-03 11:13:28

    前期准备
        1    概念层次的ER图和数据库定义书准备齐全           
        2    ER图关联简洁           
        3    ER图结构清晰           
        4    ER图实体个数适中           
        5    ER图无重复冗余           
        6    存在原有系统的情况下,对旧系统的数据库进行了整理,本次设计中保留原有数据库的设计优点           
        7    存在原有系统的情况下,注意原有数据库系统中一些忽略的问题           
        8    存在原有系统的情况下,进行了数据库方面的设计对比           
        9    设计采用了CASE工具           
        10    数据字典完备           
        11    设计时考虑了将来哪些数据字段可能会发生变更           
        12    设计时考虑了不同国家,地区可能存在的字段和字段格式           
        13    设计时考虑了数据库的版本标识           
        14    设计时考虑了将来的数据挖掘和分析需求           
        15    使用英文而不是其它语言,编码来作为设计语言           
        16    存在一数据库标识机制来反映数据库的当前版本和相关配置信息           
        17    数据库设计时考虑到了备份的安全机制           
        18    数据库设计时尽量不考虑取值CHECK,有关CHECK的东西通过页面输入检查来解决   
    表设计   
        19    实体有主键或有外键,或二者兼备           
        20    多对多关系被映射为三张基本表           
        21    基本表的字段不能再分解           
        22    基本表的数据均来自于用户人工输入或系统设定           
        23    基本表结构稳定,短期之内不再变化           
        24    基本表尽量满足3范式,符合2范式           
        25    根据用户统计,时间统计等统计需求建立中间表           
        26    临时表是临时的           
        27    表个数足够精简(多字段分表情况例外)           
        28    对于多值字段采用了创建子表的做法或预留了足够的字段来存储不同的值           
        29    表中存在合理的派生性冗余字段或无冗余字段           
        30    表中字段足够精简,不存在重复性冗余字段           
        31    有多种权限设计的时候采用用户-权限设计方式           
        32    表设计包括了管理员(用户)的账号管理设计   
    数据库   
        33    数据库命名使用小写英语字母, 数字和下划线,无其他字符       
        34    数据库命名长度小于20位       
        35    数据库命名采用项目名或产品名称命名       
        36    数据库中的所有表字符集统一       
        37    数据库中对象命名见名知意       
        38    数据库对象的命名不使用保留关键字       
        39    数据库设计考虑到了事务机制       
        40    数据库设计考虑到将来可能存在的异种数据库迁移       
        41    数据库设计时考虑到了审计追踪机制(警告等)
    表   
            42    组合主键的字段数量不超过3个   
        43    采用了系统自增字段作为主键   
        44    不同表的同一意义的字段名称和类型一致(特别是外键场合)   
        45    为关联字段创建外键   
        46    所有键取值唯一   
        47    外键是关联唯一的字段   
        48    使用商务规则约束数据完整性   
        49    表的id字段和name字段命名时采用表名_id(name)的形式   
        50    不存在只有写入没有读取的表   
        51    不用可能被更新或经常更新的字段作为主键   
        52    表设计不存在级联性删除   
    字段   
        53    字段与画面项目能够一一对应(部分标识符字段和系统设定字段除外)           
        54    索引是多值字段           
        55    索引是单一字段           
        56    字段取值符合域定义           
        57    字段名称见名知意           
        58    多个表中出现同一类型字段用表前缀来标识           
        59    字段的类型和长度能够满足字段的值的最大限量           
        60    文本字段有充足的余量对应可能的长度变更           
        61    数字字段考虑了充足的余量和精度对应可能的长度或精度变更           
        62    不给MEMO(Mysql TEXT类型)之类的大字段建索引           
        63    为每种查询都建立索引           
        64    加一个标识更新时间的Datetime字段update_time,不使用mySQL 的timestamp类型。           
        65    加入一个表示记录插入时间的时间字段create_time, datetime           
        66    布尔值一律为INTERGER类型           
        67    有小数的字段使用Integer, 而不用float 等字段           
        68     普通时间字段使用Integer 或者Datetime           
        69     如果报表中可能分别按年,月,日进行排序和分组。则把时间字段分成不同的年月日字段           
        70    支持多国, 则数据库中必须存格林威治时间           
        71    不需要区别NULL和空字符串的地方,数据表设计时标上NOT NUL           
        72    用程序逻辑控制Default值, 而不是让数据库控制默认值           
        73    表中采用了DEL_FLAG字段标明删除           
        74    表中采用了IS_VALID(CANCEL_FLAG)标明有效性           
        75    采用了存放路径而不是存放图片(文件)本身的方式来保存图片数据或文件数据           
        76    Password只存单向加密过的密码, 而不是密码本身
    "存储过程-视图-触发器"
            77    针对客户的特定应用采用了视图机制           
        78    采用了常规的存储过程来替代和简化客户程序代码的开发           
        79    少用触发器,多用存储过程           
        80    缺乏约束的数据库系统中,采用了触发器用来加强参照和数据完整性
    优化   
        81    计算复杂时,以文件形式处理后才追加至数据库中而不是在数据库中直接计算           
        82    表记录字段太多时,采用垂直分割(超过80个以上)           
        83    表记录太多时,采用水平分割(分表)           
        84    SQL语句符合“先投影后连接再更新”的优化规则           
        85    所有SQL语句都充分地得到优化           
        86    数据库管理系统参数均得以优化           
        87    支持数据库的硬件指标符合项目需求           
        88    优化设计过程中考虑了“程序优化”,“数据库优化”和“系统优化”三个层次的优化           
        89    分布式数据库设计时充分考虑了80-20规则           
        90    XXXX数据库时使用XXXXX作为数据库引擎       
  • 【转】软件过程改进的人文途径(SEPG 2007 China 演讲稿)

    2009-02-03 11:11:51

    诸位朋友,嘉宾:

        在开始演讲前给大家讲一个寓言,也算是一个笑话。寓言是这样的,

        在一架飞机上,乌鸦对乘务员小姐说:“小妞,给爷来杯水!坐在旁边的猪听后也学道:“小妞,给爷也来杯水!”,乘务员小姐把猪和乌鸦领子一提,扔到机舱外。乌鸦拍拍翅膀,笑着对猪说:“你还真是猪头啊,傻了吧?爷会飞!”。

        这个寓言告诉我们,外界因素是一种约束条件,自身能力也是一种约束条件。所以,别人能成功的事,未必自己就能成功。

        对于CMM/CMMI和过程改进来说,我们有些企业扮演的是乌鸦的角色,也有不少的企业扮演的是猪的角色。今天我们的主题就是关于从猪的角色转变为乌鸦的角色的一些人文方面的途径。

    首先,让我们来看看目前很多企业在实施CMM/CMMI方面的问题。

        (1)实施成本高,不少公司在实施后走向玩命生涯。大家去查查国内第一家过CMM和第一家过双五的企业,看看他们现在的一个境况如何。我想你们比我更清楚。我的意思不是说实施CMM/CMMI企业就会败落,有不少企业,包括这次来的很多嘉宾所在的企业,他们的企业在实施CMM/CMMI后业务反而做得很好,为什么,有一点是值得注意的,成本问题。试想一个二三十个人的小公司去实施CMM/CMMI,你们算算多少费用,这样的小公司有多少资金可用。没等实施完,早弹尽粮绝了。所以,没半斤的肚子,就不要吃八两馒头,免得气胀和消化不良。

        (2)形式主义加教条主义,我称之为“双症教育”,国内通过CMM/CMMI的企业,实施时靠个“GOLDEN PROJECT”的模板项目骗CMM/CMMI认证的公司多的是,我的先前曾经呆过的一家公司在过CMM 4认证的时候,评估师居然在验收时,面对测试团队,居然没有提一个问题。难道真得没有问题了么。做事讲究的是一个态度,做人讲究的是一个“德”字,很多认证在国内被做烂掉的一个原因就是个“形式主义”。形式主义缺什么,甲方缺做事的态度,乙方缺德。相比形式主义来讲,教条主义也好不到哪里去,一个公司的制度太过于教条,整个公司就会死气沉沉,缺乏活力。关于教条主义的来源,我将在后面给大家讲述。

        (3)第三条,我们称之为偏见,这是技术人员出身的人常常犯的错误。我也常常犯这种类型的错误。记住“软件行业无一包治百病,立竿见影,药到病除的狗皮膏药体系和方法。”我是学中药出身的,中药里基本上没有只用一味药的,只有调和各个药的作用,才能发挥最大的药效。一个企业的质量问题同样地,不是仅仅关注于过程就能达到的,过程是人做的,有缺德的人和高尚的人,有先进的技术手段和落后的人工手段的,自然会有过程改进的效果不同。不然的话,为什么不去找个文盲来做过程改进。所以,我们在实施CMM/CMMI的时候,不要以偏概全。只重分析,不重综合。过程、人、技术,软件过程三要素,缺一不可。

        (4)目前的很多咨询师在CMM/CMMI方面,仍然轻视人在软件开发中的核心作用,以为有了机制,对人的要求反而不是太重要。机制在一定基础上可以降低对人员素质的要求,但不是没有要求。在座的嘉宾们有很多是名企,一样过CMM/CMMI认证,你看看他们的人材招聘要求,不但不低,而且很高。为什么,人是软件行业赖以生存之本。所以不要把人当机器,机器是没有思想和创造力的,人有思想,有创造力。这就是各位为什么生气勃勃的在这里参加大会的原因,因为我们都是有思想,有创造力的新人类。

        我们接下来谈谈过程改进咨询和实践中遇到的最为常见的问题。这些问题目前是目前的过程改进流程中做不到的一些方面。

         (1)执行力不足

        过程改进强调给管理者、实施人员足够的权限,讲求“授权”二字。很不幸的是,尽管有了授权,相关的过程改进实施执行方面仍旧是拖拖拉拉,大家都在磨时间。这个结症往往出在项目组长和项目经理方面,有法不依。我先前的一家公司的老板,为了这个问题,解雇了所有的中层管理人员,其结果大家可向而知,公司去年倒闭了。可以说,执行力低下这个现象不单是实施过程改进的企业,基本上所有行业都会有这个问题。殡仪行业也许是个例外,所以我们要高歌一曲“学习殡葬好榜样,高效快速执行力强”。至于执行力不足的原因,我在后面的激励机制中将有所阐述。

         (2)软件质量仍然达不到要求

        我们都知道,软件质量的源头是需求,软件质量的关键是过程。但是,就目前来说,过程改进的一大不足就在于没有真正深入到质量的源头,没有参与到客户价值过程中去。我见过很多公司SEPG成员参与到软件开发的洪流中,热火朝天。但是很少看到SEPG的人员陪同开发人员、市场人员和客户进行业务沟通。或是审查过业务销售的报告和需求单据。往往就是这不经意的一步,对后续的需求质量乃至业务的获取影响至远。

         (3)流程过于形式化,重数据而不重本质

    我看到这次一个嘉宾的文章,有关标杆数据的,写得非常好,非常有借鉴性。但是在实施过程中,我讲了,人的态度决定一切。最主要的在于数据采集的主观意志太强。这是因为,就软件质量属性来说,有的东西只能定性,比如代码风格好坏,精炼程度,文档正确性和书写的优美性,很多都是模糊的,比较难以数量化,这些模糊的东西不是不可以量化,而是量化所需的成本太高或是算法太复杂。这好比“多少根头发的人算秃头一样,多一根少一根会影响评定结果吗”一样,我们只要给个定性的结论就可以了,但是在标杆数据里,定性的东西却没法处理,我们的SEPG组织总是吹毛求疵的追求最终的数据结果,最后才发觉自己没事瞎白活。此外,很多公司的过程改进中,强调文档的数量而忽略质量,重文档形式而忽略其实质内容。结果是过程改进好像没有给软件质量带来提升。这不是过程改进的错,如木桶理论所言,要达到质量的提升,过程改进有必要在木桶的短板上做足十分的功夫。

     引起上述情况的根本根源,我们认为这在于东西方的文化冲突,主要体现在“人治”和“法制”的均衡上。

        (1) CMM/CMMI的核心思想

        CMM/CMMI的核心思想为三权分立,我们的CMM/CMMI创始人可是标准的孟德斯鸠的门徒。

        我们现阶段的司法体系也如此,可以说,我们可以把CMM/CMMI模型当作公司项目开发的小的司法系统,联想一下中国社会上的司法种种现象,你就不难想像我们的小司法系统也会出现哪些同样问题。

        过程改进体现的是“三权分立”的思想,强调的是职责明确和授权,但是中国企业现实中更多的是要如何解决“秃头人问题”。这是因为西方人求真,东方人务实。 胡适先生讲过,“多解决些问题,少谈些主义”,在这里也是同样适用的,过程改进不能只是空谈,而是要反应到企业具体的实际问题中去。


        此外,从CMM和CMMI的“三权分离”(制度化)理念和持续改进(完美主义)来看,往往忽略了人在软件质量中的核心作用和企业环境对CMM/CMMI的支持作用。这是西方人和东方人不太的地方,西方人考虑问题时,往往将主题对象从环境中剥离,而东方人的思维里,常常考虑的是主题对象和环境的交互作用。既然思维方式不同,所以行为方式自然也不同。

         (2)CMM/CMMI的初衷

        CMM/CMMI的初衷是为了提高软件开发的质量和效率。但是大企业的效率和小企业的效率问题的本源不是一样的。

        大企业的效率问题来至于制度的盘根错节,是制度与制度间冲突的效率问题。

        小企业的效率问题来自于毫无章法带来的效率低下,与大企业有本质差别。

        一个需要“化零为整”,另外一个需要“从无到有”。

        制度设计的理念体现为“公平、高效”四个字,对于大企业来说,更兼顾于“公平”、而小企业来说,更兼顾于“效率’。所以我们在实施过程改进时,首先应该考虑到企业的一个规模因素。

     

        在实施过程改进的人文途径方面,首先我们要树立以下一些思想,对我们理解过程改进的人文途径至关重要。

       1.不要一来就叫嚣改变企业文化,过程改进只有适应企业文化环境才能有发展。

        一个企业文化是企业经过长期的进化、演变而积累的东西,是一个企业精神价值的所在。不是靠开开会,给公司领导洗洗脑就能够改变的。过程改进不能违背企业的基本价值观。过程改进只有审时度势,在公司大环境允许的条件下进行适当的改良,以适应公司的基本环境,然后才能谈改变。因为没有人喜欢变,因为变化很多情况下意味着原有积累的丧失和风险,除非新产生的价值能够弥补已有的沉淀成本。反过来,过程改进只有发展了才能改变企业文化,以一种循序渐进的方式,不断的对企业文化进行改良,但企业的基本价值观是不能动摇的。在很多方面,客户利益是放在第一位,因此在项目开发中会出现不按过程改进原有措施做的实例。一个紧急的单子或是问题,可能是先做后补单。如果什么都按既定步骤,医院死人人数不知要翻几番。企业就会流单子,流单子老板要骂人,最后就是将“制度奴隶”扫地出门。

        2.过程改进与客户利益的关系

        企业是目标是生存和盈利,而不是过程和制度。但制度和过程可以影响企业的生存和盈利。先进的理念如果不能给公司带来真正的效益,那么说明理念本身的适应性有问题。对于过程改进来说也是同样的道理,过程改进如果不能给公司带来真正的效益,那么说明过程改进这个理念本身适应性有问题。因此,除开发过程中需要导入过程改进机制外,客户价值过程中也应该导入过程改进。通过客户价值过程改进、赢取合格的客户需求,比事后进行过程控制要好的多。需要提醒的是,过程改进在客户价值流程方面要力求务实,而不是新的教条主义。

        3.过程改进要协调好利益干系人的利益关系

        为什么过程改进在具体的实施中会有太多的阻力?下面给出一些项目经理和开发人员给出的推卸之辞:

            1.过程改进没有按项目大小和紧张程度进行剪裁

            2.过程改进总是太过于公平,忽略效率

            3.我从过程改进中没有获得任何好处,工作量倒是增加不少

            4.给我一个式样模板对于我来说更为急需,过程这种看不到的东西就算了

            等等

        与其大谈过程改进要改变人的思想,不如事先分析一下相关干系人的利益情况,这样你就会知道,谁在过程改进中支持你,谁在过程改进中反对你,以及如何有的放矢的应对。项目管理中的一个核心不也是项目干系人分析,过程改进适合同样的情况。

        为什么?因为人的本性都是趋利的。毫不利己,专门利人,你们当中有多少人能做到。每个过程改进所影响到人员在企业内都有自己的利益和自己团队的利益,如果你的过程改进损害到这些人的利益或给他们造成麻烦,谁来支持你。这里面就涉及到一个利益均衡的问题,这点在中国企业制度的建设中非常重要。其实在国外企业,也是同样的重要。不过外国人不会告诉你,他们也有“面子文化”。

     过程改进有哪些人文途径,我简单的讲述一下自己的一些体会:

        (1)在过程改进中将授权机制变为激励机制

        没有激励,仅仅只有“授权”是完全不够的。传统的过程改进总是强调授权而忽略激励,根据制度经济学的论断,制度的接纳的最优途径是激励,而不是授权。激励可以激发过程改进人员、项目管理者、底层开发员工的积极性。权益,权益,为什么项目管理层在授权后老是拖拖拉拉或者是阳奉阴违,因为他们只有权,没有益。换个角度思考,你会不会去做一件跟你完全毫无利益的事情。最简单的例子,就是包产到户,包干到户。一个没有激励只有授权的团队意味着团队的人员只有责任,没有权利。而从人的本性的黑暗面来说,人是风险规避的,也就是责任逃避的。

        激励机制可以有很多做法,最简单的就是绩效公示,不过这种做法会太过于打击新手,因此可以采取一些隐性的激励手段,比如项目提成和团队补贴或是精神激励等。如我前面所说,没有一种方法能够单一取得最优效果,因此在实施过程中要结合使用。对于惩罚,没必要公示,中国的技术人员最爱面子,以教育为主。如果实在是“朽木不可雕”,就扫地出门,扔掉把。


        (2)取消无限、持续的过程改进说法,讲究适可而止,阶段性提升

        无限、持续过程改进体现了我们这些技术出身人员最大的一个人性缺点,同时也是人性的优点之一,追求完美,没有最好,只有更好。但是从企业成本和过程改进成本来说,未必就值得。为什么?我举考试的例子,大家考60分需要复习一个小时,从60分到70分肯定不止一个小时,70到80分呢,80到90分呢,100分就更不要说,投入的精力和时间太大,而且稍微闪失就不能达到。过程改进也是一样的。如同经济学边际递减规律所提到的,如果过程改进的投入要素连续地等量增加,增加到一定值后,所提供的过程效果的增量就会下降。追求完美是没错,但是要考虑过程改进的成本,企业的预算是有限度的。这是其一,此外,项目的过程改进也得有个适应期,每个项目都要在前面一个项目上持续地改进,项目开发人员只能愈来愈抵制。因为他们在还没完全适应的基础上又得匆匆忙忙去适应下一个项目的新过程。一个字“累”。

         (3)尊重80-20规律,精英意识与平民意识并举 
        我跟一个CMM/CMMI的咨询师曾争论过这个问题,他跟我讲,你一味强调人,你还没领略CMM/CMM的思想。什么思想,我称之为“民工思想”,在他看来,通过先进的制度和理念可以去除人带来的影响。没错,任何先进的管理制度都在解决这个问题,但是很不幸,人的能力是有差异的。制度要解决的是人的劣根性,激发人的善性,我们的软件开发不是体力劳动,而是有创造性的劳动。我们的管理层都是团队精英,在很多公司,我收到他们对过程改进的一些反馈:

        为什么管理层人员和技术强人大多抵制过程改进?

            1.  增加工作量

            2.  太过于教条,不考虑特殊情况和紧急情况

            3.  职责变多,无法“踢皮球”

            4.  个人作用不再受重视

            5.  管理成本增加

        你们可以看到,大家都是“唯利主义者”。大家之所以在你们现在的岗位上,是因为你们相对与其他岗位的人员有着相对的“性价比”优势,如果一个制度能抵消掉这方面的优势,那这个岗位没你做也没关系,既然有没有你都无所谓了,你的生存价值何在,你不抵制这个制度才怪。所以,有时候制度需要一点人性化的东西在里面。我前面说过,有很多是名企,一样过CMM/CMMI认证,你看看他们的人材招聘要求,不但不低,而且很高。高素质的人材是潜力股,潜力股要看未来,就个人行为来说,短视者居多,对于企业来说,不能吃了上顿没下顿,潜力股是企业未来保证。

             (3)将客户价值的商业流程纳入到过程改进中来

        为什么过程改进在企业内部不受重视,不被人理解。没有把客户价值创造的流程包括在过程改进中是一个主要的原因。我们进行过程改进时,不要只考虑公司内部的过程改进,尽可能的把价值链上所牵涉的业务对象也加入流程。软件质量低下跟没有将客户价值的商业流程纳入到过程改进中也有关系。客户的需求是软件质量的本源,单靠我们自身能力不足以 完美无缺,需要客户参与到过程改进中来。否则,你无法预知需求获取之前的东西和需求的质量。实际上很多企业的销售工程师和系统分析师都需要过程人员的协助,包括客户。我们的客户经常会问,你们那边的商务流程是怎么样的,需求流程是怎么样的。过程改进在此时就体现了了它的重要性和必要性。换个角度来说,将客户价值的商业流程纳入到过程改进中来,还可以改变过程改进的“成本中心”形象,由于过程改进参与到企业利润源头的工作中来,往往会获得更多公司内支持。

     

    (4)过程制度建立和完善要依据分工规模

        如何剪裁和划分过程制度的颗粒度,这是最为企业过程人员头痛的事情之一。我们从经济学的分工理论上来看,过程制度建立和完善要依据分工规模。

        制度划分理论是这样的:

        制度划分的力度取决于组织的容量。

        同样过程改进的剪裁和力度划分需要按照团队和项目大小来进行调整。分析与项目目标相关的领域的相关性。比如较为低层次的对日外包项目,过程改进活动一般着眼于代码审查和测试复核。而对于产品开发来讲,过程改进关注的中心往往是首尾,一个市场需求的式样化,一个是市场反馈系统完善过程。

        还有一点要提醒的是,交易费用理论对我们也有十足的借鉴性:

        随着组织规模增加,交易成本将越来越大。

        因此对于大项目来说,如何对沟通方面的改进会变得攸关重要。过程改进的实施的效果将取决于沟通的流畅性。

        我们可以总结为:

        大企业、大团队、大项目,过程改进的重点在于沟通的流畅性。

        小企业、小团队、小项目,过程改进的重点在于过程颗粒度的划分。


        (4)构建成熟的人力资源成熟度模型

        为什么我们要引入人力资源成熟度?1.

            1.我们确保合适的人在合适的职责岗位上,才能获得最大的工作效果。

            2.过程是要靠人来抓住,人来管理,不是制度摆在那里就算完成了。

            3.进行诸如软件开发这样的脑力劳动需要高素质人员

        过程改进实践往往忽略环境和上下文,有的过程改进甚至需要由顶级专家构成的团队才能施行。没有合格的员工开发不出合格的软件,没有合理的制度,创造不出高绩效。因此,过程改进中,不可缺少人力资源的支持。这跟CMM/CMMI的开展过程教育的宗旨有一定的重合空间,是不违背的CMM/CMMI的“洗脑战术”理念的。


    (5)构建合理、公平的劳资、福利体系,并与过程改进相挂钩

        过程改进要能顺利实施,离不开公司的福利制度。任何一个企业里,没有人会跟钱过不去,但会跟过程改进过不去。将过程改进和员工的福利劳资挂钩,会从很大方面加速过程改进的力度和提高过程改进的效果。当然人是IT企业的立身之本,过程改进需要优秀的人材参与,有些CMM/CMMI企业,自身福利薪资太差,就算你现在过了CMM/CMMI,你又能好到哪里去。近期的钱你是赚足了,但是远期呢。大家有空可以去看看IT红黑榜,看看我们的CMM/CMMI企业有多少在黑榜上,然后预测一下企业存活期。实际上,你们不用预测,你看看这些公司的效益值,就不难发现,口碑差的企业大部分还真是举步维艰。

     (6)以经济效益为考核杠杆,通过过程改进提升企业效益

        经济效益是企业生存的指标,任何企业的制度,理念,无一不是以合法合理的经济效益为最终目的。要获取企业高层领导及管理层(我这里指的是有心搞好CMM/CMMI,过程改进的企业领导,不是为了骗国家资助,玩形式主义的领导)的大力支持, 首先要灌输过程改进的 “节钱”观念。其次,过程改进的最终目的还是通过提高软件质量从而提升企业的经济效益。如果一个过程改进对企业效益没有任何作用,这样的过程改进不可能长久,也没有存在的必要。我的经验是,分析过程改进中流程与效益的相关性,扶正去负。经过一段时间的过程改进适应后,会做相关的效益评估报告。这样的做法可以去除公司员工对SEPG的成本中心看法,获得公司整个上下文环境的支持。从另外一个侧面讲,让SEPG人员和QA人员知道自己所做的贡献值,增强对过程改进的信心,做出更为出色的成果。

         过程改进的人文途径总结:用生态学观点看过程改进,创造和谐的人文环境

        我们把企业当作是一个生态系统,过程改进犹如人之进化。进化的本意是先适应后改变,现在到处都在提倡和谐,过程改进也一样,我们考虑过程改进的时候不单单只从过程改进本身出发,更重要的是,联系上下文环境,尊重员工。只有为过程改进创造一个和谐的人文环境,才能够做好过程改进。

        我的演讲到此为止,谢谢大家。

  • 项目管理的三个重要控制点:检查点、里程碑、基线

    2009-01-19 11:29:49

    这三个概念分别是 检查点( CheckPoint )、里程碑( Mile Stone )和基线( Base Line ),他们一起描述了在什么时候( When )对项目进行什么样控制。

      检查点

      指在规定的时间间隔内对项目进行检查,比较实际与计划之间的差异,并根据差异进行调整。可将检查点看作是一个固定 “ 采样 ” 时点,而时间间隔根据项目周期长短不同而不同,频度过小会失去意义,频度过大会增加管理成本。常见的间隔是每周一次,项目经理需要召开例会并上交周报。

      里程碑

      完成阶段性工作的标志,不同类型的项目里程碑不同。里程碑在项目管理中具有重要意义,我们用一个例子说明

      情况一你让一个程序员一周内编写一个模块,前 3 天你们可能都挺悠闲,可后 2 天就得拼命加班编程序了,而到周末时 又发现系统有错误和遗漏,必须修改和返工,于是周末又得加班了。

      情况二实际上你有另一种选择,即周一与程序员一起列出所有需求,并请业务人员评审,这时就可能发现遗漏并即 时修改;周二要求程序员完成模块设计并由你确认,如果没有大问题,周三、周四就可让程序员编程。同时自己准备测试案例,周五完成测试;一般经过需求、设计确认,如果程序员合格则不会有太大问题,周末可以休息了。 第二种方式增加了 “ 需求 ” 和 “ 设计 ” 两个里程碑,这看似增加了额外工作,但其实有很大意义首先,对一些复杂的项 目,需要逐步逼近目标,里程碑产出的中间 “ 交付物 ” 是每一步逼近的结果,也是控制的对象。如果没有里程碑,中间 想知道 “ 他们做的怎么样了 ” 是很困难的。其次,可以降低项目风险。通过早期评审可以提前发现需求和设计中的问 题,降低后期修改和返工的可能性。另外,还可根据每个阶段产出结果分期确认收入,避免血本无归。第三,一般人 在工作时都有 “ 前松后紧 ” 的习惯,而里程碑强制规定在某段时间做什么,从而合理分配工作,细化管理 “ 粒度 ” 。

      基线

      指一个(或一组)配置项在项目生命周期的不同时间点上通过正式评审而进入正式受控的一种状态。基线其实是一些 重要的里程碑,但相关交付物要通过正式评审并作为后续工作的基准和出发点。基线一旦建立后变化需要受控制。

      重要的检查点是里程碑,重要的需要客户确认的里程碑,就是基线。在我们实际的项目中,周例会是检查点的表现形式,高层的阶段汇报会是基线的表现形式。

  • 转载—新加入一个团体,如何尽快的展开测试工作?

    2009-01-16 11:28:45

    新加入一个团体,如何尽快的展开测试工作?

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

      作为一名测试新人加入团队,大多数情况下,项目组成员都是一种热情欢迎的态度,并且主动提供力所能及的支持和帮助,如何快速熟悉项目业务和测试环境,尽快投入到实际工作中去,我谈谈个人的经验和一些看法,供同行参考:

      1、寻找新公司的团队元老:

      一般来说,一个新人进入新公司,都要指定一个师傅带一段时间,这也就是我们说的测试前辈。很多时候,测试前辈都是经验非常丰富的测试高人,如何您和他相处融洽,关系不错,凭他个人丰富的业务经验,给您指点迷津,也许会比你自己摸索10倍的时间效果还好。很多的测试新手,刚进入新公司时,自高自大,眼高收低,测试前辈都不愿意交,结果到了试用期转正答辩的时候,一问三不知,被迫离开公司,被炒鱿鱼。这样的例子我看到的不下于10例,很可惜丢失了很多工作机会。

      2、虚心的学习态度:

      刚到一家新公司,保持谦虚的学习态度非常必要。记得我刚毕业那年,公司招聘了一个测试主管,他有4到5年的工作经验,阅历算是不简单,也是我们心目中的牛人吧。但是那个人,除了听总监的话以外,对于我们部门的其它人来说,他简直是自高自大,目中无人,根本不把部门里的其他人放到眼里,觉得部门的人都不如他。他作为一个空降兵,老员工和新员工,对他都很冷漠,碰到什么问题,需要小组成员帮忙的时候,大家都不愿意帮助他,互相推诿,并且经理也找他谈了几次话,效果不明显,结果他呆了不到2个月,估计是自己觉得很不开心,被迫离开了公司。其实,保持低姿态,谦虚的学习态度,必不可少。

      3、阅读项目相关的文档:

      一般来说,新人一到公司,就会安排到项目中去。作为测试新手,快速阅读相关的“需求文档”、“详细设计文档”和“用户手册”特别关键。我们能够通过需求规格说明书等文档,快速熟悉系统相关的知识,获取编写测试文档的相关信息。如果项目已经编好了用户手册,您完全可以根据文档的步骤,一步一步傻瓜式的熟悉每项功能。只有掌握的这些文档的精髓,测试才会变得异常轻松呀。

      4、快速熟悉项目相关业务知识:

      刚到新公司的测试人员,如果你是跳槽到以前做过的相近行业,有丰富的经验了,那么您熟悉业务没什么大的问题。如果您换的新公司是您以前都没有接触到的行业,那你一定得努力一点,买些相关的业务知识看看非常必要。我深有体会,以前从一家“通讯公司”跳槽到做“银行系统”的公司,业务完全两样,很多业务知识都是从零开始。不过有一定的工作经验,学习起来也挺快,关键取决于个人是酷爱学习和坚强的学习毅力。

      5、尽快介入了解被测试系统:

      刚跨入一家新公司,如果被测试系统已经开发的差不多了,部分功能已经OK了。你可以部署到测试环境下,尝试从直观测试的角度去尽快了解系统,尽快结合文档熟悉起来。很多的时候,通过页面操作实际的系统比看文档效果好的多,并且印象更深刻,熟悉系统更快。新加入公司的朋友不防试一试。

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

      6、了解公司类似的相关产品:

      大多数的公司,都不可能在每个行业都非常强,基本上都是在某一个较小的领域很强势,公司主要就是研发强势相关业务的产品。所以说,相关的产品一般来说是很多的,如果要你测试的系统没有开发完毕,如果时间和条件允许,不妨先了解一下公司类似的产品,以便尽快熟悉起来。大多数情况下,公司很多的产品都是相通的,大部分的产品是在不同的客户要求下,修改了部分功能和界面而已。个人认为:了解类似的产品,也是测试新手快速熟悉产品的一条捷径。

      7、尽量多参加项目的各种会议:

      每个项目,特别是在项目的启动阶段,大会小会不断,很多时候项目组成员抱怨居多,都认为很浪费时间,耽误开发进度。如果作为测试新手的您这个时候加入,那太好了,多参加这样的讨论会。大部分时间都是在讨论项目的重点和关键,如果大家意见不一致,必然要对不一致的东西展开细节讨论,您肯定是收益匪浅。特别是对业务方面的讨论,您参加几次讨论,比您看10篇需求还强,并且理解也很透彻。如果您对需求有所了解,但是部分功能模块还有问题,就可以在讨论会上随时提出来,大家一起讨论,共同解决。如果有这样的机会,切勿放弃哟。

      8、阅读类似项目已有的测试用例:

      如果项目已经启动并进入了测试阶段,如果你在这个时候介入,通常情况下负责人都会给你提供整个项目或部分需要你测试的部分模块的测试用例。这些测试用例也是您快速上手测试的重要参考资料。如果还没有编写测试用例,你就介入了,那你就得重头开始,您可以阅读项目类似的测试用例,并结合以前项目的测试经验,根据公司相关的测试用例模板开始编写测试用例。如果在编写测试用例中碰到您不了解和很难处理的问题,您可以记入测试需求疑问表格,等部门开会时,提出来大家讨论。最好不要碰到一个问题就去问,经常打乱人家的思路,弄得别人嫌烦,那就不值了。

      9、查看缺陷数据库中旧有的缺陷:

      一般的测试缺陷跟踪系统,都是按模块来分类软件缺陷的。如果老大给你分配了测试任务,你就可以有目的的去熟悉即将测试的模块缺陷。登录系统后,对缺陷进行筛选,尝试按测试前辈的Bug描述步骤进行操作,看看是否能够重新缺陷?这种方法能够借鉴测试同行的经验,尽快发现问题,避免测试的盲目性。一来可以拓宽您的视野,避免递交类似问题的Bug或是重复的Bug,二来还可以为您快速熟悉被测试系统添砖加瓦。

      10、必须明白自己领导是谁:

      一般的员工进入公司,公司和部门领导很多,搞不清楚谁管我,碰到问题问谁?谁可以帮忙解决问题?如果真是这样那就麻烦了。部门领导臃肿的情况实在是太多了,有的公司,既有2测试经理,又有几个测试主管,还有多个项目经理和研发总监,不知道工作向谁回报,对哪个领导负责。弄得每个领导都回报,很累呀!!我的做法是:测试项目中负责领导只有一个那就是测试主管,测试主管负责安排和分配每个测试人员的工作和任务,我直接Review测试主管。如果项目中碰到有什么解决不了的问题,组内成员可以直接找我,同时我也定期加入项目参加部分测试,了解测试项目的一些进展情况,必要时还要找一些人谈心。这样,工作汇报比较简单明了,很轻松。

      11、熟悉与测试相关的管理软件的使用:

      我说的这个测试相关的软件包括缺测试需求管理软件(如TestDirector或QC)、陷跟踪管理软件(如:TestTrack Pro、TestDirector等等)、版本配置管理工具软件(CVS、VSS,还是SVN等等),具体熟悉到什么程度,那就要看您的职位了。如果您是一般的工程师,那你就只了解一般的使用就够了,如果您是测试经理,您不仅要了解一般的使用,还要更深层次的了解软件的权限和项目的配置,因为您要作为该软件的Admin,碰到问题大部分都由您搞定呀,高工资不是那么好拿的呀,哈哈!!!如果作为新入职的您,连这些都不会,那你就得加把油了,不然到了测试启动阶段,你才开始熟悉管理软件,那么你觉的能够快速展开测试吗?

      12、注意沟通技巧,把握请教良机:

      为了尽快熟悉项目,展开测试工作,沟通技巧必不可少。您作为新入职的测试人员,尽量了解每个开发人员开发的模块和每个开发人员的性格特点,寻找一些共同语言,拉近与开发人员的距离,让他们对您产生好感。只有这样,当您碰到问题的时候,他们才会鼎立的帮助您。如果您与开发人员关系不好,看了就觉的很讨厌,那他们肯定不会帮助您的,更不原意和您配合,当您提错Bug的时候,他们就会抓住这些Bug不放,有时候还要说您什么都不懂,这样你就很郁闷,肯定呆不长久的,只有走人的份了,呵呵。特别是开发人员很窝火的时候,您更要多一些理解和宽容,切勿火上浇油,您可以给他一些表扬,给他一些鼓励。他一听准开心死了,总觉得还是您们最了解我,把您当成自己人。这个时候,你再问开发人员问题,他也许态度就不一样了,他准会仔细的给你讲解,并且以后的什么事情,他也会百厌齐烦地帮助您的,因为他觉您最了解他们,无意识的把您当成了好朋友和哥们。还有的时候,开发人员有空过来测试部门逛逛,准备和您交流时,一定要把握机会,和开发人员开开玩笑和一些必要赞赏,也能够调节和开发人员的关系。总之,这一点做起来真的很难,如果做的好,那效果确实就不一样了。

      欢迎各位同行继续补充指正!!

  • 转载—对于如何衡量和提高测试效率

    2009-01-16 11:08:04

    如何衡量测试效率?

      个人认为可以从软件测试的活动中的以下指标综合考评,去评估衡量测试效率,每项指标都高,自然能够说明一些问题:

      1.发现缺陷的质量:

      同一个项目组内,我们一般运用测试管理工具TD, 按优先级和严重等级,把每个人的缺陷做成柱状图和饼图,放到一个文档中,邮件发给大家,让组内成员了解自己的工作情况和其他人的工作情况。同时也让开发人员,对每个测试人员的工作,做出评估,供绩效考核时参考。特别是发现非常隐蔽缺陷的测试人员,一定要重赏。

      2. 测试的有效性:

      一般来说,递交Bug的有效性,体现了测试员是否能够正确理解系统,并发现问题,是否能够发现有效的问题。很多时候,测试人员没有弄准确需求,或者是没搞清楚设计,一旦出现异常,就提交Bug。不是和前面的缺陷相同,重复递交相同类型的缺陷,就是递交无效的Bug,导致后来很多缺陷,都被项目评审时拒绝,既耽误了时间,效率自然不高。

      3.测试组员交叉测试,发现漏测问题数量:

      经常是这样,一个测试人员测试结束,修复了全部的缺陷。这个时候,测试的模块和测试人员交叉一下,再测试,很有可能又发现很多问题。这样我们可以对测试发现问题数量,进行统计。这样做,就迫使测试人员认真执行每一轮测试,每次测试都不敢懈怠。

      4.遗漏到客户缺陷的比例:

      一旦版本测试通过,发布给客户以后,客户要对发布的版本进行验收测试。同样会发现一些问题,我们也会对测试过程中发现的Bug分配到每个模块和具体的人。但是,如果缺陷在测试环境中不能重现,只能在实际工作环境中出现,则不属于遗漏给客户的Bug,不计入漏测统计里面。有时候,客户系统在使用中也会发现缺陷,我们同样做好记录。

      5.递交的缺陷数量:

      在同一个项目组内,每天递交的Bug数量,每周递交的Bug数量,每个版本测试结束,总共递交的Bug数量。最终测试结束,算出每个人递交有效缺陷的百分比。

      6.执行用例的数量:

      同一天,每个测试人员,执行用例的数量。但是一定要去除那些不能够测试的功能模块,或者是被阻塞的模块,这些一定要考虑到。否则大家意见就大了呢!

      7.编写测试文档的速度和质量:

      每次编写测试用例时,大家都要编写部分模块的测试用例,我们也可以通过单位时间内编写case的数量、速度和质量,来区分每个人的效率,我觉得也是一种好方法。

      8.评审发现问题的效率:

      在组织部门内部的case评审时,同一个测试文档的评审,如果提出的修改建议比较多,并且很有参考价值。这样的测试人员,效率应该比较高,得考虑考虑加薪,呵呵。

      9.测试工具使用的熟练程度:

      当然,一个测试人员,对测试工具的熟练程度越高,使用技巧越强,一般来说,测试的效率就越高。按常理来说,每个人不可能了解全部的自动化测试工具,我们只对常用的测试工具进行考核就可以了,还算人性化吧。并且后面懂得较多的同事,给组内成员集体培训,使大家迅速掌握测试工具的基本使用,这才是我们的真正目的。

      10.测试结果的分析水平:

      对自动化的测试工具来说,特别是性能测试结束之后,我们要分析部分测试结果,如果你都不熟悉测试工具的分析,何谈效率呢?所以测试结果的分析水平,也可以作为衡量测试效率的一个指标。

      如何提高测试效率?

      1.首先要有一个合理的详细的测试计划:

      没有详细的测试计划,测试部的每个成员都在那儿盲无目的测试,何谈提高测试效率?当然测试计划也不能够太细,太细了,编写测试计划同样浪费时间,做到时可而止。最好是测试任务尽量能细化到测试的功能和测试的case这个级别去监控进度,较为理想。

      2.测试尽早介入项目详细了解项目的业务需求,做好测试的前期准备:

      目前来说,可能大家都有类似的感受,接触到的大多数的项目,都是测试周期比较短,开发人员耽误了时间,为了不拖延项目进度,留给测试人员做测试的时间都非常紧张。如果项目测试的前期了解业务需求、了解产品属性和准备测试数据不充分,往往测试效率很低,测试时间变长,测试效率急剧下降。

      3.对测试项目前景充满信心,调整最佳心态,保持愉悦的工作心情

      一般来说,如果大家认为测试的项目没什么发展前景,当然测试也不会很卖命,测试效率不用说。如果某个测试人员碰到什么不顺心的事,当天的工作效率肯定比平常低。所以,要保证测试效率,测试负责人要察言观色,及时找不开心的下属谈心,了解并帮忙消除部分员工的不良情绪,让员工有更好的心情投入到测试工作中去。

      4.提高测试接受的标准,减少测试版本送测次数:

      大部分公司的开发人员都有一种惰性,一旦公司成了测试部,他们自己测试时,都不会那么认真,以为有了测试人员,就自己就解放了。很多时候都是调试编译通过,实际上开发人员没有做完整的自测,就拿到测试部进行测试。如果测试部门有严格的测试接受标准,一旦发现有重大问题,立即拒绝测试,送回开发人员修改。可以减少很多次反复测试,重复测试,明显提高了测试效率。

      5.测试负责人认真做好测试文档的评审:

      测试经理一定要认真做好测试用例的评审,尽量使用较少的测试用例,发现较多的Bug,无疑是最佳提高效率的一种方式。很多时候,经验较少的测试人员在设计测试用例的时候,写了很多的测试用例,测试时几乎没有发现缺陷。还有一种:比如说等价类的测试,只要具备代表性就可以了,如果写了很多测试用例,执行了半天,臃肿的测试用例,未发现任何问题,也很不值。这些主要是靠测试用例评审的时候,测试Leader去把握了。尽量做到在满足需求的情况下,精简测试用例数量,提高测试覆盖率。很多时候,测试人员写好用例就自己测试,根本没人评审,有些地方理解有偏差,测试点没测试到,导致发给客户版本被退回,给公司也会带来巨大经济损失。

      6.加强项目组成员的相互沟通工作和项目信息收集工作:

      测试工作是一项沟通要求比较高的工作,一般需要同项目经理、产品经理、开发人员、业务人员、客户沟通。很多时候,由于测试介入较晚,测试时间短,测试初期测试人员了解需求不及开发人员,为了迅速熟悉需求,需要项目组成员之间相互培训和沟通。

      测试人员为了利于测试工作,平时也需要主动和开发团队沟通项目的进度、项目存在的问题、项目的需求变更等等情况。与团队成员沟通得越充分、对项目的信息收集和把握得越及时、越准确,我们的测试工作才可能做得越顺利,才可能提高测试效率。

      7.积极配合开发人员工作,努力赢得开发人员的尊重和支持:

      作为测试人员,我们绝不能消极等待或一味埋怨开发人员的不理解和不重视。我们首先需要正视自己、改进自己,通过自身的不断努力让开发人员,真正体会到测试的价值。同时,也需要理解并配合开发人员的工作。只有这样,才能赢得开发人员的支持。互相配合、互相促进,项目成员之间形成良性循环,彼此感情加深了、配合默契了、工作效率和工作质量也就自然提高了。

      8.按照项目的大小不同,必要的情况下引入自动化测试工具:

      是否引入自动化的测试工具,主要取决于测试的时间长短和测试的轮次。一般来说,测试周期较长、版本升级平凡和回归测试次数较多的项目,引用测试工具可以提高测试效率。如果测试周期较短,本来测试周期只有两三个月,开发测试脚步就要花费大量时间,引入自动化测试工具,用的次数较少,结果得不丧失,劳民伤财,呵呵!

      9.测试部门内部成员的工作业绩数据化:

      具体的做法如下:每天给每个人分配的任务非常具体,并且随时关注他们的进展情况,完成百分比,不断督促他们。并且,把每个人每天的工作成果(发现缺陷的数量和工作的质量)数据化,通过邮件的形式发给组内的成员,让大家有个比较。大家都有自尊心,看到自己落后,后面就加油赶工,形成一种良好的测试氛围。每周周例会的时候,对表现突出的给予表扬,对每次都比较差的下属,单独谈心,问问具体原因。

      10.提高测试人员的专业技能和工作能力:

      由于测试技术的不断成熟和完善,许多的新技术陈出不穷,作为测试人员需要不断提高自己的专业技能和工作技能。不断的给自己充电,补充测试理论知识,让自己工作技能力去弥补专业技能的不足。这样,你的工作同样可以做到最棒,效率自然很高。一段时间过去,回过头来一看,自己确实进步不少,没有虚度光阴呀!

      只是我个人的想法,希望同行批评指正!!

    转载请保留:本文出自51Testing软件测试论坛每周一问活动,感谢会员爱吃鱼的月亮的精彩回答。

  • 完善测试工作

    2009-01-16 10:41:49

    完善测试工作

      整个工作内容主要有:

      1、改善测试流程,形成《测试流程》文档

      2、规范测试工作,形成《测试规范》文档

      看上去就只需要上面两个文档就够了,但经详细分析,发现还需要很多相关的需要文档,整理了一下主要有

      1、《测试申请与反馈表》模板

      2、《测试计划》模板

      3、《功能测试测试点》模板

      这个与测试用例差不多,但不用写得很详细,主要把容易漏掉的测试点写下来

      4、《BUG严重性等级与优先级定义》文档

      5、《BUG提交注意事项》文档

      6、《功能测试报告》模板

      7、《性能测试计划》模板

      8、《性能测试指标及相关说明》文档

      9、《性能测试报告》模板

      10、《项目测试报告》模板

      11、《项目资料存档规范》文档

  • 转载-测试执行过程及注意事项

    2009-01-15 15:43:55

    一、测试执行根据:《测试需求文档》《测试计划》《测试执行测试》《测试用例》

      二、测试执行计划

      执行计划是确保正常的实施测试活动

      包含内容:

      注意考虑:1.测试执行的轮次安排

      2.测试执行的时间安排(参考程序发布计划)

      3.测试执行的人员分配

      4.测试执行的环境要求和搭建

      三、测试执行记录

      ● 做测试执行记录原因?

      1.保证测试工作的可追溯性

      2.记录测试人员的工作情况

      3.绩效评估的重要数据

      ● 记录的内容

      1.什么人--测试执行人员

      2.在什么时候-DATE

      3.做了什么--Case ID

      4.结果如何-(Pass/fail )

      四、执行测试过程

      1.设置测试环境,确保所需的全部构件(硬件、软件、工具、数据等)都已实施并处于测试环境中

      2.将测试环境初始化,以确保所有构件都处于正确的初始状态,可以开始测试

    五、测试执行活动结束或终止

      1.正常终止:所有测试过程(或脚本)按预期方式执行至结束。

      – 如果测试正常结束,则核实测试结果

      2.异常或提前结束:测试过程(或脚本)没有按预期方式执行或没有完全执行。当测异常终止时,测试结果可能不可靠。在执行任何其他测试活动前,应确定并解决异常/ 提前终止的原因然后重新执行测试。

      – 如果测试异常终止,则恢复暂停的测试

      六、核实测试结果,真正的缺陷:

      1.通常发生在实际结果与预期结果不匹配时

      2.意外的GUI窗口(图形界面)

      3.业务流程错误

      七、测试执行准备

      1. 执行前,动员工作:阐述策略,回答问题,定义测试计划、测试范围

      2. 严格审查测试环境,包括硬件、网络拓扑结构、网络协议、防火墙或代理服务器的设置、服务器的设置、应用系统的版本

      3. 将测试用例分类进行有效整合,构造测试套件(test Suite)

      4. 所有测试用例、测试套件、测试任务和测试执行结果通过测试管理系统进行管理,使测试执行的操作、过程记录在案,能跟踪、控制和追溯,保证测试进度和质量

      5. 确保每个测试人员理解测试策略、测试目标,对测试进程进行审查,确保测试策略得到执行,可奖励手段,测试经理、组长要勇于承担风险,使测试人员有发挥、想象的空间,但同时也施加压力,提高工作效率和责任心

      八、测试执行过程

      1. 记录测试记录,用例的执行状态使pass/fail

      2. 记录缺陷报告捕获测试结果,提交给上级审查及实现人员进行修复

      3. 缺陷跟踪和管理一般由特定工具来执行,对各模块、各测试人员、整体项目等进行事实跟踪。

      4. 进行常规的缺陷审查,包括BUG的严重性、BUG的描述、BUG修正等

      5. 对每个阶段测试结果进行分析,保证阶段性的测试任务得到完整的执行并达到预定的目标

      6. 良好的沟通,测试人员之间,与项目组之间保持有效的沟通,如每周例会,可以及时发现测试中问题。

  • 转载-如何确定一个软件的测试结束点

    2009-01-15 15:37:26

    在软件消亡之前,如果没有测试的结束点,那么软件测试就永无休止,永远不可能结束。软件测试的结束点,要依据自己公司具体情况来制定,不能一概而论!个人认为测试结束点由以下几个条件决定:

      1.基于“测试阶段”的原则:

      每个软件的测试一般都要经过单元测试、集成测试、系统测试这几个阶段,我们可以分别对单元测试、集成测试和系统测试制定详细的测试结束点。每个测试阶段符合结束标准后,再进行后面一个阶段的测试。举个例子来说:单元测试,我们要求测试结束点必须满足“核心代码100%经过Code Review”、“功能覆盖率达到100%”、“代码行覆盖率不低于80%”、“不存在A、B类缺陷”、“所有发现缺陷至少60%都纳入缺陷追踪系统且各级缺陷修复率达到标准”等等标准。集成测试和系统测试的结束点都制定相关的结束标准,当然也是如此。

      2.基于“测试用例”的原则:

      测试设计人员设计测试用例,并请项目组成员参与评审,测试用例一旦评审通过,后面测试时,就可以作为测试结束的一个参考标准。比如说在测试过程中,如果发现测试用例通过率太低,可以拒绝继续测试,待开发人员修复后再继续。在功能测试用例通过率达到100%,非功能性测试用例达到95%以上,允许正常结束测试。但是使用该原则作为测试结束点时,把握好测试用例的质量,非常关键。

      3.基于“缺陷收敛趋势”的原则:

      软件测试的生命周期中随着测试时间的推移,测试发现的缺陷图线,首先成逐渐上升趋势,然后测试到一定阶段,缺陷又成下降趋势,直到发现的缺陷几乎为零或者很难发现缺陷为止。我们可以通过缺陷的趋势图线的走向,来定测试是否可以结束,这也是一个判定标准。

      4.基于“缺陷修复率”的原则:

      软件缺陷在测试生命周期中我们分成几个严重等级,它们分别是:严重错误、主要错误、次要错误、一般错误、较小错误和测试建议6种。那我们在确定测试结束点时,严重错误和主要错误的缺陷修复率必须达到100%,不允许存在功能性的错误;次要错误和一般错误的缺陷修复率必须达到85%以上,允许存在少量功能缺陷,后面版本解决;对于较小错误的缺陷修复率最好达到60%~70%以上。对于测试建议的问题,可以暂时不用修改。

      转载请注明出自51Testing软件测试论坛

      5.基于“验收测试”的原则:

      很多公司都是做项目软件,如果这种要确定测试结束点,最好测试到一定阶段,达到或接近测试部门指定的标准后,就递交用户做验收测试。如果通过用户的测试验收,就可以立即终止测试部门的测试;如果客户验收测试时,发现了部分缺陷,就可以针对性的修改缺陷后,验证通过后递交客户,相应测试也可以结束。

      6.基于“覆盖率”的原则:

      对于测试“覆盖率”的原则,个人觉的只要测试用例的“覆盖率”覆盖了客户提出全部的软件需求,包括行业隐性需求、功能需求和性能需求等等,只要测试用例执行的覆盖率达到100%,基本上测试就可以结束。如“单元测试中语句覆盖率最低不能小于80%”、“测试用例执行覆盖率应达到100%”和“测试需求覆盖率应达到100%”都可以作为结束确定点。如果你不放心,非得要看看测试用例的执行效果,检查是否有用例被漏执行的情况,可以对常用的功能进行“抽样测试 ”和“随机测试”。对于覆盖率在单元测试、集成测试和系统测试,每个阶段都不能忽略。

      7.基于“项目计划”的原则:

      大多数情况下,每个项目从开始就要编写开发和测试的Schedule,相应的在测试计划中也会对应每个里程碑,对测试进度和测试结束点做一个限制,一般来说都要和项目组成员(开发,管理,测试,市场,销售人员)达成共识,团队集体同意后制定一个标准结束点。如果项目的某个环节延迟了,测试时间就相应缩短。大多数情况下是所有规定的测试内容和回归测试都已经运行完成,就可以作为一个结束点。很多不规范的软件公司,都是把项目计划作为一个测试结束点,但是如果把它作为一个结束点,测试风险较大,软件质量很难得到保证。

      8.基于“缺陷度量”的原则:

      这个原则也许大家用的不是很多,了解比较少。我们可以对已经发现的缺陷,运用常用的缺陷分析技术和缺陷分析工具,用图表统计出来,方便查阅,分时间段对缺陷进行度量。我记得以前zhuzx在这个论坛上提出过缺陷分析技术这个问题,我不再重复讲述。我们也可以把 “测试期缺陷密度”和 “运行期缺陷密度”作为一个结束点。当然,最合适的测试结束的准则应该是“缺陷数控制在一个可以接受的范围内”。比如说:一万行代码最多允许存在多少个什么严重等级的错误,这样比较好量化,比较好实施,成为测试缺陷度量的主流。

      9.基于“质量成本”的原则:

      一个软件往往要从“质量/成本/进度”三方面取得平衡后就停止。至于这三方面哪一项占主要地位,就要看是什么软件了。比如说是:人命关天的航天航空软件, 那还是质量重要些,就算多花点钱、推迟一下进度,也要测试能保证较高质量以后才能终止测试,发布版本。如果是一般的常用软件,由于利益和市场的原因,哪怕有bug,也必须得先推出产品,没办法呀。一般来说,最主要的参考依据是:“把找到缺陷耗费的代价和这个缺陷可能导致的损失做一个均衡”。具体操作的时候,可以根据公司实际情况来定义什么样的情况下算是“测试花费的代价最划算、最合理”,同时保证公司利益最大化。如果找到bug的成本比,用户发现bug 的成本还高,也可以终止测试。

      10.基于“测试行业经验”的原则:

      很多情况下,测试行业的一些经验,也可以为我们的测试提供借鉴。比如说测试人员对行业业务的熟悉程度,测试人员的工作能力,测试的工作效率等等都会影响到整个测试计划的执行。如果一个测试团队中,每个人都没有项目行业经验数据积累,拿到一个新的项目,自然是一头雾水,不知道从何处开始,测试质量自然不会很高。因此通过测试者的经验,对确认测试执行和结束点也会起到关键性的作用。


    转载请保留:本文出自51Testing软件测试论坛每周一问活动,感谢会员爱吃鱼的月亮的精彩回答。

  • 查询经典语句

    2009-01-15 15:35:10

    SQL分类:
    DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
    DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
    DCL—数据控制语言(GRANT,REVOKE,COMMIT,ROLLBACK)

    首先,简要介绍基础语句:

    1、说明:创建数据库
    CREATE DATABASE database-name

    2、说明:删除数据库
    drop database dbname

    3、说明:备份sql server
    --- 创建 备份数据的 device
    USE master
    EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'

    --- 开始 备份
    BACKUP DATABASE pubs TO testBack

    4、说明:创建新表
    create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

    根据已有的表创建新表:
    A:create table tab_new like tab_old (使用旧表创建新表)
    B:create table tab_new as select col1,col2… from tab_old definition only

    5、说明:删除新表drop table tabname

    6、说明:增加一个列
    Alter table tabname add column col type
    注:列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

    7、说明:添加主键: Alter table tabname add primary key(col)
    说明:删除主键: Alter table tabname drop primary key(col)

    8、说明:创建索引:create [unique] index idxname on tabname(col….)
    删除索引:drop index idxname
    注:索引是不可更改的,想更改必须删除重新建。

    9、说明:创建视图:create view viewname as select statement

       删除视图:drop view viewname

    10、说明:几个简单的基本的sql语句

    选择:select * from table1 where 范围
    插入:insert into table1(field1,field2) values(value1,value2)
    删除:delete from table1 where 范围
    更新:update table1 set field1=value1 where 范围
    查找:select * from table1 where field1 like ’%value1%’ ---like的语法很精妙,查资料!
    排序:select * from table1 order by field1,field2 [desc]
    总数:select count * as totalcount from table1
    求和:select sum(field1) as sumvalue from table1
    平均:select avg(field1) as avgvalue from table1
    最大:select max(field1) as maxvalue from table1
    最小:select min(field1) as minvalue from table1

    11、说明:几个高级查询运算词

    A: UNION 运算符

    UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1 就是来自 TABLE2。

    B: EXCEPT 运算符

    EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。

    C: INTERSECT 运算符

    INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。
    注:使用运算词的几个查询结果行必须是一致的。

    12、说明:使用外连接
    A、left outer join:

    左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。
    SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    B:right outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。

    C:full outer join:
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

    其次,大家来看一些不错的sql语句

    1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
    法一:select * into b from a where 1<>1
    法二:select top 0 * into b from a

    2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
    insert into b(a, b, c) select d,e,f from b;

    3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
    insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
    例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

    4、说明:子查询(表名1:a 表名2:b)
    select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

    5、说明:显示文章、提交人和最后回复时间
    select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

    6、说明:外连接查询(表名1:a 表名2:b)
    select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

    7、说明:在线视图查询(表名1:a )
    select * from (SELECT a,b,c FROM a) T where t.a > 1;

    8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
    select * from table1 where time between time1 and time2
    select a,b,c, from table1 where a not between 数值1 and 数值2

    9、说明:in 的使用方法
    select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

    10、说明:两张关联表,删除主表中已经在副表中没有的信息
    delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

    11、说明:四表联查问题:
    select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where .....

    12、说明:日程安排提前五分钟提醒
    SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

    13、说明:一条sql 语句搞定数据库分页
    select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段

    14、说明:前10条记录
    select top 10 * form table1 where 范围

    15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
    select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

    16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
    (select a from tableA ) except (select a from tableB) except (select a from tableC)

    17、说明:随机取出10条数据
    select top 10 * from tablename order by newid()

    18、说明:随机选择记录
    select newid()

    19、说明:删除重复记录
    Delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

    20、说明:列出数据库里所有的表名
    select name from sysobjects where type='U'

    21、说明:列出表里的所有的
    select name from syscolumns where id=object_id('TableName')

    22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
    select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
    显示结果:
    type vender pcs
    电脑 A 1
    电脑 A 1
    光盘 B 2
    光盘 A 2
    手机 B 3
    手机 C 3

    23、说明:初始化表table1
    TRUNCATE TABLE table1

    24、说明:选择从10到15的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc
      
    随机选择数据库记录的方法(使用Randomize函数,通过SQL语句实现)
      对存储在数据库中的数据来说,随机数特性能给出上面的效果,但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环:
    Randomize
    RNumber = Int(Rnd*499) +1
     
    While Not objRec.EOF
    If objRec("ID") = RNumber THEN
    ... 这里是执行脚本 ...
    end if
    objRec.MoveNext
    Wend
     
       这很容易理解。首先,你取出1到500范围之内的一个随机数(假设500就是数据库内记录的总数)。然后,你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495,那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些,但相比更为稳固的企业解决方案这还是个小型数据库了,后者通常在一 个数据库内就包含了成千上万条记录。这时候不就死定了?
      采用SQL,你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset,如下所示:
    Randomize
    RNumber = Int(Rnd*499) + 1
     
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber
     
    set ōbjRec = ObjConn.Execute(SQL)
    Response.WriteRNumber & " = " & objRec("ID") & " " & objRec("c_email")
     
      不必写出RNumber 和ID,你只需要检查匹配情况即可。只要你对以上代码的工作满意,你自可按需操作“随机”记录。Recordset没有包含其他内容,因此你很快就能找到你需要的记录这样就大大降低了处理时间。
    再谈随机数
      现在你下定决心要榨干Random 函数的最后一滴油,那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。
      为了取出几条随机选择的记录并存放在同一recordset内,你可以存储三个随机数,然后查询数据库获得匹配这些数字的记录:
    SQL = "SELECT * FROM Customers WHERE ID = " & RNumber & " OR ID = " & RNumber2 & " OR ID = " & RNumber3
     
      假如你想选出10条记录(也许是每次页面装载时的10条链接的列表),你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成,但是 SELECT 语句只显示一种可能(这里的ID 是自动生成的号码):
    SQL = "SELECT * FROM Customers WHERE ID BETWEEN " & RNumber & " AND " & RNumber & "+ 9"

      注意:以上代码的执行目的不是检查数据库内是否有9条并发记录。

     
    随机读取若干条记录,测试
    Access语法:SELECT top 10 * From 表名 ORDER BY Rnd(id)
    Sql server:select top n * from 表名 order by newid()
    mysqlelect * From 表名 Order By rand() Limit n
    Access左连接语法(最近开发要用左连接,Access帮助什么都没有,网上没有Access的SQL说明,只有自己测试, 现在记下以备后查)
    语法elect table1.fd1,table1,fd2,table2.fd2 From table1 left join table2 on table1.fd1,table2.fd1 where ...
    使用SQL语句 用...代替过长的字符串显示
    语法:
    SQL数据库:select case when len(field)>10 then left(field,10)+'...' else field end as news_name,news_id from tablename
    Access数据库:SELECT iif(len(field)>2,left(field,2)+'...',field) FROM tablename;
     
    Conn.Execute说明
    Execute方法
      该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集,该方法的使用格式分为以下两种:
        1.执行SQL查询语句时,将返回查询得到的记录集。用法为:
        Set 对象变量名=连接对象.Execute("SQL 查询语言")
       Execute方法调用后,会自动创建记录集对象,并将查询结果存储在该记录对象中,通过Set方法,将记录集赋给指定的对象保存,以后对象变量就代表了该记录集对象。

        2.执行SQL的操作性语言时,没有记录集的返回。此时用法为:
        连接对象.Execute "SQL 操作性语句" [, RecordAffected][, Option]
          ·RecordAffected 为可选项,此出可放置一个变量,SQL语句执行后,所生效的记录数会自动保存到该变量中。通过访问该变量,就可知道SQL语句队多少条记录进行了操作。
          ·Option 可选项,该参数的取值通常为adCMDText,它用于告诉ADO,应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数,可使执行更高效。

    ·BeginTrans、RollbackTrans、CommitTrans方法
      这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物;RollbackTrans用于回滚事务;CommitTrans用于提交所有的事务处理结果,即确认事务的处理。
      事务处理可以将一组操作视为一个整体,只有全部语句都成功执行后,事务处理才算成功;若其中有一个语句执行失败,则整个处理就算失败,并恢复到处里前的状态。
       BeginTrans和CommitTrans用于标记事务的开始和结束,在这两个之间的语句,就是作为事务处理的语句。判断事务处理是否成功,可通过 连接对象的Error集合来实现,若Error集合的成员个数不为0,则说明有错误发生,事务处理失败。Error集合中的每一个Error对象,代表一 个错误信息。

  • 必须掌握的八个DOS命令

    2009-01-15 15:32:32

    一,ping    

      它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧,在DOS窗口中键入:ping /? 回车,。所示的帮助画面。在此,我们只掌握一些基本的很有用的参数就可以了(下同)。    

      -t 表示将不间断向目标IP发送数据包,直到我们强迫其停止。试想,如果你使用100M的宽带接入,而目标IP是56K的小猫,那么要不了多久,目标IP就因为承受不了这么多的数据而掉线,呵呵,一次攻击就这么简单的实现了。    

      -l 定义发送数据包的大小,默认为32字节,我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用,会有更好的效果哦。    

      -n 定义向目标IP发送数据包的次数,默认为3次。如果网络速度比较慢,3次对我们来说也浪费了不少时间,因为现在我们的目的仅仅是判断目标IP是否存在,那么就定义为一次吧。    

      说明一下,如果-t 参数和 -n参数一起使用,ping命令就以放在后面的参数为标准,比如"ping IP -t -n 3",虽然使用了-t参数,但并不是一直ping下去,而是只ping 3次。另外,ping命令不一定非得ping IP,也可以直接ping主机域名,这样就可以得到主机的IP。    

      下面我们举个例子来说明一下具体用法。    

      这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒,从这里可以判断网络连接速度的大小 。从TTL的返回值可以初步判断被ping主机的操作系统,之所以说"初步判断"是因为这个值是可以修改的。这里TTL=32表示操作系统可能是win98。 

      (小知识:如果TTL=128,则表示目标主机可能是Win2000;如果TTL=250,则目标主机可能是Unix) 

      至于利用ping命令可以快速查找局域网故障,可以快速搜索最快的QQ服务器,可以对别人进行ping攻击……这些就靠大家自己发挥了。    

    二,nbtstat    

      该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接,使用这个命令你可以得到远程主机的NETBIOS信息,比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。    

      -a 使用这个参数,只要你知道了远程主机的机器名称,就可以得到它的NETBIOS信息(下同)。    

      -A 这个参数也可以得到远程主机的NETBIOS信息,但需要你知道它的IP。 

      -n 列出本地机器的NETBIOS信息。    

      当得到了对方的IP或者机器名的时候,就可以使用nbtstat命令来进一步得到对方的信息了,这又增加了我们入侵的保险系数。    

    三,netstat 

      这是一个用来查看网络状态的命令,操作简便功能强大。    

      -a 查看本地机器的所有开放端口,可以有效发现和预防木马,可以知道机器所开的服务等信息,如图4。    

      这里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务等。用法:netstat -a IP。 

      -r 列出当前的路由信息,告诉我们本地机器的网关、子网掩码等信息。用法:netstat -r IP。 
    四,tracert 

      跟踪路由信息,使用此命令可以查出数据从本地机器传输到目标主机所经过的所有途径,这对我们了解网络布局和结构很有帮助。如图5。    

      这里说明数据从本地机器传输到192.168.0.1的机器上,中间没有经过任何中转,说明这两台机器是在同一段局域网内。用法:tracert IP。    

    五,net    

      这个命令是网络命令中最重要的一个,必须透彻掌握它的每一个子命令的用法,因为它的功能实在是太强大了,这简直就是 微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令,键入net /?回车如图6。 

      在这里,我们重点掌握几个入侵常用的子命令。    

      net view    

      使用此命令查看远程主机的所以共享资源。命令格式为net view \IP。   

      net use 

      把远程主机的某个共享资源影射为本地盘符,图形界面方便使用,呵呵。命令格式为net use x: \IP\sharename。上面一个表示把192.168.0.5IP的共享名为magic的目录影射为本地的Z盘。下面表示和192.168.0.7建立IPC$连接(net use \IP\IPC$ "password" /user:"name"),    

      建立了IPC$连接后,呵呵,就可以上传文件了:copy nc.exe \192.168.0.7\admin$,表示把本地目录下的nc.exe传到远程主机,结合后面要介绍到的其他DOS命令就可以实现入侵了。    

      net start 

      使用它来启动远程主机上的服务。当你和远程主机建立连接后,如果发现它的什么服务没有启动,而你又想利用此服务怎么办?就使用这个命令来启动吧。用法:net start servername,如图9,成功启动了telnet服务。    

      net stop 

      入侵后发现远程主机的某个服务碍手碍脚,怎么办?利用这个命令停掉就ok了,用法和net start同。    

      net user 

      查看和帐户有关的情况,包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的,最重要的,它为我们克隆帐户提供了前提。键入不带参数的net user,可以查看所有用户,包括已经禁用的。下面分别讲解。 

      1,net user abcd 1234 /add,新建一个用户名为abcd,密码为1234的帐户,默认为user组成员。 

      2,net user abcd /del,将用户名为abcd的用户删除。 

      3,net user abcd /active:no,将用户名为abcd的用户禁用。 

      4,net user abcd /active:yes,激活用户名为abcd的用户。 

      5,net user abcd,查看用户名为abcd的用户的情况   

      net localgroup 

      查看所有和用户组有关的信息和进行相关操作。键入不带参数的net localgroup即列出当前所有的用户组。在入侵过程中,我们一般利用它来把某个帐户提升为administrator组帐户,这样我们利用这个帐户就可以控制整个远程主机了。用法:net localgroup groupname username /add。    

      现在我们把刚才新建的用户abcd加到administrator组里去了,这时候abcd用户已经是超级管理员了,呵呵,你可以再使用net user abcd来查看他的状态,和图10进行比较就可以看出来。但这样太明显了,网管一看用户情况就能漏出破绽,所以这种方法只能对付菜鸟网管,但我们还得知道。现在的手段都是利用其他工具和手段克隆一个让网管看不出来的超级管理员,这是后话。有兴趣的朋友可以参照《黑客防线》第30期上的《由浅入深解析隆帐户》一文。    

      net time 

      这个命令可以查看远程主机当前的时间。如果你的目标只是进入到远程主机里面,那么也许就用不到这个命令了。但简单的入侵成功了,难道只是看看吗?我们需要进一步渗透。这就连远程主机当前的时间都需要知道,因为利用时间和其他手段(后面会讲到)可以实现某个命令和程序的定时启动,为我们进一步入侵打好基础。用法:net time \IP。    

    六,at 

    这个命令的作用是安排在特定日期或时间执行某个特定的命令和程序(知道net time的重要了吧?)。当我们知道了远程主机的当前时间,就可以利用此命令让其在以后的某个时间(比如2分钟后)执行某个程序和命令。用法:at time command \computer。    

      表示在6点55分时,让名称为a-01的计算机开启telnet服务(这里net start telnet即为开启telnet服务的命令)。    
    七,ftp    

      大家对这个命令应该比较熟悉了吧?网络上开放的ftp的主机很多,其中很大一部分是匿名的,也就是说任何人都可以登陆上去。现在如果你扫到了一台开放ftp服务的主机(一般都是开了21端口的机器),如果你还不会使用ftp的命令怎么办?下面就给出基本的ftp命令使用方法。 

      首先在命令行键入ftp回车,出现ftp的提示符,这时候可以键入"help"来查看帮助(任何DOS命令都可以使用此方法查看其帮助)。    

      大家可能看到了,这么多命令该怎么用?其实也用不到那么多,掌握几个基本的就够了。    

      首先是登陆过程,这就要用到open了,直接在ftp的提示符下输入"open 主机IP ftp端口"回车即可,一般端口默认都是21,可以不写。接着就是输入合法的用户名和密码进行登陆了,这里以匿名ftp为例介绍。    

      用户名和密码都是ftp,密码是不显示的。当提示**** logged in时,就说明登陆成功。这里因为是匿名登陆,所以用户显示为Anonymous。    

      接下来就要介绍具体命令的使用方法了。    

      dir 跟DOS命令一样,用于查看服务器的文件,直接敲上dir回车,就可以看到此ftp服务器上的文件。 

      cd 进入某个文件夹。 

      get 下载文件到本地机器。 

      put 上传文件到远程服务器。这就要看远程ftp服务器是否给了你可写的权限了,如果可以,呵呵,该怎么 利用就不多说了,大家就自由发挥去吧。 

      delete 删除远程ftp服务器上的文件。这也必须保证你有可写的权限。 

      bye 退出当前连接。 

      quit 同上。 
       

    八,telnet 

      功能强大的远程登陆命令,几乎所有的入侵者都喜欢用它,屡试不爽。为什么?它操作简单,如同使用自己的机器一样,只要你熟悉DOS命令,在成功以administrator身份连接了远程机器后,就可以用它来干你想干的一切了。下面介绍一下使用方法,首先键入telnet回车,再键入help查看其帮助信息。    

      然后在提示符下键入open IP回车,这时就出现了登陆窗口,让你输入合法的用户名和密码,这里输入任何密码都是不显示的。    

      当输入用户名和密码都正确后就成功建立了telnet连接,这时候你就在远程主机上具有了和此用户一样的权限,利用DOS命令就可以实现你想干的事情了。这里我使用的超级管理员权限登陆的。   

      到这里为止,网络DOS命令的介绍就告一段落了,这里介绍的目的只是给菜鸟网管一个印象,让其知道熟悉和掌握网络DOS命令的重要性。其实和网络有关的DOS命令还远不止这些,这里只是抛砖引玉,希望能对广大菜鸟网管有所帮助。学好DOS对当好网管有很大的帮助,特别的熟练掌握了一些网络的DOS命令。 

      另外大家应该清楚,任何人要想进入系统,必须得有一个合法的用户名和密码(输入法漏洞差不多绝迹了吧),哪怕你拿到帐户的只有一个很小的权限,你也可以利用它来达到最后的目的。所以坚决消灭空口令,给自己的帐户加上一个强壮的密码,是最好的防御弱口令入侵的方法。 

      最后,由衷的说一句,培养良好的安全意识才是最重要的。

    =========================================
    开始→运行→命令集锦
    winver---------检查Windows版本 
    wmimgmt.msc----打开windows管理体系结构(WMI) 
    wupdmgr--------windows更新程序 
    wscrīpt--------windows脚本宿主设置 
    write----------写字板 
    winmsd---------系统信息 
    wiaacmgr-------扫描仪和照相机向导 
    winchat--------XP自带局域网聊天 

    mem.exe--------显示内存使用情况 
    Msconfig.exe---系统配置实用程序 
    mplayer2-------简易widnows media player 
    mspaint--------画图板 
    mstsc----------远程桌面连接 
    mplayer2-------媒体播放机 
    magnify--------放大镜实用程序 
    mmc------------打开控制台 
    mobsync--------同步命令 

    dxdiag---------检查DirectX信息 
    drwtsn32------ 系统医生 
    devmgmt.msc--- 设备管理器 
    dfrg.msc-------磁盘碎片整理程序 
    diskmgmt.msc---磁盘管理实用程序 
    dcomcnfg-------打开系统组件服务 
    ddeshare-------打开DDE共享设置 
    dvdplay--------DVD播放器 

    net stop messenger-----停止信使服务 
    net start messenger----开始信使服务 
    notepad--------打开记事本 
    nslookup-------网络管理的工具向导 
    ntbackup-------系统备份和还原 
    narrator-------屏幕"讲述人" 
    ntmsmgr.msc----移动存储管理器 
    ntmsoprq.msc---移动存储管理员操作请求 
    netstat -an----(TC)命令检查接口 

    syncapp--------创建一个公文包 
    sysedit--------系统配置编辑器 
    sigverif-------文件签名验证程序 
    sndrec32-------录音机 
    shrpubw--------创建共享文件夹 
    secpol.msc-----本地安全策略 
    syskey---------系统加密,一旦加密就不能解开,保护windows xp系统的双重密码 
    services.msc---本地服务设置 
    Sndvol32-------音量控制程序 
    sfc.exe--------系统文件检查器 
    sfc /scannow---windows文件保护 

    tsshutdn-------60秒倒计时关机命令 
    tourstart------xp简介(安装完成后出现的漫游xp程序) 
    taskmgr--------任务管理器 

    eventvwr-------事件查看器 
    eudcedit-------造字程序 
    explorer-------打开资源管理器 


    packager-------对象包装程序 
    perfmon.msc----计算机性能监测程序 
    progman--------程序管理器 

    regedit.exe----注册表 
    rsop.msc-------组策略结果集 
    regedt32-------注册表编辑器 
    rononce -p ----15秒关机 
    regsvr32 /u *.dll----停止dll文件运行 
    regsvr32 /u zipfldr.dll------取消ZIP支持 

    cmd.exe--------CMD命令提示符 
    chkdsk.exe-----Chkdsk磁盘检查 
    certmgr.msc----证书管理实用程序 
    calc-----------启动计算器 
    charmap--------启动字符映射表 
    cliconfg-------SQL SERVER 客户端网络实用程序 
    Clipbrd--------剪贴板查看器 
    conf-----------启动netmeeting 
    compmgmt.msc---计算机管理 
    cleanmgr-------垃圾整理 
    ciadv.msc------索引服务程序 

    osk------------打开屏幕键盘 
    odbcad32-------ODBC数据源管理器 
    oobe/msoobe /a----检查XP是否激活 
    lusrmgr.msc----本机用户和组 
    logoff---------注销命令 


    iexpress-------木马捆绑工具,系统自带 

    Nslookup-------IP地址侦测器 

    fsmgmt.msc-----共享文件夹管理器 

    utilman--------辅助工具管理器 

    gpedit.msc-----组策略
  • 关于测试的一些技巧和经验

    2009-01-13 15:06:05

    在制定测试计划的时候,就要考虑到测试的风险,并抉择要执行哪些测试,并放弃哪些测试;测试计划的评审应该让开发人员参与;测试模型的制作应该尽可能贴近用户,或者站在用户的使用立场上来观测软件,此时应该能发现更多的问题。

     由于测试发现问题,在解决问题后还要重新测试,因此测试的时间可能会比实际更长一些

     识别和注意少数重要的方面,而忽略多数次要的方面,有时候少数的问题足以致命,这些问题将是软件测试结果中重要性最高的错误。

     错误的定位有时是很难的,要找出必然发生的前因后果,而不至于因为描述错误而误导开发人员。有时候确实存在错误不能重建的问题。解决办法之一是在错误报告中给予说明。

     对错误的描述,应该是准确、完整而简练。因为描述的问题或者不完整的描述会引起开发人员的误解,其后果是可以想见的。

     有时有经验的测试人员凭借直觉就可以发现一些问题,这可称为“错误猜测”。

     测试人员容易犯2种错误:一是测试人员发生判断错误,将本没有错误的系统行为报告为错误,或者将错误指定了过高的严重级别,或者过高估计了问题的严重性,这样会引起开发人员的不信任,产生一种象“狼来了”一样的效果;二是测试人员将错误的严重性或优先级定得过低,从而产生“测试逃逸”,这样会造成产品质量的风险。以上两种错误应该尽量避免
  • 测试用例设计

    2009-01-13 15:04:58

    测试需求收集完毕后,开始测试设计。测试用例是什么?测试用例就是一个文档,描述输入、动作、或者时间和一个期望的结果,其目的是确定应用程序的某个特性是否正常的工作。设计测试用例需要考虑以下问题:

    测试用例的基本格式

    软件测试用例的基本要素包括测试用例编号、测试标题、重要级别、测试输入、操作步骤、预期结果,下面逐一介绍。

    用例编号: 测试用例的编号有一定的规则,比如系统测试用例的编号这样定义规则: PROJECT1-ST-001 ,命名规则是项目名称+测试阶段类型(系统测试阶段)+编号。定义测试用例编号,便于查找测试用例,便于测试用例的跟踪。

    测试标题: 对测试用例的描述,测试用例标题应该清楚表达测试用例的用途。比如测试用户登录时输入错误密码时,软件的响应情况

    重要级别: 定义测试用例的优先级别,可以笼统的分为两个级别。一般来说,如果软件需求的优先级为,那么针对该需求的测试用例优先级也为;反之亦然,

    测试输入: 提供测试执行中的各种输入条件。根据需求中的输入条件,确定测试用例的输入。测试用例的输入对软件需求当中的输入有很大的依赖性,如果软件需求中没有很好的定义需求的输入,那么测试用例设计中会遇到很大的障碍。

    操作步骤: 提供测试执行过程的步骤。对于复杂的测试用例,测试用例的输入需要分为几个步骤完成,这部分内容在操作步骤中详细列出。

    预期结果: 提供测试执行的预期结果,预期结果应该根据软件需求中的输出得出。如果在实际测试过程中,得到的实际测试结果与预期结果不符,那么测试不通过;反之则测试通过。

    软件测试用例的设计主要从上述 6 个域考虑,结合相应的软件需求文档,在掌握一定测试用例设计方法的基础上,可以设计出比较全面、合理的测试用例。具体的测试用例设计方法可以参见相关的测试书籍,白盒测试方法和黑盒测试方法在绝大多数的软件测试书籍中都有详细的介绍,这里不作赘述。

    重用同类型项目的测试用例

    如果我看得远,那是因为我站在巨人的肩上 --牛顿。

    一般来说,每个软件公司的项目可以分为固定的几大类。可以按业务类型划分,比如 ERP 软件、产品数据管理软件、通信软件、地理信息系统软件等等;可以按软件结构来划分,比如 B/S 架构的软件、 C/S 架构的软件、嵌入式软件等等。参考同类别软件的测试用例,会有很大的借鉴意义。如果,公司中有同类别的软件系统,千万别忘记把相关的测试用例拿来参考。如果,系统非常接近,甚至经过对测试用例简单修改就可以应用到当前被测试的软件。拿来主义可以极大的开阔测试用例设计思路,也可以节省大量的测试用例设计时间。

    利用已有的软件 Checklist

    在上面一个小节中,按照不同的规则划分了不同的软件类型。每种类型的软件都有一定的测试规范,比如, WEB 软件系统在系统测试过程中,会有一系列的范式,比如针对 Cookie 就会有很多测试点。在设计测试用例的时候,不妨到网上去搜索相关的 Checklist ,不过国内外的网站很少有这方面的资料,即便有,也不是特别系统。可以先找一份粗糙的 Checklist ,然后,在设计测试用例的时候不断的去完善它,以作为下次测试用例设计的基础。

    加强测试用例的评审

    测试用例设计完毕后,最好能够增加评审过程。同行评审是 CMM3 级的一个 KPA ,如果因为公司没有通过 CMM3 级,就不开展同行评审是不恰当的。测试用例应该由产品相关的软件测试人员和软件开发人员评审,提交评审意见,然后根据评审意见更新测试用例。如果认真操作这个环节,测试用例中的很多问题都会暴露出来,比如用例设计错误、用例设计遗漏、用例设计冗余、用例设计不充分等等;如果同行评审不充分,那么,在测试执行的过程中,上述本应在评审阶段发现的测试用例相关问题,会给测试执行带来大麻烦,甚至导致测试执行挂起。

    定义测试用例的执行顺序
       
    在测试用例执行过程中,你会发现每个测试用例都对测试环境有特殊的要求,或者对测试环境有特殊的影响。因此,定义测试用例的执行顺序,对测试的执行效率影响非常大。比如某些异常测试用例会导致服务器频繁重新启动,服务器的每次重新启动都会消耗大量的时间,导致这部分测试用例执行也消耗很多的时间。那么在编排测试用例执行顺序的时候,应该考虑把这部分测试用例放在最后执行,如果在测试进度很紧张的情况下,如果优先执行这部分消耗时间的异常测试用例,那么在测试执行时间过了大半的时候,测试用例执行的进度依然是缓慢的,这会影响到测试人员的心情,进而导致匆忙地测试后面的测试用例,这样测试用例的漏测、误测就不可避免,严重影响了软件测试效果和进度。因而,合理地定义测试用例的执行顺序是很有必要的。
      
    测试用例执行
      
    测试用例设计完毕后,接下来的工作是测试执行,测试执行中应该注意以下几个问题:
      
    搭建软件测试环境,执行测试用例
      
    测试用例执行过程中,搭建测试环境是第一步。一般来说,软件产品提交测试后,开发人员应该提交一份产品安装指导书,在指导书中详细指明软件产品运行的软硬件环境,比如要求操作系统系统是 Windows 2000 pack4 版本,数据库是 Sql Server 2000 等等,此外,应该给出被测试软件产品的详细安装指导书,包括安装的操作步骤、相关配置文件的配置方法等等。对于复杂的软件产品,尤其是软件项目,如果没有安装指导书作为参考,在搭建测试环境过程中会遇到种种问题。
      
    如果开发人员拒绝提供相关的安装指导书,搭建测试中遇到问题的时候,测试人员可以要求开发人员协助,这时候,一定要把开发人员解决问题的方法记录下来,避免同样的问题再次请教开发人员,这样会招致开发人员的反感,也降低了开发人员对测试人员的认可程度。
      
    测试执行过程应注意的问题
      
    测试环境搭建之后,根据定义的测试用例执行顺序,逐个执行测试用例。在测试执行中需要注意以下几个问题:
      
    全方位的观察测试用例执行结果: 测试执行过程中,当测试的实际输出结果与测试用例中的预期输出结果一致的时候,是否可以认为测试用例执行成功了?答案是否定的,即便实际测试结果与测试的预期结果一致,也要查看软件产品的操作日志、系统运行日志和系统资源使用情况,来判断测试用例是否执行成功了。全方位观察软件产品的输出可以发现很多隐蔽的问题。以前,我在测试嵌入式系统软件的时候,执行某测试用例后,测试用例的实际输出与预期输出完全一致,不过在查询 CPU 占用率地时候,发现 CPU 占用率高达 90 %,后来经过分析,软件运行的时候启动了若干个 1ms 的定时器,大量的消耗的 CPU 资源,后来通过把定时器调整到 10ms CPU 的占用率降为 7 %。如果观察点单一,这个严重消耗资源的问题就无从发现了。
      
    加强测试过程记录: 测试执行过程中,一定要加强测试过程记录。如果测试执行步骤与测试用例中描述的有差异,一定要记录下来,作为日后更新测试用例的依据;如果软件产品提供了日志功能,比如有软件运行日志、用户操作日志,一定在每个测试用例执行后记录相关的日志文件,作为测试过程记录,一旦日后发现问题,开发人员可以通过这些测试记录方便的定位问题。而不用测试人员重新搭建测试环境,为开发人员重现问题。
      
    及时确认发现的问题: 测试执行过程中,如果确认发现了软件的缺陷,那么可以毫不犹豫的提交问题报告单。如果发现了可疑问题,又无法定位是否为软件缺陷,那么一定要保留现场,然后知会相关开发人员到现场定位问题。如果开发人员在短时间内可以确认是否为软件缺陷,测试人员给予配合;如果开发人员定位问题需要花费很长的时间,测试人员千万不要因此耽误自己宝贵的测试执行时间,可以让开发人员记录重新问题的测试环境配置,然后,回到自己的开发环境上重现问题,继续定位问题。
      
    与开发人员良好的沟通: 测试执行过程中,当你提交了问题报告单,可能被开发人员无情驳回,拒绝修改。这时候,只能对开发人员晓之以理,做到有理、有据,有说服力。首先,要定义软件缺陷的标准原则,这个原则应该是开发人员和测试人员都认可的,如果没有共同认可的原则,那么开发人员与测试人员对问题的争执就不可避免了。此外,测试人员打算说服开发人员之前,考虑是否能够先说服自己,在保证可以说服自己的前提下,再开始与开发人员交流。
      
    及时更新测试用例
      
    测试执行过程中,应该注意及时更新测试用例。往往在测试执行过程中,才发现遗漏了一些测试用例,这时候应该及时的补充;往往也会发现有些测试用例在具体的执行过程中根本无法操作,这时候应该删除这部分用例;也会发现若干个冗余的测试用例完全可以由某一个测试用例替代,那么删除冗余的测试用例。
      
    总之,测试执行的过程中及时地更新测试用例是很好的习惯。不要打算在测试执行结束后,统一更新测试用例,如果这样,往往会遗漏很多本应该更新的测试用例。
      
    提交一份优秀的问题报告单
      
    软件测试提交的问题报告单和测试日报一样,都是软件测试人员的工作输出,是测试人员绩效的集中体现。因此,提交一份优秀的问题报告单是很重要的。软件测试报告单最关键的域就是问题描述,这是开发人员重现问题,定位问题的依据。问题描述应该包括以下几部分内容:软件配置、硬件配置、测试用例输入、操作步骤、输出、当时输出设备的相关输出信息和相关的日志等。
      
    软件配置: 包括操作系统类型版本和补丁版本、当前被测试软件的版本和补丁版本、相关支撑软件,比如数据库软件的版本和补丁版本等。
      
    硬件配置: 计算机的配置情况,主要包括 CPU 、内存和硬盘的相关参数,其它硬件参数根据测试用例的实际情况添加。如果测试中使用网络,那么网络的组网情况,网络的容量、流量等情况。硬件配置情况与被测试产品类型密切相关,需要根据当时的情况,准确翔实的记录硬件配置情况。
      
    测试用例输入 \ 操作步骤 \ 输出: 这部分内容可以根据测试用例的描述和测试用例的实际执行情况如实填写。
      
    输出设备的相关输出信息: 输出设备包括计算机显示器、打印机、磁带等等输出设备,如果是显示器可以采用抓屏的方式获取当时的截图,其他的输出设备可以采用其它方法获取相关的输出,在问题报告单中提供描述。
      
    日志信息: 规范的软件产品都会提供软件的运行日志和用户、管理员的操作日志,测试人员应该把测试用例执行后的软件产品运行日志和操作日志作为附件,提交到问题报告单中。
      
    根据被测试软件产品的不同,需要在问题描述中增加相应的描述内容,这需要具体问题具体分析。
      
    测试结果分析
      
    软件测试执行结束后,测试活动还没有结束。测试结果分析是必不可少的重要环节,编筐编篓,全在收口,测试结果的分析对下一轮测试工作的开展有很大的借鉴意义。前面的测试准备工作中,建议测试人员走读缺陷跟踪库,查阅其他测试人员发现的软件缺陷。测试结束后,也应该分析自己发现的软件缺陷,对发现的缺陷分类,你会发现自己提交的问题只有固定的几个类别;然后,再把一起完成测试执行工作的其他测试人员发现的问题也汇总起来,你会发现,你所提交问题的类别与他们有差异。这很正常,人的思维是有局限性,在测试的过程中,每个测试人员都有自己思考问题的盲区和测试执行的盲区,有效的自我分析和分析其他测试人员,你会发现自己的盲区,有针对性的分析盲区,必定会在下一轮测试用避免盲区。

  • 应该考虑进行何种测试

    2009-01-13 15:03:49

    黑盒测试(Black box testing)  ____不考虑内部设计和代码,根据需求和功能进行测试

    白盒测试 (White box testing) ── 根据应用软件的代码的内部逻辑,按照代码的语句、分支、路径和条件进行测试。

    部件测试 (Unit testing) ——最小范围的测试,针对特定的函数和代码模块进行测试。因为需要了解程序的设计和代码的细节才能进行,所以部件测试一般是程序员。而不是由测试人员来做。除非应用软件的结构设计良好,而且代码也写得清楚,否则部件测试并非易事。也许需要开发测试驱动模块或测试工具。

    递增的综合测试(incremental integration testing)——不断进行的测试过程,每增加一个新的功能模块,都进行测试。这要求一个应用软件在最终完成之前,各功能模块要相对独立,或者已根据需要开发出测试驱动软件。这种测试可由程序员或测试人员进行。

    综合测试(integration testing)——对应用软件的各个部分进行组合测试,来检查各功能模块在一起工作是否正常,“部件“可以是代码模块、独立的应用程序、也可以是网络中的客户/服务器应用软件。这种测试特别使用客户/服务器环境和分布式系统

    功能测试(functional testing)——对一个应用软件的功能模块进行黑盒测试。这种测试应当由测试人员进行。但这并不意味着程序员在推出软件之前不进行代码检查。(这一原则适用于所有的测试阶段。)

    系统测试 —— 针对全部需求说明进行黑盒测试,包括系统中所有的部件

    端到端测试 (end-to-end testing) ── 类似于系统测试,但测试范围更“宏观”一些。模仿实际应用环境,对整个应用软件进行使用测试。例如与数据库进行交互作业、使用网络通信、与其他硬件、应用程序和系统之间的相互作用是否满足要求。

    健全测试 (sanity testing) ── 是一种典型的初始测试。判断一个新的软件版本的运行是否正常,是否值得对它作进一步的测试。例如,如果一个新的软件每 5 分钟就破坏系统、大大降低系统的运行速度、或者破坏数据库,那么这样的软件就算不上是“健全”的,不值得在目前状态下进行进一步的测试。

    回归测试 (regression testing) ── 每当软件经过了整理、修改、或者其环境发生变化,都重复进行测试。很难说需要进行多少次回归测试,特别是是到了开发周期的最后阶段。进行此种测试,特别适于使用自动测试工具。

    认同测试 (acceptance testing) ── 基于说明书的、由最终用户或顾客来进行的测试。或者由最终用户/顾客来进行一段有限时间的使用。

    负荷试验 (load testing) ── 在大负荷条件下对应用软件进行测试。例如测试一个网站在不同负荷情况下的状况,以确定在什么情况下系统响应速度下降或是出现故障。

    压力测试 (stress testing) ── 经常可以与“负荷测试”或“性能测试”相互代替。这种测试是用来检查系统在下列条件下的情况:在非正常的巨大负荷下、某些动作和输入大量重复、输入大数、对数据库进行非常复杂的查询,等等。

    性能测试 (performance testing) ── 经常可以与“压力测试”或“负荷测试”相互代替。理想的“性能测试”(也包括其他任何类型的测试) 都应在质量保障和测试计划的文档终予以规定。

    可用性测试 (usability testing) ── 是专为“对用户友好”的特性进行测试。这是一种主观的感觉,取决于最终用户或顾客。可以进行用户会见、检查、对用户会议录像、或者使用其他技术。程序员和测试人员通常不参加可用性测试。

    安装/卸载测试 (install/uninstall testing) ── 对安装/卸载进行测试 (包括全部、部分、升级操作)

    恢复测试 (recovery testing) ── 在系统崩溃、硬件故障、或者其他灾难发生之后,重新恢复系统的情况。

    安全测试 (security testing) ── 测试系统在应付非授权的内部/外部访问、故意的损坏时的防护情况。这需要精密复杂的测试技术。 

    兼容性测试 (compatability testing) ── 测试在特殊的硬件/软件/操作系统/网络环境下的软件表现。

    认同测试 (acceptance testing) ── 看顾客是否对软件满意。

    比较测试 (comparison testing) ── 与竞争产品进行比较,以找出弱点和优势。

     α 测试 (alpha testing) ── 在开发一个应用软件即将完成时所进行的测试。此时还允许有较小的设计修改。通常由最终用户或其他人进行这种测试,而不是由程序员和测试人员来进行。

     β 测试 (beta testing) ── 当开发和测试已基本完成,需要在正式发行之前最后寻找毛病而进行的测试。通常由最终用户或其他人进行这种测试,而不是由程序员和测试人员来进行。

  • 软件评测师学习笔记之一-黑盒测试

    2009-01-13 15:02:34

    黑盒测试
    一. 黑盒测试概述(2.10 黑盒测试)
    1
    .定义
    也称功能测试,它是通过测试来检测每个功能是否都能正常使用
    把程序看成一个黑盒子,完全不考虑程序内部结构和内部特性,着眼于程序外部结构,不考虑内部逻辑结构
    在程序接口进行测试,只检查程序功能是否按照需求说明书的规定正常使用,程序是否能适当地接收输入数据而产生正确的输出信息
    主要针对软件界面和软件功能进行测试
    2
    .试图发现的错误类型
    功能不正确或遗漏
    界面错误(输入能否正确的接受?能否输出正确的结果)
    数据库访问错误(如数据结构定义错误或外部信息(如数据文件)访问错误)
    性能错误
    初始化和终止错误
    3
    .黑盒测试用例设计方法
    1 等价类划分法:把程序的输入域划分成若干部分,然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类的其他值
    2 边界值分析法:通过选择等价类边界的测试用例。不仅重视输入条件边界,而且也必须考虑输出域边界
    3 错误推测法:基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性地设计测试用例的方法
    4 因果图法:从用自然语言书写的程序规格说明的描述中找出因(输入条件)和果(输入或程序状态的改变),可以通过因果图转换成判定表
    5 判定表驱动法:利用判定表进行测试用例的设计
    6 正交试验设计法:使用已设计好的正交表格来安排试验,并进行数据分析的一种方法,目的是用最少的测试用例达到最高的测试覆盖率
    7 功能图法:用功能图形象地表示程序的功能说明,并机械地生成功能图的测试用例。功能图模型由状态迁移图和逻辑功能模型构成
    二. 黑盒测试用例设计方法
    1
    .等价类划分法
    1)划分基础:需求规格说明书中输入、输出要求
    2)等价类:某个输入域的子集合;分为有效等价类和无效等价类
    有效等价类:指对于程序规格说明书来说是合理的、有意义的输入数据构成的集合。利用有效等价类可以检验程序是否实现了规格说明书中的功能和性能
    无效等价类:与有效等价的定义恰巧相反
    3)划分等价类原则(6条)
    序号 输入条件(数据) 划分等价类
    规定了取值范围值的个数 一个有效等价类两个无效等价类
    规定了输入值的集合规定了必须如何的条件 一个有效等价类一个无效等价类
    是一个布尔量 一个有效等价类一个无效等价类
    输入数据的一组值(n个),并且程序对每一个输入值分别进行处理 n个有效等价类一个无效等价类
    规定必须遵守的规则 一个有效等价类(符合规则)若干个无效等价类
    在确知已划分的等价类中,各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步地划分为更小的等价类
        
    4 列出等价类表
    在确定了等价类之后,建立等价类表,列出所有划分出的等价类
    输入条件 有效等价类 无效等类
    …… …… ……
    5 确定测试用例步骤
    第一步:为每个等价类规定一个惟一的编号
    第二步:设计一个新的测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类。重复这一步骤,最后使得所有有效等价类均被测试用例所覆盖
    第三步:设计一个新的测试用例,使其只覆盖一个无效等价类。重复这一步骤,最后使得所有有效等价类均被测试用例所覆盖
    小结:采用等价类划分方法设计测试用例,按照划分等价类、列出等价列表、确定测试用例三个步骤完成,目标是把可能的测试用例组合缩减到仍然足以满足软件测试需求为止。
    2
    .边界值分析法
    1 边界类型
    边界条件:可以在产品说明书中有定义或者在使用软件过程中确定
    次边界条件:在软件内部,也称为内部边界条件
    其他边界条件:如输入信息为空(对于此类问题应建立单独的等价类空间)、非法、错误、不正确和垃圾数据
    2)边界值的选择方法(遵循原则)
    序号 输入条件(数据) 输入边界值数据
    规定了取值范围 刚刚达到这个范围刚刚超越这个范围
    规定值的个数 最大个数、比最大个数大1最小个数、比最小个数少1
    根据规格说明书的每个输出条件,使用 原则12
    输入或输出是个有序集合 集合的第一个、最后一个元素
    程序中使用一个内部数据结构 内部数据结构边界上的值
    分析规格说明,找出其他可能的边界
    3)例子:
    允许文本输入1255个字符:测试用例-12552540256
    程序读写软盘:测试用例-文件很小、等于软盘容量限制之内、空、超过
    程序允许在一张纸上打印多个页面:测试用例-只打印一页,规定最大页,0页,大于允许最大页数
    3
    .错误推测法
    基本思想:列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据它们选择测试用例
    4
    .因果图法
      
    侧重于输入条件的各种组合,各个输入情况之间的相互制约关系
    1 因果图设计方法
    从用自然语言书写的程序规格说明的描述中找出因果,通过因果图转换成判定表
    2 因果图导出测试用例步骤
    第一步:分析程序规格说明的描述中,哪些是原因,哪些是结果。原在因常常是输入条件或是输入条件的等价类,结果是输出条件
    第二步:分析程序规格说明的描述中语义的内容,并将其表示成连接各个原因与各个结果的因果图
    第三步:标明约束条件
    第四步:把因果图转换成判定表
    第五步:为判定表中每一列表示的情况设计测试用例
    3 因果图基本图形符号
    通常在因果图中,用Ci 表示原因,Ei表示结果,各结点表示状态,可取值0(状态不出现) 1(某状态出现)
    恒等:若原因出现,则结果出现;若原因不出现,则结果不出现
    非(~):若原因出现,则结果不出现;若原因不出现,则结果出现
    或(V):若几个原因中有一个出现,则结果出现;若几个原因都不出现,则结果不出现;
    与():若几个原因都出现,结果才出现;若其中有一个原因不出现,则结果不出现
    4 因果图的约束符号
    从输入(原因)考虑四种约束
    l E
    (互斥):表示两个原因不会同时成立,两个中最多有一个可能成立
    l I
    (包含):表示三个原因中至少有一个必须成立
    l O
    (惟一):表示两个原因中必须有一个,且仅有一个成立
    l R
    (要求):表示两个原因,a出现时,b也必须出现,a出现时,b不可能不出现
    从输出(结果)考虑一种约束
    l M
    (屏蔽):两个结果,a1时,b必须是0,当a0时,b值不定

    2005-4-19
    5
    .判定表驱动法
    1 判定表:是分析和表达多逻辑条件下执行不同操作的情况的工具
    2 判定表组成
    条件桩:列出了问题的所有条件
    动作桩:列出了问题规定可能采取的操作
    条件项:列出针对它所列条件的取值,在所有可能情况下的真假值
    动作项:列出在条件项的各种取值情况下应该采取的动作
    规则:任何一个条件组合的特定取值及其相应要执行的操作
    注:判定表中贯穿条件项和动作项的一列就是一条规则;
    3 判定表的建立(步骤)
    第一步:确定规则的个数。假如有n个条件,每个条件有两个取值(0,1),故有2n种规则
    第二步:列出所有的条件桩和动作桩
    第三步:填入条件项
    第四步:填入动作项。制定初始判定表
    第五步:简化。合并相似规则或者相同动作
    4 适合使用判定表设计测试用例的条件
    规格说明以判定表的形式给出,或很容易转换成判定表
    条件的排列顺序不影响执行哪些操作
  • UI测试和测试规则

    2009-01-13 15:01:27

    界面是软件与用户交互的最直接的层,界面的好坏决定用户对软件的第一印象。而且设计良好的界面能够引导用户自己完成相应的操作,起到向导的作用。同时界面如同人的面孔,具有吸引用户的直接优势。设计合理的界面能给用户带来轻松愉悦的感受和成功的感觉,相反由于界面设计的失败,让用户有挫败感,再实用强大的功能都可能在用户的畏惧与放弃中付诸东流。目前界面的设计引起软件设计人员的重视的程度还远远不够,直到最近网页制作的兴起,才受到专家的青睐。而且设计良好的界面由于需要具有艺术美的天赋而遭拒绝。
    目前流行的界面风格有三种方式:多窗体、单窗体以及资源管理器风格,无论那种风格,以下规则是应该被重视的。

          1
    :易用性:
        
    按钮名称应该易懂,用词准确,屏弃没楞两可的字眼,要与同一界面上的其他按钮易于区分,能望文知意最好。理想的情况是用户不用查阅帮助就能知道该界面的功能并进行相关的正确操作。

        
    易用性细则:
         1):
    完成相同或相近功能的按钮用Frame框起来,常用按钮要支持快捷方式。
         2):
    完成同一功能或任务的元素放在集中位置,减少鼠标移动的距离。
         3):
    按功能将界面划分局域块,用Frame框括起来,并要有功能说明或标题。
         4):
    界面要支持键盘自动浏览按钮功能,即按Tab键的自动切换功能。
         5):
    界面上首先应输入的和重要信息的控件在Tab顺序中应当靠前,位置也应放在窗口上较醒目的位置。
         6):
    同一界面上的控件数最好不要超过10个,多于10个时可以考虑使用分页界面显示。
         7):
    分页界面要支持在页面间的快捷切换,常用组合快捷键Ctrl+Tab
         8):
    默认按钮要支持Enter及选操作,即按Enter后自动执行默认按钮对应操作。
         9):
    可写控件检测到非法输入后应给出说明并能自动获得焦点。
         10):Tab
    键的顺序与控件排列顺序要一直,目前流行总体从上到下,同时行间从左到右的方式。
         11):
    复选框和选项框按选择几率的高底而先后排列。
         12):
    复选框和选项框要有默认选项,并支持Tab选择。
         13):
    选项数相同时多用选项框而不用下拉列表框。
         14):
    界面空间较小时使用下拉框而不用选项框。
         15):
    选项数叫少时使用选项框,相反使用下拉列表框。
         16):
    专业性强的软件要使用相关的专业术语,通用性界面则提倡使用通用性词眼。
         2
    规范性:
        
    通常界面设计都按Windows界面的规范来设计,即包含菜单条、工具栏、工具厢、状态栏、滚动条、右键快捷菜单的标准格式,可以说:界面遵循规范化的程度越高,则易用性相应的就越好。小型软件一般不提供工具厢。

        
    规范性细则:
         1):
    常用菜单要有命令快捷方式。
         2):
    完成相同或相近功能的菜单用横线隔开放在同一位置。
         3):
    菜单前的图标能直观的代表要完成的操作。
         4):
    菜单深度一般要求最多控制在三层以内。
         5):
    工具栏要求可以根据用户的要求自己选择定制。
         6):
    相同或相近功能的工具栏放在一起。
         7):
    工具栏中的每一个按钮要有及时提示信息。
         8):
    一条工具栏的长度最长不能超出屏幕宽度。
         9):
    工具栏的图标能直观的代表要完成的操作。
         10):
    系统常用的工具栏设置默认放置位置。
         11):
    工具栏太多时可以考虑使用工具厢。
         12):
    工具厢要具有可增减性,由用户自己根据需求定制。
         13):
    工具厢的默认总宽度不要超过屏幕宽度的1/5
         14):
    状态条要能显示用户切实需要的信息,常用的有:
    目前的操作、系统状态、用户位置、用户信息、提示信息、错误信息等,如果某一操作需要的时间较长,还应该显示进度条和进程提示。
         15)
    :滚动条的长度要根据显示信息的长度或宽度能及时变换,以利于用户了解显示信息的位置和百分比。
         16)
    :状态条的高度以放置五好字为宜,滚动条的宽度比状态条的略窄。
         17)
    :菜单和工具条要有清楚的界限;菜单要求凸出显示,这样在移走工具条时仍有立体感。
         18)
    :菜单和状态条中通常使用5号字体。工具条一般比菜单要宽,但不要宽的太多,否则看起来很不协调。
         19):
    右键快捷菜单采用与菜单相同的准则。

         3
    :帮助设施:
        
    系统应该提供详尽而可靠的帮助文档,在用户使用产生迷惑时可以自己寻求解决方法。

        
    帮助设施细则:
         1)
    :帮助文档中的性能介绍与说明要与系统性能配套一致。(我们的系统帮助文档都是系统的祖先时期的说明,让人困惑)
         2)
    :打包新系统时,对作了修改的地方在帮助文档中要做相应的修改。
         3)
    :操作时要提供及时调用系统帮助的功能。常用F1
         4)
    :在界面上调用帮助时应该能够及时定位到与该操作相对的帮助位置。也就是说帮助要有即时针对性。
         5)
    :最好提供目前流行的联机帮助格式或HTML帮助格式。
         6)
    :用户可以用关键词在帮助索引中搜索所要的帮助,当然也应该提供帮助主题词。
         7)
    :如果没有提供书面的帮助文档的话,最好有打印帮助的功能。
         8 )
    :在帮助中应该提供我们的技术支持方式,一旦用户难以自己解决可以方便的寻求新的帮助方式。

         4
    :合理性:
        
    屏幕对角线相交的位置是用户直视的地方,正上方四分之一处为易吸引用户注意力的位置,在放置窗体时要注意利用这两个位置。

        
    合理性细则:
         1)
    :父窗体或主窗体的中心位置应该在对角线焦点附近。
         2)
    :子窗体位置应该在主窗体的左上角或正中。
         3)
    :多个子窗体弹出时应该依次向右下方偏移,以显示窗体出标题为宜。
         4)
    :重要的命令按钮与使用较频繁的按钮要放在界面上注目的位置。
         5)
    :错误使用容易引起界面退出或关闭的按钮不应该放在易点位置。横排开头或最后与竖排最后为易点位置。
         6)
    :与正在进行的操作无关的按钮应该加以屏蔽(Windows中用灰色显示,没法使用该按钮)
         7)
    :对可能造成数据无法恢复的操作必须提供确认信息,给用户放弃选择的机会。
         8)
    :非法的输入或操作应有足够的提示说明。
         9):
    对运行过程中出现问题而引起错误的地方要有提示,让用户明白错误出处,避免形成无限期的等待。
         10):
    提示、警告、或错误说明应该清楚、明了、恰当。
         5
    :美观与协调性:
        
    界面应该大小适合美学观点,感觉协调舒适,能在有效的范围内吸引用户的注意力。

        
    美观与协调性细则:
         1):
    长宽接近黄金点比例,切忌长宽比例失调、或宽度超过长度。
         2):
    布局要合理,不宜过于密集,也不能过于空旷,合理的利用空间。
         3):
    按钮大小基本相近,忌用太长的名称,免得占用过多的界面位置。
         4):
    按钮的大小要与界面的大小和空间要协调。
         5):
    避免空旷的界面上放置很大的按钮。
         6)
    :放置完控件后界面不应有很大的空缺位置。
         7):
    字体的大小要与界面的大小比例协调, 通常使用的字体中宋体9-12较为美观,很少使用超过12号的字体。
         8):
    前景与背景色搭配合理协调,反差不宜太大,最好少用深色,如大红、大绿等。常用色考虑使用Windows界面色调。
         9):
    如果使用其他颜色,主色要柔和,具有亲和力与磁力,坚决杜绝刺目的颜色。
         10):
    大型系统常用的主色有"#E1E1E1""#EFEFEF""#C0C0C0"等。
         11):
    界面风格要保持一致,字的大小、颜色、字体要相同,除非是需要艺术处理或有特殊要求的地方。
         12):
    如果窗体支持最小化和最大化或放大时,窗体上的控件也要随着窗体而缩放;切忌只放大窗体而忽略控件的缩放。
         13)
    :对于含有按钮的界面一般不应该支持缩放,即右上角只有关闭功能。
         14):
    通常父窗体支持缩放时,子窗体没有必要缩放。
         15)
    :如果能给用户提供自定义界面风格则更好,由用户自己选择颜色、字体等。

         6
    :菜单位置:
        
    菜单是界面上最重要的元素,菜单位置按照按功能来组织。

        
    菜单设测试细则:
         1)
    :菜单通常采用常用--主要--次要--工具--帮助的位置排列,符合流行的Windows风格。
         2):
    常用的有文件编辑查看等,几乎每个系统都有这些选项,当然要根据不同的系统有所取舍。
         3):
    下拉菜单要根据菜单选项的含义进行分组,并切按照一定的规则进行排列,用横线隔开。
         4):
    一组菜单的使用有先后要求或有向导作用时,应该按先后次序排列。
         5):
    没有顺序要求的菜单项按使用频率和重要性排列,常用的放在开头, 不常用的靠后放置;重要的放在开头,次要的放在后边。
         6):
    如果菜单选项较多,应该采用加长菜单的长度而减少深度的原则排列。
         7):
    菜单深度一般要求最多控制在三层以内。
         8):
    对常用的菜单要有快捷命令方式,组合原则见8
         9):
    对与进行的操作无关的菜单要用屏蔽的方式加以处理,如果采用动态加载方式——即只有需要的菜单才显示——最好。
         10)
    :菜单前的图标不宜太大,与字高保持一直最好。
         11):
    主菜单的宽度要接近,字数不应多于四个,每个菜单的字数能相同最好。
         12)
    :主菜单数目不应太多,最好为单排布置。

  • 测试工程师工作流程概论

    2009-01-13 14:59:29

    测试工程师的工作流程,与公司的整体工作流程,项目的测试要求等因素相关。本文主要讨论测试工程师的一般工作流程。

    做好测试准备

    1)
    明确测试任务的范围  

       
    测试文档通常包括测试目的、测试环境、测试方法、测试用例、测试工具等。测试工程师首先要通读文档,对整个测试要求形成整体认识,明确测试目的,以及测试要求和测试重点,明确软件测试方法和使用的测试工具。  

    2)
    明确测试时间  

       
    明确测试周期和测试时间进度。如果是多人合作完成一个软件,则要首先明确属于自己的测试内容、根据测试内容和测试周期,估算自己每日应该完成的工作量。此外由于软件测试是群体协作的测试活动,需要明确哪些测试内容要与其他测试工程师协作才能完成。  

    3)
    设置测试环境

       
    根据测试文档要求,设置测试需要的软件和硬件环境,包括操作系统,要测试的软件和其他必要的测试工具软件等。所有这些完成后,分别运行,查看是否能正确运行,保证符合测试文档要求的测试环境。  

    4)
    学习被测试软件

       
    对于不太熟悉的软件,可以通过阅读软件自身的教程和帮助文件,学习本软件的一般操作方法,也可以参照相关的书籍资料等。另外,向熟悉测试软件的其他同事请教软件使用方法,也是学习软件的一条捷径。对软件使用越熟练,测试过程越顺利,测试效果越理想。  

    5)
    确认完全理解测试任务

       
    软件测试最重要的要求就是确实明确了测试任务和要求,这包括正确理解了测试文档,确认可以按照测试进度要求,完成测试。对于测试工具要正确安装,熟练使用。如果有任何不明白之处,向软件测试负责人询问。切忌凭自己的理解和主观推测,自行其事。当然,真正测试中,往往会遇到各种新的小疑难问题,也需要及时向测试负责人请教,以保证测试顺利进行。

    执行软件测试任务  

    1)
    按照测试文档要求,逐项认真测试

       
    根据测试文档测试要求,按照测试步骤,逐项进行。通过运行软件,观察测试结果,与软件需求说明书的内容进行比较,找出软件错误。对于需要调用测试用例的测试,保证正确地调用了测试用例,注意观察和分析测试结果。某些不容易重复的错误,需要反复测试,总结重复该错误所需要的测试步骤,直到确认可以重复出现为止。  

    2)
    记录发现的错误,填写软件问题报告  

       
    为了纠正软件中的错误,测试工程师要正确记录发现的错误,将错误再现的步骤写入测试报告中,测试报告是程序测试的重要组成部分,正确书写测试报告是对测试工程师的基本要求。采用软件缺陷数据库管理测试中发现的软件缺陷,每一条错误作为数据库的一条记录,方便记录、修改、查询。  

    3)
    填写测试进度表和必要的测试内容记录表

       
    每天将测试内容写入测试进度表文档,可以使测试负责人了解测试进度,控制测试周期内测试的连续性,增强测试过程控制性,保证测试的正常进行。测试记录要准确完整,实事求是,必要时插入测试注释,解释测试中的特殊问题。测试进度表是评价测试质量和工作内容的重要凭证,对于测试后发现的测试错误和失误,可以通过检查测试记录,寻找产生错误的原因。  

    4)
    测试中发现疑难及时请教

       
    测试是一个动态的过程,可能由于自己的错误操作或者测试文档内容的错误,使得测试过程中出现自己不能解释的现象或结果,出现与测试要求不符合的情形,这时可能需要与其他测试者协商或求助,如果问题仍然不能解决,应该及时请教,听取意见和建议,必要时反复讨论直到问题全面解决。

    全面检查测试结果

    1)
    对照测试文档要求,检查测试内容是否完整  

       
    测试完成后,要对照测试文档检查测试是否全部完成,保证没有丢失测试内容。如果某些内容,由于测试环境的要求不满足,或者由于测试时间短没有进行,则要写入测试进度表文档。  

    2)
    检验书写的软件问题报告的记录,使之确切、规范

       
    正确书写测试记录是保证迅速定位软件错误,加快改正错误的必要前提。专业规范的软件记录报告是体现公司测试水平和专业实力的外在体现。认真检查书写的每条记录是否符合规范,格式、步骤、内容一一检查,必要时补充或删减。  

    上述三个阶段,相互联系紧密,其中准备是基础,测试是重点,检查是保证,应该根据测试的软件特点合理安排

     

Open Toolbar