发布新日志

  • 【转】:软件测试职业发展三步曲之二 - 如何做优秀的测试工程师

    andyfly_001 发布于 2010-10-16 11:59:48

    想必能浏览此文的朋友也该是软件测试从业人员了吧,不管您今天的职位、年限、收入如何,大抵上,也必然是从软件测试工程师做起的吧!这么多年过去了,当了N久的测试工程师,今天不妨跟叶某人一起反思一下,如何才能当个出色的测试工程师呢?

        这里不谈工程师的级别,什么初级、中级、高级、资深等;这种东西是每个公司内部自己评定的,没有标准。我想说的是,既然入了软件测试这一行,就有必要想想,咋样才能爱上这行呢?如果您抬杠说根本不爱这行,那何必进入这一行呢?是你自作孽,是对自己人生的漠视和不负责任!如果还没爱真正爱上而是渐渐适应的地步,那有必要一起来分享此文了!

    【软件测试知识体系】

        叶某在2006年写过一个小结,来说明该话题。

    我的相关日志:
    2009-08-18 | 软件测试从业者职业发展助手

        本人从事的一直是WEB系统的行业软件测试,所以该列表总结的也是针对电信、通信、物流、保险、金融、ERP等这种行业软件,其它领域如游戏、手机、嵌入式软件的测试,恕本人无知了。

    我想,关于通用软件测试的知识体系,大概分成以下几类:

    1. 软件测试理论与方法
    2. 行业知识
    3. 外语
    4. 自动化测试技能
    5. 性能测试技能
    6. 开发编程技能
    7. 数据库、中间件、网络知识
    8. 测试辅助工具使用技能

        首先是软件测试理论与方法。这些就不用多说了,就像盖房子,得知道砖、水泥、锹、铲的作用和用法一样。但是,我想额外提醒的是,我们不该把眼光只关注在测试用例设计、缺陷跟踪报告、白盒/黑盒测试概念上,而应该拓展视野,花些时间理解CMM、CMMI、RUP、Agile、BPT等,从软件工程整体角度去思考测试工作,这也是想升职做测试经理的必备。

        然后是行业知识。一般来说,当你不想把自己塑造成一个典型的技术类人才,而又没有升职做管理者的意愿,那么在我所谓的制造、电信、通信、物流、保险、金融、ERP等里从事业务测试工作,还是个不错选择。而如果连公司所在行业的业务知识都不懂的话,那可真难为你了!因为连最基本的测试用例设计、手工测试执行你都可能不合格!如此,公司解雇你或将你转岗只是迟早的事情了。也许你觉得夸张,但是我觉得很正常。理论上讲,软件测试是处于软件工程这条产业链的下游环节,所以很多时候处于被动角色,正如很多朋友慨叹:我们不掌握项目的时间、任务、资源、需求,却要保证质量,这不是天方夜谭嘛!的确,现实就是这么严苛!我们不能硬着脖子和老板说“测试人员不是用来保证质量的!”或“需求要么不明确要么没有,让我们测试乜?”,因为如果对话能解决问题,就不至于钓鱼岛问题至今未决,巴以冲突至今如滔滔江水--连绵不绝了!这就是个强权社会,谁的拳头大谁说的算!在行业软件供应商的产业链里,就是客户说的算!所以,优秀的测试工程师就是能在最短的时间里设计出最有效的用例,覆盖软件尽可能多的路径来验证软件最有价值的特性!别忘了任何工程学科谈到“质量”概念的时候,都是与时间、成本三维图示出现的,这是个天经地义的事情!而软件测试里也有名言说“没有穷举的测试”和“测试是在有限的时间里发现尽可能多的缺陷”等。那么如何做到呢?答曰:需要雇佣最了解需求的测试人员!因为除了制定需求的业务分析师,就是具有行业背景和知识的测试人员了!尤其在制造、电信、通信、物流、保险、金融、ERP、互联网等这些行业里。纵有天大的本事、熟练使用各种测试设计方法的人,在特定的行业软件面前不懂业务,也很难设计出优秀的用例。因为太多的企业和个人经验告诉我们,对于不掌握终端用户实际使用行为的测试覆盖,都只是学院派+浮光掠影式测试!相反,如果能做个出色的业务测试人员,在这样的企业里还是蛮有竞争力的嘛!举例来说,一个赤身裸体的求职者想在这些典型的行业软件领域里从事测试工作,掌握测试基本原理及方法论只是穿上了“内衣”而已;要出去见人,还要把穿上“行业知识”这层外套;现实就是这么残酷,这世道不包装怎么过活!而如果想光明正大的穿梭于熙来攘往的人潮而不摔倒或拒进某餐厅吃饭,就要掌握如下的一些绝技了!!!

        接着是外语能力,我想是行业所趋。谁都知道计算机这种高科技的东西是西方人先搞起来的,就算咱在国内的本土公司做测试工作,也不得不学习一些新技术新理念。围绕着软件工程行业的不断革新,咱做测试的自然也要与时俱进去吸收新的营养;那么看英文资料就不可避免了!如果您已经在外企工作,自然要掌握足够的听说读写能力来应付项目进度的安排,需求的变更和测试文档的编写了。

        接下来是大家常谈的自动化测试、性能测试等技能。我在本系列文章的第一曲中做过详细说明。想在技术路线有所突破的朋友,或许可从这几个技能类型去设计自己的未来蓝图。

        记得2006年写此文的时候,我就预计未来会有专职的自动化测试与性能测试工种出现在软件测试行业里。而今天,很多外企、国企也验证了此设想。随着行业的细分,每个工程师都有必要掌握这2种技能或之一,以面对未来软件测试行业发展所带来人才需求变化。不然,可能真的是想跳槽都不敢跳喽!

        然后是软件开发编程的技能。按照软件质量模型,一个软件具有六大特性、二十七个子特性需要测试;但这是学术层面,而根据现实中软件企业对软件质量的要求,无非三大类:功能、性能、安全性;所以软件测试也分成功能测试、性能测试、安全性测试三大类。按照对该三类软件测试类型的实现手段来说,功能测试主要分白盒测试和黑盒测试;性能测试和安全性测试虽也有白盒要求,但主要还是黑盒的系统层面,然后根据测试出来的性能问题或安全问题去通过技术手段解决。因此,无论是黑盒功能性自动化测试,还是纯粹的白盒功能测试,还是性能测试、安全性测试,都需要一定的编程能力。很多人凭兴趣学习了一些工具后突然发现难以进一步提高自己或在企业实际应用,多数情况就是因为作为测试人员,开发编程能力欠缺!不了解被测试系统的开发技术,不能写程序或脚本去使用各种用例设计方法去实现测试,你的竞争力何在呢?

        再次是数据库、中间件及计算机底层平台知识,包括操作系统、网络、拓扑设计等。如今的行业软件大抵上都是WEB系统或与CS架构结合的双模式,但是作为悬浮于计算机系统的应用软件来说,基本上都是要靠上述这些基础架构来实现的。那么要对其进行充分的测试,不懂这些技术怎么行呢?当然根据不同的职位需求,掌握的深入也不尽相同。对于常规的功能测试,掌握数据库基本操作、中间件基本安装配置也够了,例如可以通过独立搭建被测试系统的测试环境来验证自己的这方面技能,然后根据需要深入学习下去。而对于专业的性能测试和安全性测试人员来说,这些知识要尽量深入学习和挖掘下去;即使今天你感觉自己在这方面的技能还好,那么未来的软件系统的设计模式进化,也会驱使你继续下去,例如云计算、WEB3.0等。

        最后是一些辅助工具的使用经验,如需求管理工具、测试管理工具、缺陷管理工具、配置管理工具等。这些东西是我们做测试工作的日常平台,使用上说来简单,但是我觉得通过学习这些工具的设计思想来提高自身对软件测试过程及整体软件开发流程的改进相当有用,尤其那些使用广泛、成熟的商业工具。

    【软件测试工程师非智力素质】

        大家都知道,成功人士的成功秘诀是30%的智力因素加上70%的非智力因素。上边说了作为软件测试工程师的基本技能,这里来谈谈那些情商素质。人类文明的发展到到今,以追求经济增长为唯一目的的国家崛起或企业发展,都是建立在对地球资源的无情攫取基础上的;尤其这20年,计算机行业的竞争异常激烈,激烈到每个从业者稍不留神就可能丢掉饭碗!也许你说这太夸张,但是由于软件测试行业在中国仅有十余年历史,最老资格的测试人员也无非30多岁,所以行业的起步晚使我们多数人还没意识到未来这行也会象其它传统行业一样撕破脸皮的去争去夺一个就业机会!相信关注时事的人从近年的国际金融危机和中国大学生就业难、公务员考试等社会问题中,或可知晓,软件测试行业对从业者的要求也是愈加苛刻;而若干年后,我们这批没有竞争力的测试工程师们或被迫改行或被迫转岗的日子必将如期到来!这样合理吗?我也觉得不合理!但是地球人口的持续增长而又没有战争、饥荒等手段来缓解人类的贪婪、享受等欲望,那么自然会出现劳动力过剩、行业竞争大进而生存压力大、贫富差距大等现象!看看美国、日本天天用各种卑鄙伎俩来搞中国就可想而知,政治的背后就是他们对利益攫取的驱使!当然中国也好不到哪里去,富者怕失去富裕,穷者怕变得更穷;所以要竞争!机会就这么多,能源就那么多,当然谁先得谁占上风,瞧瞧南海问题就是中国下手晚了吧!

        不说这些信口开河的话了,我要说明的意思就是“行业竞争是天然,优胜劣汰是天道”!想想我们自己搞IT的,多少人天天加班装勤奋,多少人放低自尊、泯灭个性的去讨好老板,多少人面对再不公平、再不正义也忍者神龟的样子,就能了解大家过的多苦!还不是为了不失业,还不是为了买个房子,还不是为了老婆孩子过的好点,还不是为了对得起儿时那些梦幻般的宏伟人生构想...

        但是事物永远是辩证的!残酷的竞争推动了人类文明的发展,企业的剥削推动了国家GDP的加速,个人的艰辛换来性情的成熟、思想的解放和拼搏进取的不死意志!既然改变不了天道,那就只好适应天道了!对于如果成为优秀测试工程师的非智力因素,我不想再说“思维细腻、眼光敏锐”、“责任心强”、“善于团队合作”等这些基本原则,既然是“基本”原则,自然应该必备。这里我要说的是:

    • 积极的态度    

        积极的态度,是相对消极来说,是面对软件测试日常工作中一些不合理、不正规、不可行等种种困难的一种心态!众所周知,象制造、电信、通信、物流、保险、金融、ERP这种行业软件公司里,除了微软、IBM、EMC等这种顶级巨头企业外,多数公司都面临着很多共性的问题,例如需求不完备,需求变更频繁,项目进度紧、任务量大,人员配备不足,责任不明确等等,尤其那些ON-LINE为客户服务性质的软件供应商企业。那么,作为测试工程师来说,是不是因为这些就抱怨呢?因为上游环节没做好就不开展下游的测试工作呢?是要消极怠工吗?是要推卸责任吗?这些当然不可取!一个成熟的测试工程师,应该拿出积极的、乐观的、正面的心态勇于面对困难、克服困难、提出困难、解决困难!因为你的一言一行都被项目组同事看在眼里听在心里,尤其你的上司也会因此怀疑是你的能力欠缺吗,是找借口吗,还是在挑战领导层的决策和能力呢?也许说者无心,但是长期下去,你会给大家一个爱抱怨、眼高手低的印象,这就怪不得绩效考核的时候评分低了哦!也许你会反驳说,这样脆弱的领导和同事,我还不喜欢和他们共事呢!玩笑开大了,哥们!我说过很少有软件公司按照正规的CMM或V模型做软件的,不要被那些学院派的理论洗脑洗糊涂了!换句话说,如果一个企业真的做到环环相合、尽善尽美,那还要专业的测试团队干嘛呢?殊不知,纯理论上讲,在足够充裕的时间内,一个软件需求、设计、开发做的完美,是可以不需要测试的或不需要专职测试的!所以,也许我们做测试的价值恰恰在于此。那么究竟该如何做到积极的态度呢?我也不是人生哲学的导师,只是根据我的个人经验:在遇到种种问题时,于情于理的,不带任何主观感情色彩的,以摆事实讲道理的方式和团队说出这些困难,如果能提出改进或解决意见自然最好。好的团队、好的领导也该鼓励这样的方式,营造这样的氛围,给员工一个合理的通道来宣泄或释放这些困难产出的心理压力和对企业信心的重构建!记住,说出你的困难,由整个团队为你做后盾;但切忌不要开会不说、背后乱说哦;那样就是大嘴巴乌鸦、人见人烦的小人啦!这里还有另外一个误区,就是有些人性格较内向,确实从不抱怨,却是任劳任怨。这也不好,在人与人如此微妙的社会关系中,做软柿子自然挨捏、被欺负,也许逐渐大家都习惯于把事情分配给你而坐享其成了!等有好处的时候,别人也未必想着你呢!所以,成熟的测试工程师是外柔内刚,既有真才实学,又谦虚朴素,既能但当大任独挡一面,又会让团队成员都知道他的才智和高风亮节!如果不信,可以想想自己公司里那些混的好并且一直好的人,大抵如此!早年我做培训的时候,常引用我们老板一句话:态度决定习惯,习惯决定性格,性格决定命运!没有比这更浅显的道理,也没有比这更精辟的人生哲学了!如果你今天看了俺老爷们这番话,还不热血沸腾的思考一下自己曾经的表现,那么你就是拿自己的前途当儿戏,拿自己的青春开玩笑,拿自己的人生当赌注!这个游戏太荒唐,这个玩笑太幼稚,这个赌注太巨大,你输不起,我们谁都输不起!就算待到3000年转世成个天才,成个傲视一切的绝对强者,但是此生——你是这个世界最最平凡的人,平凡的可以被任何人忽视,因为你自己都对自己不负责任,谁还能对你有所义务呢?

    • 主动的意识

        主动的意识,是相对被动来说。在企业管理里,多数工程师的工作是由上级按照项目进度、任务范围被动分配的。因此,做好这些本职工作,及时、高效、保质的提交任务成果是最基本的职业能力。这里我不想探讨你的上司是否合理的分配工作,因为这是他的能力素质问题;我还是想侧重工程师的角度,作为我们测试工程师,如果大家都只是被动的接受工作、被动的执行工作,那么如何区分你是否优秀呢?所以我认为要在工作中拿出主动的意识,包括这样几点:

    1. 主动的汇报。这是作为工程师被动接受工作后,及时、快捷汇报工作进展和成果的良好习惯!大家都是成年人,多数领导者并不喜欢家长式的询问、跟踪甚至盯着每个人的进度,时间上也不允许这样做;而我们工程师也不喜欢被询问、被盯着的感觉。而一旦有执行环节中的问题没有被及时暴露出来,就不只是工程师的责任了,可能涉众就广了!所以很多企业采用日报、周报的方式跟踪工作进度,是很自然的手段。我想额外提一点,作为员工尤其新员工,向上司主动做月度、季度汇报,是个非常好的习惯;本人刚毕业那会儿就是这么干的,可参见叶赫华早期博文。
    2. 主动的总结。多数的公司都有项目组例会,而我们多数的年轻人并不喜欢主动发表个人意见,甚至有人采用“事不关己 高高挂起”的消极态度或者干脆抵制、抱怨这种会议形式(也许是中国人都比较含蓄吧,我共事过的外国同事还是蛮积极的参加各种会议的)。我觉得应该调整这种心态,如果因为开会时候没什么可说的,那就是因为平日没有做工作总结。作为工程师把工作中出现的问题,经过个人的独立思考而记录下来,并在项目会议中大胆、明确的说出来并且能提出改进建议,这是优秀员工的必然通道;而作为测试工程师,我们更应该拿出细腻的感情、强烈的责任心去总结软件质量、开发过程、工作模式等等方面问题,然后在合适的场合表达出来,我想每个正常的软件公司都喜欢这样的员工吧!
    3. 主动的沟通。除了项目会议这种常规的场合外,作为好的工程师,我们可以找机会主动和上司和领导层交流个人想法和改进建议。毕竟项目会议是人多嘴杂,探讨的问题还是有针对性的、是当前面临的;而私下和领导层交流心得,一方面有增进感情的因素(这很必要,尤其大企业,一个部门几十人,我们终日被小主管带着,部门领导甚至跨部门领导很难熟悉或认识你);一方面只要你讲的是为工作本身负责,并且经过深思熟虑,哪个称职的领导者都会非常欢迎这样的做法、喜欢这样的员工的;而最重要的一方面,通过这样的机会,你也许说出了领导者长期想到而未决或者干脆未想到的细节,也许趁此机会你可以堪当大任了;就算不立即升职加薪,你的这种行为和素质已经大大增加明年绩效考核的砝码了。说的再直白一点,历史上不管是奸臣还是忠臣,只要受到皇帝重用的人,且不谈其人品、权谋,有一点很重要,就是臣子替君王分忧了;从当代管理学来说也一样,如果你要升职,就要在目前职位想到或者做到上一级所该想、所该做,如此升职不远矣!看看那些商道节目、书籍,学学成功人士的经验,就想想“如何敲开领导办公室的门”吧,朋友!
    • 勤奋的学习

        其实这一点是其它三点的基础。我们多数的测试工程师能够通过面试进入所在企业,说明已经具备当前职位的技能必需;但是我们的话题一直围绕做优秀的测试工程师,那么如果自己没有充分的真才实学,上述的积极态度、主动沟通包括下边的充分分享,就没有底气了。试想,一个团队里每个人能力都差不多,谁也没有起到带头作用,谁也没有突出特长,没有出类拔萃,大家都吃大锅饭,这样的团队自然没有战斗力,士气自然不足,提升的空间也小的可怜!而作为领导者,也没有信心去跟大领导申请更具挑战的工作,如此大家都是和尚撞钟式的工作了,长年累月,人员流动、消极怠工在所难免!领导者要改变这样的局面,可以通过分享、激励的方式;而作为工程师,我们要勤奋的学习、踏实的积累,才能在机会来临的时候不至于恨苍天、妒人意!

        那么究竟学习什么呢?就是我前面【软件测试知识体系】里说的呀,哥们!哪里有短板,就学哪里,在通用行业软件领域里,掌握全部这些知识体系就已经是高手高高手了,再也不用怕失业了,也不用怕没竞争力了;当然,想发挥它们需要个好的舞台,那就是人生际遇问题了,看是否你能遇到个伯乐了,跟个好领导、好团队也很重要,有个导师式、朋友式的上司,一方面工作开心些,另一方面在职业提升上少走弯路;命矣!天意!

        学习技巧,我不想多谈。提几个原则吧!

    1. 软件测试行业要求知识面广,所以要多读书、看资料
    2. 当你选择了某个具体职业路线后,再深入的学习下去
    3. 常写博客总结自己是个好习惯
    4. 多和业内高手交流,再结成朋友,对求职也有利
    5. 多去www.51testing.com 和 www.qaforums.com    
  • 分享的精神

        前边我讲过,要做一个优秀的工程师,不仅个人具有真才实学,还要有个好人品,偷笑 ,所谓“德才兼备才是王者”!“任我行”任老前辈说过“有人就有仇恨,有仇恨就有江湖,人就是江湖!你怎么逃避?”应该说,IT由于行业的特征决定了从业者们都是精英或伪精英们,起码大家都是受过高等教育的人,也就是说都是聪明人!一堆的聪明人在一起呢,就会搞事;再加上IT行业的竞争激烈造就了整个行业誓要你死我活,否则就要丢单、关门、倒闭,所以整个行业文化决定了内部的员工们也要拼,也要抢!再加上IT公司多数规模不大,多数人不可能进入IBM、Microsoft、Oracle这种大公司而受雇于本土或外资中小软件公司里。试想,庙就这么小,人人想当大佛!咋办?又不能战争,又不能犯罪,又得争到自己的利益,于是乎明争暗斗、唇枪舌剑、流言掣肘、暗箭明枪就满天飞了,就像古代后宫争宠、皇子争位的故事一样丑陋,也像天下大乱、三国争雄的故事一样波澜壮阔!有人斗的头破血流、黯然离去,有人卧薪尝胆、期待东山再起,有人忍辱负重、不惜自贬身价作践自己、甚至把灵魂出卖给魔鬼......还有人,装作不谙世事,处处低调,想在“众神”中压低自己,不陷入派系之争,尽力在时间的洪流中做个尘埃,可惜最后也难于自保、落难草寇!唉,想起来就郁闷,不过写起来很兴奋! 大笑 

        其实,现实工作中不会有我写的这么夸张。但这是人性的问题,人性的二个特征就是贪婪和争斗!只是每个企业文化的熏陶问题,争斗的多少问题!虽然软件测试这种技术工种可以一定程度上逃避这些群魔乱舞的局面,但是要在保持自我个性的同时又要免于牵连到某个阵营并赢得多数同事、上司的好感,也就是最初说的“德才兼备”就不容易了。作为优秀的测试工程师,做到开放的分享很有必要。技术活动其实并没有什么大不了,只是别人掌握的快慢问题,因为大家的智力都差不多,如果对自己的技能、技巧持保守、封闭的态度就不可取了。把自己的所学、所问、所思、所辨、所行分享给别人,一方面加深自己的理解,也锻炼了自己的表达能力;另一方面让别人获得学习的捷径;再者对团队的战斗力也有所贡献!久而久之,你在团队、公司里的正面形象就树立起来了;每个人知道你是个有本事也乐于分享的人!殊知,树立一个好形象很难,但破坏一个好形象太易了,要改变一个人在企业里的形象并得到认可,难上加难!

        而分享的概念,从做人的角度来说,有其更大的含义。我前边说了那么多企业、群体的争斗,既然我们不能以消极避世的思想去规避这些,因为哪个公司都多少有些勾心斗角的龌龊人和不平事;唯一让自己可以相对“超凡脱俗”的办法,就是和大家都保持合作、分享的态度,但是不丧失原则性和自尊自爱。古语有云“君子和而不群”,说的就是这个道理。从政治角度看,中国政府提出的“求同存异、和平共处、永不结盟、永不称霸”的外交理念是一脉相承的!!中国人讲究以和为贵、天人合一,所有这些以尊重事实、与自然和谐相处的原则,才是做人、立身、处世之道。

       最后,我愿和软件测试同仁们一起,从自我开始,保持一颗开放、坦诚、细腻的胸襟,融入团队中,时刻提醒自己注重细节,从自我学习,向他人学习,工作中让自己起到示范作用,为整体团队士气的营造、团队风气的构建贡献价值。实话说,每个人能力都差不多,能力偏差不大,成功、优秀都是相对的、并带有主动意识形态的概念,起决定作用的往往就是这些非智力因素。做到这些一点都不难,这个世界,没有人比自己更了解自己的不足,但是没有人可以估计出自己的潜在能量,只要你有毅力,有魄力,就能做一个积极向上、充满激情、活力四射的年轻人!正如诗曰:
          天下风云出我辈,
          一入江湖岁月摧。
          皇图霸业谈笑间,
          不胜人生一场醉!

       作者:叶赫华  2010年10月   上海

  • HTTP中GET与POST方法的区别

    smile665 发布于 2010-10-20 21:29:20

    看这个之前,可以先大致看一下我以前的一篇总结(HTTP请求模型和头信息):
    http://www.51testing.com/index.php?uid-225738-action-viewspace-itemid-216200

    做Web测试相关工作,了解一下HTTP协议规定的8中请求方式中最常用的GET和POST是很有必要的,现简单总结一下吧,也当是自己做个笔记。

    1.HTTP协议的格式:为了理解两者在传输过程中的不同,我们先看一下HTTP协议的格式:  HTTP请求:
    <request line>
    <headers>
    <blank line>
    [<request-body>]
    在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之 后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
    GET与POST方法实例:
    GET /books/?sex=man&name=Professional HTTP/1.1
    Host: www.wrox.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
    Gecko/20050225 Firefox/1.0.1
    Connection: Keep-Alive

    POST / HTTP/1.1
    Host: www.wrox.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
    Gecko/20050225 Firefox/1.0.1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 40
    Connection: Keep-Alive
         (----此处空一行----)
    name=Professional%20Ajax&publisher=Wiley

    2.GET与POST的区别:

        HTTP定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST.
        HTTP-GET和 HTTP-POST是使用HTTP的标准协议动词,用于编码和传送变量名/变量值对参数,并且使用相关的请求语义。每个HTTP-GET和HTTP- POST都由一系列HTTP请求头组成,这些请求头定义了客户端从服务器请求了什么,而响应则是由一系列HTTP应答头和应答数据组成,如果请求成功则返回应答。
      HTTP-GET以使用MIME类型application/x-www-form-urlencoded的urlencoded文本的格式传递参数。Urlencoding是一种字符编码,保证被传送的参数由遵循规范的文本组成,例如一个空格的编码是"%20"。附加参数还能被认为是一个查询字符串。(GET提交,请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,多个参数用&连接;例 如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。)
      与HTTP-GET类似,HTTP-POST参数也是被URL编码的。然而,变量名/变量值不作为URL的一部分被传送,而是放在实际的HTTP请求消息内部被传送。
    (1)get是从服务器上获取数据,post是向服务器传送数据。
    (2)在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交
    (3)对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
    (4)GET方式提交的数据长度受浏览器URL长度的限制,而POST则没有此限制。(特定浏览器和服务器对URL长度有限制,例如IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。)
    (5)安全性问题。正如在(2)中提到,使用 Get 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 get;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。

    关于浏览器URL长度的限制,这里我再说明一下:见HTTP的RFC2068文档。
    HTTP协议本身未指定任何对URL长度要求。它只是建议不要超过255个字符。(Servers should be cautious about depending on URI lengths above 255 bytes, because some older client or proxy implementations may not properly support these lengths. The spec for URL length does not dictate a minimum or maximum URL length, but implementation varies by browser.)

    更多相关知识,请参考:
    http://stone-1231.javaeye.com/blog/539191
    http://www.cnblogs.com/wxf0701/archive/2008/08/17/1269798.html
    http://blog.chinaunix.net/u1/55764/showart_2082293.html
  • 转:性能测试的3+1原则

    andyfly_001 发布于 2010-10-21 00:02:33

    性能测试中有很多的总结,其中大部分是性能测试工具的使用,对于测试设计总结偏少,且这些总结和具体行业关系较为紧密,导致跨行业测试人员比较难于理解。笔者根据多年测试经验,整理出对性能测试设计、测试执行以及数据分析的3+1原则(3+1原则是指量、全、深+快)。笔者认为只要在测试过程中紧紧把握住3+1原则,就具体了做好性能测试的基础。对于性能测试新手而言把握住这些原可以快速入门,性能测试老手则可以作为参考,对性能测试更深入的理解。

    关键词:性能测试 测试分析 测试设计 测试用例 测试报告

      一、性能测试中“量”原则

      测试设计是测试工作的重点,在性能测试设计中通常要考虑很多的因素,如果测试设计遗漏往往会导致重测。笔者根据多年测试经验总结出一个核心,就是“量”。性能测试和功能测试的最基本区别也就是性能测试有一定规模的“量”,比如系统有一定数量的用户,有一定的负荷。

      在测试设计中,对“量”的分析上,可以从系统范围和局部范围两个维度进行思考。系统范围是指将整个产品作为被测对象,主要根据产品实际的使用环境来分析涉及的“量”,然后在测试环境中进行模拟,可以模拟实际环境相同中的“量”,也可以根据测试目的按照一定的算法扩大“量”。局部范围是指以产品中某一个局部模块或者功能等为范围,主要靠测试人员的分析得到,根据系统外部输入的量,分析出被测局部范围有哪些“量”,然后再针对此局部范围有针对性的进行测试,这种方法可以弥补系统范围的不足,但需要对系统有较深入的了解。

      针对不同的被测对象,涉及到“量”的测试点也不相同,下面根据笔者工作经验和相关文档整理而成,读者可以根据实际情况进一步扩展或细化,这些是性能测试的基础,建议联合有经验的测试人员和开发人员做一次全面的梳理,并形成文档在后续测试工作中使用和检查。

      业务量:一个系统往往可以处理多种业务类型,这里的量就是指系统支持的业务类型数量。在产品实际使用时这些业务是并发的,所以在测试过程中也要同时进行模拟。相对于其他类型的“量”而言,业务类型量是比较少的,但可以说是最关键的。比如在交换机系统中可以提供语音电话、短消息等业务,这些业务是可以并发的,因此测试时就需要同时模拟这两种业务。

      负荷量:这里的量是指系统处理的流量,系统能够提供多种业务或者功能,且可以并发,在实际的使用环境中不同业务的用户数不同,因此其对系统产生的负荷也不一样。在测试时,对于系统范围的测试通常是由外部用户的行为决定的,数据来自于现场收集或根据现状进行的趋势分析。比如登陆网站的用户中,同时进行软件下载的用户有500个,同时进行网页浏览的用户有1000个。对于局部范围的测试,通常是将外部的负荷转化为对应的局部负荷,然后通过工具进行模拟得到。比如直接通过测试桩的方式进行测试,而不需要模拟外部用户的行为。

      ……………………

      查看全文请点击下载:http://www.51testing.com/html/07/n-221707.html

      三、性能测试中“深”原则

      这里的“深”包括两个维度,一是对系统的了解要“深”,二是对缺陷的分析要“深”。

      性能测试通常都是黑盒测试,如果是大的系统,大的公司,分工更细,性能测试人员对系统的理解就更加肤浅。《软件测试经验与教训》中有个观点“黑盒测试并不是基于无知的测试””,笔者在多年测试中深有体会。要想做好性能测试,首先要深入理解系统的架构,系统的机制,其次是根据系统的实际情况,可以有针对性相关产品的知识,因为通常一个系统的组成部分都不会是某个公司自己开发的,都是使用了其他公司的一些产品,这样对这些产品知识的了解也比较重要。

      通常性能测试中发现的缺陷都是系统中深层次的问题,这些问题对于开发人员来说,定位比较困难,有些缺陷甚至很难重现。因此测试人员要对测试过程进行仔细观察以及对测试结果数据进行初步分析。这里的分析要有一定的深度,当然不是深入到发现缺陷的跟因,但分析结果能够引导开发人员进行问题的定位。笔者多年的经验中感觉到通常开发人员也搞不清楚哪个地方出了问题,在判断大的方向上测试更占优势。

      ……

  • 如何学习自动化测试

    海刀豆 发布于 2010-10-13 14:45:28

      从事了几年测试工作,也着实见证了测试的发展,如今测试行业对从业者的要求是越来越高,不再仅仅局限于要求会写测试用例、会细致的执行测试、能有效的发现系统缺陷等;越来越多的企业对应聘者本身的技能要求也越来越高,招聘信息中诸如“精通VBscrīpt、Perl/Rbuy等至少一门脚本语言”、“至少熟悉一门开发语言”、“精通QTP、LR等自动化测试工具”、“有大型项目自动化实施成功经验”此类的字眼也逐渐增多。目前看来,除白盒测试内容和测试管理外,主流的方向有两个:功能自动化测试和性能测试。这就要求从业人员能够在短时间内快速的掌握这些知识,才能获取到更好的工作机会。本人是名功能自动化测试的工程师,以自己学习、工作的过程结合QTP讲讲该如何学习自动化测试。

      首先,想从事自动化测试,必须先了解What/Why/How,也就是常说的去了解什么是自动化测试、为什么要进行自动化测试、该如何进行自动化测试,这类的资料在网上有很多,这里就不做重复了;

      其次,需要根据项目的特点,选择合适的自动化测试工具,并了解工具的特性。以QTP为例,该如何去掌握它呢?对于初学者,大多数都是通过录制的方式来生成脚本,这个阶段应该掌握的基础知识有:

      1)     QTP是如何去识别对象的,对于新手经常会出现录制的脚本回放的时候报错的现象,这个时候就应该考虑为什么呢?如果很了解QTP识别对象的原理啊,我想就能很快定位到原因了

      2)     去掌握一些QTP对象的方法,如GetROPreperty、GetTOPreperty、ChildObjects等等,对于相似的方法应该去搞清楚到底区别在哪?像GetROPreperty、GetTOPreperty有什么区别等

      3)     什么是Action参数、什么又是Test参数?两者有什么区别,又有什么联系,在同一Test和不同Test间这些参数如何工作

      4)     什么是环境变量?环境变量是如何建立和使用的,环境变量在参数传递中和action参数、test参数有什么不同

      5)     了解检查点的知识,明白什么是内置检查点,什么又是自定义检查点。并搞清楚在什么时候该如何使用检查点

      6)     掌握对象库的操作,了解对象库对于测试的意义,象是否启用智能识别对测试脚本有何影响、为什么同一对象识别起来会有_1、_2之类的后缀等都是需要去研究清楚的问题

      这几个问题都搞清楚的话,那基本就能够利用QTP生成正确的脚本了,当然以上只是部分必须掌握的内容,其实还是很多细节的设置,就需要在实际运用中去掌握了。

      接下来,就可以进一步提升自己的QTP运用水平了,这个阶段就需要去学习vbs知识和如何运用描述性编程实现脚本了,同时在这个过程中还需要去学习html知识、DOM、XML、以及像excel、word等的API知识了,总的来说,这个阶段应该掌握的内容大体上包括:

      1)     VBscrīpt的基础知识,熟悉常用的方法和函数,掌握文件对象的操作等

      2)     熟练掌握XML技术;excel、word等API对象,可以根据需要创建日志

      3)     熟练掌握DOM和HTML知识,能够结合这些技术对Web页面进行解析

      4)     掌握数据库的基本操作语句,能够利用ADO对象进行数据操纵

      5)     熟练掌握正则表达式,很多时候处理对象问题相当方便

      6)     掌握如何调用dll进行工作

      7)     能够利用QTP的自动化对象模型创建出需要的运行模式

      8)     掌握WMI知识

      以上只是我考虑到的部分,并不全面,呵呵,供大家参考,当然这些技术主要是针对Web系统运行,因为我们的系统就是B/S的,呵呵。如果这些知识都能够扎实的掌握的话,个人认为,基本上能够处理自动化过程中的绝大多数问题了,这个时候你对自动化测试的技术应该是有一定积累了。

      接下来就需要考虑自动化测试框架问题了。当脚本规模到了一定的程度,就会面临一些问题,如:

      1)     如何有效的管理并调度脚本

      2)     如何实现脚本运行的无人值守,测试过程中能够自动进行错误处理并进行日志记录

      3)     如何生成简介明确的测试报告

      4)     如何能够更加高效的维护测试脚本

      5)     实现框架代码和业务代码的分层、业务脚本和业务数据的分离

      这个阶段主要体现的是测试人员的测试思想,是可以脱离工具独立存在的过程。当然各个公司项目的实际情况不同,导致设计出来的思想不同,但总体上来说一般包括数据驱动和关键字驱动两种模式。后者实现的技术难度大于前者,大多数公司目前都采用的数据驱动模式。这个阶段不应局限于技术运用上,而需要从测试全局考虑,进行分层设计、模块化实现,减少代码之间的耦合。

      如果以上三个方面都能够做的很好的话,那么恭喜你,你已经可以独立负责项目的自动化测试建立工作了,呵呵!

      总之,学习自动化测试需要在实际项目中进行,这样提高的会比较快,项目中运用了很多种技术,自动化实施过程会碰见各种各样的问题,是很好的学习机会,关键要善于总结、积累经验,只要能够把各个细节做好,那么你一定能够成为一名优秀的自动化测试工程师。

     

    版权声明:本文出自zte_boy的51Testing软件测试博客:http://www.51testing.com/?161787

    原创作品,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明,否则将追究法律责任。

  • 高级白领具备三项基本素质(转)

    Apple.Liu 发布于 2008-11-23 14:33:20

       高级白领们常常碰到的一些问题,专家们认为他们需具备三项基本素质,才可使自己立于不败之地。
     
      不断学习是高级白领发展的动力
     
      经济的全球化模式已对中国产生巨大的影响,高级白领们不但行使自己岗位职责时要驾轻就熟,对本行业的动态发展乃至整个世界的经济政治形势都应有清晰的认识和相对准确的预期,以保证自己作出正确的决策。学习是根本,工作的本身就是学习,是自然地从实践中学,被动地学,会形成一些只属于自己的经验积累。但他们更要主动地学,挤出时间,利用机会去学习,英语水平不够好的去参加培训,进入新的领域向学校的教授请教,是必要的。在国际化的时代,面对国际化的人才的竞争,首先自己要国际化。
     
      国际化的人才体现在具备国际化的视野以及国际化的管理风格上,有着与三个或更多的国外客户进行项目合作,以及在至少两个国家的城市与不同的人员进行过合作,这样的人可以算是有着“国际化”的背景。这是严格意义上的,不是所有的高级白领都特别幸运,不断学习可弥补机会之不足。
     
      表现力是高级白领发展的保证
     
      在当今这个开放的时代里,即使是一个很有成就的人,也不要指望被别人发现或者认识,你得让公司知道你做了些什么,知道你还可以做些什么,让人们知道你是谁。低调是少数成功者和大多数失败者的做事方式。不善于表现,沉默寡言,与公司的主流群体无法和谐相处,高级白领必败无疑。提高演讲能力是高级白领走上更高层次的保证。在公开的场合进行演讲去感染观众,用最准确的语言最有效地去表达自己的意图,在关键时刻挺身而出,从而使自己脱颖而出。
     
      应变力是高级白领取得发展的不可或缺的又一素质
     
      这是个变化的年代,大的形势在变,公司在变,人员在变,自己要适应变化。跟客户首次打交道需察言观色、随机应变;向老板汇报时发现对自己不利要应景变化;工作没成效赶紧总结教训变换方法。在一个公司呆的时间太长感觉快走到尽头时,更要变换思路,是继续这样下去还是另劈他径,是替人打工还是自己创业?缺少应变,以不变应万变,很容易出问题。
  • 提升从搭建测试环境开始

    太极人生 发布于 2008-11-23 14:00:36

    前些日子看电视时看到一条新闻:上海福利彩票因为更新系统,导致上海福利彩票的销售终端在将近3天的时间内,无法进行销售。作为一名测试,我的第一反应是,这套系统在更新前后是否做过更新前后的数据,系统等等的兼容性测试?也就是在看到这条消息没多久之后,我们部门也在提交版本时发生了意外,幸运的是这个版本在最后部署到生产环境中去的过程中,更新人员发现了问题,及时得到了修正(我要说明的一点是,版本的测试已经在测试环境中通过,问题出在了数据库的更新脚本上)。这件事发生后,我一直在思考问题到底出在什么地方?

    我想讨论的是“提升从搭建测试环境开始”,可能很多人很疑惑,这个题目似乎和我开头说的有点搭不上边,而我却不是这么看待的。我问过相关人员,你是怎么看待“搭建测试环境”这个事情的,你觉得你能从中学到什么?你觉得这个对你后面的工作有帮助吗?你觉得测试环境的更新除了替换版本外还应该考虑什么问题?很多人都会这么回答,我觉得能学到很多东西,但具体说不上来,对后面的工作有帮助,但具体有哪些帮助同样说不上来,测试环境的更新,除了保证更新成功外,似乎没有什么需要再考虑的了。

    一个负责搭建测试环境的人的意识,如果不得到更进一步的提高,我想,生产环境中发生任何事情就变得不奇怪了(这里不探讨系统设计本身的问题)。

    从搭建测试环境,我们到底能提升什么呢?

    第一,             是更进一步的了解我们的待测试项目的系统架构。现在对我们测试人来讲的大环境中,测试介入项目的时间往往是项目即将完成开发进入测试环境的阶段。很多测试在拿到项目的后往往关注的是用例,执行,以及最后的结果,似乎没有更多的时间去考虑其他。对于为什么采用这么一个框架,可能很少关注,往往就是按照要求,把环境部署完毕后,联调成功,就算完成了第一步,然后就急急忙忙的开始我们的后面的工作。在我看来,这个是非常错误的,在部署测试环境的过程中,除了能更进一步的了解各个部分采用的技术外,在这个过程中,应该更多的了解一下,为什么会采用这样的方式。说直白一点就是,采用这样的方式的优势是什么?这么说可能还是有很多人不明白,我再举一个简单一点的例子把,我们现在有些项目会做成C/S的模式,有些项目是采用B/S的模式,为什么采用这样的模式?在比如B/S模式的系统中,有些必须考虑性能测试,有些则不需要,为什么?其实,通过部署的过程,你在了解系统设计的原理,你明白了这些,最后我们的用例必然会得到更多的充实。

    第二,             更新过程中是否会对原有的数据产生破坏?大家必须注意到一点,测试环境和生产环境的最大区别在于,生产环境是一个延续性的行为过程,而测试环境则没有这么一个延续性行为过程,所以,作为测试环境的部署者,在部署环境的过程中要充分考虑到这个因素,什么样的更新版本才是符合要求的。这点我想可能能解决我开头提到的两个案例。

    第三,             在部署中测试环境的复用。这点也非常的关键,资源的合理应用对于任何一个公司来讲都非常的重要,如果这个过程中忽略了这个问题,测试环境可能会变得非常的臃肿,对于维护起来可能会非常的困难。

  • 测试如何有效的摆脱开发的“控制”

    太极人生 发布于 2008-11-10 21:03:56

    开发与测试的关系似乎总是那么的微妙。“强势”的开发,“弱势”的测试,这种状态似乎一直没有转变过,也一直成为测试行业内最想扭转的一个目标。如何有效的摆脱开发的控制?

    在讨论这个问题之前,我们首先来谈谈一个公司的发展。一个公司的起家模式基本都是先有开发,后有测试这么一个过程,总之一句话,就是测试不可能在开发之前成立(专门的测试公司除外)。公司的发展模式决定了开发的优越感,也因为公司发展的初期依赖的是开发,加之公司发展初期为了自身发展,“效率优先”的原则在很大程度上影响了“一代人”(一代人:指公司创业初期的元老,这代人通常都是设计领域或者开发领域的“强人”,这代人里通常不会有测试领域的“强人”),这一代人在公司初期项目中的习惯影响到了后续的项目,进而形成一个非常牢固的“外壳”,要想打破这个“外壳”,所需要花费的时间和精力是很难评估的。这就像我们从小形成的习惯,明知这个习惯相当不好,可是就是改不过来一样的道理。

    公司需求发展,发展需要可靠的质量保证……,这个过程是公司向正规化方向迈进的关键一步,而测试也是在这个过程中诞生的。测试的存在,总是让一些人感觉非常的不舒服,因为开发在观念上会不由的认为测试是在为难开发(这些开发可能不是很成熟),虽然测试也一再强调我们是在协助开发完成项目,而不是为了为难开发。开发与测试是不可分离的,只是在项目中承担各自不同的职责而已。

    公司的发展有一个过程,测试部的发展同样需要过程。测试部发展的初期,需要依赖开发的各种支持,但依赖开发的支持不能代表测试就应该丧失自己的原则。这个过程中,妥协的可能往往是测试,但妥协不代表就丧失了测试的原则。我常常对我们的测试人员说,做到心中有数,在适当的情况下,我们需要妥协,妥协的目的是为了把项目继续下去。

    测试成立的初期,首先介入的是系统测试。这个阶段的测试主要是属于功能性测试,也就是在外人开来“这里点点,那里点点”的这么一个过程。这个过程往往被外界所轻视,但在我的眼里,这是一个测试部自我能力提升,以及完善最为关键的阶段。这个阶段直接影响到后续的发展。这个阶段测试部需要解决3个问题。第一个问题是学会整理“文档”,这个过程非常重要,文档是依据,这个阶段需要的就是不耻下问,进而形成测试的依据。第二个问题是测试环境必须独立于开发,而且必须是测试自己维护自己的测试环境。第三个问题,整理测试部的工作流程。 这个阶段是测试部最困难的阶段,因为这个过程实际在一定程度上触及到了开发的一些底线,这在任何一个人来看,都是所不能容忍的。这里我最想强调的一个就是测试环境由测试部进行维护的原则。这个是作为测试人的一个底线,如果测试连自己的环境都不能维护的话,这在我看来,测试就不能完全保证测试的质量一样的道理,举一个简单例子,测试的环境由别人在维护,作为测试,你能说我真的完成了某个版本的测试吗?如果测试无法把握自己的在测试版本,测试何以保证质量?随着测试能力的提升,集成测试就会成为测试部的发展趋势。这个过程中,测试部会逐步接触性能测试,接口测试等等这方面的测试,这个过程也是测试真正开始摆脱开发控制的一个关键。记得我们有一个项目,先前开发总认为性能上绝对不会存在任何问题,甚至在测试部提交的测试方案中,开发也是非常强硬的用“时间允许的前提下,可以考虑做一下”。这次项目测试的前期开发是主导,后期测试介入了,测试用非常有力的证据证明了开发先前的错误后,测试顺利的拿下了性能测试的权力。

    测试需要逐步摆脱开发的控制,而不是一次成功。测试在自己的翅膀还不是很强硬的时候,需要“伪装”自己,需要低调,在不失原则的过程中逐步壮大自己,在悄无声息中成为基石。这其实何尝不是适合自己的发展呢?

  • 测试人员如何说服他人认可你提交的缺陷是需要修改的?

    毛头 发布于 2008-04-11 23:45:16

    这个问题其实非常不好回答,实际情况往往很复杂……
    就我个人经验写一点感受吧~~当然了,诸如要写清楚现象,尽量详细报告等是QA人员应有素质,这里篇幅原因暂且搁置不谈。

    首先,开发方必须提供完整详细的式样书和制限事项。式样书是测试人员测试的基础,测试人员如果按照式样书测试得到了不一样的或者奇怪的结果,那么必然是bug无疑,没有任何可以争论的余地;如果测试人员执行了式样书上没有写的动作,得到了一个奇怪的结果,那么首先去制限事项里面找,如果制限事项写了,那么意味着开发者知道这个问题并且还在开发中,那么OK暂时放过(注意是暂时),如果制限事项也没写,那么再看这个动作是不是用户可能做出来的动作,举个例子如果一个软件的某个命令完全封装在内部,调用时一定会以普通用户身份执行,那么测试人员使用root测试出来的问题就是无效的(注意,当然封装的命令可能因为封装错误用root执行了,但那是另一个bug);如果测试人员的动作虽然式样书没有,但是却是用户可以做出来的,那么抱歉,这个问题必须修改,而且还要围绕这个被式样书遗漏的问题进行拓展。

    其次,测试开始前由开发方review测试方的测试计划,并针对测试方对式样书的疑问答疑。这一点有两个好处,一个是开发方可以尽早指出哪里测试不合理,哪里测试薄弱,另外也可以减少以后因为双方理解上的差异带来的时间浪费。虽然这会占用一点开发人员的时间,但是磨刀不误砍柴工。

    第三,建立完备的版本管理系统,这个系统如何建立前面的每周一问已经详细讨论过了,目前要补充的就是,版本管理中必须把式样书和制限事项一起加进去,开发者发布了0_0_1版,其中制限事项是文件数目不能超过1M个,0_0_2版开发者取消了这个制限,那么必须在发布作这个版本的同时写明这一点,测试人员才能据此测试。严格的版本管理可以有效减少纠纷,如果测试人员使用0_0_1版测试1M+1个文件失败,那么是无效测试,如果使用的0_0_2版,那么就是bug必须修复,无可争论。

    有了上面三条,大部分问题差不多能解决了,但是还是不行,差在哪里?主要还有两个问题,一个是测试方可能指出一些跟个人喜好相关的地方,比如测试方可能指出GUI一个警告信息窗的字体太暗而且不显眼,不容易被注意到,这类问题无法用上面三条来解决,因为是否容易被看到本身就不好界定;另一个问题就是(尤其是到了测试后期),测试人员连续跑了好几天测试忽然程序死了,再来一次又没事了,告诉开发人员这个现象,开发人员也解决不了,因为很难再现,如果是测试环境问题还好,如果真的是软件缺陷那被用户遇上就很严重,但是这种问题无论是让QA无休止的尝试再现还是让开发者没头没脑的调查都很难说得过去。

    于是我们加上一条
    第四,仲裁机制。QA和开发者并不直接对话去讨论一个问题是否要修改,我们首先对开发者实行残酷的有罪推定,也就是QA报告的问题开发者都必须修改,如果开发者认为无需修改必须给出理由和证据,围绕这个理由是否成立,QA和开发者双方展开讨论,这个讨论必须每一步都使用缺陷管理工具记录下来。最终要改还是不要改由一个仲裁机构来决定,当然了这个仲裁机构其实就是更上层的管理者,他们手里是日程计划,市场需求,对手状况等,他们根据这些更高层信息决定一个问题是否值得去修。

    写到这里细心的读者已经发现,题目问的是怎样去说服,我却大谈测试管理方法。其实我个人觉得,建立一个宏观的良好机制比起一个测试者去唇枪舌剑的和开发人员辩论更加有效,我们追求的是什么,不就是效率么。因此我个人以为真正的测试人员职责就是报告缺陷,至于这个缺陷是否应该被修复先用机制套,套不上再来仲裁,仲裁过程QA leader全程参与,测试人员要做的只是在仲裁过程中客观的回答每一个问到自己的问题,至于什么我认为这个bug必须修之类的话不必出自测试人员之口,正如汽车发动机只需要考虑转呀转,具体哪个路口该拐弯也让发动机来考虑就不必了。

    ==================================================================================

    1,和开发人员达成共识:开发人员的开发工作和测试人员的测试工作的出发点是一致的,都是为了给公司创造利益。达成这个共识后,开发人员就不会对测试人员和测试人员的工作有抵触情绪;再在这个认识的基础之上,和开发人员一起讨论如何修改代码他们的Effort比较小(如果你有一定的开发能力)、何时进行修改(由于各种原因,可能需要稍后进行一起修改)等。

    2,与开发人员建立良好的关系,包括私人关系。如果你的能力强,开发人员可能会把某些工作交给你,让你帮忙做。这时可以积极接受,尽最大肯能帮助它们。我的一个同事曾发现某个Bug是由于没有写对一个业务逻辑比较复杂的SQL语句,于是他自己写了,就把开发人员一直困扰的这个问题解决了。从此以后,开发人员就非常支持我们的工作了。

    3, 系统和软件最终是要交付给客户的。只有他们认可了,同意付款了,开发人员和测试人员的工作才算有意义。因此,我们测试人员一定要站在客户的角度去使用软件,去测试人员。我们要考虑客户会怎么样使用,他们可能会遇到什么问题。这样可以减少许多直到交付给客户后才会发现的问题。从这一点上来说,我们也要让开发人员站在客户的角度去理解为什么这个Bug一定要修改。曾经有许多UI上的错误,开发人员举手之劳就修改了。可是就是不修改,他们认为不需要。我就是让他们先把自己设想为一个客户来使用此系统,然后说服他们去修改的。

    4,如果有条件,建议拿出你的数据和证据去说明为什么一定要修改它。如,进行性能测试后的测试报告数据、经客户确认的需求说明书等。

    总之,既要让开发人员知道你是站在他的立场上考虑问题的,同时又要站在客户的角度来说明为什么需要修改这个缺陷

    =================================================================================

    到大家都说出了自己的办法,我也来说说我测试两年中解决此类问题的方法。
    下面我就列举一下我的办法:
    1.针对开发人员懒惰的心态。
    开发人员在项目测试初期对于发现的BUG,往往是非常积极的态度,但是随着项目的测试的结束时间的到来,开发人员就会形成一种懒惰的心理(测试人员也不例外),这种懒惰的心理就会使得开发人员面对那种不是崩溃或者严重性的错误进行公认或者设置为不解决。面对这种情况,测试人员唯一的办法就是将BUG信息传达给项目经理,并讲述不修改这个BUG对项目有可能造成的影响,这是解决这种类型问题的最有效办法,懒惰的项目经理除外。
    2.针对开发人员对测试人员的个人感情因素
    不知道你们遇到过开发人员对测试人员因为个人感情因素,而故意不对你提的BUG进行修改的问题。有些初级开发人员开发的模块,错误多多,单元测试又做的不足,导致了他所负责的模块的BUG远远超出了其他人的数量。项目经理的指责加上自己能力的限制,面对越来月多的BUG产生厌倦,对提BUG的人员产生厌恶,这种问题其实不好解决。每天必须去开发部10趟以上,而且必须和对你有厌恶感的人侃些工作之外的话,如果他怎么说话,你就和屋内其他人侃,营造幽默气氛,并在开玩笑之余讲述测试的困难,侧面说出你的无奈。如果公司有些什么活动的话,是个很好的机会,记住增加沟通。
    3.针对需求不符类型的BUG
    满足用户的需求是项目质量的分量很重的评价标准,不满足需求用户需求还提什么软件质量。
    开发人员只了解自己负责的部分模块,不懂得整体架构,只知道与其他接口取变量,传变量。
    测试出的需求不符的BUG必须将需求中提到的需求点粘贴给他看,概要设计中提到的设计粘贴给他看,可以截图给他或者以附件的形式上传给他,这叫有理可证。
    4.试运行前三天遇到的问题
    项目测试后期,马上就要拿到线程试运行的时候出现的BUG是最关键的,这个时候遗留的BUG也是项目经理最关注的。如果你想让他们把你提的问题修改,那你就把你的问题设置为严重错误,这个时候即使是一个小小的界面问题,我们都有理由认为它是严重的。
    5.针对不容易重现的问题
    测试过程中不容易重现的问题也是很多的。自己悄悄测试的时候出现了,开发人员一来看,问题就没了,开发人员看不到的问题,他们当然不会改。所以在测试的过程中尽可能的不要忘记3分钟前你所做的一切操作,并且将问题现象截图保留,因为这你是重现BUG和讲述问题的关键。
    6.制定BUG提交规则说明书
    强制性的规定测试人员提交的BUG,通过BUG提交规则说明书规范测试人员BUG。提高BUG的有效率。并根据BUG提交个则说明书制定开发人员
    BUG修改标准,符合标准的必须由开发人员作出处理。
    7.服从领导
    如果项目经理说不改,你就不必费脑筋想办法让他们改了!

  • 测试过程中如何应对频繁的版本变更

    毛头 发布于 2008-04-12 00:04:22

    软件开发过程不规范的项目组中,这种情况是非常常见的。2001年,我接触过的一个公司,它刚刚成立软件测试部,当时的测试部遇到的情况和上面讲的几乎如出一辙,搞得测试员叫苦不迭,开发部的程序员也天天抱怨头疼。

    具体到当前这个项目遇到的情况,从上面的问题分析,我认为主要原因是:开发部提供的测试版本太过随意,导致质量太差。要解决它,我认为有以下几个关键点:

    ×在项目开始时,最好能先开发一个原型出来,原型基本上要确定整体界面的风格、统一的操作习惯等,以后的开发要以原型为基础进行;

    ×开发部使用版本控制工具,比如CVS、VSS等,并且要保证每天定时Check-in和Check-out,避免积累大量代码,同时要强调在Check-out和Check-in的时候要注明缘由,是为了修改某个bug还是增加新功能等;

    ×每日构建(Daily Build):每日构建要形成制度,构建过程最好能自动进行,如果因为是第一次这样做,没有经验,遇到技术问题,在这种情况下,建议由测试部指派一名测试员加入到开发部,协助开发部进行人工构建,每日能集成一个能运行起来的完整的软件系统;

    ×强化冒烟测试(Smoke testing):加入开发部的测试员在构建后,集成了一个完整的软件系统,要及时对每一个build进行验证(Build Verification Test ),也可以称之为“冒烟测试”,对软件的基本功能点进行验证;

    ×强化测试的准入条件:软件测试启动是有条件的,并不是说开发部拿个软件过来,开发部就要测试,比如要启动测试活动,必须要有需求规格说明书、设计书、单元测试报告、冒烟测试报告等,这是前提。满足不了这个前提条件,测试活动不会启动。当然这个制度需要公司管理高层的认可,在项目启动时要和项目经理协调好的;

    ×强化BUG管理:测试组要使用BUG管理工具,例如bugzilla、JiRA等,要保证 bug、版本、以及人员的对应关系,同时分析在不同的版本、不同的时间段、不同的模块中BUG的走势,确定“危险模块”为重点测试对象,预测未来的BUG走势和工作量等。

    ×积极的态度:无论是开发部还是测试部,在这个困难的过程中都要有积极的态度,遇到问题要及时沟通,以最高效的方式解决问题。

    要从根本上根治这种矛盾,需要一套完整的、规范的开发过程。以上的措施只是一部分,只能在最短的时间内缓解矛盾。

    =============================================

    1、通过管理制度约束,要有明确的版本打回的考核制度,把版本打回次数与开发人员的考核指标挂钩,并有一定的惩罚措施,这样才能使开发提高提交版本的质量,从而使提交版本可测试。

    2、通过清晰,明确的流程保证,如提交测试的版本要有一定的测试准入条件,没有达到准入条件的一律打回处理,不能浪费更多的时间测试一个不可测试的版本。针对版本所规划的需求未实现这一问题,可以增加需求验证这一环节,这个环节的验证不会要求很细,但是可以规划的需求已全部实现,或实现的功能与需求规划是一致的,这样提交到测试环节的版本,我们就可以按计划开展比较详细的测试。

    3、通过一些方法和策略保证。把测试分级,一个版本的提交,通过几个级别的测试,然后再确定是否全面投入测试,1级的可以定义为运行BVT或一些预测试,例如正确执行安装,运行等测试用例,这些是最基本的用例,通过后再运行2级用例,定义为一些基本功能和主要流程类的用例,运行通过后再按计划展开全面的测试,避免盲目的投入造成测试资源的浪费和做无用功。前2个级别的测试完全可以通过自动化来实现,这样的话可以夜间进行,既提升了效率,也不会对进度有太大影响。

    总之,我认为制度,流程,方法结合,可以把风险和影响降到最低,但最终的根本还在于整个研发团队的质量意识和团队精神,这两方面都比较强的话,再加以健全的流程和制度,包括这个问题的许多问题都可以迎刃而解了。
    ===============================================
    1、制定合理的版本发布计划,并加强版本控制管理;
    2、版本发布时有开发负责人编写详细的软件变更说明;
    3、开发人员应该加强单元测试和冒烟测试;
    4、测试部跟开发部协商拒绝测试的标准;
    5、公司高层应该将软件版本发布的质量纳入部门绩效考核
  • 如何在有限的时间内编写完整有效的测试用例

    毛头 发布于 2008-04-11 23:58:38

    楼主的问题看来只有一句话,但实际包含了很多方面的问题,不同的人文环境、公司文化、公司资质等因素都会产生不同的结果。
    分析这个问题,我想先从两个方面回答:
    1.如何在有限的时间内完成测试用例
    2.如何编写完整有效的测试用例
    有限的时间顾名思义工时不足。那么凡事都是有果必有因,解决问题就要先找到其原因,并加以解决,问题就会迎刃而解。
    在软件行业中,时间是一个非常重要的概念,时间有限也是经常提到的一个词,归其产生原因不外乎以下几点:
    1.项目经理缺乏项目管理经验,对项目工期估计不准确,导致工时吃紧,时间有限。
    2.项目开发人员(包括测试小组人员)缺乏实际工作经验或者说知识匮乏,相比之下不能在相等的时间内完成自己的任务,导致时间有限。
    3.项目开发周期已经确定,但由于客户的临时需求变更导致的工作量增大,无法继续在规定的时间内完成任务,导致时间有限。
    4.社会关系导致的公司内部人员拉帮结派,出现的争功躲弊的人群在有权利条件的基础上为夺取管理阶层对自己的好感,谎报项目的开发周期,致使承诺的工时远远低于实际工时,导致时间有限。
    5.其他原因(事假、病假、人员变动、突发事件等)而导致的项目人力资源不足,时间有限。
    用CMMI的理念讲以上这些原因就是风险,针对这些风险,就要采用风险识别,风险评估,风险减缓,风险跟踪将问题扼杀在萌芽中。
    第一,根据风险检查表,识别出项目的风险(时间不足)
    第二,估计风险严重性、风险可能性、风险系数(以上列举的5条分别进行评估)
    第三,对于风险系数超过“容许值”的每一个风险,都应采取减缓措施(量化风险的严重性,定义容许值)
    第四,跟踪风险减缓过程,记录风险的状态
    第五,制定风险解决方案
    1.项目经理需提高系统分析能力,增加自身技能水平,提高预测准确度。必要时可以更换。
    2.提高工作人员自身技能水平,评估其工作能力,定期考核,安排适当人群执行适当工作。公司提拔的不算。
    3.严格控制需求变更,制定需求变更管理,需求发生变更要经过会议评审,必要时员工需加班工作。
    4.社会关系复杂,如果想被提拔,升职或加薪那就乖乖的加班工作。
    5.减少工作对单人的依赖,保证每份任务必须由两人或两人以上负责,突发事件另作处理。
    虽然回答没有针对如何在有限时间内编写测试用例,但以上答案完全可以解决这个问题了。
    回答了第一个问题,下面回答第二个问题。说一下怎么样设计完整有效的测试用例
    第一,覆盖率100%,保证完整性
    第二,对测试环境,用户环境,模拟用户环境,及之间的差别进行描述。
    第三,设计场景测试法虚拟业务流程
    第四,建立测试公共数据,并根据系统内部关系组织数据的关联性
    第五,其他人可以看懂你的用例,并且是可以执行的
    第六,如果有标准的用例模板,可以使用用例模板
    现在将这两个问题合二为一,不同的问题可以根据给出的答案互相结合找出解决问题的办法。
    但是根据我的经验,一般编写测试用例的时间都是很充足的,除非是某些项目为了应付监理公司,临时对项目的相关资料进行补充的时候才会出现这种情况。
    ============================================================================

    在测试工作中,“直接拿到软件就测试”的做法曾经很普遍,现今这种情况应该很少了,它只属于那个特定的时期。在回答这个问题之前,我觉得有必要展现这种特殊的情况所处的背景。

    ×它发生在那个软件开发不规范的年代,软件开发还处于原始的状态;

    ×由于不规范,所以不能指望它有完整的开发及测试文档。

    在以上的前提条件下,要在有限的时间内编写有效且完整的测试用例,的确不是一般人可以做到的,对测试人员有特定的要求。

    ×业务专家型:对软件的业务流程、最终客户的主要使用角色及使用功能都非常熟悉

    ×精通黑盒测试用例的编写方法

    有了符合以上要求的测试人员后,需要特别指定本次测试的主要目的。

    ×由于现状的制约,本次测试的主要目的可以定位成:在有限的时间内,站在用户的角度,按照软件最终验收的标准,验证软件的主要功能是否正常;

    ×在此基础之上,思考最终用户最有可能的失误或者异常操作,验证在这些条件下,软件是否能够正确处理。

    在测试目的的指引下,然后再确定测试环境以及测试类型的取舍。如

    ×按照用户最流行的软硬件环境配置,搭建测试环境,配置测试和兼容性测试及其他无关的测试都可以暂时取消;

    ×明确功能测试是重点,压力测试次之。

    走到这一步,测试人员已经明确了测试的主要目的和要进行哪些测试,就可以按照以下原则来设计测试用例了

    ×根据验收测试的标准,针对不同类型的软件,按照等价类划分、因果图、场景法等,设计有效测试用例;建议在设计测试数据时,如果有条件,可以多参考最终用户以前的历史数据,把有效的业务流程、有效的场景100%覆盖;

    ×上面的完成后,再最大可能的增加一些异常的测试用例,努力覆盖到用户最可能失误的操作或者异常的操作数据或者流程。

    基于以上的原则,可以在有限的时间内,编写出“相对”完整且有效的测试用例,而不是“绝对”的

    ==============================================================

    这个话题要拆分开来分析。
    一、编写完整的测试用例
    二、有效的测试用例
    三、在有限的时间内
    第一、个人认为,没有一个测试人员可以做到百分之百“完整”!何为“完整”?是测试路径覆盖率100%么?不是!即便覆盖了测试需求的全部功能,又如何保证100%的测试需求不变更、亦或满足了客户的需求呢?测试是保证软件产品的质量。而最“完整”的质量保障或者说测试覆盖,其实应该是满足了客户的当前需求。说白了,其他不是客户想要的质量,可以弱化点,要切入要点进行测试,从而在要害关卡编写测试用例。
    第二、何为“有效”?是测试方法正确还是测试策略高深?不是!
    1、是基本的测试规则。如同游戏一般需要定义规则,测试需要用标准规范来约束。没有良好的测试规则,恐怕难以称之为“有效”。我以为,从分析测试需求起,就可以同步建立测试模型/模式,开发有他们自己的模型/模式,测试当然也可以使用。譬如用UML来画流程图、活动图,理清测试步骤。或者用RUP的迭代测试,是否会比普通的模型要好些呢?
    2、测试用例的根本是设计如何测试,不是测试什么。很多人仅简单把测试操作步骤记录在案,以为就是测试用例,那就错了。测试用例必须应用用例设计思路,保证其有效的结构性,可读性,渗透性。
    3、依然是需求变更。倘若测试组无法从项目组及时获取到变更的信息,更有甚至连开发组织也没有对变更做出响应,那么用例肯定是无效的了。
    4、测试用例必须进行交流评审。在开发组、测试组和项目总体组负责人员和相关分管岗位人员开会讨论后,最终拍板定案。
    第三、时间限制。“有限时间内”这一说法,其实又得看具体情况。一周可以算有限时间,一天亦可以做有限时间结点。具体情况具体分析。通常的做法是:
    1、测试管理。我们必须从测试管理机制上考虑,努力改善测试的环境,调整项目的管理流程,为有效的测试争取出时间。
    2、工作效率。通过建立测试用例库来节省编写测试用例时间。现在都提倡复用的思想,不是仅代码可以复用、构件可以复用,公用测试用例的复用,可以极大程度,提高测试执行的效率。若把测试用例集应用于自动化工具中,这才是真正的会用工具,减少人工劳动力。
    3、明确测试范围,严格按测试计划工作,利用有限的资源做有限的事情,使价值最大化。
    4、规避风险。类似需求变更等是最大的风险,当然会影响工作效率,应该趁早定义清楚。

    综上,要在有限的时间内编写完整有效的测试用例,所涉及到整个软件开发测试过程的方方面面,不是一两个知识点或者有些经验就可以定义的。而关键还是要明确需求,尽量减少需求变更,否则后续编写的用例,也只是做无功用罢了。

    个人拙见,请指正。
  • 没有需求文档的时候如何来设计测试用例?

    zte_boy 发布于 2008-11-22 23:08:39

    这个问题出题很新颖,着重是考察公司的测试Leader应对突发事件的能力?
    以前我们公司招测试Leader的面试题目中也有类似的一个题目?我面试了很多人,回答都不是很理想,都只能够回答上几句话,并且都有“需求不明确”等同感,只是工作中太忙缺少总结,给出一个常见的很熟悉的问题,马上作答不知道如何说起。

    下面是我的一些看法,恳请各位同行批评指正:
    1.根据客户的功能点整理测试需求追朔表:
    一般的客户都要把要开发软件的功能点写成一个表格交给市场部,让市场部门转交研发部。所以客户的功能点是编写测试用例一个最最重要的依据。

    2.根据开发人员的Software Specification List整理我们的功能测试点:
    一般来说,开发人员实现一个功能都要把该功能分成几个子模块来实现,所以Software Specification List也是我们参考的另一个比较重要的依据。

    3.开展项目跨部门讨论会:
    可以抽出时间,叫市场部的项目负责人、产品经理、项目经理、软件开发经理和软件开发人员,分别讲讲他们对整个产品的认识和设计模式,对每个功能点的理解和认识,理顺思路,达成共识,测试人员负责记录,测试Leader负责整理汇总,形成测试的部分参考文档。

    4.测试人员整理用例需求疑问递交项目组和客户代表回复:
    测试人员根据项目讨论会后的理解,测试过程中可能碰到的问题(如:边界值、输入数据类型等等)和需求不明确的问题,整理用例需求疑问,让相关的模块负责人在“用例需求疑问”表格中回复,并给出详细解释和说明。

    5.项目内部用例评审:
    测试人员根据对项目的理解,编写测试用例要点,测试组内部评审修改后,可以召集项目组的成员,帮助Review一下,然后进行修改。经过多次修改和评审以后,测试用例要点可能会更加全面一些。

    6.邮件和客户代表确认部分争议问题:
    测试人员与开发人员、项目组成员,在需求问题上讨论有时候观点不一致,各说各有理,这种情况下最好把争议问题写成邮件,发给客户让客户来拍板,确定那种需求合理,到底如何做?抄送项目组的全体成员,方便大家都了解客户的意见。最后编写测试用例的时候,以客户的邮件内容为准。

    7.项目Demo和部分已开发系统:
    大部分的系统,由于没有需求,为了避免项目风险,开发方一般都要做成Demo,不断让客户确认后签字,不断展现新开发的功能,以达到吸引客户的目的。如果项目中有Demo,Demo也是参考标准。如果什么都没有,那已经开发的部分功能模块,要去随时让用户了解了解,并提出部分修改意见,也可以为我们熟悉系统提供部分依据。

    8.参考同行业和竞争对手的类似产品:
    假如说是做一个网上书店类似的网站,我们编写测试用例的时候,可以看看“当当网”,“China—pub”等等类似成熟相关的网站。很容易发现本公司产品的问题,无意识给产品添加了竞争力。对于竞争对手的了解一定不能够少。

    9.交叉模块的测试,最容易被人忽略:
    一般的产品,功能部分的交叉,即是说在A模块中设置了参数,在B模块和C模块中体现该参数的实际运用。比较难的如我们现在测试的“银行系统”中的交叉模块,还可能牵涉到不同的用户,3个以上的模块之间的调用。即是有了需求也很少写,同时也是需求编写的一个薄弱环节。这样的测试用例编写问题,一般初级测试工程师很难考虑全。对于有这种交叉功能的模块,必须要求项目组中的精兵强将,画出相关的调用关系图,表明调用关系,方便后面编写测试用例。

    10.可以使用电话、MSN、Skype等网络聊天工具咨询部分需求:
    我们做的产品,大多数的客户都在国外,测试经理也可以用这些网络聊天工具和客户确认部分需求疑问。不过要要事先越好时间,并注意异地的“时差”。

     

  • (转)测试用例-搜索功能

    jfioe 发布于 2007-11-02 18:41:11

     

    测试用例分解
      对被测试点进行分解,把测试用例分解为多个测试场景
     
    场景编号 场景描述 预期结果
    场景一 页面检查 正确
    场景二 默认条件搜索 查询结果正确
    场景三 修改可选条件搜索 查询结果正确
    场景四 修改输入条件搜索 查询结果正确
    场景五 修改区间条件搜索 查询结果正确
    场景六 组合可选、输入条件搜索 查询结果正确
    场景七 操作后检查搜索条件及查询结果 查询结果正确
    场景八 错误、空记录搜索 查询结果为空

      测试步骤描述
      按照已经分解的测试场景顺序,逐个描述测试场景的测试步骤
       
    测试场景一:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 界面共性测试
    3 退出
       
      测试场景二:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 点击“搜索”按钮,显示查询结果列表
    3 检查查询结果列表,每页显示记录条数正确、文字折行显示正确、页面布局美观
    4 检查查询结果列表,列标题项、列显示内容、排序方式符合需求定义
    5 检查查询结果列表,符合默认查询条件结果集
    6 点击查询结果列表链接、复选框、全选框响应正确
    7 退出
       
      测试场景三:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 逐一选择各个查询条件可选项,如:“全部”、“类别1”等,点击“搜索”,查询结果正确
    3 组合各个查询条件可选项,如:价格+产品,点击“搜索”,查询结果正确
    4 退出
       
      测试场景四:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 逐一输入文本域条件,模糊查询值,点击“搜索”,查询结果正确
    3 逐一输入文本域条件,完全匹配值,点击“搜索”,查询结果正确
    4 逐一输入文本域条件,中文值,点击“搜索”,查询结果正确
    5 逐一输入文本域条件,字母大、小写值,点击“搜索”,查询结果正确
    6 逐一输入文本域条件,数字类型值,点击“搜索”,查询结果正确
    7 逐一输入文本域条件,全角、半角值,点击“搜索”,查询结果正确
    8 组合各个文本域查询条件,点击“搜索”,查询结果正确
    9 退出
       
      测试场景五:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 修改区间条件左值,右值使用默认值,点击“搜索”,查询结果正确
    3 修改区间条件右值,左值使用默认值,点击“搜索”,查询结果正确
    4 修改区间条件左、右值,点击“搜索”,查询结果正确
    5 修改区间条件左、右值为边界值,点击“搜索”,查询结果正确
    6 修改区间条件左、右值,使左值=右值,查询结果正确
    7 修改区间条件左、右值,使左值>右值,查询结果为空(或提示信息正确)
    8 退出
       
      测试场景六:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 任意组合各个查询条件:如:价格+产品+关键字,点击“搜索”,查询结果正确
    3 重复步骤2,更换组合内容搜索
    4 退出
       
      测试场景七:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 选择和输入所有查询条件后,点击“搜索”,查询结果正确
    3 分别进行翻页、修改、添加、删除等操作后,检查查询条件不变,查询结果正确
    4 退出
       
      测试场景八:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 逐一选择或输入查询条件为:不存在的值(查询结果集为空),查询结果为空
    3 逐一选择或输入查询条件为:空格、特殊字符、超长的值,点击“搜索”,查询结果为空
    4 组合查询条件,选择或输入不存在、空格、特殊字符、超长的值,点击“搜索”,查询结果为空
    5 重复步骤4,更换组合内容搜索
    6 退出

  • (转)测试用例-搜索功能

    fengjingqiong 发布于 2007-11-06 12:43:13

    测试用例分解
      对被测试点进行分解,把测试用例分解为多个测试场景
     
    场景编号 场景描述 预期结果
    场景一 页面检查 正确
    场景二 默认条件搜索 查询结果正确
    场景三 修改可选条件搜索 查询结果正确
    场景四 修改输入条件搜索 查询结果正确
    场景五 修改区间条件搜索 查询结果正确
    场景六 组合可选、输入条件搜索 查询结果正确
    场景七 操作后检查搜索条件及查询结果 查询结果正确
    场景八 错误、空记录搜索 查询结果为空
    51Testing软件测试网7o;A8z5Eg$W(SL&s
      测试步骤描述
      按照已经分解的测试场景顺序,逐个描述测试场景的测试步骤
       
    测试场景一:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 界面共性测试
    3 退出
       
      测试场景二:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 点击“搜索”按钮,显示查询结果列表
    3 检查查询结果列表,每页显示记录条数正确、文字折行显示正确、页面布局美观
    4 检查查询结果列表,列标题项、列显示内容、排序方式符合需求定义
    5 检查查询结果列表,符合默认查询条件结果集
    6 点击查询结果列表链接、复选框、全选框响应正确
    7 退出
       
      测试场景三:
     
    步骤编号 具体描述
    1 进入搜索(高级搜索)页面
    2 逐一选择各个查

    测试搜索功能时,文本框中可以输入:
    1、空格+合法关键字
    2、合法关键字+空格
    3、数据源中存在的关键字
    4、数据源中不存在的关键字,如:任意输入的到达边界的字符串
    5、输入单个特殊符号,如:% ? @ # 空格等
    6、输入的关键字两边加双引号
    7、文本框:空白,什么也不输

  • 搜索引擎测试点

    wangpl4092 发布于 2008-09-03 22:14:47

    包括关键字搜索.完全匹配.有效字符.无效字符等

    1,空内容点击搜索,看其有没有LINK
    2,输入过长查询数据,看其有没判断,报错
    3,输入各种符号,特别是空格,看其能否正确判断
    4,输入各种字符,譬如输入范围是0~9,A~Z的看输入中文是什么效果
    5,输入正确数据,看其的查询后数据的完整性
    6,注意在光标停留的地方输入信息时,光标和所输入的信息会否跳到别的地方
    7,在输入结束后直接按回车键,看系统处理如何,会否报错
    8,反复输入相同的数据(5次以上)看是否报错
    9,各国文字/字符的输入/粘贴能正确显示 退格键等操作显示正常 超过支持的最大长度有相应的提示 混合的多种语言也能正确显示
    10,显示&接收;能进行下一步处理
    11,其他的 包括能删除  能剪切等(我也不确定要不要包括 有点奇怪 显示语言是字符库支持的问题 而且如果是面向对象程序设计语言做的文本框 删除什么的功能也不用测了吧sdlkfj1 )
    12, 另外注意分析搜索结果.如:搜索结果的正确性,排序等..
  • 编写正则表达式

    lynmin 发布于 2008-04-09 15:37:03

    <%
    Function RegExpTest(patrn, strng)
    Dim regEx, Match, Matches '建立变量。
    Set regEx = New RegExp '建立正则表达式。
    regEx.Pattern = patrn '设置模式。
    regEx.IgnoreCase = True '设置是否区分字符大小写。
    regEx.Global = True '设置全局可用性。
    Set Matches = regEx.Execute(strng) '执行搜索。
    For Each Match in Matches '遍历匹配集合。
    RetStr = RetStr & "Match found at position "
    RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
    RetStr = RetStr & Match.Value & "'." & "<BR>"
    Next
    RegExpTest = RetStr
    End Function
    response.write RegExpTest("[ij]s.", "IS1 Js2 IS3 is4")
    %>
    在这个例子中,我们查找字符串中有无is或者js这两个词,忽略大小写。运行的结果如下:
    Match found at position 0. Match Value is 'IS1'.
    Match found at position 4. Match Value is 'Js2'.
    Match found at position 8. Match Value is 'IS3'.
    Match found at position 12. Match Value is 'is4'.
    下面我们就介绍这三个对象和集合。
    1、RegExp对象是最重要的一个对象,它有几个属性,其中:
    ○Global 属性,设置或返回一个 Boolean 值,该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。如果搜索应用于整个字符串,Global 属性的值为 True,否则其值为 False。默认的设置为 False。
    ○IgnoreCase 属性,设置或返回一个Boolean值,指明模式搜索是否区分大小写。如果搜索是区分大小写的,则 IgnoreCase 属性为 False;否则为 True。缺省值为 False。
    ○Pattern 属性,设置或返回被搜索的正则表达式模式。必选项。总是一个 RegExp 对象变量。

    2、Match 对象
    匹配搜索的结果是存放在Match对象中,提供了对正则表达式匹配的只读属性的访问。 Match 对象只能通过 RegExp 对象的 Execute 方法来创建,该方法实际上返回了 Match 对象的集合。所有的 Match 对象属性都是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象提供了被正则表达式搜索找到的字符串的访问、字符串的长度,以及找到匹配的索引位置等。
    ○FirstIndex 属性,返回在搜索字符串中匹配的位置。FirstIndex 属性使用从零起算的偏移量,该偏移量是相对于搜索字符串的起始位置而言的。换言之,字符串中的第一个字符被标识为字符 0
    ○Length 属性,返回在字符串搜索中找到的匹配的长度。
    ○Value 属性,返回在一个搜索字符串中找到的匹配的值或文本。

    3、Matches 集合
    正则表达式 Match 对象的集合。Matches 集合中包含若干独立的 Match 对象,只能使用 RegExp 对象的 Execute 方法来创建之。与独立的 Match 对象属性相同,Matches `集合的一个属性是只读的。在执行正则表达式时,可能产生零个或多个 Match 对象。每个 Match 对象都提供了与正则表达式匹配的字符串的访问入口、字符串的长度,以及标识匹配位置的索引。
    学习了这三个对象和集合,如何应用于字符串的判断和替换呢?regExp对象的三个方法正好解决了这个问题,它们是Replace方法、Test方法和Execute方法。
    1、Replace 方法
    替换在正则表达式查找中找到的文本。我们还是先看个例子:下面的例子说明了 Replace 方法的用法。
    <%
    Function ReplaceTest(patrn, replStr)
    Dim regEx, str1 ' 建立变量。
    str1 = "The quick brown fox jumped over the lazy dog."
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = True ' 设置是否区分大小写。
    ReplaceTest = regEx.Replace(str1, replStr) ' 作替换。
    End Function
    Response.write ReplaceTest("fox", "cat") & "<BR>" ' 将 'fox' 替换为 'cat'。
    Response.write ReplaceTest("(\S+)(\s+)(\S+)", "$3$2$1") ' 交换词对.
    %>
    2、Test 方法
    对指定的字符串执行一个正则表达式搜索,并返回一个 Boolean 值指示是否找到匹配的模式。正则表达式搜索的实际模式是通过RegExp对象的Pattern属性来设置的。RegExp.Global属性对Test方法没有影响。
    如果找到了匹配的模式,Test方法返回True;否则返回False。下面的代码说明了Test 方法的用法。
    <%
    Function RegExpTest(patrn, strng)
    Dim regEx, retVal ' 建立变量。
    Set regEx = New RegExp ' 建立正则表达式。
    regEx.Pattern = patrn ' 设置模式。
    regEx.IgnoreCase = False ' 设置是否区分大小写。
    retVal = regEx.Test(strng) ' 执行搜索测试。
    If retVal Then
    RegExpTest = "找到一个或多个匹配。"
    Else
    RegExpTest = "未找到匹配。"
    End If
    End Function
    Response.write RegExpTest("is.", "IS1 is2 IS3 is4")
    %>
    3、Execute 方法
    对指定的字符串执行正则表达式搜索。正则表达式搜索的设计模式是通过 RegExp 对象的 Pattern 来设置的。
    Execute 方法返回一个 Matches 集合,其中包含了在 string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。
  • 搜索引擎测试的难点

    qaarchitech 发布于 2008-02-26 23:56:08

    衡量搜索引擎系统功能质量方面有2大指标,查询率、查准率。

    性能方面从吞吐率、响应时间、系统资源消耗等多方面综合考虑。

    搜索引擎应用参与运作的角色划分:分发请求/合并查询结果的merger,以及查询服务的searcher.

     

    搜索引擎系统部署可以划分为:

    1)      1 Merger Nsearcher searcher上数据一样  (分布式单个集群多台机器)  N>=1且为整数

    2)      1个机器 同时充当Merger以及searcher (单机版)

    3)      为避免2)单点故障,几台机器同时为merger/searcher,机器的数据一样。

    4)      M 个分布式单个集群多台机器组成 1个大型的分布式多集群多机器的复杂环境

     

    实践中3)4)  2种部署模式都是存在的。

     

    大数据量、高吞吐率的都采用4),避免单点故障

    小型的数据采用3) ,节约成本。

     

    单机上搜索引擎的模块划分一般有:

    Ø        索引模块:为海量数据(数据库导出的文件数据) 建立索引文件 (依照一定数据结构格式保存为二进制文件)

    Ø        查询模块:接收http请求,查询本机硬盘上的索引文件,返回文档ID以及第二次查询时返回具体的内容

    Ø        即时更新模块:加入新的数据,可以从0开始重新建索引,也可以在原有基础上增加索引。

    Ø        分布式模块:merger/searcher 多台机器的网络通信。

    Ø        CACHE模块:这里可以做查询请求的缓存,也可以做查询结果的缓存,但缓存后者的话,将极大消耗系统内存。

    Ø        其他管理模块

    Ø        外部接口

     

     

    基于如上复杂的系统架构,尤其是4)模式,我们在测试当中也碰到相当多棘手的技术问题

    1)      海量数据是否都按预期的分词算法建立索引了呢?

    2)      机器分词的效果与手工分词相差有多大呢?

    3)      海量查询的返回结果是否多查了

    4)      海量查询的返回结果是否漏查了

    5)      海量查询的返回结果的加亮、标注如期加了?

    6)      海量查询的返回结果中相关性分数计算是否正确?

    7)      海量查询的返回结果积分计算是否正确了呢

    8)      海量查询的返回结果积分相同时,排序的先后依据唯一么?

    9)      加入即时更新模块后,每次查询结果都不同,新建的索引内容是否都反馈到查询结果里面了呢

    10)  海量数据时CACHE是否预期CACHEcache的内容?

    11)  海量数据时CACHE是否依照一定的过时算法令cache的内容失效呢?

    12)  应用程序在32LINUX 操作系统和64位的LINUX的索引、查询结果是否依然一样?

    13)  应用程序在不同的OS 上索引、查询结果是否依然一样?

     

     

    我们在实践中,针对查询结果正确性有3类方法处理以上问题

    第一类基于人工肉眼对比,极度耗费脑细胞

    1)      少量数据单机测试准确性

    2)      少量数据1个集群,搭建1merger 1searcher 测试准确性

    3)      少量数据1个集群,搭建1merger searcher 测试准确性

    4)      少量数据多个集群,搭建1merger searcher 测试准确性

     

    第二类,经过人工对比确认基本功能无大问题后,开发linux shell脚本或者loadrunner脚本比较部署方式不同但测试返回结果理当相同的。这个方法也帮我们发现了一些BUG

     

    第三类方法,

    直接测试大量数据多个集群,搭建1merger searcher 测试准确性。

    这个时候采用loadrunner施加高峰压力,抽样检查查询请求的正确性。

     

    对于分词结果、相关性的结果,有人可能建立另外按照同样的算法以及输出格式,由2个不同的开发工程师实现,再对比同样的数据分词、相关性是否相同。在项目开发时间从容的情况下,可以考虑这么做的,但现实中有几个项目时间从裕?呵呵,我没有这么好运气遇上。

     

    针对搜索引擎测试的困难,欢迎各位各抒己见。

  • 数据统计

    • 访问量: 5786
    • 日志数: 13
    • 建立时间: 2008-11-24
    • 更新时间: 2010-10-21

    RSS订阅

    Open Toolbar