发布新日志

  • 软件测试基础知识

    2008-02-20 11:27:14

    软件开发过程及软件质量保证
    1.软件开发过程的几个主要阶段:
    1)定义。明确开发的目标,软件的
    需求
    2)计划。制订软件开发所涉及到的计划。
    3)
    设计。设计、编码、编写文档等,完成要求的软件特性。
    4)稳定化。主要是
    测试和缺陷修复,确保软件的质量。
    5)安装。安装、提交完成的软件,为客户提供运行环境。
    2.几种常用的软件生命周期模型:
    1)瀑布模型。
    2)原型模型。
    3)增量模型。
    4)螺旋模型。
    软件测试人员的角度来看软件开发过程,需要注意的是:测试贯穿在整个开发过程中,而不是在某个阶段集中地做一下测试而其它阶段不用理会测试工作

    一个软件之所以被认为为质量优秀,是它内在具备了这样一些特性:
    满足用户的需求;
    合理进度、成本、
    功能关系;
    具备扩展性和灵活性,能够适应一定程度的需求变化;
    能够有效地
    处理例外的情况;
    保持成本和
    性能的平衡。

    软件质量保证(Software Quality Assurance-----SQA)是为了确保软件开发过程和结果符合预期的要求而建立的系列规程,以及依照规程和计划采取的一系列活动及其结果评审。

    软件质量保证的活动主机包括:
    技术方法的就用;
    正式技术评审的
    实施
    软件测试;
    标准的执行;
    修改的控制;
    度量;
    记录和记录保存。

    软件错误的定义:软件错误是软件产品中存在的导致期望的运行结果和实际结果间出现差异的一系列
    问题,这些问题包括故障、失效、缺陷。


    软件测试:
    软件测试就是为了发现软件中存在的错误而
    分析或执行程序的过程。具体地说,软件测试是分析程序或根据软件开发各阶段的规格说明和各程序的内部结构而精心设计出一批测试用例,并利用测试用例来运行程序,以发现程序错误的过程。

    软件测试有两个基本的功能:验证(Verification)和确认(Validation)。
    验证指保证软件正确地
    实现了特写功能的一系列活动。
    确认指保证最终的产品满足
    系统需求。
    通俗的说:验证保证产品的正确性;确认保证生产了正确的产品。

    软件测试人员应该至少具备以下两个关键领域方面的知识:
    1)软件测试技术;
    2)被测
    应用程序及其相关应用领域知识。

    理解以下的描述:
    测试能提高软件的质量,但是提高质量不能依赖测试;
    测试只能证明错误存在,不能证明错误不存在;
    测试的主要困难是不知道该
    如何进行有效地测试,也不知道什么时候能够放心的结束测试;
    每个程序员都应当测试自己的程序(份内事),但不能作为程序已通过测试的依据(所以项目需要独立的测试人员);
    80-20原则:80%的错误聚集在20%的模块中,经常出错的模块改错后还是会经常出错;
    测试应当循序渐进,不要企图一次性做完。"欲速则不达"。

    测试人员的目标和主要工作:
    目标:(1).基本目标是发现软件错误;
    (2).要尽可能早的找出软件错误;
    (3).必需确保找出的软件错误得以关闭。

    主要工作:
    1)规划测试任务
    2)设计测试(包括编写测试用例等等)
    3)建立一个合适的测试环境
    4)
    评估、获取、安装和配置自动测试工具
    5)执行测试
    6)撰写适当的测试文档

    软件测试的分类
    1.从是否需要执行被测试软件的角度分:有静态测试和动态测试。
    2.从测试是否针对软件结构和算法的角度分类分:白盒测试和黑盒测试。
    3.从测试的不同阶段分:
    单元测试、集成测试、系统测试和验收测试四个阶段。
    其中系统测试有:
    功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试等等。

    针对某些功能作用的测试:
    回归测试:指错误被修正后或软件功能、环境发生变化后进行的重新测试。
    功能测试:测试软件的功能是否符合功能性需求,通常采用黑盒测试方式。
    负载测试:测试软件系统的最大负载,超出此负载软件有可能会失常。
    压力测试:与负载测试差不多,叫法不同。
    易用性测试:测试软件是否易用,主观性比较强。一般要根据用户的反馈信息来评价。
    安装与反安装测试:测试软件在"全部、部分、升级"等状况下的安装/反安装过程。
    恢复测试:测试系统从故障中恢复的能力。
    安全性测试:测试系统防止非法侵入的能力。
    兼容性测试:测试系统与其它软件、硬件兼容的能力。
    内存泄漏测试:测试软件在运行过程中是否会造成内存泄漏。
    比较测试:通过与同类产品比较,考察该产品的优点、缺点。
    Alpha测试:一种先期的用户测试,此时系统刚刚开发完成。
    Beta测试:一种后期的用户测试,此时系统已经通过内部测试,大部分错误已经改正,即将正式发行。同Alpha测试一样都由用户进行,场地不同,Alpha测试一般是把用户请到开发方的场地来测试,Beta测试是指在一个或多个用户的场所进行测试。

    测试工作的主要步骤:
    1)测试计划:测试人员要首先对需求进行分析,最终定义一个测试集合。
    2)测试设计与开发:根据软件需求、说明书完成测试用例设计并编写必要的测试驱动程序。
    3)执行测试:需要做的工作是,建立测试环境;根据前面编写的测试计划和测试用例运行测试;记录测试结果;报告软件缺陷;跟踪软件缺陷直至其被处理;分析测试结果


    PS 测试工程师职业素质
    1)责任心
    2)学习能力
    3)怀疑精神
    4)沟通能力
    5)专注力
    6)洞察力
    7)团队精神
    8)注重积累
  • 软件测试人员自身素质的培养!

    2008-02-20 11:20:48

        (1) 首先,应对软件测试感兴趣和对自己有自信,如果具备了这两点,那么在开发过程中不管遇到什么样的困难,我相信你一定能克服。 

      (2) 善于怀疑,世界上没有绝对正确的,总有错误的地方,具有叛逆心理,别人认为不可能发生的事,我却认为可能发生。别人认为是对的,我却认为不是对的。

      (3) 打破砂锅问到底的精神,对于只出现过一次的bug,一定找出原因,不解决誓不罢休。

      (4) 保持一个良好的心情,否则可能无法把测试作好。不要把生活中的不愉快的情绪带到工作中来。

      (5) 做测试时要细心,不是所有的bug都能很容易的找出,一定要细心才能找出这些bug。

      (6) 灵活一些,聪明一点,多制造一些容易产生bug的例子。

      (7) 在有条件的情况下,多和客户沟通,他们身上有你所需要的。

      (8) 设身处地为客户着想,从他们的角度去测试系统。

      (9) 不要让程序员,以“这种情况不可能发生”这句话说服你,相反,你应该去说服他,告诉他在客户心里,并不是这样的。

      (10) 考虑问题要全面,结合客户的需求、业务的流程、和系统的构架,等多方面考虑问题。

      (11) 提出问题不要复杂化,这一点和前面的有点矛盾,如果你是一新手,暂时不要管这一点,因为最终将有你的小组成员讨论解决。

      (12) 追求完美,对于新测试员来说,努力的追求完美,这对你很好,尽管有些事无法做到,但你应该去尝试。

      (13) 幽默感,能和开发小组很好的沟通是关键,试着给你的开发小组找一个“BUG杀手”,或对他们说“我简直不敢相信,你写的程序居然到现在没有找到BUG”。

      (14) 到此是不是对测试很有兴趣呢?不过我要告诉你,测试过程中有酸甜苦辣,其中的滋味只有你知道,也许你会感到枯燥,要学会放松自己,去溜冰或做你喜欢做的事,不过,别放弃,因为你的自信告诉过你“你会是很优秀的测试员”不是吗?

  • 【转】一位软件测试工程师6年的工作经验总结

    2008-02-20 10:58:55

    1 分享第一条经验:学历代表过去、能力代表现在、学习力代表未来。其实这是一个来自国外教育领域的一个研究结果。相信工作过几年、十几年的朋友对这个道理有些体会吧。但我相信这一点也很重要:重要的道理明白太晚将抱憾终生!所以放在每一条,让刚刚毕业的朋友们早点看到哈!

    2
    一定要确定自己的发展方向,并为此目的制定可行的计划。不要说什么,我刚毕业,还不知道将来可能做什么?跟着感觉走,先做做看。因为,这样的观点会通过你的潜意识去暗示你的行为无所事事、碌碌无为。一直做技术,将来成为专家级人物?向管理方向走,成为职业经理人?先熟悉行业和领域,将来自立门户?还是先在行业里面混混,过几年转行做点别的?这很重要,它将决定你近几年、十年内做什么事情才是在做正确的事情!


    3
    软件开发团队中,技术不是万能的,但没有技术是万万不能的!在技术型团队中,技术与人品同等重要,当然长相也比较重要哈,尤其在MM比较多的团队中。在软件项目团队中,技术水平是受人重视和尊重的重要砝码。无论你是做管理、系统分析、设计、编码,还是产品管理、测试、文档、实施、维护,多少你都要有技术基础。算我孤陋寡闻,我还真没有亲眼看到过一个外行带领一个软件开发团队成功地完成过软件开发项目,哪怕就一个,也没有看到。倒是曾经看到过一个高学历的牛人”(非技术型)带一堆人做完过一个项目,项目交付的第二天,项目组成员扔下一句再也受不了啦!四分五裂、各奔东西。那个项目的成功度大家可想而知了。


    4
    详细制定自己软件开发专业知识学习计划,并注意及时修正和调整(软件开发技术变化实在太快)。请牢记:如果一个软件开发人员在12年内都没有更新过自己的知识,那么,其实他已经不再属于这个行业了。不要告诉自己没有时间。来自时间管理领域的著名的三八原则告诫我们:另外的那8小时如何使用将决定你的人生成败!本人自毕业以来,平均每天实际学习时间超过2小时。


    5
    书籍是人类进步的阶梯,对软件开发人员尤其如此。书籍是学习知识的最有效途径,不要过多地指望在工作中能遇到世外高人,并不厌其烦地教你。对于花钱买书,我个人经验是:千万别买国内那帮人出的书!我买的那些家伙出的书,!00%全部后悔了,无一本例外。更气愤的是,这些书在二手市场的地摊上都很难卖掉。拥有书籍并不表示拥有知识;拥有知识并不表示拥有技能;拥有技能并不表示拥有文化;拥有文化并不表示拥有智慧。只有将书本变成的自己智慧,才算是真正拥有了它。


    6
    不要仅局限于对某项技术的表面使用上,哪怕你只是偶尔用一、二次。对任何事物不究就里是任何行业的工程师所不应该具备的素质。开发Windows应用程序,看看Windows程序的设计、加载、执行原理,分析一下PE文件格式,试试用SDK开发从头开发一个Windows应用程序;用VC++、DelphiJava.Net开发应用程序,花时间去研究一下MFCVCLJ2EE.Net它们框架设计或者源码;除了会用J2EEJBossSpringHibernate等等优秀的开源产品或者框架,抽空看看大师们是如何抽象、分析、设计和实现那些类似问题的通用解决方案的。试着这样做做,你以后的工作将会少遇到一些让你不明就里、一头雾水的问题,因为,很多东西你知其然且知其所以然


    7
    在一种语言上编程,但别为其束缚了思想。代码大全中说:深入一门语言编程,不要浮于表面。深入一门语言开发还远远不足,任何编程语言的存在都有其自身的理由,所以也没有哪门语言是包治百病灵丹妙药。编程语言对开发人员解决具体问题的思路和方式的影响与束缚的例子俯拾皆是。我的经验是:用面对对象工具开发某些关键模块时,为什么不可以借鉴CC51、汇编的模块化封装方式?用传统的桌面开发工具(目前主要有VC++Delphi)进行系统体统结构设计时,为什么不可以参考来自Java社区的IoCAOP设计思想,甚至借鉴像SpringHibernateJBoss等等优秀的开源框架?在进行类似于实时通信、数据采集等功能的设计、实现时,为什么不可以引用来自实时系统、嵌入式系统的优秀的体系框架与模式?为什么一切都必须以个人、团队在当然开发语言上的传统或者经验来解决问题???他山之石、可以攻玉


    8
    养成总结与反思的习惯,并有意识地提炼日常工作成果,形成自己的个人源码库、解决某类问题的通用系统体系结构、甚至进化为框架。众所周知,对软件开发人员而言,有、无经验的一个显著区别是:无经验者完成任何任务时都从头开始,而有经验者往往通过重组自己的可复用模块、类库来解决问题(其实这个结论不应该被局限在软件开发领域、可以延伸到很多方面)。这并不是说,所有可复用的东西都必须自己实现,别人成熟的通过测试的成果也可以收集、整理、集成到自己的知识库中。但是,最好还是自己实现,这样没有知识产权、版权等问题,关键是自己实现后能真正掌握这个知识点,拥有这个技能。


    9
    理论与实践并重,内外双修。工程师的内涵是:以工程师的眼光观察、分析事物和世界。一个合格的软件工程师,是真正理解了软件产品的本质及软件产品研发的思想精髓的人(个人观点、欢迎探讨)。掌握软件开发语言、应用语言工具解决工作中的具体问题、完成目标任务是软件工程师的主要工作,但从软件工程师这个角度来看,这只是外在的东西,并非重要的、本质的工作。学习、掌握软件产品开发理论知识、软件开发方法论,并在实践中理解、应用软件产品的分析、设计、实现思想来解决具体的软件产品研发问题,才是真正的软件工程师的工作。站在成熟理论与可靠方法论的高度思考、分析、解决问题,并在具体实践中验证和修正这些思想与方式,最终形成自己的理论体系和实用方法论。


    10
    、心态有多开放,视野就有多开阔。不要抱着自己的技术和成果,等到它们都已经过时变成垃圾了,才拿出来丢人现眼。请及时发布自己的研究成果:开发的产品、有创意的设计或代码,公布出来让大家交流或者使用,你的成果才有进化和升华的机会。想想自己2000年间开发的那些Windows系统工具,56年之后的今天,还是那个样子,今天流行的好多Windows系统工具都比自己的晚,但进化得很好,且有那么多用户在使用。并且,不要保守自己的技术和思想,尽可能地与人交流与分享,或者传授给开发团队的成员。与人交换苹果之后,每个人还是只有一个苹果;但交换思想之后,每个人都拥有两种思想,道理大家都懂,但有多少人真正能做到呢?


    11
    、尽量参加开源项目的开发、或者与朋友共同研制一些自己的产品,千万不要因为没有钱赚而不做。网络早已不再只是虚拟世界,网上有很多的开源项目、合作开发项目、外包项目,这都是涉猎工作以外的知识的绝好机会,并且能够结识更广的人缘。不要因为工作是做ERP,就不去学习和了解嵌入式、实时、通信、网络等方面的技术,反过来也是一样。如果当他别人拿着合同找你合作,你却这也不会,那也不熟时,你将后悔莫及。


    12
    、书到用时方恨少,不要将自己的知识面仅仅局限于技术方面。诺贝尔经济学奖得主西蒙教授的研究结果表明:对于一个有一定基础的人来说,他只要真正肯下功夫,在6个月内就可以掌握任何一门学问。教育心理学界为感谢西蒙教授的研究成果,故命名为西蒙学习法。可见,掌握一门陌生的学问远远没有想想的那么高难、深奥。多方吸取、广泛涉猎。极力夯实自己的影响圈、尽量扩大自己的关注圈。财务、经济、税务、管理等等知识,有空花时间看看,韬光养晦、未雨绸缪。


    13
    、本文的总结与反思:


    A
    :不要去做技术上的高手,除非你的目标如此。虽然本文是关于提高软件开发知识的建议,做技术的高手是我一向都不赞同的。你可以提高自己的专业知识,但能胜任工作即止。


    B
    :提高软件知识和技术只是问题的表面,本质是要提高自己认识问题、分析问题、解决问题的思想高度。软件专业知识的很多方法和原理,可以很容易地延伸、应用到生活的其它方面。


    C
    :在能胜任工作的基础上,立即去涉猎其它领域的专业知识,丰富自己的知识体系、提高自己的综合素质,尤其是那些目标不在技术方面的朋友。
  • 【转】测试8000薪水是这样得到的!

    2008-02-20 10:50:01

    这听起来是个很有诱惑力的话题;也的确是个很有诱惑力的话题。
    很多做测试的朋友千万次的问,测试行业能挣到高薪吗?从事测试工
    作有发展吗?我能够忍受枯燥无聊的测试工作吗?

    这里我不想谈所有问题,只谈谈如何获得高薪,获得高薪需要哪些素质,那
    些条件,多少年的工作经验等。

    我认为的测试人员分类

    测试人员在软件开发中基本由两大类:一类是起步就做测试,一类做过开发
    后来转为测试。

    最近在网上同一些朋友聊天,经常聊到测试人员是否需要开发经验这样一个话
    题。我个人认为,又开发经验更好。我也倾向于由开发经验的测试人员可以获
    得更好的发展。但这都是一个动态的过程,起步就做测试的人可能后来也慢慢
    掌握开发经验。

    测试人员的成长阶段

    测试人员基本上可以分为如下几个阶段,手工测试阶段、工具辅助阶段、定制
    工具阶段、初级管理阶段、高级管理阶段、业务测试专家(此阶段在等同于在
    管理方面发展的初级、高级管理阶段,这个阶段的测试人员熟悉测试的各个方
    面,逐步专项某个领域的测试)。

    手工测试阶段

    处于此阶段的测试人员一般是刚刚进入这一行,或者刚刚换了一个公司(新来
    的吗)。这个时候是很重要的积累时期,自动此时工具只是一个辅助,重要的
    时你要有如何测试一个软件的思想。

    工具辅助阶段

    这个阶段的测试人员对各个类型的测试都有所了解,为了提高测试效率,开始
    使用测试工具;或者为了以后的职业发展开始关注自动测试,并主动或被动的
    学习测试工具。这时候自己心里一定要有数,那些测试工具会对职业生涯有帮
    助。目前国内的测试人员都在学习一些大厂商的测试工具,这些工具的确不错
    ,但是不一定都对以后的职业发展有利。一般来说这个时候首先要确定自己在
    功能测试方向发展还是在性能测试方向发展。这样可以有针对性地学习各类别
    的工具。当让有时间和精力可以多学习一些,多多益善。另外还有一些白盒测
    试工具,如果想在白盒测试方向发展可以多多研究。

    定制工具阶段

    这是工具辅助阶段的延续,一般定制工具分为两种,一种是对第三方厂商的工具
    进行插件开发或利用工具的脚本语言开发可重用的类库;另一种是开发公司内部
    使用的工具。第二中情况难度较大,需要测试人员有较高的开发水平。一般来说
    只有在商业测试工具不能满足测试要求时才开发自己的测试工具。当然有时候不
    需要使用庞大的商业测试工具的时候也可以自己开发一些小的、能够满足测试要
    求的工具。这一般使用产品开发所使用的语言或者Perl、Python等。对于使用
    Java开发的产品可以使用BeanShell等脚本语言。

    业务测试专家

    此阶段的测试人员已经熟练的掌握了多种工具,或者已经具备了为产品定制测试
    工具的能力。这个时候的测试人员应该做长期的职业生涯考虑,如果从事某个领
    域的产品测试时间较久,可以继续深入研究此领域里的相关技术,逐步能够提出
    对产品开发有建设性的建议。一般来说这个阶段的测试人员会在产品规划的前期
    作为高级测试人员参与进去,为产品的需求搜集和设计提供建设性意见。

    初级管理阶段

    一般来说这个阶段是指你处于项目组长位置的时候。这时可以制定测试计划,组
    织组内人员编写、修改测试用例。这个阶段的人员一般一般可以考虑向业务测试
    专家方向或者高级管理人员发展。

    高级管理阶段

    经历初级管理阶段后,积累了初步的测试管理经验。这时候一般会参与测试计划
    的制定、人力资源调配、各种资源分配等。

    各阶段的薪资状况

    就目前国内市场来看,按照测试人员所在的公司类型大致可分为如下几类:

    1。国内中小企业
    2。国内大企业
    3。测试外包公司
    4。国外企业

    同一个等级的职位在不同类型的公司可能有不同的定义,比如在国内的小企业
    可能就以两个测试人员,那你可能身兼多职,既是项目组长,又是项目经理。
    国内大企业一般来说同国外的企业的职位基本对应,但是一般来说国内大企业
    的测试经理到国外的公司也只能是个测试组长。

    测试外包公司在这几个类别中是个另类,在这种公司工作,基本就是技术类,
    很少有管理类的。

     

    如何获取高薪?

    一般来说在国内的中小公司做测试一般在1500-3000人民币每月。个别也有高
    的。在国内大公司高级人员一般可以拿到6000-8000人民币每月,初级人员大
    概在3000-5000之间。外包公司给的比较多,有经验的人员可以拿到6k到8k。
    在国外的大公司工作,就目前了解,初级人员在4k到7k之间,高级人员(有
    多年的测试经验)可以到8k-10k左右。

    如果你是刚刚毕业,那么能够进入大公司或国外的大公司,可以起步较高。
    如果你有几年工作经验,那么可以进入国外大公司,逐渐往管理职位发展,不
    过一般来说这很难。不过国外的大公司,一般提供技术和管理两条路供选择。
    毕竟管理职位有限,在国外的某些大公司,有经验的技术人员和一般的管理
    人员的薪资基本持平。

  • 嵌入式软件测试的十大秘诀

    2008-02-20 10:42:28

    在嵌入式软件开发过程中,一般来说,花在测试和花在编码的时间比为3:1(实际上可能更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要。很多年前,一位开发人员为了对嵌入式有更深层次的理解,向Oracle询问了这样的一个问题:我怎么才能知道并懂得我的系统到底在干些什么呢? Oracle面对这个问题有些吃惊,因为在当时没有人这么问过,而同时代的嵌入式开发人员问的最多的大都围绕“我怎么才能使程序跑的更快”、“什么编译器最好”等肤浅的问题。所以,面对这个不同寻常却异乎成熟的问题,Oracle感到欣喜并认真回复了他:你的问题很有深度很成熟,因为只有不断地去深入理解才有可能不断地提高水平。并且Oracle为了鼓励这位执着的程序员,把10条关于嵌入式软件开发测试的秘诀告诉了他:

    1.懂得使用工具

    2.尽早发现内存问题

    3.深入理解代码优化

    4.不要让自己大海捞针

    5.重现并隔离问题

    6.以退为进

    7.确定测试的完整性

    8.提高代码质量意味着节省时间

    9.发现它,分析它,解决它

    10.利用初学者的思维

    这十条秘诀在业界广为流传,使很多人受益。本文围绕这十条秘诀展开论述。

    1.懂得使用工具

    通常嵌入式系统对可靠性的要求比较高。嵌入式系统安全性的失效可能会导致灾难性的后果,即使是非安全性系统,由于大批量生产也会导致严重的经济损失。这就要求对嵌入式系统,包括嵌入式软件进行严格的测试、确认和验证。随着越来越多的领域使用软件和微处理器控制各种嵌入式设备,对门益复杂的嵌入式软件进行快速有效的测试愈加显得重要。

    就象修车需要工具一样,好的程序员应该能够熟练运用各种软件工具。不同的工具,有不同的使用范围,有不同的功能。使用这些工具,你可以看到你的系统在干些什么,它又占用什么资源,它到底和哪些外界的东西打交道。让你郁闷好几天的问题可能通过某个工具就能轻松搞定,可惜你就是不知道。那么为什么那么多的人总是在折腾个半死之后才想到要用测试工具呢?原因很多,主要有两个。一个是害怕,另一个是惰性。害怕是因为加入测试用具或测试模块到代码需要技巧同时有可能引入新的错误,所以他们总喜欢寄希望于通过不断地修改重编译代码来消除bug,结果却无济于事。懒惰是因为他们习惯了使用printf之类的简单测试手段。下面来介绍一些嵌入式常用的测试工具。

    .源码级调试器[Source-level Debugger]

    这种调试器一般提供单步或多步调试、断点设置、内存检测、变量查看等功能,是嵌入式调试最根本有效的调试方法。比如VxWorks TornadoII提供的gdb就属于这一种。

    .简单实用的打印显示工具[printf]

    printf或其它类似的打印显示工具估计是最灵活最简单的调试工具。打印代码执行过程中的各种变量可以让你知道代码执行的情况。但是,printf对正常的代码执行干扰比较大(一般printf占用CPU比较长的时间),需要慎重使用,最好设置打印开关来控制打印。

    .ICE或JTAG调试器[In-circuit Emulator]

    ICE是用来仿真CPU核心的设备,它可以在不干扰运算器的正常运行情况下,实时的检测CPU的内部工作情况。像桌面调试软件所提供的:复杂的条件断点、先进的实时跟踪、性能分析和端口分析这些功能,它也都能提供。ICE一般都有一个比较特殊的CPU,称为外合(bond-out)CPU。这是一种被打开了封装的CPU,并且通过特殊的连接,可以访问到CPU的内部信号,而这些信号,在CPU被封装时,是没法“看到”的。当和工作站上强大的调试软件联合使用时,ICE就能提供你所能找到的最全面的调试功能。但ICE同样有一些缺点:昂贵;不能全速工作;同样,并不是所有的CPU都可以作为外合CPU的,从另一个角度说,这些外合CPU也不大可能及时的被新出的CPU所更换。JTAG(Joint Test Action Group)虽然它最初开发出来是为了监测IC和电路连接,但是这种串行接口扩展了用途,包括对调试的支持。AD公司为Blackfin设计的Visual Dsp++就支持高速的JTAG调试。

    .ROM监视器[ROM Monitor]

    ROM监控器是一小程序,驻留在嵌入系统ROM中,通过串行的或网络的连接和运行在工作站上的调试软件通信。这是一种便宜的方式,当然也是最低端的技术。它除了要求一个通信端口和少量的内存空间外,不需要其它任何专门的硬件。并提供了如下功能:下载代码、运行控制、断点、单步步进、以及观察、修改寄存器和内存。因为ROM监控器是操作软件的一部分,只有当你的应用程序运行时,它才会工作。如果你想检查CPU和应用程序的状态,你就必须停下应用程序,再次进入ROM监控器。

    .Data监视器[Data Monitor]

    这种监视器在不停止CPU运行的情况下不仅可以显示指定变量内容,还可以收集并以图形形式显示各个变量的变化过程。

    .OS监视器[Operating System Monitor]

    操作系统监视器可以显示诸如任务切换、信号量收发、中断等事件。一方面,这些监视器能够为你呈现事件之间的关系和时间联系;另一方面,还可以提供对信号量优先级反转、死锁和中断延时等问题的诊断。

    .性能分析工具[Profiler]

    可以用来测试CPU到底耗在那里。profiler工具可以让你知道系统的瓶颈在那里、CPU的使用率以及需要优化的地方。

    .内存测试工具[Memory Teseter]

    可以找到内存使用的问题所在,比如内存泄露、内存碎片、内存崩溃等问题。如果发现系统出现一些不可预知的或间歇性的问题,就应该使用内存测试工具测测看。

    .运行跟踪器[Execution Tracer]

    可以显示CPU执行了哪些函数、谁在调用、参数是什么、何时调用等情况。这种工具主要用于测试代码逻辑,可以在大量的事件中发现异常的那些。

    .覆盖工具[Coverage Tester]

    主要显示CPU具体执行了那些代码,并让你知道那些代码分支没有被执行到。这样有助于提高代码质量并消除无用代码。

    .GUI测试工具[GUI Tester]

    很多嵌入式应用带有某种形式的图形用户界面进行交互,有些系统性能测试足根掘用户输入响应时间进行的。GUI测试工具可以作为脚本工具有开发环境中运行测试用例,其功能包括对操作的记录和回放、抓取屏幕显示供以后分析和比较、设置和管理测试过程(Rational公司的robot和Mercury的Loadrunner工具是杰出的代表)。很多嵌入式设备没有GUI,但常常可以对嵌入式设备进行插装来运行GUI测试脚本,虽然这种方式可能要求对被测代码进行更改,但是节省了功能测试和回归测试的时间。

    .自制工具[Home-made tester]

    在嵌入式应用中,有时候为了特定的目的,需要自行编写一些工具来达到某种测试目的。本人曾经编写的视频流录显工具在测试视频会议数据流向和变化上帮了大忙,帮公司找到了几个隐藏很深的bug。

    2.尽早发现内存问题

    内存问题危害很大,不容易排查,主要有三种类型:内存泄露、内存碎片和内存崩溃。对于内存问题态度必须要明确,那就是早发现早“治疗”。在软件设计中,内存泄露的“名气”最大,主要由于不断分配的内存无法及时地被释放,久而久之,系统的内存耗尽。即使细心的编程老手有时后也会遭遇内存泄露问题。有测试过内存泄露的朋友估计都有深刻地体验,那就是内存泄露问题一般隐藏很深,很难通过代码阅读来发现。有些内存泄露甚至可能出现在库当中。有可能这本身是库中的bug,也有可能是因为程序员没有正确理解它们的接口说明文档造成错用。

    在很多时候,大多数的内存泄露问题无法探测,但可能表现为随机的故障。程序员们往往会把这种现象怪罪于硬件问题。如果用户对系统稳定性不是很高,那么重启系统问题也不大;但,如果用户对系统稳定很高,那么这种故障就有可能使用户对产品失去信心,同时也意味着你的项目是个失败的项目。由于内存泄露危害巨大,现在已经有许多工具来解决这个问题。这些工具通过查找没有引用或重复使用的代码块、垃圾内存收集、库跟踪等技术来发现内存泄露的问题。每个工具都有利有弊,不过总的来说,用要比不用好。总之,负责的开发人员应该去测试内存泄露的问题,做到防患于未然。

    内存碎片比内存泄露隐藏还要深。随着内存的不断分配并释放,大块内存不断分解为小块内存,从而形成碎片,久而久之,当需要申请大块内存是,有可能就会失败。如果系统内存够大,那么坚持的时间会长一些,但最终还是逃不出分配失败的厄运。在使用动态分配的系统中,内存碎片经常发生。目前,解决这个问题最效的方法就是使用工具通过显示系统中内存的使用情况来发现谁是导致内存碎片的罪魁祸首,然后改进相应的部分。

    由于动态内存管理的种种问题,在嵌入式应用中,很多公司干脆就禁用malloc/free的以绝后患。

    内存崩溃是内存使用最严重的结果,主要原因有数组访问越界、写已经释放的内存、指针计算错误、访问堆栈地址越界等等。这种内存崩溃造成系统故障是随机的,而且很难查找,目前提供用于排查的工具也很少。

    总之,如果要使用内存管理单元的话,必须要小心,并严格遵守它们的使用规则,比如谁分配谁释放。

    3.深入理解代码优化

    讲到系统稳定性,人们更多地会想到实时性和速度,因为代码效率对嵌入式系统来说太重要了。知道怎么优化代码是每个嵌入式软件开发人员必须具备的技能。就象女孩子减肥一样,起码知道她哪个地方最需要减,才能去购买减肥药或器材来减掉它。可见,代码优化的前提是找到真正需要优化的地方,然后对症下药,优化相应部分的代码。前面提到的profile(性能分析工具,一些功能齐全IDE都提供这种内置的工具)能够记录各种情况比如各个任务的CPU占用率、各个任务的优先级是否分配妥当、某个数据被拷贝了多少次、访问磁盘多少次、是否调用了网络收发的程序、测试代码是否已经关闭等等。

    但是,profile工具在分析实时系统性能方面还是有不够的地方。一方面,人们使用profile工具往往是在系统出现问题即CPU耗尽之后,而profile工具本身对CPU占用较大,所以profile对这种情况很可能不起作用。根据Heisenberg效应,任何测试手段或多或少都会改变系统运行,这个对profiler同样适用!

    总之,提高运行效率的前提是你必须要知道CPU到底干了些什么干的怎么样。

    4.不要让自己大海捞针

    大海捞针只是对调试的一种生动比喻。

    经常听到组里有人对自己正在调试的代码说shit!可以理解,因为代码不是他写的,他有足够的理由去shit bug百出的代码,只要他自己不要写出这种代码,否则有一天同组的其它人可能同样会shit他写的代码。为何会有大海捞针呢?肯定是有人把针掉到海里咯;那针为何会掉在海里呢?肯定是有人不小心或草率呗。所以当你在抱怨针那么难找的时候,你是否想过是你自己草率地丢掉的。同样,当你调试个半死的时候,你是否想过你要好好反省一下当初为了寻求捷径可能没有严格地遵守好的编码设计规范、没有检测一些假设条件或算法的正确性、没有将一些可能存在问题的代码打上记号呢?关于如何写高质量请参考林锐的《高质量c++/c编程指南》或《关于C的0x8本“经书”》。

    如果你确实已经把针掉在海里是,为了防止在找到之前刺到自己,你必须要做一些防范工作,比如戴上安全手套。同样,为了尽能地暴露和捕捉问题根源,我们可以设计比较全面的错误跟踪代码。怎么来做呢?尽可能对每个函数调用失败作出处理,尽可能检测每个参数输入输出的有效性包括指针以及检测是否过多或过少地调用某个过程。错误跟踪能够让你知道你大概把针掉在哪个位置。

    5.重现并隔离问题

    如果你不是把针掉在大海了,而是掉在草堆里,那要好办写。因为至少我们可以把草堆分成很多块,一块一块的找。对于模块独立的大型项目,使用隔离方法往往是对付那些隐藏极深bug的最后方法。如果问题的出现是间歇性的,我们有必要设法去重现它并记录使其重现的整个过程以备在下一次可以利用这些条件去重现问题。如果你确信可以使用记录的那些条件去重现问题,那么我们就可以着手去隔离问题。怎么隔离呢?我们可以用#ifdef把一些可能和问题无关的代码关闭,把系统最小化到仍能够重现问题的地步。如果还是无法定位问题所在,那么有必要打开“工具箱”了。可以试着用ICE或数据监视器去查看某个可疑变量的变化;可以使用跟踪工具获得函数调用的情况包括参数的传递;检查内存是否崩溃以及堆栈溢出的问题。

    6.以退为进

    猎人为了不使自己在森林里迷路,他常常会在树木上流下一些标记,以备自己将来有一天迷路时可以根据这些标记找到出路。对过去代码的修改进行跟踪记录对将来出现问题之后的调试很有帮助。假如有一天,你最近一次修改的程序跑了很久之后忽然死掉了,那么你这时的第一反映就是我到底改动了些什么呢,因为上次修改之前是好的。那么如何检测这次相对于上次的修改呢?没错,代码控制系统SCS或称版本控制系统VCS(Concurrent Version Control,CVS是VCS的演化版本)。将上个版本check in下来后和当前测试版本比较。比较的工具可以是SCS/VCS/CVS自带的diff工具或其它功能更强的比较工具,比如BeyondCompare和ExamDiff。通过比较,记录所有改动的代码,分析所有可能导致问题的可疑代码。

    7.确定测试的完整性

    你怎么知道你的测试有多全面呢?覆盖测试(coverage testing)可以回答这个问题。覆盖测试工具可以告诉你CPU到底执行了那些代码。好的覆盖工具通常可以告诉你大概20%到40%代码没有问题,而其余的可能存在bug。覆盖工具有不同的测试级别,用户可以根据自己的需要选择某个级别。即使你很确信你的单元测试已经很全面并且没有dead code,覆盖工具还是可以为你指出一些潜在的问题,看下面的代码:

    if (i >= 0 && (almostAlwaysZero == 0 || (last = i)))

    如果almostAlwaysZero为非0,那么last=i赋值语句就被跳过,这可能不是你所期望的。这种问题通过覆盖工具的条件测试功能可以轻松的被发现。

    总之,覆盖测试对于提高代码质量很有帮助。

    8.提高代码质量意味着节省时间

    有研究表明软件开发的时间超过80%被用在下面几个方面:

    .调试自己的代码(单元测试)

    .调试自己和其他相关的代码(模块间测试)

    .调试整个系统(系统测试)

    更糟糕的是你可能需要花费10-200倍的时间来找一个bug,而这个bug在开始的时候可能很容易就能找到。一个小bug可能让你付出巨大的代价,即使这个bug对整个系统的性能没有太大的影响,但很可能会影响让那些你可以看得到的部分。所以我们必须要养成良好的编码和测试手段以求更高的代码质量,以便缩短调试的代码。

    9.发现它,分析它,解决它

    这世界没有万能的膏药。profile再强大也有力不从心的时候;内存监视器再好,也有无法发现的时候;覆盖工具再好用,也有不能覆盖的地方。一些隐藏很深的问题即使用尽所有工具也有可能无法查到其根源,这时我们能做的就是通过这些问题所表现出来的外在现象或一些数据输出来发现其中的规律或异常。一旦发现任何异常,一定要深入地理解并回溯其根源,直到解决为止。

    10.利用初学者的思维

    有人这样说过:“有些事情在初学者的脑子里可能有各种各样的情况,可在专家的头脑里可能就很单一”。有时候,有些简单的问题会被想的很复杂,有些简单的系统别设计的很复杂,就是由于你的“专家思维”。当你被问题难住时,关掉电脑,出去走走,把你的问题和你的朋友甚至你的小狗说说,或许他们可以给你意想不到的启发。

    总结:嵌入式调试也是一门艺术。就想其它的艺术一样,如果你想取得成功,你必须具备智慧、经验并懂得使用工具。只要我们能够很好地领悟Oracle这十条秘诀,我相信我们在嵌入式测试方面就能够取得成功。

  • 软件测试名词解释

    2008-02-20 10:40:57

    软件缺陷----软件中含有符合下面5 条规则之一的问题称为软件缺陷

      ◆软件未达到产品说明书标明的功能。
      ◆软件出现产品说明书指明不会出现的错误。
      ◆软件功能超出产品说明书指明的范围。
      ◆软件未达到产品说明书未指出但应达到的目标。
      ◆
    软件测试人员或用户认为软件难以理解,不易使用,运行速度缓慢等问题。

      测试案例----测试用例的别名

      黑盒测试----指测试人员通过各种输入和观察软件的各种输出结果来发现软件的缺陷,而不关心程序具体如何实现的一种测试方法。

      静态测试----指测试不运行的部分,例如测试产品说明书,对此进行检查和审阅.

      静态白盒测试-----指在不执行的条件下有条理地仔细审查软件设计,体系结构和代码,从而找出软件缺陷的过程。有时称作结构分析

      动态测试----通过运行和使用软件进行测试。

      探索测试----通常用于没有产品说明书的测试,这需要把软件当作产品说明书来看待,分步骤逐项探索软件特性,记录软件执行情况,详细描述功能,综合利用静态和动态技术来进行测试。

      等价区间----指测试相同目标或者暴露相同软件缺陷的一组测试用例.

      测试设计----提炼测试方法,明确指出设计包含的特性和相关测试。如果要求完成测试还明确指出测试案例和测试程序,指定特性通过/失败的规则。

      软件QA----QA= Quality Assessment 质量评价。防止软件缺陷称为软件QA。

      TQM 或者TQC 原理----TQM(全面质量管理)或者TQC(全面质量控制)。其原理是,用集中的质量评判团队来负责质量是不实际的,因为工作的人不负责质量,所以他们不会设法实现质量评判目的。要想制造高质量产品,需要创立从管理开始自上而下的质量意识,使全体成员共同承担质量责任。

      SQC----软件质量控制(SQC)是测试团队很常用的名称。该名称来源于制造行业,其中QC 检验员对生产线上的产品进行采样、检测,如果测试失败,他有权停掉生产线或者整个工厂。测试团队很少有这种授权。

      Murphy 法则---永远不会有足够的时间把事情做好,但是总有时间返工。软件开发小组需要遵循一个过程,花费一些时间,变得有条理,一开始就设法作对。

  • 一个相当不错的国外测试网站

    2008-02-02 10:27:06

    一个相当不错的国外测试网站,有空多学习,顺便练练English。

    http://www.sqaforum.com/ubbthreads.php

Open Toolbar