逃避不一定躲得过 面对不一定最难受 孤单不一定不快乐 得到不一定能长久 失去不一定不再有 转身不一定最软弱 别急着说别无选择

发布新日志

  • [论坛] 系统测试设计的层次[转]

    2009-12-23 22:30:47Top 1 Digest 1

  • [论坛] 成功测试管理的九大原则

    2009-10-16 08:16:40Top 1 Digest 1

  • 软件评测师考试大纲

    2008-11-24 22:44:42Top 1 Digest 1

    软件评测师考试大纲

    一、考试说明

    1.考试要求 

    (1)熟悉计算机基础知识;

    (2)熟悉操作系统、数据库、中间件、程序设计语言基础知识;

    (3)熟悉计算机网络基础知识;

    (4)熟悉软件工程知识,理解软件开发方法及过程;

    (5)熟悉软件质量及软件质量管理基础知识;

    (6)熟悉软件测试标准;

    (7)掌握软件测试技术及方法;

    (8)掌握软件测试项目管理知识;

    (9)掌握C语言及C++或Java语言程序设计技术;

    (10)了解信息化及信息安全基础知识;

    (11)熟悉知识产权相关法律、法规;

    (12)正确阅读并理解相关领域的英文资料。

    2.通过本考试的合格人员能在掌握软件工程与软件测试知识基础上,运用软件测试管理办法、软件测试策略、软件测试技术,独立承担软件测试项目;具有工程师的实际工作能力和业务水平。

    3.本考试设置的科目包括:

    (1)软件工程与软件测试基础知识,考试时间为150分钟,笔试,选择题;

    (2)软件测试应用技术,考试时间为150分钟,笔试,问答题。

     

     

    二、考试范围

     

    考试科目1:软件工程与软件测试基础知识 

    1.计算机系统基础知识

    1.1 计算机系统构成及硬件基础知识

    ·计算机系统的构成

    ·处理机

    ·基本输入输出设备

    ·存储系统

    1.2 操作系统基础知识

    ·操作系统的中断控制、进程管理、线程管理

    ·处理机管理、存储管理、设备管理、文件管理、作业管理

    ·网络操作系统和嵌入式操作系统基础知识

    ·操作系统的配置

    1.3 数据库基础知识

    ·数据库基本原理

    ·数据库管理系统的功能和特征

    ·数据库语言与编程

    1.4 中间件基础知识

    1.5 计算机网络基础知识

    ·网络分类、体系结构与网络协议

    ·常用网络设备

    ·Internet基础知识及其应用

    ·网络管理

    1.6 程序设计语言知识

    ·汇编、编译、解释系统的基础知识

    ·程序设计语言的基本成分(数据、运算、控制和传输、过程(函数)调用)

    ·面向对象程序设计

    ·各类程序设计语言的主要特点和适用情况

    ·C语言以及C++(或Java)语言程序设计基础知识

    2.标准化基础知识

    ·标准化的概念(标准化的意义、标准化的发展、标准化机构)

    ·标准的层次(国际标准、国家标准、行业标准、企业标准)

    ·标准的类别及生命周期

    3.信息安全知识

    ·信息安全基本概念

    ·计算机病毒及防范

    ·网络入侵手段及防范

    ·加密与解密机制

    4.信息化基础知识

    ·信息化相关概念

    ·与知识产权相关的法律、法规

    ·信息网络系统、信息应用系统、信息资源系统基础知识

    5.软件工程知识

    5.1 软件工程基础

    ·软件工程概念

    ·需求分析

    ·软件系统设计

    ·软件组件设计

    ·软件编码

    ·软件测试

    ·软件维护

    5.2 软件开发方法及过程

    ·结构化开发方法

    ·面向对象开发方法

    ·瀑布模型

    ·快速原型模型

    ·螺旋模型 

    5.3 软件质量管理

    ·软件质量及软件质量管理概念

    ·软件质量管理体系

    ·软件质量管理的目标、内容、方法和技术

    5.4 软件过程管理

    ·软件过程管理概念

    ·软件过程改进

    ·软件能力成熟度模型

    5.5 软件配置管理

    ·软件配置管理的意义

    ·软件配置管理的过程、方法和技术

    5.6软件开发风险基础知识

    ·风险管理

    ·风险防范及应对

    5.7 软件工程有关的标准

    ·软件工程术语

    ·计算机软件开发规范

    ·计算机软件产品开发文件编制指南

    ·计算机软件需求规范说明编制指南

    ·计算机软件测试文件编制规范

    ·计算机软件配置管理计划规范

    ·计算机软件质量保证计划规范

    ·数据流图、程序流程图、系统流程图、程序网络图和系统资源图的文件编制符号及约定

    6.软件评测师职业素质要求

    ·软件评测师职业特点与岗位职责

    ·软件评测师行为准则与职业道德要求

    ·软件评测师的能力要求

    7.软件评测知识

    7.1 软件测试基本概念

    ·软件质量与软件测试

    ·软件测试定义

    ·软件测试目的

    ·软件测试原则

    ·软件测试对象

    7.2 软件测试过程模型

    ·V模型

    ·W模型

    ·H模型

    ·测试模型的使用

    7.3 软件测试类型

    ·单元测试、集成测试、系统测试

    ·确认测试、验收测试 

    ·开发方测试、用户测试、第三方测试

    ·动态测试、静态测试

    ·白盒测试、黑盒测试、灰盒测试

    7.4 软件问题分类

    ·软件错误

    ·软件缺陷

    ·软件故障

    ·软件失效

    7.5 测试标准

    <?xml:namespace prefix=st1 ns="urn:schemas-microsoft-com:office:smarttags" />7.5.1 GB/T 16260.1 – 2003 软件工程 产品质量 第1部分:质量模型

    7.5.2 GB/T 18905.1 – 2002 软件工程 产品评价 第1部分:概述

    7.5.3 GB/T 18905.5 – 2002 软件工程 产品评价 第5部分:评价者用的过程

    8.软件评测现状与发展

    ·国内外现状

    ·软件评测发展趋势

    9.专业英语

    ·正确阅读并理解相关领域的英文资料

     

     

    考试科目2:软件测试应用技术

    1. 软件生命周期测试策略

    1.1 设计阶段的评审

    ·需求评审

    ·设计评审

    ·测试计划与设计

    1.2 开发与运行阶段的测试

    ·单元测试

    ·集成测试

    ·系统(确认)测试

    ·验收测试

    2. 测试用例设计方法

    2.1 白盒测试设计

    ·白盒测试基本技术

    ·白盒测试方法

    2.2 黑盒测试用例设计

    ·测试用例设计方法

    ·测试用例的编写

    2.3 面向对象测试用例设计

    2.4 测试方法选择的策略

    ·黑盒测试方法选择策略

    ·白盒测试方法选择策略

    ·面向对象软件的测试策略

    3. 软件测试技术与应用

    3.1 软件自动化测试

    ·软件自动化测试基本概念

    ·选择自动化测试工具

    ·功能自动化测试

    ·负载压力自动化测试

    3.2 面向对象软件的测试

    ·面向对象测试模型

    ·面向对象分析的测试

    ·面向对象设计的测试

    ·面向对象编程的测试

    ·面向对象的单元测试

    ·面向对象的集成测试

    ·面向对象的系统测试

    3.3 负载压力测试

    ·负载压力测试基本概念

    ·负载压力测试解决方案

    ·负载压力测试指标分析

    ·负载压力测试实施

    3.4 Web应用测试

    ·Web应用的测试策略

    ·Web应用设计测试

    ·Web应用开发测试

    ·Web应用运行测试

    3.5 网络测试

    ·网络系统全生命周期测试策略

    ·网络仿真技术

    ·网络性能测试

    ·网络应用测试

    3.6 安全测试

    ·测试内容

    ·测试策略

    ·测试方法

    3.7 兼容性测试

    ·硬件兼容性测试

    ·软件兼容性测试

    ·数据兼容性测试

    ·新旧系统数据迁移测试

    ·平台软件测试

    3.8 易用性测试

    ·功能易用性测试

    ·用户界面测试

    3.9 文档测试

    ·文档测试的范围

    ·用户文档的内容

    ·用户文档测试的要点

    ·用户手册的测试

    ·在线帮助的测试

    4. 测试项目管理

    ·测试过程的特性与要求

    ·软件测试与配置管理

    ·测试的组织与人员

  • [论坛] 成功测试管理的九大原则

    2010-04-07 18:54:09

    简介

       许多测试管理者是从技术部门进到管理阶层的。尽管他们有可能受过很多测试或软件工程的培训和指导,但他们还是很难经常从失败和错误中学到管理技巧。作为一个管理者,你有两项基本工作:找出为你工作的最好的员工并且建立一个能够使员工完成工作的环境(使他们最好地完成工作)。这篇文章讲述了一些我学过的关于这些管理工作的经验。

       总是那些人――帮助人们最好地完成工作

       1. 为工作雇佣最好的员工

       我遇到许多管理者,他们要雇佣的员工仅仅是他们上一个雇佣的翻版。作为一个测试管理者,你必须对你需要什么人做出评估。假设现在你的部门满是极好的探索型的测试员。如果你还要雇另一个探索型的测试员,也许比你现在的要好,但是他对你的空白领域有作用吗?也许有,也许没有。

       工作的最佳人选也许就是你现在这个小组里所没有的类型。最佳人选或许并不“适合”你通常的工作方式。作为一个测试管理者,雇佣一个最佳的员工要用发展的雇佣策略,面试时要检验他是否符合这个策略。这可以让你找到最适合这份工作的人员,他能够完成必要的工作。

       2.安排每周与你的每个小组成员在不被打扰的环境进行谈话

       最为一个测试经理,主要工作之一就是定期的评定你的组织做了些什么并且是怎样做的。你还要为你的员工做一个报告,关于充分了解他们正在做什么和他们是怎样做的,以此来给做他们正式的和非正式的工作成绩考核。如果你没有了解到每个人的动态你就不应该对你的报告满意。

       我定期地给我的小组成员每周在不被打扰的条件下做一对一的谈话。(当我管理12个员工的时候,我安排在另外一周会见另一些人)。我每周用30分钟来和每个员工谈谈他们的工作:他们工作中的问题或是意见;他们是否需要帮助,他们的表现和他们达到目标的兴奋。我一般安排一周的某天来进行一对一谈话。我事先安排出和每个人的特定时间,接下来我亲自会见他们每个人。如果我们不能把所有需要谈到的细节都包括,我们会安排另外一个时间来继续。

       许多管理者说他们没有时间在一周会见每一个员工来谈他们的工作。据我的经验,如果我不能安排时间和我的员工进行每周的谈话,他们会来打扰我的工作,因为他们无论如何还是必须要来找我。

       如果你安排和你员工的谈话,你必须减少计划外的打扰(既有他们的也有你自己的),并且更多的了解他们在做什么。当你清楚你的小组正在做的,你才能更有效率地帮助他们明确优先应该做的工作,重聚资源,重新计划工程的部分,排除障碍等等。

       3.假定员工知道如何完成他们的工作的人员

       因为很多管理者起初做的是技术工作,他们知道他们的员工现在从事的工作。他们认为他们现在知道。如果你已经管理了两三年,你也许还没有你的技术员工知道的多,尤其是怎么样完成日常工作。

       你或者你的前任者雇佣你小组的员工。假设你雇佣这些人因为你认为他们能够完成工作,如果你设想每个人都知道如何完成他们的工作,你将得到比假设他们都不知道怎么完成的更好的效果。即使有些员工在无论你设想是否都能成功完成工作,但是有些员工将会被你对他们的想法所影响工作。

       因为我知道我的员工都知道怎样做他们的工作,我给他们分派任务。问他们是否需要帮助,然后留他们独自完成(除非他们寻求帮助)。我的意思并不是你不应该在他们工作的时候和他们说话,你只是不该打扰他。打扰可以分为几种不同的形式:

       · 如果你在不知不觉的情况下来到他身后,来到他的肩膀旁边,问他:“进行的如何了?”,尤其是在他们绞尽脑汁仍不得其解时, 这将仍然不能使你对他们的要求达到。。

       · 如果你每天都问,更糟的是每个钟头都问,他们是如何做的。这看起来就像对你员工进行微机管理,很惹人烦。毕竟,你没有工作要做吗?另外, 他们会以为你认为他们不知道该如何完成工作。

       · 如果当他们没有问你意见,你说“我会用这种方法”。这种予以打击的帮助不会有用。
    .如果你不确定怎样能知道你的员工是否胜任,和每一个小组成员商讨寻求帮助的时机。每个人,包括你自己,应该选择一个规则来知道他或她什么时候成为了一个令人讨厌的家伙了。我的一个客户有一个15分钟法规。如果有人在某方面令人讨厌持续15分钟以上,他就必须停止并且和别人谈谈他的工作。

       当你分配工作时,问问你的员工是否明白该做什么,他或她是否有方法完成。确定工作进程,如果员工遇到麻烦,他应该主动找你寻求帮助,但是如果你坚决干涉,你的员工将会把找你寻求帮助作为最后的解决方法。

       4.对待你的员工要用他们能接受的方式,而不是你可以自己可以接受的方式“对待别人要用你愿意接受的方式”(己之不予,勿施于人)――这条黄金法则可能会对许多生活中的纯的社交因素有效,但是并不是总对工作有用。

       有效率的管理者知道他的每一个员工需要怎样的对待方式。当其他的人更乐意接受更多的信息。一些人去需要特定的任务和指示。一些因为解决新的,很棒的,复杂的问题而更有冲劲,但是还有一些只是对他们已经知道如何去处理的问题而感到舒服。

       另外,针对于不同的工作,我们都喜欢不同的认同方式。金钱不是表示认同的唯一方式,你可以用其他的方式来酬劳你的员工。有些人喜欢对他个人的感谢,有人乐意在公众面前的认可,一些喜欢以M﹠M方式,或者是奖励电影票,还有人希望有团队的排队来庆祝。记住无论什么的激励你的方式都不一定能激励你小组的每一个其他成员。和你的小组成员们通过讨论来了解他们每个人对奖励比较喜欢的给予方式。创造一个好的工作环境

       5.重视结果而非时间

       许多认可建立在员工完成工作的时间上,而不是他们最后的成绩上。但是,花费在工作上的时间不一定和创造性有必然的联系。如果你真的想改善对创作性和工作效率的认可的话,不妨考虑保证你员工每周只工作40个小时。 我常常听到一种表示对员工的异议就是“你整整一天什么都做不出来。”假设你自己处在一个巨大的障碍前,考虑你可以做什么来解决的时候,你是不是取消了会议?你的小组成员能否井然有序地安排他们的工作以至于能够最大限度发挥创造性?

       当人们每周工作超过40个小时的时候,他们开始在工作的时候关心他们自己的事。他们花钱,他们给很久没有联系的人打电话,因为他们一直都在工作。

       一旦你创造了一个环境,让员工在工作时间完成工作,开始鼓励他们每周不要超过40小时,接着你就可以基于他们在40个小时能够完成的工作量给他们酬劳。我总是发现这样能够提升创造力(因为员工不能在太疲劳的状态下完成工作,这是因为他们在工作时不能关心自己)。

       当你开始注意规律,不仅仅是时间,还包括更容易地给员工的表现给予精确的适度的评价。你的员工是否完成了他们的计划和测试设计?当他们开发测试的时候,他们还要修订那些他们需要的改进的部分?(如果你只是注意有多少测试可以使用,我可以重复地开展相同的测试)计划每周工作40个小时,并且为你要在这段时间完成的工作付报酬。

       6.承认自己的错误

       每个人都会犯错。他们会因为忘记开会而使客户发怒。承认你犯错是令人尴尬的。我们中的许多人认为对小组承认自己犯错会失去尊严。

       如果你不是经常犯错,你承认错误的时候其实能够赢得尊敬。如果你忘记一次会议,你为此道歉,其他的人会理解你并且最终原谅你。

       不管你做了什么,不要否认或故意忽略你的失误。故意忽略不会让错误消失这只会让错误成长为怪物。最近,有一个委托人在会上对他的员工大声斥责。会后,他认识到他不应该那样在小组会上那样做。他只是想让他们安心工作,等过几天再道歉。

       我建议在他们对他积累怒气之前,应该用正确的方式和他的员工交谈。他起初不愿意,但是他后来还是温和地在两天后和他的每个员工单独进行了交谈。每个人都是这样对他说的:“我只是在会后才对你感到生气的。如果您能够立即和我谈谈,我就不会把它们积累起来。但是现在已经两天过去了,我仍然对您感到生气,事实上,我还更加恼火,我现在不能确信现在是否能相信您。我不介意你对我们大吼,但是我不能确定是否还会再这样做。

       我的客户不知道应该如何处理这种情况。他认为他的等待是正确的,但是却让问题变得更加严重。.他已经决定再也不会犯这样的错误了,而且会立刻和会员工交流。

       他的员工用了好几个月来重新相信他,但是我的这位客户的确通过承认过错而增加了他的个人魅力。现在,他和他的员工对这件事可以当做是玩笑来说。他们说这是他的认知和能力的巨大转折点。
       7.决定承担一个项目必须首先问你的组员是否有能力完成当你是一个下级的员工,你的老板对你说“我们是否可以在下个十月完成项目?”回答说“当然”会令人惊讶。但是,你的员工会因为你回答“我要考虑一下。”而表示赞赏。

       即使你已经在考虑这个问题,告诉了你的员工你们将来做它,你还是应该得到足够的信息来考虑。你应该从这几方面来看:

       ·一段时间内,你也许会因为另一件工作而感到对这个问题迷惑。

       · 也许有你正被其它需要考虑的问题所累,因为你不再有相同的时间像你第一次看到它的时候。

       · 如果你“训练”你的上司让你的回答有漏洞,你的上司会继续给你让你回答他的压力。

       当你与你的员工在做决定之前讨论问题时,你应该把这些和他们说一说:

       · 我想知道是什么让你想做这个项目。

       · 我不怕告诉我的上司要怎么处置它。

       在决定做一个项目之前先好好做考虑是一种对你员工的尊重。另外,考虑他们的想法也会使你从他们那里赢得尊重和忠诚。

       8.计划定期的培训

       作为管理学的一部分,测试是一种挑战和对规则的经常性的改变。因为经常的改变,要制定定期的培训计划。如果你没有基于不断的变化而培训你的员工,你就会有损失。

       培训可以是关于特定项目或者是技术。你可以进行训练用不同的方法:

       · 提供一个简单的午餐,让每个你的每个组员讨论一个特定的领域。这特别对同时要做很多不同项目的小组有用。当每个人做不同的项目,这会有助于每个人了解你小组所有的工程。

       · 做一个对每个部门的阶段说明。无论幸运与否,每个部门都会有和你小组相仿的工作,但是一般来说其它部门都不知道另外的部门在做什么。

       · 如果你们有交叉利益的小组,你可以让两个小组都展现他们各自为公司所作的项目,或者只是针对你的测试小组。

       · 邀请外面的专家来讲一个特定的技术或者一种项目。这些专家或者是专业的顾问,善演讲的人,也或是一个博学的朋友或同事。

       · 如果你买了工具或者已经进行了培训,考虑组织一个内部的“使用者”会议。人们可以在那里分享他们使用这种工具的感受并且讨论它的问题,优点和恶作剧。这特别对有缺陷的追踪系统和构造管理系统有效果。

       9.计划测试

       作为一个测试经理,你不可能有时间去做所有你想做的事。所以,计划你和你小组能做什么。作为测试经理,首先应该确定自己的任务,是在发布之前找到大的缺陷?还是评估软件的状态?或者是帮助开发经理在发布之前做风险评估?你的任务有可能是其中一项又或者是其中几项结合。无论是怎样,在进入的玩命工作时期之前, 对测试进行计划, 你组里的每个人都要竭尽全力你不需要做所有的事。你不是对所有事都计划而是精简,你就会有时间, 然后你就可以计算出你能再做什么。

       测试的计划是对每个产品或是对各个开发阶段的产品开展测试的策略。测试要多严格?什么测试不用进行?你在测试里要用硬件和软件的那些组合?什么样的组合不能作为彻底的,可能的,在所有的测试里都运用到的。

       测试是一种危险的评估。你和你项目里的其它成员能够进一步做出决定:你乐意对产品的测试部分和非测试部分冒多大的的险?

       一旦你决定要测试什么,对每个产品发展发布标准。发布标准是对每一项发布挑剔的重要性评判的客观的标准。“如果那样将会不错”不是步伐标准。“如果不那样做客户将会置我们于死地”才是发布标准的组成部分。

       如果你计划一个测试并和你的组员一起开展项目, 你不能一直只扮演一个守门人的角色。你无须停止准许运用.你和你的项目小组或者你和项目经理一起制定评判的标准。当你们都通过了这些标准,就可以交货了。加入你们没有达成共识 ,诚实的,决定你下一步该做什么。我所有做过的项目当中,我们都必须对发布标准达成共识,所以我们为此一直工作.一些客户提出了很苛刻的标准,我们最后也达成了共识。他们更换了文件当中的发布标准,

       解释他们在项目小组里的位置, 并且支配管理, 最后交接工作。
  • 软件测试的心理学问题

    2009-06-03 10:16:29

  • 如何成为优秀的测试员(2)

    2009-06-03 10:14:04

    如何成为优秀的测试员

    作为一名出色的测试员可以带来更多的商业价值,起到关键性作用,本文提出了一些成为优秀测试员的实践建议,这些建议源于我对许多掌握专业技术备受尊敬的测试员的观察,这些建议可以帮助你提高效力和效率。你可以选择一些目前可以实施的实践方法来成为优秀的测试员,你在这里可以学到:

    一 .针对不同背景的测试

    二 .使用启发式模型关注重要的测试特征而不会遗漏核心元素

    三 .掌握你所需要的技术和技能来提高你的专业水平

    四 .知道有时候一个好问题比正确的答案更重要

    测试新手和专家之间的区别在哪里?你的工作中有什么可以为公司带来价值,加快生产速度?本文讲述了如何成为优秀的测试员,企业需要怎样的测试人才。

    1.更好的测试基于背景驱动(Context-Driven)

    想要把测试做得更好需要思考,你必须考虑怎样才是基于目前情况下最好的测试,而不是简单重复以前的测试或是盲目模仿一些最佳实践,某种情况下最好的测试方法放在其它情况下也许是最糟糕的方法。

    2.更好的测试基于模型(Model-Based)

    模型可以激发你的灵感来确保对基本元素的最大限度测试覆盖,测试专家都有很好的模型来引导他们很快开始有效的测试,你的测试专业技术很大程度上依赖于你所掌握的测试模型执行能力。

    3.更好的测试需要精通测试技术

    如果你所拥有的唯一工具是锤子,那么所有的东西看起来都像是钉子。如果选择正确的工具那么工作就会变得容易很多,学习最好的实践就是去精通测试技术。

    4.更好的测试需要实践来提高技能

    我们的孩子去到球场提高他们的运动技能,没有持续的锻炼他们不能掌握娴熟的技能来提高竞争能力,测试也是如此。没有不断的实践我们不能提高自己的技能,实践是提高技能的有效方法。

    5.好的问题有时候比正确的答案更重要

    测试中的一个危险就在于我们浪费了太多时间去回答错误的问题,如果有人问你“可以像上次那样测试吗?”,回答“可以”很容易,但是,更好的问题是“我可以比上次做得更好吗?”学会对任何事情提问,至少在你的脑子里这么做。

    6.更好的测试不仅仅需要技术和技能

    知道了怎样测试还不够,我们是与人和组织一起工作。要想在团队中起到重要作用我们必须提高自己的交流能力和领导才能,学会如何与别人共事可以让你想做的事情办起来更容易。

    7.更好的测试结果源于对客户更好的了解

    我们如果对客户和行业领域了解得越多,我们就可以更好地确保交付的软件适合他们使用。

    8.更好的测试基于背景驱动(Context-Driven)

    想要把测试做得更好需要思考,你必须考虑怎样才是基于目前情况下最好的测试,而不是简单重复以前的测试或是盲目模仿一些最佳实践,某种情况下最好的测试方法放在其它情况下也许是最糟糕的方法。如果你要突破普通测试员的境界而成为优秀的测试员,那么背景驱动方法是必须的。你需要考虑资源、技术、时间、目标和人员。如果你的每次测试都用“一成不变”(注:原文是 one-size-fits-all)的方法只会对项目造成损害,大多数“一成不变”的方法都不适合个别化的项目,考虑一下以下内容:

    哪个更好?

    A.回归测试针对两个不同版本之间的改动

    B.最低限度的回归测试获得最少数量的测试用例覆盖

    C.回归测试只针对改动部分

    哪个更好?

    A.自动化测试或者

    B.手工的探索测试

    哪个更好?

    A.正常操作测试(软件可靠性工程)

    B.攻击测试

    哪个更好?

    A.测试完成标准是没有严重缺陷并且所有的低级别缺陷都有相应解决方法,所有的测试用例都执行过并且80%以上成功

    B.测试完成标准由团队基于ODC数据,缺陷数据和其它相关信息共同来做出最后决定

    每个问题的答案都需要知道基于什么情况,哪种方式的回归测试最好需要了解以下情况:

    a).有多少时间来执行测试?

    b).都有哪些测试用例?

    c).代码改动所涉及的范围和复杂程度是什么?

    d).下一次测试什么时候执行?

    e).谁会用到测试后的代码?

    f).这些代码修改的历史记录是什么?重要性如何?可能会在哪里用到?

    没有相关背景很难判断技术、实践和过程的价值。正如 James Bach所说,评定测试活动是好是坏以及成为一名优秀的测试员的关键就是提出背景设置问题,下面是一些背景设置问题的简单样列,这些都是测试中需要考虑的。

    a).限制条件有哪些?(人员、预算、资源、技术、进度、过程等)

    b).目标、目的和期望是什么?

    c).“成功”的含义是什么?

    d).“质量”的含义是什么?

    e).项目环境是什么?(产品,工具,配置,技术程度、态度、团队等)

    f).什么人做这项工作?我要怎样合理利用他们?

    g).什么人参与进来?他们的重要性怎样?

    h).什么测试过程和技术用起来会最好?

    i).有什么可以使用?

    j).有什么可以选择?

  • 怎样成为优秀 软件测试员(1)

    2009-06-03 10:11:16

    怎样成为优秀 软件测试员

     

    软件测试员的目标是找出软件缺陷,尽可能早一些。
    软件测试员的一个基本素质是:打破沙锅问到底。
    大多数软件测试员应具备的素质:
    1.探索精神:软件测试员不会害怕进入陌生环境。 有较强的学习能力,可以用最快的速度成为一个新的行业的专家。

    2.故障排除能手:软件测试员善于发现问题的症结,喜欢猜谜。可以迅速的通过事物的表面现象发现事物的本质,能够从琐碎的现象中发现内部的联系和规律。

    3.不懈努力:软件测试员总是不停尝试。他们可能会碰到转瞬即逝或者难以重建的软件缺陷;他们不会心存侥幸,而是尽一切可能去寻找。 只要出现过的缺陷,就说明一定是存在的,找不到只能说明没有能够真的重新当时的环境和全部的操作细节。测试人员要能够敏感的察觉到细微的变化,并立即开始在大脑中努力重现之前的整个场景。把残存的瞬间记忆整理在纸上,通过分析,把这些碎片整理起来,最终找到缺陷重现的场景和规律。牢记:在做这样的事情之前给自己制定一个规则,例如只花费N多时间来努力重现这个缺陷,如果超过这个时限还没有找到,那么就把当前的工作整理成一份文档保留下来,然后去按计划继续进行下面的工作,直到再次“偶遇”这个缺陷。

    4.创造性:测试显而易见的事实,那不是软件测试员;他们的工作是想出富有创意甚至超常的手段来寻找软件缺陷。 虽然创造性是必需的,但是还是更建议把大多数时间放在熟悉真实用户的工作上,测试的基础是现实中已经存在的场景,在冥思苦想新的场景的时候,先同用户沟通一下,试图发现一些新的场景效率会更高一些。有很多事实并不是那么显而易见。

    5.追求完美:他们力求完美,但是知道某些无法企及时,不去苛求,而是尽力接近目标。 做任何事情都应当有一个策略,分配给每项任务一个指标或者一部分资源(也就是说如果这件事情成功,那么它带来的收益值得我们付出的最大成本),当这部分资源耗尽时,就停止这项任务。

    6.判断准确:软件测试员要决定测试内容、测试时间,以及看到的问题是否算作真正的缺陷。 要不断的提高自己的专业素养,除了行业知识、测试专业知识以外,还要尽可能的去学习一些软件行业的基础知识,例如操作系统、数据库、程序设计开发、计算机网络等。

    7.老练稳重:软件测试员不害怕坏消息。 其实做任何工作、任何事情都一样,人生就是一个不断的发现问题和解决问题的过程,没什么好怕的。

    8.说服力:软件测试员要善于表达观点,表明软件缺陷为何必须修复,并通过实际演示力陈观点。 测试工作开展的好坏,很大程度上就靠沟通能力和展示自己工作的能力了。

    9.在编程方面受过教育。 一个有过开发经历的测试人员,对系统的领悟能力和学习速度同没有开发经历的测试人员是截然不同的。

  • 论单元测试

    2009-06-03 10:08:30

    论单元测试

    软件测试是保证软件产品质量的重要手段之一。它是测量、评估软件产品特点和能力的活动。现在,国内一些软件企业对于软件测试的重视程度还很不够,认为测试工作非常简单,只是简单地操作所测的软件产品而已。这种错误的思想严重影响了国内软件质量,应该引起我们的高度重视。  软件测试阶段可以分为若干个小的阶段,阶段的划分有多种,我现在按流程顺序将其分为四个阶段:
      * 单元测试:由项目小组完成
      * 集成测试:由项目小组完成
      * 系统测试:由专业测试小组完成
      * 交接测试:用户和开发商共同完成。
      测试的四个阶段完全逆向检测了软件开发的各个阶段。单元测试主要是测试程序代码,集成测试主要是对设计的检测,系统测试主要测试了软件的功能,交接测试主要是对用户需求的一种检测。但是每个测试阶段仍要对其它测试阶段的测试内容加以测试,只是测试重点不同。
      在这篇文章中,我只对单元测试流程加以阐述,而不涉及具体的测试方法。关于测试方法(如:使用手工测试还是自动测试)若有机会将在其它文章中进行阐述。
      在单元测试前,先让我们明白以下几个问题,这可以使我们对单元测试更加清晰。
      * 单元测试的目标: 确保模块被正确地编码
      * 由谁去做:    通常由程序人员测试
      * 怎样去测试:   功能测试可以用黑匣测试方法,代码测试可用白   匣测试方法  
      * 什么时候可以停止:当程序员感到代码没有缺陷时
      * 记录:      通常没有记录   我们在清楚以上问题后就可以编写测试用例了。测试用例是输入、执行条件和一个特殊目标所开发的预期结果集合。它按测试目的不同可分为以下几种类型:
      * 需求测试用例:测试是否符合需求规范
      * 设计测试用例:测试是否符合系统逻辑结构
      * 代码测试用例:测试代码的逻辑结构和使用的数据  需求测试用例通常是按照需求执行的功能逐条地编写输入数据和期望输出。一个好的需求用例是可以用少量的测试用例就能够覆盖所有的程序功能。  设计测试用例检测的是代码和设计是否完全相符。是对底层设计和基本结构上的测试。设计测试用例可以涉及到需求测试用例没有覆盖到的代码空间(例如界面的设计)。  代码测试用例是基于运行软件和数据结构上的。它要保证可以覆盖所有的程序分支、最小的语句和输出。
      
      以上三种用例所用的数据又可分为正常数据、边缘数据和错误数据。
      *正常数据:在测试中所用的正常数据的量是最大的,而且也是最关键的。少量的测试数据不能完全覆盖需求,但我们要从中提取出一些具有高度代表性的数据作为测试数据,以减少测试时间。 
      *边缘数据:边缘测试是界于正常数据和错误数据之间的一种数据。它可以针对某一种编程语言、编程环境或特定的数据库而专门设定。例如若使用SQL Server数据库,则可把SQL Server关键字(如:';AS;Join等)设为边缘数据。其它边缘数据还有:HTML的HTML;<>等关键字以及空格、@、负数、超长字符等。边缘数据要靠测试人员的丰富经验来制定。
         
      *错误数据:显而易见,错误数据就是编写与程序输入规范不符的数据从而检测输入筛选、错误处理等程序的分支。
      由于执行测试用例的数据量巨大以及还要进行回归测试,所以可以考虑使用自动测试工具,但提取测试数据仍要依靠编写测试用例人员的经验。并且,我们还要注意到自动测试也许不能找到程序中所有错误,手动测试所找到的错误会比自动测试所找到的要多。  有了测试用例,我们就可以进行测试了吧?许多公司也是这样做的,但在这里我建议大家最好要先进行代码的审议。通过代码审议找到的错误可以比测试用例测试所能找到的错误更加深入,并且发现错误的时间也比测试用例要早。代码审议要以代码标准(根各公司具体情况自行制定)为依据,一般情况下要检查以下几点:
      * 代码风格和规则审核
      * 程序设计和结构的审核
      * 业务逻辑的审核
      代码风格和规则的审核是在每个程序员完成一个模块或类的 时候要进行编码规范的检查。要召开审核会议让所有的项目组人员都参加。在会前项目经理要做一个检查表,以表的内容为检查依据,检查表的内容主要是检查的要点。在审核会上项目组的每一个人员都能看到自己和其他人员的编码问题,从而起到预防的作用。这些问题都要被解决,并且解决的结果要在审议会上被确认。  进行程序设计和结构的审议是因为开发工具的不同和项目时间的限制而造成设计不详细。比较深入的设计通常是在编码阶段完成的,但由于程序人员和设计人员的经验是不同的,所以会出现很大的问题。我们引入了程序设计和结构审核来保证质量。审核人员要有先进的技术开发经验。在审核之前也要一个审核列表,列出主要几项,如:程序的概要、详细设计。但仅局限于列表是不够的,审议人员 还要审议程序的精巧度和具有创造力的方面,这只能靠经验而不能只靠列表中的内容来审议。对于不同的程序员所检测代码的宽度和深度也是不同的。项目经理可以根据程序员经验的不同制定被审议人员的宽度和深度。例如:年轻的程序员要审议所有代码。但有经验的就可适当减少。  业务逻辑性审议必须要在代码完成后审议。业务逻辑审议实际上是审议单元模块的功能。这些功能是以系统说明为依据的。审议人员要有开发的经验并且对系统也要熟悉。审议人员通过执行程序从而了解底层代码的状态。这阶段的审议实际也包含了前两种审议,因为审议者也可以通过最后的结果检测单元模块设计和结构的准确性。  以上三种审议都要耗费一定的时间和资源,但是它却能更早地发现和解决不易显现的错误。  审议通过后,我们终于可以使用用例来进行代码测试和调试了。代码的调试是用来保证程序能按照系统需求正常运行的一种手段。但是我所提到的这种代码调试并不是简单的调试,它要包括以下两部分:
      * 特征调试
      * 代码覆盖调试  首先我们要先进行特征 调试。它是通过运行程序找到代码中的错误,这与我们平时常进行的调试相同。到程序能运行后,我们可使用已编好的三种类型的用例并以正常数据测试用例进行测试,若不能正常运行则要用调试工具调试。在这阶段,我们要用大量正常数据去测试。测试后,该程序应可在绝大多数的正常数据中运行。  其次,我们要进行代码覆盖测试,一直要达到以下目标为至:
      * 测试到每一个最小语句的代码
      * 测试到所有的输出结果
      我们应该通过一步步的调试去运行每个程序的所有语句和分支。如果我们想要百分之百地覆盖就应适当运用边缘数据和错误数据。测试在这个阶段的质量是难以掌握的。它基于程序员的责任心和经验。当这阶段完成后,每个程序员所测的深度也是不同的。因此,在这个测试阶段之前,项目经理(或测试工程师)应制定出测试指导和计划书。它们至少应包括以下内容:
      * 测试的主要对象
      * 主要调试点
      * 怎样测试
      * 什么时候可以完成  至今为至,我们已完成了代码的审议和调试。如果我们是严格按照以上步骤做的,那就可以保证代码没有太多的错误,至少没有使程序运行中断的错误了。如果我们不能很好地执行代码审议和正确的调试,那我们就不能顺利地通过测试,有时我们还要不得不返回来做这些事。     好了,我们终于完成了单元测试的工作,程序员们可以喘口气了,但不要忘记还有更加严格的集成测试要我们去做。呵呵

  • [论坛] 软件测试从零开始

    2009-04-04 07:44:36

  • [论坛] 用TestDirector生成的测试用例

    2009-03-01 22:42:48

    TestDirector生成的测试用例

    TestDirector生成的测试用例有两种样式:Full PageTabular

    TestDirector中没有关于测试用例的目的,以该用例的前提条件等字段,因此可以在客户化时增加这些字段,由于客户化字段没有Memo类型,因此,可以将用例的目的和前提条件等在描述字段中进行描述,注意事项等也可以在此描述,如果有测试数据的话,可以在描述字段中对测试数据进行描述,具体的测试数据以文本或Excel方式保存,作为该测试用例的附件。

     

    样式一:Full Page

    1.1  用例名称 : 启动客户端程序 

    路径 :

    主题 : 服务程序

    设计状态 : Design

    设计者 : maggie

    创建日期 : 2002-06-11

    用例类型 : MANUAL

    描述 : 目的:

       1. 检查服务程序能否以设计的五种方式正确启动客户端程序

          1.1. 菜单启动

          1.2. 快捷键启动

          1.3. 鼠标双击启动

          1.4. 定时启动

          1.5. 隔时启动

     

    前提条件:

       1. 服务程序已经运行;

       2. 客户端程序尚未运行;

     

    估计开发时间 : 0

    执行状态 : Passed

    Steps :

    Step Name : Step 1 

    Description : 运行服务程序Server.exe

    Expected Result : 1. 服务程序运行;

    2. 服务程序在系统托盘中显示为图标;

    Step Name : Step 2 

    Description : 1. 在服务程序图标上单击右键;

    2. 在弹出的悬浮菜单中选择【启动在线升级程序】;

    Expected Result : 1. 弹出悬浮菜单,包括【启动在线升级程序】、【启动定时服务】、【启动隔时服务】和【关闭服务程序】四个菜单项;

    2.1 如果柜台系统需要更新,则弹出窗口提示是否更新,选择“Yes”按钮则启动客户端程序进行更新,选择“No”则关闭提示窗口;

    2.2 如果柜台系统不需要更新,则弹出窗口提示不需要更新,点击“OK”按钮关闭提示窗口;

    3 服务程序下载version.txt并生成DownLoadList.ini文件到服务端程序的安装目录下的 temp 目录中;

    4 version.txt文件的内容与服务器端的version.txt文件的内容一样;

    5 服务程序根据version.txt文件的内容与本地对应的文件进行比较,将需要升级的文件生成下载清单DownLoadList.ini

    6 如果需要更新并确定要更新,则下载更新文件并解压缩到Download目录中;

    Step Name : Step 3 

    Description : 双击服务程序图标

    Expected Result : 1 如果柜台系统需要更新,则弹出窗口提示是否更新,选择“Yes”按钮则启动客户端程序进行更新,选择“No”则关闭提示窗口;

    2 如果柜台系统不需要更新,则弹出窗口提示不需要更新,点击“OK”按钮关闭提示窗口;

    3 服务程序下载version.txt并生成DownLoadList.ini文件到服务端程序的安装目录下的 temp 目录中;

    4 version.txt文件的内容与服务器端的version.txt文件的内容一样;

    5 服务程序根据version.txt文件的内容与本地对应的文件进行比较,将需要升级的文件生成下载清单DownLoadList.ini

    6 如果需要更新并确定要更新,则下载更新文件并解压缩到Download目录中;

    Step Name : Step 4 

    Description : 按启动服务快捷键(Ctrl + F12

    Expected Result : 1 如果柜台系统需要更新,则弹出窗口提示是否更新,选择“Yes”按钮则启动客户端程序进行更新,选择“No”则关闭提示窗口;

    2 如果柜台系统不需要更新,则弹出窗口提示不需要更新,点击“OK”按钮关闭提示窗口;

    3 服务程序下载version.txt并生成DownLoadList.ini文件到服务端程序的安装目录下的 temp 目录中;

    4 version.txt文件的内容与服务器端的version.txt文件的内容一样;

    5 服务程序根据version.txt文件的内容与本地对应的文件进行比较,将需要升级的文件生成下载清单DownLoadList.ini

    6 如果需要更新并确定要更新,则下载更新文件并解压缩到Download目录中;

    Step Name : Step 5 

    Description : 修改配置文件Config.ini中的定时启动时间(SpecifyTime

    Expected Result : 1. 到启动时间后,如果柜台系统需要更新,则弹出窗口提示是否更新,选择“Yes”按钮则启动客户端程序进行更新,选择“No”则关闭提示窗口;

    2. 到启动时间后,如果柜台系统不需要更新,则弹出窗口提示不需要更新,点击“OK”按钮关闭提示窗口;

    3 服务程序下载version.txt并生成DownLoadList.ini文件到服务端程序的安装目录下的 temp 目录中;

    4 version.txt文件的内容与服务器端的version.txt文件的内容一样;

    5 服务程序根据version.txt文件的内容与本地对应的文件进行比较,将需要升级的文件生成下载清单DownLoadList.ini

    6 如果需要更新并确定要更新,则下载更新文件并解压缩到Download目录中;

    Step Name : Step 6 

    Description : 修改配置文件Config.ini中的隔时启动时间长度(IntervalTime

    Expected Result : 1. 每间隔隔时启动时间长度后,如果柜台系统需要更新,则弹出窗口提示是否更新,选择“Yes”按钮则启动客户端程序进行更新,选择“No”则关闭提示窗口;

    2.  每间隔隔时启动时间长度后,如果柜台系统不需要更新,则弹出窗口提示不需要更新,点击“OK”按钮关闭提示窗口;

    3. 如果尚未对上一次的提示进行操作,而在此之间,升级状态发生了变化,到新一次隔时启动时间长度后,正确显示提示信息;

    4 服务程序下载version.txt并生成DownLoadList.ini文件到服务端程序的安装目录下的 temp 目录中;

    5 version.txt文件的内容与服务器端的version.txt文件的内容一样;

    6 服务程序根据version.txt文件的内容与本地对应的文件进行比较,将需要升级的文件生成下载清单DownLoadList.ini

    7 如果需要更新并确定要更新,则下载更新文件并解压缩到Download目录中;

     

    History :

    New Value

    Changer

    Change Time

    Change Date

    Field

    Passed

    maggie

    09:51

  • [论坛] 测试用例

    2009-02-19 20:46:42Digest 1

  • [论坛]  嵌入式测试

    2009-02-14 21:21:09

                    嵌入式测试
    第一部分:简介
    嵌入式系统是将先进的计算机技术、半导体技术和电子技术和各个行业的具体应用相结合后的产物,这一点就决定了它必然是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。今天嵌入式系统带来的工业年产值已超过了1万亿美元,1997年来自美国嵌入式系统大会(Embedded System Conference)的报告指出,未来5年仅基于嵌入式计算机系统的全数字电视产品,就将在美国产生一个每年1500亿美元的新市场。美国汽车大王福特公司的高级经理也曾宣称,“福特出售的‘计算能力'已超过
    了IBM”,由此可以想见嵌入式计算机工业的规模和广度。1998年11月在美国加州圣*何塞举行的嵌入式系统大会上,基于RTOS的Embedded Internet成为一个技术新热点。
    美国著名未来学家尼葛洛庞帝99年1月访华时预言,4~5年后嵌入式智能(电脑)工具将是PC和因特网之后最伟大的发明。我国著名嵌入式系统专家沈绪榜院士98年11月在武汉全国第11次微机学术交流会上发表的《计算机的发展与技术》一文中,对未来10年以嵌入式芯片为基础的计算机工业进行了科学的阐述和展望。
    3 嵌入式系统工业的特点和要求 (Embedded System Industry, ESI)
    3.1 嵌入式系统工业是不可垄断的高度分散的工业
    从某种意义上来说,通用计算机行业的技术是垄断的。占整个计算机行业90%的PC产业,80%采用Intel的8x86体系结构,芯片基本上出自Intel,AMD,Cyrix等几家公司。在几乎每台计算机必备的操作系统和文字处理器方面,Microsoft的Windows及Word占80-90%,凭借操作系统还可以搭配其它应用程序。因此当代的通用计算机工业的基础被认为是由Wintel(Microsoft和Intel 90年代初建立的联盟)垄断的工业。
    嵌入式系统则不同,它是一个分散的工业,充满了竞争、机遇与创新,没有哪一个系列的处理器和操作系统能够垄断全部市场。即便在体系结构上存在着主流,但各不相同的应用领域决定了不可能有少数公司、少数产品垄断全部市场。因此嵌入式系统领域的产品和技术,必然是高度分散的,留给各个行业的中小规模高技术公司的创新余地很大。另外,社会上的各个应用领域是在不断向前发展的,要求其中的嵌入式处理器核心也同步发展,这也构成了推动嵌入式工业发展的强大动力。嵌入式系统工业的基础是以应用为中心的“芯片”设计和面向应用的软件产品开发。
    3.2 嵌入式系统具有的产品特征
    嵌入式系统是面向用户、面向产品、面向应用的,如果独立于应用自行发展,则会失去市场。嵌入式处理器的功耗、体积、成本、可靠性、速度、处理能力、电磁兼容性等方面均受到应用要求的制约,这些也是各个半导体厂商之间竞争的热点。和通用计算机不同,嵌入式系统的硬件和软件都必须高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能,这样才能在具体应用对处理器的选择面前更具有竞争力。嵌入式处理器要针对用户的具体需求,对芯片配置进行裁剪和添加才能达到理想的性能;但同时还受用户订货量的制约。因此不同的处理器面向的用户是不一样的,可能是一般用户,行业用户或单一用户
    .嵌入式系统和具体应用有机地结合在一起,它的升级换代也是和具体产品同步进行,因此嵌入式系统产品一旦进入市场,具有较长的生命周期。嵌入式系统中的软件,一般都固化在只读存储器中,而不是以磁盘为载体,可以随意更换,所以嵌入式系统的应用软件生命周期也和嵌入式产品一样长。另外,各个行业的应用系统和产品,和通用计算机软件不同,很少发生突然性的跳跃,嵌入式系统中的软件也因此更强调可继承性和技术衔接性,发展比较稳定。嵌入式处理器的发展也体现出稳定性,一个体系一般要存在8-10年的时间。一个体系结构及其相关的片上外设、开发工具、库函数、嵌入式应用产品是一套复杂的知识系统,用户和半导体厂商都不会轻易地放弃一种处理器。
    3.3 嵌入式系统软件的特征
    嵌入式处理器的应用软件是实现嵌入式系统功能的关键,对嵌入式处理器系统软件和应用软件的要求也和通用计算机有所不同。
    (1) 软件要求固态化存储
    为了提高执行速度和系统可靠性,嵌入式系统中的软件一般都固化在存储器芯片或单片机本身中,而不是存贮于磁盘等载体中。
    (2) 软件代码高质量、高可靠性
    尽管半导体技术的发展使处理器速度不断提高、片上存储器容量不断增加,但在大多数应用中,存储空间仍然是宝贵的,还存在实时性的要求。为此要求程序编写和编译工具的质量要高,以减少程序二进制代码长度、提高执行速度。
    (3) 系统软件(OS)的高实时性是基本要求
    在多任务嵌入式系统中,对重要性各不相同的任务进行统筹兼顾的合理调度是保证每个任务及时执行的关键,单纯通过提高处理器速度是无法完成和没有效率的,这种任务调度只能由优化编写的系统软件来完成,因此系统软件的高实时性是基本要求。
    (4) 多任务操作系统是知识集成的平台和走向工业标准化道路的基础
    3.4 嵌入式系统开发需要开发工具和环境
    通用计算机具有完善的人机接口界面,在上面增加一些开发应用程序和环境即可进行对自身的开发。而嵌入式系统本身不具备自举开发能力,即使设计完成以后用户通常也是不能对其中的程序功能进行修改的,必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。
    3.5 嵌入式系统软件需要RTOS开发平台
    通用计算机具有完善的操作系统和应用程序接口(API),是计算机基本组成不可分离的一部分,应用程序的开发以及完成后的软件都在OS平台上面运行,但一般不是实时的。嵌入式系统则不同,应用程序可以没有操作系统直接在芯片上运行;但是为了合理地调度多任务、利用系统资源、系统函数以及和专家库函数接口,用户必须自行选配RTOS开发平台,这样才能保证程序执行的实时性、可靠性,并减少开发时间,保障软件质量。
    3.6 嵌入式系统开发人员以应用专家为主
    通用计算机的开发人员一般是计算机科学或计算机工程方面的专业人士,而嵌入式系统则是要和各个不同行业的应用相结合的,要求更多的计算机以外的专业知识,其开发人员往往是各个应用领域的专家。因此开发工具的易学、易用、可靠、高效是基本要求。
    结 语
    中国的单片机应用和嵌入式系统开发走过了15年的历程,有超过10万名从事单片机开发应用的工程师,但95%以上是3~5个人的小组以孤军奋战的封闭方式开发几乎不可重用的软件。今天面对的是嵌入式系统工业化的潮流,如果我们不能认清嵌入式软件必须以工业化的方式生产开发,不理解在短时间内装配集成“数百人年”嵌入式产品软件库固化于芯片之中的方法,那么我们将失去更多“上游”产品的市场机遇;反之在我国大力推动和建设“嵌入式软件工厂”,使我国的嵌入式软件库(零件)产品化并溶入国际市场,对加速知识创新和建立面向21世纪的知识经济.-
    嵌入式计算机系统的展望 ----中国计算机学会微机专业委员会主任 中国科学院院士沈绪榜
       从使用角度来说,计算机可分为两类:一类是独立使用的计算机系统,如个人计算机、工作站等;一类是嵌入式计算机系统,它是作为其他系统的组成部分使用的。不管是哪一种计算机系统,要能够迅速地向前发展,都必须满足五个简单而又基本的条件:一是经济性,计算机要很便宜,让更多的人能买得起;二是小型化,人们携带起来方便;三是可靠性,能够在一般环境条件下或者是苛刻的环境条件下运行;四是高速度,能够迅速地完成数据计算或数据传输;五是智能性,使人们用起来更习惯,对人们更有使用价值。不过,对不少应用来说,嵌入式计算机系统对这些基本条件的要求往往是更苛刻的。这可以从一些嵌入式系统的成功与失败的例子清楚地看出来。所以,这里就从这五个基本条件出发,展望一下嵌入式系统发展的未来。
       就经济性来说,个人计算机的普及要算是一个典型的成功例子。可惜的是,Xerox的管理人员于70年代初实施其无纸办公室的计划时,虽然首先开发了个人计算机,但他们认为这种计算机对一般人来说可能是太贵了,因而没有制造与发展个人计算机。自动付款机系统要算是一个典型的失败例子。它要求超市中的每件商品都有一个存贮商品价钱的芯片。当商品小推车经过记账出口时,一个无线电信号使芯片传出它的价钱信息以自动记账。当信用卡"扫过"时,就给出清单,这样记账时就不用排队了。这个系统未得到使用,就是因为芯片的价钱还是太贵了。芯片技术能降低电子产品成本的速度,就连当代电子学革命之父,2000年诺贝尔物理奖获得者杰克·基尔比也没有想到,他在1959年发明的芯片技术,会将电子产品的成本降低到了百万分之一的地步。芯片技术的这种神奇的作用,恐怕就是摩尔预言神奇般灵验的主要原因之一吧!难怪尽管发展芯片技术的耗资是惊人的巨大,发达国家还是力争在芯片技术的竞争中要永远保持领先的地位,以便能主宰世界信息技术的发展。就小型化来说,需要人们携带的电子产品,如心脏启博器,小型化要求就非常明显了。电子产品的小型化程度也是受芯片技术的发展水平限制的。尽管到2015年微米技术将达到它的物理极限,但仍然有许多应用还有待芯片技术的进一步微型化,使其功能密度的进一步提高。为此,MEMS技术、系统芯片技术得到了发展。不仅如此,人们还在致力于纳米技术与生物技术研究,以期能使芯片技术有可能达到更高的微型化程度。例如,日本人的研究目标是"制造出能进入管道内进行检修的微型机械,能进入血管内进行手术的微型机器人,生产微型机器人,生产微型机械部件的超小型化工厂,确保日本在未来微机械加工领域的领导地位,在基础研究方面实现纳米技术的Ogata计划"。由于嵌入式系统是针对特定应用对象设计的,利用这一情况,嵌入式微处理器的设计一般都具有结构多样性与应用灵活性的两大特点。为了微型化,低功耗也是一个重要的性能指标。就可靠性来说,对于常规条件下使用的家电产品等,现在的芯片技术已使产品的可靠性达到了非常令人满意的程度。但对太空、人体等特殊环境下使用的产品的长寿命要求,仍然不是一项容易实现的指标,还有待于芯片技术的进一步发展与完善。就高速度来说, 应用对它的要求似乎没有止境,许多人工智能应用就是受到了计算速度的限制。对互联网来说,很多应用还是受到传输速度的限制,加密解密就是一个很重要的例子。也许人们常常提到的量子计算技术才能解决这个高性能要求的问题。就智能性来说,现代的芯片计算机可以进行逻辑、符号和语言处理等这些被认为是大脑左半球的功能,而且达到了人类自己都感到惊奇的程度。但如何实现与有生命的组织一样灵活而精细的信息处理能力,如发现缺陷、识别和改正错误之类的生物功能等问题,目前尚未找到有效的途径。更不用说,各种生命形式中的自律性、自组织、自更新和自发展等最典型的生物功能如何在当前的芯片计算机中实现了。硅基芯片是人类智慧的结晶,它正在不断地实现各种人类自身功能的延伸。模糊推理芯片确实使智能家电得到了大力发展,神经网络芯片则在模拟人类的学习功能上迈进了一大步。芯片是智能化的支柱,人们不仅利用它研制智能的机器,改造客观的世界,而且也在利用它研制嵌入到人体内的产品,修补人体的缺陷,增进自身的健康。
      综上所述,嵌入式系统的发展主要体现在芯片技术的进步上,以及在芯片技术限制下的算法与软件的进步上。今天正在开发的嵌入式系统,到底哪些明天定会取得应用上的成功,这是很难预料的。因为这不仅要取决于技术的因素,还要取决于社会的因素。 虽然预测未来是困难的,但不管怎样,展望未来,明天的嵌入式系统将会比今天的更便宜、更小巧、更可靠、更高效而且更智能化,因为这毕竟是它赖以发展并为人类所最能接受的简单而基本的条件。所以从技术上来看,沿着这五个简单而基本的条件努力,恐怕是势在必行不可忽视的。 嵌入式系统的产品可是最大的最多的,在日常电器中,我们的数字式产品,比如电饭锅,微波炉,数字式录音机,播放机,但是为什么嵌入式系统测试如此冷落?是我们的产品已经达到炉火纯青?不再需要测试?其实不是,这里只能说明一点:我们的工作只能在高端,对下面一无所知,都是人家已经作好了,我们 只是装配,中国将成为世界加工厂,这点不假,但是我们不能总是为人家加工、装配.========================================================================================================

    <2>嵌入式软件测试策略

    在嵌入式领域目标系统的应用系统日趋复杂,而由于竞争要求产品快速上市,开发技术日新月异,同时硬件发展的日益稳定,而软件故障却日益突出,软件的重要性逐渐引起人们的重视,越来越多的人认识到嵌入式系统的测试势在必行。提到嵌入式软件测试,首先要简单介绍一些软件工程的一些观点,现在,被普遍接受的软件的定义是:软件 (software) 是计算机系统中与硬件 (hardware) 相互依存的另一部分,它包括程序 (program) 、相关数据 (data) 及其说明文档 (document) 。其中程序是按照事先设计的功能和性能要求执行的指令序列;数据是是程序能正常操纵信息的数据结构;文档是与程序开发维护和使用有关的各种图文资料。  
        对于一般商用软件的测试,嵌入式软件测试有其自身的特点和测试困难。

       由于嵌入式系统的自身特点,如实时性 (Real-timing) ,内存不丰富, I / O 通道少,开发工具昂贵,并且与硬件紧密相关 CPU 种类繁多,等等。嵌入式软件的开发和测试也就与一般商用软件的开发和测试策略有了很大的不同,可以说嵌入式软件是最难测试的一种软件。

       嵌入式软件测试使用有效的测试策略是唯一的出路,它可以使开发的效率最大化,避免目标系统的瓶颈,使用在线仿真器节省昂贵的目标资源。自从出现高级语言,开发环境与最终运行环境通常都是存在差异的,嵌入式系统更是如此。开发环境被认为是主机平台,软件运行环境为目标平台。相应的测试为 host-target 测试或 cross-testing 。

       讨论嵌入式软件测试首先就会遇到一个问题:为什么不把所有测试都放在目标上进行呢?因为若所有测试都放在目标平台上有很多不利的因素:

    1 )测试软件,可能会造成与开发者争夺时间的瓶颈,避免它只有提供更多的目标环境。

    2 )目标环境可能还不可行。

    3 )比起主机平台环境,目标环境通常是不精密的和不方便的。

    4 )提供给开发者的目标环境和联合开发环境通常是很昂贵的。

    5 )开发和测试工作可能会妨碍目标环境已存在持续的应用

    从经济上和开发效率上考虑,软件开发周期中尽可能大的比例在主机系统环境中进行,    其中包括测试。

         确定 host-target 测试环境后,开发测试人员又会遇到以下的问题:

    1 )多少开发人员会卷入测试工作(单元测试,软件集成,系统测试) ?

    2 )多少软件应该测试,测试会花费多长时间?

    3 )在主机环境和目标环境有哪些软件工具,价格怎样,适合怎样 ?

    4 )多少目标环境可以提供给开发者,什么时候 ?

    5 )主机和目标机之间的连接怎样?

    6 )被测软件下载到目标机有多快 ?

    7 )使用主机与目标环境之间有什么限制(如软件安全标准) ?

    任何人或组织进行嵌入式软件的测试都应深入考虑以上问题,结合自身实际情况,选定合理测试策略和方案。

         对于嵌入式软件测试或叫交叉测试( cross-test ),在测试的各个阶段有着通用的策略:

    1 .单元测试:

    所有单元级测试都可以在主机环境上进行,除非少数情况,特别具体指定了单元测试直接在目标环境进行。最大化在主机环境进行软件测试的比例,通过尽可能小的目标单元访问所有目标指定的界面。

    在主机平台上运行测试速度比在目标平台上快的多,当在主机平台完成测试,可以在目标环境上重复作一简单的确认测试,确认测试结果在主机和目标机上没有被他们的不同影响。在目标环境上进行确认测试将确定一些未知的,未预料到的,未说明的主机与目标机的不同。例如,目标编译器可能有 bug ,但在主机编译器上没有。

    2 .集成测试:

      软件集成也可在主机环境上完成,在主机平台上模拟目标环境运行,当然在目标环境上重复测试也是必须的,在此级别上的确认测试将确定一些环境上的问题,比如内存定位和分配上的一些错误。

    在主机环境上的集成测试的使用,依赖于目标系统的具体功能有多少。有些嵌入式系统与目标环境耦合的非常紧密,若在主机环境做集成是不切实际的。一个大型软件的开发可以分几个级别的集成。低级别的软件集成在主机平台上完成有很大优势,越往后的集成越依赖于目标环境。

    3 .系统测试和确认测试

    所有的系统测试和确认测试必须在目标环境下执行。当然在主机上开发和执行系统测试,然后移植到目标环境重复执行是很方便的。对目标系统的依赖性会妨碍将主机环境上的系统测试移植到目标系统上,况且只有少数开发者会卷入系统测试,所以有时放弃在主机环境上执行系统测试可能更方便。

    确认测试最终的实施舞台必须在目标环境中,系统的确认必须在真实系统之下测试,而不能在主机环境下模拟。这关系到嵌入式软件的最终使用。

    包括恢复测试、安全测试、强度测试、性能测试,已超出了软件测试的范畴,本文暂不讨论。

    使用有效的 cross-test 测试策略可极大的提高嵌入式软件开发测试的水平和效率,当然正确的测试工具使用也是必不可少的:

        总结一下,应用以上测试工具进行 .Cross-test 时的策略:

    A)        使用测试工具的插装功能(主机环境)执行静态测试分析,并且为动态覆盖测试准备好一插装好的软件代码。

    B)        使用源码在主机环境执行功能测试,修正软件的错误和测试脚本中的错误。

    C)         使用插装后的软件代码执行覆盖率测试,添加测试用例或修正软件的错误,保证达到所要求的覆盖率目标。

    D)        在目标环境下重复( B ),确认软件在目标环境中执行测试的正确性。

    E)        若测试需要达到极端的完整性,最好在目标系统上重复( C ),确定软件的覆盖率没有改变。

         通常在主机环境执行多数的测试,只是在最终确定测试结果和最后的系统测试才移植到目标环境,这样可以避免发生访问目标系统资源上的瓶颈,也可以减少在昂贵资源如在线仿真器上的费用。另外,若目标系统的硬件由于某种原因而不能使用时,最后的确认测试可以推迟直到目标硬件可用,这为嵌入式软件的开发测试提供了弹性。设计软件的可移植性是成功进行 cross-test 的先决条件,它通常可以提高软件的质量,并且度软件的维护大有益处。以上所提到的测试工具,都可以通过各自的方式提供测试在主机与目标之间的移植,从而使嵌入式软件的测试得以方便的执行。

    使用有效的 cross-test 测试策略可极大的提高嵌入式软件开发测试的水平和效率,提高嵌入式软件的质量。

    ==========================+++++++++++++++++++++++++++++++++++============================================

    <3>嵌入式的测试方案(codetest)

    可到www.superst.com上下载CodeTest嵌入式测试方式>
    美国AMC公司采用了专利——插桩技术开发出专为嵌入式开发者设计的高性能测试工具CodeTEST,它可以用于本机测试(native)或在线测试( in-circuit).
    CodeTEST系列包括三种嵌入式软件测试和分析工具:CodeTEST Native,CodeTEST Software-In-Circuit和CodeTEST Hardtware –In -Circuit。其中每一种工具代表了嵌入式系统开发的每一个周期的不同开发阶段。我们以标号1、2、3来表示:

    在开发阶段1,由于是开发的早期,没有目标硬件,所应采用的工是桌面工具。
    在开发阶段2,由于此时已开始,系统的集成工作,硬件开发板已出现。
    在开发阶段3,此时项目已处于系统测试或确认阶段,任何疏忽、质量问题和性能缺现都会影响产品的发布、销售和盈利。
    CodeTEST系列可以满足你选择适合自己测试类型:纯软件,驻留IDE硬件探头或同时选择以上所有三个测试的类型。
    CodeTEST的突出特点:
    性能分析可以实现代码的精确的可视化,从而大大提高提高工作效率,简化软件确认和查找故障的过程,
    内存分析可以监视内存的使用,提前查处内存的泄漏,从而节约你宝贵的时间和成本。
    代码追踪可以进行三个不同层次的软件运行追踪,甚至是追踪处理器内部的Cache,这样可以更容易的查找问题所在。
    高级覆盖工具可以通过确认高隐患的代码段,显示哪些函数、代码块、语句、决策条件和条件以执行过或未执行过,来提高产品的质量。高级覆盖工具完全符合高要求的软件测试标准(如:R CTA/DO-178B,A级标准),可以实现语句覆盖、决策覆盖和可变条件的决策覆盖。

    CodeTEST在各开发阶段的应用
    CodeTEST Native
    在早期的开发阶段,采用CodeTEST Native的插桩器可以实现较快的软件测试和分析。虽然此阶段的测试和分析不是实时测试,但这是没有目标硬件连接时的最好的分析和查找问题的最好方法。采用C odeTEST,可以提高软件测试的代码覆盖率、查找和分析内存的泄漏和深度追踪来确保软件的正常运行。

    CodeTEST Software-In-Circuit
    当有硬件连接到测试系统时,我们就可以采用“target hardware”工具了。一般说来,在这一阶段,逻辑分析仪、仿真器和纯软件工具是用来确定系统是否正常工作,但是采用这些工具测试软件往往增加了工程师工作的难度和压力。而采用C odeTEST Software-In –Circuit,通过目标代理(tragrt agent)来测试和分析目标硬件就不需要硬件工具。
    CodeTEST Software-In–Circuit插桩器还可以很方便的让你从CodeTEST Native的desktop-stimulated测试跳转到目标硬件的实时测试。跳转后,插桩器、脚本的文件格式和数据不受Native环境影响。而且,就学习N ative和CodeTEST Software-In –Circuit的测试方法而言是差不多的。对于大多数在这两种开发阶段使用过其他的工具的开发者,CodeTEST可以大大节约开发的时间。
    虽然CodeTEST Software-In –Circuit工具链不提供外部硬件测试系统的细节情况,但它为硬件的探测的难题提供了解决方案,提供了强大的代码覆盖实时工具、内存分析和软件追踪,而且在真实硬件环境中运行,价格低廉。
    CodeTEST Hardtware-In-Circuit
    当你进入此阶段时,你需要一组能提供监视软件测试深度和精确度的的工具链。带有的Bugs和错误的程序必须修改、升级或更新。
    CodeTEST Hardtware-In-Circuit工具链采用外部硬件辅助和相应的通讯系统来实现最大程度的软件实时测试。
    与逻辑分析仪和仿真器不同,CodeTEST Hardtware-In-Circuit具有处理目前复杂嵌入式系统的实时测试的能力。CodeTEST外置探测的硬件系统主要包括控制和数据处理器、大容量内存和可编程的升级定时器,因此大型测试的时间精度可在+ /-50ns内。
    CodeTEST Hardtware-In-Circuit除了提供测试代码覆盖率、内存分析和追踪分析,它的精确的实时测试能力还可以帮你查出软件性能和质量上的问题所在。

    完全的解决方案

    CodeTEST家族提供了六大独立的软件模块:CodeTEST性能分析,
    CodeTEST 内存分析,CodeTEST代码跟踪,CodeTEST语句覆盖,CodeTEST决策覆盖,CodeTEST可变条件决策覆盖。这些模块你可以自由的选择,来满足你对可视化的要求。
    CodeTEST性能
    (CodeTEST可以确定调试代码时那一段代码花费较多时间,这样就可以更容易地监控所有程序的执行。)
    由于CodeTEST可同时实时监视32,000个函数和1000各任务,因此它可以监控大型程序中每一个子程序的执行。而现有的调试工具通常采用采样技术,因此只能对部分代码和程序进行分析。在每次监视过程中,C odeTEST可以监视所有的应用程序,探测程序执行的瓶颈所在。它不仅可以显示出程序和函数执行最坏情况和最好情况所花的时间,而且还可以显示任务、函数及函数相互调用关系的所有结果。通过性能分析的排序列表,你可以很容易的确定你哪一部分程序需要修改。
    CodeTEST内存分析
    (CodeTEST内存分析可以动态追踪内存分配,报告内存出错和相应的原始数据。)
    CodeTEST内存分析解决了难以追踪动态内存分配问题。它不仅可以报告为程序中每条语句分配多少字节的内存(当程序运行时),而且它还可以鉴别2 0多种内存分配错误。例如,CodeTEST内存分析可以捕捉像“释放空指针(freeing a null pointer)”一样常见的程序错误,报告发生错误的函数和代码行。而相比而言,现有的调试工具需要进行上百次的代码追踪和监视,花数周的的时间才能探测一个程序问题的所在。
    CodeTEST代码跟踪

    (多追踪窗口观察可以简化程序设计流程,实现程序设计的规范化。)
    CodeTEST代码追踪把深度追踪和面向Software的简化运用特点结合起来。该工具可以从三个不同的抽象层次显示程序执行过程:1)高级,显示R TOS事件和函数执行的入口和出口。2)控制流程级,显示在每个函数执行到哪一语句。3)原码级,显示每条执行过的C或C++语句。
    CodeTEST具有专为软件工程师设计的触发(trigger)和存贮(storage)功能。你完全可以避开采用其它调试工具复杂的设置,只需根据确定一个任务中R TOS任务和函数等级来选择所需要追踪的软件内容。CodeTEST具有强大的触发功能,包括内存分配错误触发。由于CodeTEST可以记录每一条代码行执行的时间(t imestamp),因此你可以很容易的确定函数中每个循环执行的时间。
    如果你想标识出追踪过程中你感兴趣的事件,你还可以在你的代码中插入用户定义的标记(tags)。这些标记和时间记录(timestamp)会在追踪过程中显示出来,而且你可以观察追踪过程中指定变量的值。
    CodeTEST-ACT(先进的代码覆盖工具)
    (CodeTEST覆盖可以显示程序中覆盖过的函数以及代码的总覆盖率。)
    代码覆盖是一种可以确定在一个特定的测试过程中,哪一部分程序执行过,而哪一部分程序未被执行过的技术。
    CodeTEST-ACT提供了一种交互式界面,该界面可以在程序运行时显示出程序、函数和源代码的语句覆盖(SC)情况。此外,CodeTEST-ACT 独特之处是它在测试过程中提供了一张可以显示覆盖程度的覆盖率趋势图,该图可以让你确定花多少时间就可以是完成一个特定等级的代码覆盖。这样,一旦覆盖率的峰值一到你就可以终止测试,从而避开了测试中多余的和低效的部分,大大的缩短了测试的时间。
    CodeTEST-ACT除了可以显示代码段执行的语句覆盖外,还提供了决策覆盖(DC)和条件决策覆盖(MCDC)的功能。
    CodeTEST-ACT可以为不同等级的测试提供清晰的分析报告:CodeTEST SC提供语句覆盖分析和SC报告;CodeTEST DC不仅提供语覆盖分析和SC报告,而且还提供RTCA/DO-178 Level B测试标准所需的决策覆盖分析和DC报告;CodeTEST MCDC不仅包括SCHEDC报告,还提供了进行Level A测试所需的MCDC分析和报告。
    查桩器的性能分析

    你可以根据程序执行的流程和操作(包括RTOS、函数和程序跳转分支及源程序的组织结构)来决定你对可见性需要程度。而这些需要可以通过对原程序插桩来实现, 而且插桩时插入原程序的语句与编写原代码语言很相近。
    以往的解决方案是基于微处理器、总线信息和片内Cache,在总线上提前抓取信号。而CodeTEST可视化解决方案是基于软件插桩器实现的。采用插桩器,你用不着猜测关键的代码在哪,一切一目了然。
    CodeTEST自动插桩技术可以无需修改源代码而直接把插桩器插入应用软件中。你可以决定那些代码要插桩,要进行哪些测试。当插桩器在处理器中运行时,它会产生特定的实时可视标签(tags)。打完桩后关闭插桩器,这样就生成插桩版本(on-target)的新程序,而且你完全没必要删除这些可视标签。自动插桩器可以让你很容易地给大量代码插桩,而且它的可增加标签的特点可以在你需要修改b ugs或编辑文件时很快的重新插桩。在插桩的标签信息送回主机后,你就可以在程序运行时看到代码执行的精确流程。CodeTEST的解决方案不占用目标板上的处理器,可以独立于目标板的Cache运行,并且不受内存的影响。目前,在所有的测试工具中,只用CodeTEST插桩技术支持各开发阶段的软件测试和分析。

    纯软件的测试工具
    纯软件的测试工具采用的是软件打点技术,在被测代码中插入一些函数,用这些函数来完成数据的生成,并上送数据到目标系统的共享内存中。同时在目标系统中运行一个预处理任务,完成这些数据的预处理,将处理后的数据通过目标机的网口或串口上送到主机平台。这一切都需借助于用户的目标处理器完成。 通过以上过程,测试者得以知道程序当前的运行状态。 从上述分析可知,纯软件的测试工具的测试原理有两个必然存在的特点——插桩函数和预处理任务。
    由于插入插桩函数和预处理任务的存在,使系统的代码增大,更严重的是这些代码会对系统的运行效率有很大的影响(超过50%)。函数本身要有它的实现过程,它要完成数据的生成和暂存,而且这些函数在它的实现过程中还可能被其他优先级更高的中断程序所中断,预处理任务需要占用目标系统CPU处理时间、共享内存和通信通道完成数据的处理、数据的上送。由于这些弊端的存在,当采用纯软件测试工具对目标系统进行测试时,用户目标系统是在一种不真实的环境下运行的,我们所捕获的数据也是不够精确。
    所以采用纯软件的测试工具缺乏性能分析,它不能对用户目标系统中的函数和任务运行的时间指标进行精确的分析。
    当做覆盖率分析的时候,因为要大量打点,而打点多于200时就会影响系统的运行,所以只能做单元覆盖率分析且单元的程序量不能太大。
    它不能对内存的动态分配进行动态的观察。
    纯硬件的测试工具
    纯硬件工具通常用于系统的硬件设计与测试工作。当它用于软件的分析测试时,却无法满足用户的基本要求。
    以逻辑分析仪为例,逻辑分析仪是通过监控系统在运行时总线上的指令周期,并以一定的频率捕获这些信号,通过对捕获的信号进行分析来判断程序当前运行的状况。由于它使用的是采样的方式,难免会遗失一些重要的信号;同时,分析的范围也及其有限。以性能分析为例,当使用某种逻辑分析仪进行性能分析时,我们只能以抽样的方式,同时对80个函数做性能分析,得到一个不精确的结果;而若使用CodeTEST,我们可以同时对128000个函数做性能分析,得到一个精确的结果。
    当对程序做覆盖率分析时,因为硬件工具是从系统总线捕获数据的,如当CACHE打开我们会采用指令预取技术,从外存中读一段代码到一级CACHE中,这时逻辑分析仪在总线上监视到这些代码被读取的信号,就会报告这些代码已经被执行了,但实际上被送到CACHE中的代码可能根本没有被命中。为了避免这种误差必须把CACHE关闭掉,而CACHE关掉就不是系统真实的运行环境了,有时甚至会由于CACHE关闭而导致系统无法正常运行。
    而仿真器通常采用内存标记技术,它所关心的也是处理器从外存的代码段读取数据的情况。所以也无法在CACHE打开的方式下工作。而它的性能分析也是以仿真器的时间系统以抽样的方式进行的,也无法时实对系统进行真实的分析。所以我们所得出的结果也是不精确的。
    纯硬件工具根本不能对内存分配进行分析和检查的能力。
    CodeTEST对软件分析测试功能的实现原理
    AMC公司吸取了纯软件测试工具和纯硬件测试工具的优点,并对它们进行改善和提升后推出了CodeTEST。
    由上图我们可以看出,程序员编写的源代码首先会通过CodeTEST的编译驱动器调用原编译器对进行预编译,然后CodeTEST的插桩器(源代码分析程序)对预编译好的源代码进行自动的插桩,即在需要插桩的关键位置写入一条赋值语句(如:amc_ctrt=0x74100009),并把插入的标记送入一个数据库文件中生成一个符号数据库暂存起来,以备为以后分析时调用。然后,CodeTEST的编译驱动器又会调用原编译器对插桩后的代码进行编译生成可执行目标代码送到目标板上运行。当程序在目标系统运行到插桩点的位置时,目标板的控制总线和地址总线上会出现相应的控制信号和地址信号。当CodeTEST的辅助硬件(信号捕获探头)从控制总线和地址总线上监视到符合以上条件的信号时,CodeTEST会主动地从数据总线上把数据捕获回来送到CodeTEST的内存中暂存并对这些数据进行预处理,然后将预处理后的数据通过局域网送到工作平台上。通过与前面生成的符号数据库中的数据进行比较,我们就此得知当前程序的运行状态,借此完成对嵌入式软件的性能分析,高级覆盖率分析,内存分析和大容量的代码跟踪。
    由此可知,CodeTEST是一个硬件辅助软件的测试与分析工具,它一方面吸取软件打点技术,并对这种技术进行了改善,纯软件工具插入的是一个函数,而CodeTEST插入的是一条赋值语句, 它在汇编级也是一条语句,所以它执行的时间非常短,同时避免了被其它的中断所中断,所以它对目标系统的影响非常小(1%-15%)。另一方面,CodeTEST从纯硬件的测试工具那里吸取了从总线捕获数据的技术并且对它进行了改善,CodeTEST不再是采样的方式,它是通过监视系统总线,当程序运行到插入的特殊的点的时候才会主动的到数据总线上把数据捕获回来,借此,在同样的处理能力下,CodeTEST可以做到精确的数据观察。
    CodeTEST强大的测试分析功能。
    由于CodeTEST对软件打点技术和从总线捕获数据进行了改善和提升,正是这种原理上的优势,所以CodeTEST具有强大的性能分析、内存分析、高级覆盖率分析和代码跟踪功能。
    1. 强大的性能分析:CodeTEST能同时对128000个函数和1000个任务进行性能分析,可以精确的得出每个函数或任务执行的最大时间、最小时间和平均时间,精确度达到50ns;能够精确的显示各函数或任务之间的调用情况,帮助你发现系统瓶颈、优化系统和提升你的系统性能。
    2. 强大的覆盖率分析。 CodeTEST可以在系统真实的环境下,可以从单元级、集成级、系统级以及产品终端现场阶段进行嵌入式软件的分析与测试。帮助测试工程师掌握当前的测试覆盖率数据,指导测试用例的编写。
    3. 强大的内存分析。CodeTEST可以动态追踪内存分配,报告内存出错和相应的原始数据。他不仅可以在程序运行时报告为每条语句分配多少字节的内存,而且他可以鉴别20多种内存分配的错误。例如:CodeTEST可以捕捉“释放空指针(freeing a null pointer)”一样常见的程序错误,报告发生错误的函数和代码行帮,助你尽早发现动态内纯泄漏,而无需到系统崩溃时。
    4. 强大的代码跟踪分析。CodeTEST提供400K的追踪缓冲空间,能追踪150万行的源代码。我们可以设置触发器来追踪自己感兴趣的事件,可以显示运行过程中程序运行的实际情况,帮助你查找程序的BUG所在。

    <4>嵌入式测试实例:手机测试

    手机测试包含: 基于功能、性能、用户面的测试(贝它测试)、Benchmark测试;作为专用的消费电子产品测试还包括可靠性测试(对于硬件则是RQT;对于软件则是field trial);标准符合性测试(TA/FTA);互操作性测试(IOT);安全性测试(安规测试);强度测试等.
    手机测试是一个很大的题目,涉及到硬件测试和软件测试,还有结构的测试,比如抗压,抗摔,抗疲劳,抗低温高温等,结构上的设计不合理,会造成应力集中,使得本身外壳变形,对于翻盖手机,盖子失效,还有其他严重问题。硬件测试一般都有严格的物理电气指标,也有专门的仪器,这里的仪器,不在多说,一般如果是专业的测试人员,不会对词陌生吧。
    因为我们人员编制问题,所以我对于各项测试,都或多或少了解一点,甚至从事过。。
    但是手机测试,一般是指软件测试,这个一方面也说明了软件在手机上的重要行。一方面也说明手机测试的难度。因为期他得测试都有明确的指标,严格的操作规程,还有各种仪器。下面说的手机测试一般都是手机软件测试,以后不在重复说明。
    因为工作原因,没有及时回复大家要求,这里先回答一点,希望大家一起参与,毕竟我一个人精力有限,知道也少。
    这里就作为前言部分吧在说明手机测试之前,我觉得应该了解一下什么是嵌入市操作系统,这是个时髦的名词,虽然我们已经被嵌入市操作系统的产品所包围,但是却不一定能说清楚,什么是嵌如实操作系统,而学校的课堂上,讲的也不多,所以很多人对此感到云山舞罩。
    简单的说,一个嵌入市操作系统就是为完成某中特定功能而专门开发的操作系统。这个操作系统的功能很明确,不象大型操作系统,范围广泛,大千世界,尽在其中,而嵌如操作系统只为完成某一项或者几项功能。
    再说一下手机的特殊性,也就是要求对响应时间达到一定限制范围。也就是所谓的实时操作系统,如果一个电话不能在90秒内接听,那么对方会挂掉而你的操作系统还没反映过来,那么这个操作系统无疑是失败的,这是对嵌如操作系统实时性的要求。
    作为一个测试人员,你必须了解这些,可能对一些软件开发人员,他不必很在意这些方面,因为他只要了解自己模块的入口说明和 出口说明就可以。但是测试人员不行。高级测试人员应该了解嵌入操作系统的特点,这个系统不象WINDOWS,有图形界面可以输入输出,也不象D OS用命令行模式,所有这些,都需要自己编写一个编辑器,编写一个交互界面,编写一个输入输出界面,在WINDOWS中,利用一些API和一些M FC,不用考虑硬件的问题,因为系统已经完成,而WINDOWS是讲究和硬件分离的,因为这样可以保护系统不受侵入。而在嵌入市系统里面。这一些都要求和硬件息戏相关。
    手机测试中,软件出现的故障不一顶是由于软件的错误,也可能是由于没有考虑到硬件和软件没有完美的结合。因此我们在了解操作系统同时,也要了解一下其他的手机硬件性能,比如CPU ,比如存储器。 CPU的处理运算能力是以MIPS来衡量的,当然越快越好,但是也是和成本相关的,我不知道现在MOTOROLA T39的CPU,但是,因为是PDA,又是手写屏幕,所以菜单特别的慢。关于存储器需要专门做出说明,因为这里 的存储器很特别,不象PC,手机没有硬盘!
    作为一个新来的,可能对嵌入时操作系统游乐 一个大致了解了,那么对他的程序又是如何的呢,难道是和以前的程序不一样?
    其实,嵌入时系统的编程语言一般有C,而且也是最多的,也有其他语言。比如C++在最开始时候是用 汇编的,但是汇编难懂,而且也不容易移植,渐渐的被C代替,不过即使如此,在启动程序时候,要启动板子,也就是电路板时候,还是需要用一些汇编语言完成。
    作为一个嵌入市系统的程序,和在PC上运行着的程序没有任何不同,唯一不同可能是在PC上运行的程序,你可以看到结果——如果你用输出语句的话,而在这里,你是看布道结果的。除非你加上L CD硬件,然后编写了LCD驱动程序,然后再编写显示 程序。编写嵌入市程序,一切都要自己解决。
    我们的手机如果不是认为把电源切断的话,或者在电源消耗到一定程度的话,是会一直在使用的,所以,手机程序是一直在运转的,就是说一直在循环,这个,对于了解嵌入市程序,应该是个好材料——嵌入市程序就是一个无限循环的程序,除非关掉电源和电源因素,这里也有一个测试点:硬件中断是最高级的,它会终止你的程序,即使你现在的程序级别很高,比如通话,如果没电了,一切会o ver. 手机程序就是在一个无限循环的程序,什么时候跳出这个无限循环?你关机吧,如果感到不高兴,把电池卸下来,因为有可能进入死循环,而关机键失效了,——只好通过取下电池了。

    这里要专门说明一下存储器,因为很多手机毛病都和存储有关,而且很多问题都和存储相关,计算机的存储是关键,而手机更始关键,因为计算机有硬盘作为存储,而手机所有的都在存储器里存储器分为几类,RAM 随即存储器,ROM随即只读存储器还有现在出现一些的闪存,以及电子可编程存储和非易失存储起。一个一个到来RAM 随机存储器,其中又有SRAM(静态RAM)DRAM(动态RAM),SRAM,只要只要电源开着,就会保存,我们打电话,有些最后拨打的号码,暂时是存在SRAM中的,不会立刻写入通话记录。只有正常关机,才会写入,如果取电池的话,是不会写入手机的通话记录的,如果在通话记录中出现了已经拨打电话,但是没有记录的情况,那么有可能和这个存储器有关,可能是你的软件上错误,也可能是硬件。DRAM在手机上用的不多,因为保留数据时间很短,

    从价格上看,SRAM是非常昂贵的,而DRAM相比很便宜。
    ROM也有几种,PROM可编程ROM 和EPROM可擦除可编程ROM两者区别是,PROM是一次性的,也就是软件灌入后,这个就完蛋了,这种是早期的产品,现在已经不可能使用了,而E PROM则是通用的存储器,这些存储器不符和手机软件产品,一般使用ROM少
    其他FLASH
    这是近来手机采用最多的存储器,这种存储起结合了ROM和RAM的长处,但是不属于RAM也不属于ROM
    手机大量采用的NVRAM 非易失存储器 和SRAM属性差不多,EEPROM 电子可擦出可编程存储器 ,闪存,ROM的后代。手机软件一般放在EEPROM中,EPROM是通过紫外光的照射,擦出原先的程序,而EEPROM是通过电子擦出,当然价格也是很高的,而且写入时间很长,写入很慢,所以前面提到的电话号码,一般先放在S RAM中,不是马上写入EEPROM,因为当时有很重要工作要做——通话,如果写入,漫长的等待是让用户忍无可忍的。
    NVRAM 是一个很特别的存储器,它和SRAM相类似,但是价格却高很多,由于一些数据实在重要,断电后必须保持这些数据,所以只能存放在这里,一般和个人信息有关的数据会放在这里,比如和S IM卡相关数据。容量大小也只有几百字节。
    闪寸存储器是所有手机的首选,综合了前面的所有优点,不会断电丢失数据(NVRAM)快速读取,电气可擦出可编程(EEPROM)所以现在手机大量采用,
    说了这么多存储器,可能比较糊涂了,这么多存储器,究竟采用哪中呢,在手机发展中,各种存储器都用过,至于现在,各种手机采用的存储器是不同的,这个和成本相关,各种存储器价格不一样,本着性价比最优组合,由设计者决定,有些是可选的,有些是必须的,是手机方案决定的,我们了解只是各种存储性能,特点,在测试中判断错误原因。

    手机协议站软件的白合测试
    手机软件测试单丛测试的内容来看,包括上面的MMI和底下的PROTOCOL由于MMI的灵活性,和各个厂家的个性化,以及手机本身的用户不同,MMI的侧重点也就不同,在基本通话、短消息、数据功能完成的基础上可以五花八门,所以测试的重点不同。测试方法各不相同。但是协议就不同了,协议是统一的,虽然你实现方法可以不同,但是完成的功能必须相同,和MMI不同,虽然都是聊天,但是有些用短消息聊天,有些用PUSH聊天,而协议软件有一个遵守的规范——ETSI指定的协议规范,有统一的命令规范和统一的标准。消息(术语,不是软件编程里的消息,是通信术语)是固定的嘛。针对协议的测试,因为有标准可循,有规范可仪,所以软件测试就很多工具,公司也多,自动化测试要自动话,否则,按照人的测试能力,谁也无法保证其绝对可靠性,也没有这么大的人力去仔细做测试。一般对于白合测试是比较严格的,而且也是耗费人力的,所以常采用自动化测试工具。这样节省人力、缩短测试时间。至于谁家的工具比较好,涉及各取所需吧,也涉及到成本问题。你如果想购买某产品,会给你一个DEMO版本,给你一个月的评价时期,这个评估版本让你熟悉其产品的优劣也让你熟悉其操作。
    测试工具一般都有二次开发功能,也就是可以自己编写脚本,针对不同的软件平台做一些改动,这样可以根据自己的需要编写测试CASE测试用列当然即使是全部用自动化测试,你心理还是没底,你还是要仔细去看代码。分析流程,读懂其含义,一个很小的问题,出错保护没有作好,一般这个问题最多,出错保护机制没有作好,会造成崩溃这样严重的问题。
    这是针对协议代码的白合测试如果你是对购买来的协议进行测试,一般有仪器,模拟一个网络基站,进行测试,不过这样的仪器非常昂贵,而且测试人员要对ETSI协议比较熟悉。我没有直接参加针对协议的白合测试,不过对评估般的测试软件曾经PRACTISE,可测试覆盖率,我很奇怪的是,一般打点(跟踪)也是需要消耗CPU时间的这样程序效率就降低了,而我要测试程序的效率等项目就要考虑CPU,而且程序的工作运转必须和CPU息息相关,而现在CPU 在保证程序RUN同时,还要进行打点,是否测试出的指数和实际不符和呢,是否没有达到真实的水平呢而它这个产品(水牛)介绍说,一般不占用CPU时间,我想了很长时间没有想通后想咨询,告之这是他们的专利,无可奉告。由于这种测试工具是针对平台所以如果你平台不支持的,也就没有办法使用了。还有集成测试等等,在软件的介绍中有详细说明,不再详细说明。对协议进行白合测试,我想对你的要求就是:熟悉相关的协议,否则白扯;熟悉开发的语言,否则免谈。总之,我估计你们公司如果进行白合测试的话,我想测试工具是不可少的,
    希望你顺利完成测试任务。早日听到好消息。

  • [论坛] 测试名词(二)

    2008-12-17 18:30:33

     

    fault--故障
    在软件中一个错误的表现。

    feasible path--可达路径
    可以通过一组输入值和条件执行到的一条路径。

    feature testing--特性测试
    参考功能测试(Functional Testing)

    FMEA--失效模型效果分析(Failure Modes and Effects Analysis)
    可靠性分析中的一种方法,用于在基本组件级别上确认对系统性能有重大影响的失效

    FMECA--失效模型效果关键性分析(Failure Modes and Effects Criticality Analysis)
    FMEA的一个扩展,它分析了失效结果的严重性。

    FTA--故障树分析(Fault Tree Analysis)
    引起一个不需要事件产生的条件和因素的确认和分析,通常是严重影响系统性能、经济性、安全性或其它需要特性。
    functional decomposition--功能分解
    参考模块分解(modular decomposition)

    Functional Specification --功能规格说明书
    一个详细描述产品特性的文档。

    Functional Testing--功能测试
    测试一个产品的特性和可操作行为以确定它们满足规格。

    glass box testing--玻璃盒测试
    参考白盒测试(White Box Testing)

    IEEE--美国电子与电器工程师学会(Institute of Electrical and Electronic Engineers)

    incremental testing--渐增测试
    集成测试的一种,组件逐渐被增加到系统中直到整个系统被集成。
    infeasible path--不可达路径
    不能够通过任何可能的输入值集合执行到的路径。

    input domain--输入域
    所有可能输入的集合。

    inspection--检视
    对文档进行的一种评审形式。

    installability testing--可安装性测试
    确定系统的安装程序是否正确的测试。

    instrumentation--插装
    在程序中插入额外的代码以获得程序在执行时行为的信息。

    instrumenter--插装器
    执行插装的工具

    Integration Testing--集成测试
    测试一个应用组合后的部分以确保它们的功能在组合之后正确。该测试一般在单元测试之后进行。

    interface--接口
    两个功能单元的共享边界。

    interface analysis--接口分析
    分析软件与硬件、用户和其它软件之间接口的需求规格。

    interface testing--接口测试
    测试系统组件间接口的一种测试。

    invalid inputs--无效输入
    在程序功能输入域之外的测试数据。

    isolation testing--孤立测试
    组件测试(单元测试)策略中的一种,把被测组件从其上下文组件之中孤立出来,通过设计驱动和桩进行测试的一种方法。

    job control language--工作控制语言
    用于确定工作顺序,描述它们对操作系统要求并控制它们执行的语言。

    LCSAJ--线性代码顺序和跳转(Linear Code Sequence And Jump)
    包含三个部分:可执行语句线性顺序的起始,线性顺序的结束,在线性顺序结束处控制流跳转的目标语句。

    LCSAJ coverage--LCSAJ覆盖
    在组件中被测试执行到的LCSAJ的百分比。

    LCSAJ testing--LCSAJ测试
    根据LCSAJ设计测试用例的一种技术。

    Load Testing--负载测试
    通过测试系统在资源超负荷情况下的表现,以发现设计上的错误或验证系统的负载能力。

    logic analysis--逻辑分析
    (1)评价软件设计的关键安全方程式、算法和控制逻辑的方法。(2)评价程序操作的顺序并且检测可能导致灾难的错误。

    logic-coverage testing--逻辑覆盖测试
    参考结构化测试用例设计(structural test case design)

    maintainability--可维护性
    一个软件系统或组件可以被修改的容易程度,这个修改一般是因为缺陷纠正、性能改进或特性增加引起的。

    maintainability testing--可维护性测试
    测试系统是否满足可维护性目标。

    modified condition/decision coverage--修改条件/判定覆盖
    在组件中被测试执行到的修改条件/判定的百分比。

    modified condition/decision testing --修改条件/判定测试
    根据MC/DC设计测试用例的一种技术。

    Monkey Testing--跳跃式测试
    随机性,跳跃式的测试一个系统,以确定一个系统是否会崩溃。

    MTBF--平均失效间隔实际(mean time between failures)
    两次失效之间的平均操作时间。

    MTTF--平均失效时间 (mean time to failure)
    第一次失效之前的平均时间

    MTTR--平均修复时间(mean time to repair)
    两次修复之间的平均时间

    multiple condition coverage--多条件覆盖
    参考分支条件组合覆盖(branch condition combination coverage)

    mutation analysis--变体分析
    一种确定测试用例套完整性的方法,该方法通过判断测试用例套能够区别程序与其变体之间的程度。

    Negative Testing--逆向测试/反向测试/负面测试
    测试瞄准于使系统不能工作。

    non-functional requirements testing--非功能性需求测试
    与功能不相关的需求测试,如:性能测试、可用性测试等。

    N-switch coverage--N切换覆盖
    在组件中被测试执行到的N转换顺序的百分比。

    N-switch testing--N切换测试
    根据N转换顺序设计测试用例的一种技术,经常用于状态转换测试中。

    N-transitions--N转换
    N+1转换顺序

    operational testing--可操作性测试
    在系统或组件操作的环境中评价它们的表现。

    output domain--输出域
    所有可能输出的集合。

    partition testing--分类测试
    参考等价划分测试(equivalence partition testing)

    path--路径
    一个组件从入口到出口的一条可执行语句顺序。

    path coverage--路径覆盖
    在组件中被测试执行到的路径的百分比。

    path sensitizing--路径敏感性
    选择一组输入值强制组件走一个给定的路径。

    path testing--路径测试
    根据路径设计测试用例的一种技术,经常用于状态转换测试中。

    performance testing--性能测试
    评价一个产品或组件与性能需求是否符合的测试。

    portability testing--可移植性
    测试瞄准于证明软件可以被移植到指定的硬件或软件平台上。

    Positive Testing--正向测试
    测试瞄准于显示系统能够正常工作。

    precondition--预置条件
    环境或状态条件,组件执行之前必须被填充一个特定的输入值。

    predicate--谓词
    一个逻辑表达式,结果为‘真’或‘假’。

    predicate data use--谓词数据使用
    在谓词中的一个数据使用。

    program instrumenter--程序插装
    参考插装(instrumenter)

    progressive testing--递进测试
    在先前特性回归测试之后对新特性进行测试的一种策略。

    pseudo-random--伪随机
    看似随机的,实际上是根据预先安排的顺序进行的。

    QA--质量保证(quality assurance)
    (1)已计划的系统性活动,用于保证一个组件、模块或系统遵从已确立的需求。(2)采取的所有活动以保证一个开发组织交付的产品满足性能需求和已确立的标准和过程。

    QC--质量控制(quality control)
    用于获得质量需求的操作技术和过程,如测试活动。

    Race Condition--竞争状态
    并行问题的根源。对一个共享资源的多个访问,至少包含了一个写操作,但是没有一个机制来协调同时发生的访问。

    recovery testing--恢复性测试
    验证系统从失效中恢复能力的测试。

    regression analysis and testing--回归分析和测试
    一个软件验证和确认任务以确定在修改后需要重复测试和分析的范围。

    Regression Testing--回归测试
    在发生修改之后重新测试先前的测试以保证修改的正确性。

    release--发布
    一个批准版本的正式通知和分发。

    reliability--可靠性
    一个系统或组件在规定的条件下在指定的时间内执行其需要功能的能力。

    reliability assessment--可靠性评价
    确定一个已有系统或组件的可靠性级别的过程。

    requirements-based testing--基于需求的测试
    根据软件组件的需求导出测试用例的一种设计方法。

    review--评审
    在产品开发过程中,把产品提交给项目成员、用户、管理者或其它相关人员评价或批准的过程。

    risk--风险
    不期望效果的可能性和严重性的一个度量。

    risk assessment--风险评估
    对风险和风险影响的一个完整的评价。

    safety--(生命)安全性
    不会引起人员伤亡、产生疾病、毁坏或损失设备和财产、或者破坏环境。

    safety critical--严格的安全性
    一个条件、事件、操作、过程或项,它的认识、控制或执行对生命安全性的系统来说是非常关键的。

    Sanity Testing--理智测试
    软件主要功能成分的简单测试以保证它是否能进行基本的测试。参考冒烟测试

    SDP--软件开发计划(software development plan)
    用于一个软件产品开发的项目计划。

    security testing--安全性测试
    验证系统是否符合安全性目标的一种测试。

    security.--(信息)安全性
    参考计算机系统安全性(computer system security)

    serviceability testing--可服务性测试
    参考可维护性测试(maintainability testing)

    simple subpath--简单子路径
    控制流的一个子路径,其中没有不必要的部分被执行。

    simulation--模拟
    使用另一个系统来表示一个物理的或抽象的系统的选定行为特性。

    simulation--模拟
    使用一个可执行模型来表示一个对象的行为。

    simulator--模拟器
    软件验证期间的一个设备、软件程序、或系统,当它给定一个控制的输入时,表现的与一个给定的系统类似。

    SLA--服务级别协议(service level agreement)
    服务提供商与客户之间的一个协议,用于规定服务提供商应当提供什么服务。

    Smoke Testing--冒烟测试
    对软件主要功能进行快餐式测试。最早来自于硬件测试实践,以确定新的硬件在第一次使用的时候不会着火。

     

  • [论坛] 测试名词(一)

    2008-12-17 18:11:02

     

    Acceptance Testing--可接受性测试
    一般由用户/客户进行的确认是否可以接受一个产品的验证性测试。


    actual outcome--实际结果
    被测对象在特定的条件下实际产生的结果。

    Ad Hoc Testing--随机测试
    测试人员通过随机的尝试系统的功能,试图使系统中断。

    algorithm--算法
    (1)一个定义好的有限规则集,用于在有限步骤内解决一个问题;(2)执行一个特定任务的任何操作序列。

    algorithm analysis--算法分析
    一个软件的验证确认任务,用于保证选择的算法是正确的、合适的和稳定的,并且满足所有精确性、规模和时间方面的要求。

    Alpha Testing--Alpha测试
    由选定的用户进行的产品早期性测试。这个测试一般在可控制的环境下进行的。

    analysis--分析
    (1)分解到一些原子部分或基本原则,以便确定整体的特性;(2)一个推理的过程,显示一个特定的结果是假设前提的结果;(3)一个问题的方法研究,并且问题被分解为一些小的相关单元作进一步详细研究。

    anomaly--异常
    在文档或软件操作中观察到的任何与期望违背的结果。
    application software--应用软件
    满足特定需要的软件。

    architecture--构架
    一个系统或组件的组织结构。

    ASQ--自动化软件质量(Automated Software Quality)
    使用软件工具来提高软件的质量。

    assertion--断言
    指定一个程序必须已经存在的状态的一个逻辑表达式,或者一组程序变量在程序执行期间的某个点上必须满足的条件。

    assertion checking--断言检查
    用户在程序中嵌入的断言的检查。

    audit--审计
    一个或一组工作产品的独立检查以评价与规格、标准、契约或其它准则的符合程度。

    audit trail--审计跟踪
    系统审计活动的一个时间记录。

    Automated Testing--自动化测试
    使用自动化测试工具来进行测试,这类测试一般不需要人干预,通常在GUI、性能等测试中用得较多。

    Backus-Naur Form--BNF范式
    一种分析语言,用于形式化描述语言的语法

    baseline--基线
    一个已经被正式评审和批准的规格或产品,它作为进一步开发的一个基础,并且必须通过正式的变更流程来变更。

    Basic Block--基本块
    一个或多个顺序的可执行语句块,不包含任何分支语句。

    basis test set--基本测试集
    根据代码逻辑引出来的一个测试用例集合,它保证能获得100%的分支覆盖。

    behaviour--行为
    对于一个系统的一个函数的输入和预置条件组合以及需要的反应。一个函数的所有规格包含一个或多个行为。

    benchmark--标杆/指标/基准
    一个标准,根据该标准可以进行度量或比较。

    Beta Testing--Beta测试
    在客户场地,由客户进行的对产品预发布版本的测试。这个测试一般是不可控的

    big-bang testing--大锤测试/一次性集成测试
    非渐增式集成测试的一种策略,测试的时候把所有系统的组件一次性组合成系统进行测试。

    Black Box Testing--黑盒测试
    根据软件的规格对软件进行的测试,这类测试不考虑软件内部的运作原理,因此软件对用户来说就像一个黑盒子。

    bottom-up testing--由低向上测试
    渐增式集成测试的一种,其策略是先测试底层的组件,然后逐步加入较高层次的组件进行测试,直到系统所有组件都加入到系统。

    boundary value--边界值
    一个输入或输出值,它处在等价类的边界上。

    boundary value coverage--边界值覆盖
    通过测试用例,测试组件等价类的所有边界值。

    boundary value testing--边界值测试
    通过边界值分析方法来生成测试用例的一种测试策略。

    Boundry Value Analysis--边界值分析
    该分析一般与等价类一起使用。经验认为软件的错误经常在输入的边界上产生,因此边界值分析就是分析软件输入边界的一种方法

    branch--分支
    在组件中,控制从任何语句到其它任何非直接后续语句的一个条件转换,或者是一个无条件转换。

    branch condition--分支条件

    branch condition combination coverage--分支条件组合覆盖
    在每个判定中所有分支条件结果组合被测试用例覆盖到的百分比。

    branch condition combination testing--分支条件组合测试
    通过执行分支条件结果组合来设计测试用例的一种方法。

    branch condition coverage--分支条件覆盖
    每个判定中分支条件结果被测试用例覆盖到的百分比。

    branch condition testing--分支条件测试
    通过执行分支条件结果来设计测试用例的一种方法。

    branch coverage--分支覆盖
    通过测试执行到的分支的百分比。

    branch outcome--分支结果
    见判定结果(decision outcome)

    branch point--分支点
    见判定(decision)

    branch testing--分支测试
    通过执行分支结果来设计测试用例的一种方法。

    Breadth Testing--广度测试
    在测试中测试一个产品的所有功能,但是不测试更细节的特性。

    bug--缺陷

    capture/playback tool--捕获/回放工具
    参考capture/replay tool

    Capture/Replay Tool--捕获/回放工具
    一种测试工具,能够捕获在测试过程中传递给软件的输入,并且能够在以后的时间中,重复这个执行的过程。这类工具一般在GUI测试中用的较多。

    CASE--计算机辅助软件工程(computer aided software engineering)
    用于支持软件开发的一个自动化系统。

    CAST--计算机辅助测试
    在测试过程中使用计算机软件工具进行辅助的测试。

    cause-effect graph--因果图
    一个图形,用来表示输入(原因)与结果之间的关系,可以被用来设计测试用例

    certification --证明
    一个过程,用于确定一个系统或组件与特定的需求相一致。

    change control--变更控制
    一个用于计算机系统或系统数据修改的过程,该过程是质量保证程序的一个关键子集,需要被明确的描述。

    code audit --代码审计
    由一个人、组或工具对源代码进行的一个独立的评审,以验证其与设计规格、程序标准的一致性。正确性和有效性也会被评价。

    Code Coverage--代码覆盖率
    一种分析方法,用于确定在一个测试套执行后,软件的哪些部分被执行到了,哪些部分没有被执行到。

    Code Inspection--代码检视
    一个正式的同行评审手段,在该评审中,作者的同行根据检查表对程序的逻辑进行提问,并检查其与编码规范的一致性。

    Code Walkthrough--代码走读
    一个非正式的同行评审手段,在该评审中,代码被使用一些简单的测试用例进行人工执行,程序变量的状态被手工分析,以分析程序的逻辑和假设。

    code-based testing--基于代码的测试
    根据从实现中引出的目标设计测试用例。

    coding standards--编程规范
    一些编程方面需要遵循的标准,包括命名方式、排版格式等内容。

    Compatibility Testing--兼容性测试
    测试软件是否和系统的其它与之交互的元素之间兼容,如:浏览器、操作系统、硬件等。

    complete path testing --完全路径测试
    参考穷尽测试(exhaustive testing)

    completeness--完整性
    实体的所有必须部分必须被包含的属性。

    complexity --复杂性
    系统或组件难于理解或验证的程度。

    Component--组件
    一个最小的软件单元,有着独立的规格

    Component Testing--组件测试
    参考单元测试

    computation data use--计算数据使用
    一个不在条件中的数据使用。

    computer system security--计算机系统安全性
    计算机软件和硬件对偶然的或故意的访问、使用、修改或破坏的一种保护机制。

    condition--条件
    一个不包含布尔操作的布尔表达式,例如:A

    condition coverage--条件覆盖
    通过测试执行到的条件的百分比。

    condition outcome--条件结果
    条件为真为假的评价。

    configuration control--配置控制
    配置管理的一个方面,包括评价、协调、批准、和实现配置项的变更。

    configuration management--配置管理
    一套技术和管理方面的原则用于确定和文档化一个配置项的功能和物理属性、控制对这些属性的变更、记录和报告变更处理和实现的状态、以及验证与指定需求的一致性。

    conformance criterion-- 一致性标准
    判断组件在一个特定输入值上的行为是否符合规格的一种方法。

    Conformance Testing-- 一致性测试
    测试一个系统的实现是否和其基于的规格相一致的测试。

    consistency -- 一致性
    在系统或组件的各组成部分和文档之间没有矛盾,一致的程度。

    consistency checker-- 一致性检查器
    一个软件工具,用于测试设计规格中需求的一致性和完整性。

    control flow--控制流
    程序执行中所有可能的事件顺序的一个抽象表示。

    control flow graph--控制流图
    通过一个组件的可能替换控制流路径的一个图形表示。

    conversion testing--转换测试
    用于测试已有系统的数据是否能够转换到替代系统上的一种测试。

    corrective maintenance--故障检修
    用于纠正硬件或软件中故障的维护。

    correctness--正确性
    软件遵从其规格的程度。

    correctness--正确性
    软件在其规格、设计和编码中没有故障的程度。软件、文档和其它项满足需求的程度。软件、文档和其它项满足用户明显的和隐含的需求的程度。

    coverage--覆盖率
    用于确定测试所执行到的覆盖项的百分比。

    coverage item--覆盖项
    作为测试基础的一个入口或属性:如语句、分支、条件等。

    crash--崩溃
    计算机系统或组件突然并完全的丧失功能。

    criticality--关键性
    需求、模块、错误、故障、失效或其它项对一个系统的操作或开发影响的程度。

    criticality analysis--关键性分析
    需求的一种分析,它根据需求的风险情况给每个需求项分配一个关键级别。

    cyclomatic complexity--循环复杂度
    一个程序中独立路径的数量。

    data corruption--数据污染
    违背数据一致性的情况。

    data definition--数据定义
    一个可执行语句,在该语句上一个变量被赋予了一个值。

    data definition C-use coverage--数据定义C-use覆盖
    在组件中被测试执行到的数据定义C-use使用对的百分比。

    data definition C-use pair--数据定义C-use使用对
    一个数据定义和一个计算数据使用,数据使用的值是数据定义的值。

    data definition P-use coverage--数据定义P-use覆盖
    在组件中被测试执行到的数据定义P-use使用对的百分比。

    data definition P-use pair--数据定义P-use使用对
    一个数据定义和一个条件数据使用,数据使用的值是数据定义的值。

    data definition-use coverage--数据定义使用覆盖
    在组件中被测试执行到的数据定义使用对的百分比。

    data definition-use pair --数据定义使用对
    一个数据定义和一个数据使用,数据使用的值是数据定义的值。

    data definition-use testing--数据定义使用测试
    以执行数据定义使用对为目标进行测试用例设计的一种技术。

    data dictionary--数据字典
    (1)一个软件系统中使用的所有数据项名称,以及这些项相关属性的集合。(2)数据流、数据元素、文件、数据基础、和相关处理的一个集合。

    data flow analysis--数据流分析
    一个软件验证和确认过程,用于保证输入和输出数据和它们的格式是被适当定义的,并且数据流是正确的。

    data flow coverage--数据流覆盖
    测试覆盖率的度量是根据变量在代码中的使用情况。

    data flow diagram--数据流图
    把数据源、数据接受、数据存储和数据处理作为节点描述的一个图形,数据之间的逻辑体现为节点之间的边。

    data flow testing--数据流测试
    根据代码中变量的使用情况进行的测试。

    data integrity--数据完整性
    一个数据集合完全、正确和一致的程度。

    data use--数据使用
    一个可执行的语句,在该语句中,变量的值被访问。

    data validation--数据确认
    用于确认数据不正确、不完整和不合理的过程。

    dead code--死代码
    在程序操作过程中永远不可能被执行到的代码。

    Debugging--调试
    发现和去除软件失效根源的过程。

    decision--判定
    一个程序控制点,在该控制点上,控制流有两个或多个可替换路由。

    Decision condition--判定条件
    判定内的一个条件。

    decision coverage--判定覆盖
    在组件中被测试执行到的判定结果的百分比。

    decision outcome--判定结果
    一个判定的结果,决定控制流走哪条路径。

    decision table--判定表
    一个表格,用于显示条件和条件导致动作的集合。

    Depth Testing--深度测试
    执行一个产品的一个特性的所有细节,但不测试所有特性。比较广度测试。

    design of experiments--实验设计
    一种计划实验的方法,这样适合分析的数据可以被收集。

    design-based testing--基于设计的测试
    根据软件的构架或详细设计引出测试用例的一种方法。

    desk checking--桌面检查
    通过手工模拟软件执行的方式进行测试的一种方式。

    diagnostic--诊断
    检测和隔离故障或失效的过程。

    dirty testing--肮脏测试
    参考负面测试(negative testing)

    disaster recovery--灾难恢复
    一个灾难的恢复和重建过程或能力。

    documentation testing --文档测试
    测试关注于文档的正确性。

    domain--域
    值被选择的一个集合。

    domain testing--域测试
    参考等价划分测试(equivalence partition testing)

    dynamic analysis--动态分析
    根据执行的行为评价一个系统或组件的过程。

    Dynamic Testing--动态测试
    通过执行软件的手段来测试软件。

    embedded software--嵌入式软件
    软件运行在特定硬件设备中,不能独立于硬件存在。这类系统一般要求实时性较高。

    emulator--仿真
    一个模仿另一个系统的系统或设备,它接受相同的输入并产生相同的输出。

    End-to-End testing--端到端测试
    在一个模拟现实使用的场景下测试一个完整的应用环境,例如和数据库交互,使用网络通信等。

    entity relationship diagram--实体关系图
    描述现实世界中实体及它们关系的图形。

    entry point --入口点
    一个组件的第一个可执行语句。

    Equivalence Class--等价类
    组件输入或输出域的一个部分,在该部分中,组件的行为从组件的规格上来看认为是相同的。

    equivalence partition coverage--等价划分覆盖
    在组件中被测试执行到的等价类的百分比。

    equivalence partition testing--等价划分测试
    根据等价类设计测试用例的一种技术。

    Equivalence Partitioning--等价划分
    组件的一个测试用例设计技术,该技术从组件的等价类中选取典型的点进行测试。

    error--错误
    IEEE的定义是:一个人为产生不正确结果的行为。

    error guessing--错误猜测
    根据测试人员以往的经验猜测可能出现问题的地方来进行用例设计的一种技术。

    error seeding--错误播种/错误插值
    故意插入一些已知故障(fault)到一个系统中去的过程,目的是为了根据错误检测和跟踪的效率并估计系统中遗留缺陷的数量。

    exception--异常/例外
    一个引起正常程序执行挂起的事件。

    executable statement--可执行语句
    一个语句在被编译后会转换成目标代码,当程序运行是会被执行,并且可能对程序数据产生动作。

    Exhaustive Testing--穷尽测试
    测试覆盖软件的所有输入和条件组合。

    exit point--出口点
    一个组件的最后一个可执行语句。

    expected outcome--期望结果
    参考预期结果(predicted outcome)。

    failure--失效
    软件的行为与其期望的服务相背离。

     

  • [论坛] 测试的基本原则

    2008-12-17 17:46:02

    测试的基本原则<->

    在设计有效测试用例之前,测试工程师必需理解软件测试的基本原则。这里有一组测试原则:
    1 、所有的测试都应追溯到用户需求。正如我们所知:软件测试的目标在于揭示错误。而最严重的错误(从用户角度来看)是那些导致程序无法满足需求的错误。
    2 、应该在测试工作真正开始前的较长时间内就进行测试计划。测试计划可以在需求模型一完成就开始,详细的测试用例定义可以在设计模型被确定后立即开始。因此,所有测试应该在任何代码被产生前就进行计划和设计。
    3 、 Pareto 原则应用于软件测试。简单地讲, Pareto 原则暗示着测试发现的错误中的 80 %很可能起源于程序模块中的 20 %。当然,问题在于如何孤立这些有疑点的模块并进行彻底的测试。
    4 、测试应从 “ 小规模 ” 开始,逐步转向 “ 大规模 ” 。最初的测试通常把焦点放在单个程序模块上,进一步测试的焦点则转向在集成的模块簇中寻找错误,最后在整个系统中寻找错误。
    5 、穷举测试是不可能的。即使是一个大小适度的程序,其路径排列的数量也非常大。因此,在测试中不可能运行路径的每一种组合。然而,充分覆盖程序逻辑,并确保程序设计中使用的所有条件是有可能的。
    6 、为了达到最佳效果,应该由独立的第三方来构造测试。 “ 最佳效果 ” 指最有可能发现错误的测试(测试的主要目标),所以创建系统的软件工程师并不是构造软件测试的最佳人选。
    7、 不充分的测试是不负责任的;过分的测试是一种资源的浪费,同样也是一种不负责任的表现.

    测试的基本原则<二>

    1.应当把“尽早和不断的测试”作为开发者的座右铭
    2.程序员应该避免检查自己的程序,测试工作应该由独立的专业的软件测试机构来完成。
    3.设计测试用例时应该考虑到合法的输入和不合法的输入以及各种边界条件,特殊情况下要制造极端状态和意外状态,比如网络异常中断、电源断电等情况。
    4.一定要注意测试中的错误集中发生现象,这和程序员的编程水平和习惯有很大的关系。
    5.对测试错误结果一定要有一个确认的过程,一般有A测试出来的错误,一定要有一个B来确认,严重的错误可以召开评审会进行讨论和分析。
    6.制定严格的测试计划,并把测试时间安排的尽量宽松,不要希望在极短的时间内完成一个高水平的测试。
    7.回归测试的关联性一定要引起充分的注意,修改一个错误而引起更多的错误出现的现象并不少见。
    8.妥善保存一切测试过程文档,意义是不言而喻的,测试的重现性往往要靠测试文档。

     

  • [论坛] GUI 测试

    2008-12-10 01:47:43

    GUI 测试

    图形用户界面( GUI )对软件测试提出了有趣的挑战,因为 GUI 开发环境有可复用的构件,开发用户界面更加省时而且更加精确。同时, GUI 的复杂性也增加了,从而加大了设计和执行测试用例的难度。因为现在 GUI 设计和实现有了越来越多的类似,所以也就产生了一系列的测试标准。下列问题可以作为常见 GUI 测试的指南:

    窗口:
    · 窗口是否基于相关的输入和菜单命令适当地打开?
    · 窗口能否改变大小、移动和滚动?
    · 窗口中的数据内容能否用鼠标、功能键、方向键和键盘访问?
    · 当被覆盖并重新调用后,窗口能否正确地再生?
    · 需要时能否使用所有窗口相关的功能?
    · 所有窗口相关的功能是可操作的吗?
    · 是否有相关的下拉式菜单、工具条、滚动条、对话框、按钮、图标和其他控制可为窗口使用,并适当地显示?
    · 显示多个窗口时,窗口的名称是否被适当地表示?
    · 活动窗口是否被适当地加亮?
    · 如果使用多任务,是否所有的窗口被实时更新?
    · 多次或不正确按鼠标是否会导致无法预料的副作用?
    · 窗口的声音和颜色提示和窗口的操作顺序是否符合需求?
    · 窗口是否正确地被关闭?

    下拉式菜单和鼠标操作:
    · 菜单条是否显示在合适的语境中?
    · 应用程序的菜单条是否显示系统相关的特性(如时钟显示)?
    · 下拉式操作能正确工作吗?
    · 菜单、调色板和工具条是否工作正确?
    · 是否适当地列出了所有的菜单功能和下拉式子功能?
    · 是否可以通过鼠标访问所有的菜单功能?
    · 文本字体、大小和格式是否正确?
    · 是否能够用其他的文本命令激活每个菜单功能?
    · 菜单功能是否随当前的窗口操作加亮或变灰?
    · 菜单功能是否正确执行?
    · 菜单功能的名字是否具有自解释性?
    · 菜单项是否有帮助,是否语境相关?
    · 在整个交互式语境中,是否可以识别鼠标操作?
    · 如果要求多次点击鼠标,是否能够在语境中正确识别?
    · 光标、处理指示器和识别指针是否随操作恰当地改变?

    数据项:
    · 字母数字数据项是否能够正确回显,并输入到系统中?
    · 图形模式的数据项(如滚动条)是否正常工作?
    · 是否能够识别非法数据?
    · 数据输入消息是否可理解?

  • [论坛] 冒烟测试

    2008-12-10 01:33:46

     

    什么是冒烟测试


    [摘要] 关于冒烟测试,应该是微软首先提出来的一个概念,和微软一直 提倡的每日build有很密切的联系。具体说,冒烟测试就是在每日build建立后,对系统的基本功能进行简单的测试。这种测试强调功能的覆盖率,而不对 功能的正确性进行验证。从这一点看和所谓的“接受性(验收)测试(Acceptance Test)”非常相似。不同之处就在于他们执行的频率和被测的版本不同。


    [关键字] 软件测试 冒烟测试 验收测试
    关于冒烟测试,应该是微软首先提出来的一个概念,和微软一直提倡的每日build有很密切的联系。具体说,冒烟测试就是在每日build建立后,对系统的 基本功能进行简单的测试。这种测试强调功能的覆盖率,而不对功能的正确性进行验证。从这一点看和所谓的“接受性(验收)测试(Acceptance Test)”非常相似。不同之处就在于他们执行的频率和被测的版本不同。
    至于冒烟测试这个名称的来历,大概是从电路板测试得来的。因为当电路板做好以后,首先会加电测试,如果板子没有冒烟在进行其它测试,否则就必须重新来过。类似的如果冒烟测试没有通过,那么这个build也会返回给开发队伍进行修正,测试人员测试的版本必须首先通过冒烟测试的考验。


    冒烟测试的说法据说是:
    就象生产汽车一样,汽车生产出来以后,首先发动汽车,看汽车能否冒烟,如果能,证明汽车最起码可以开动了。说明完成了最基本的功能。
    冒烟测试一般用于每日构建(Nightly build),构建服务器首先从CVS服务器上,下载最新的源代码,然后编译单元测试,运行单元测试通过后,编译可执行文件,可执行文件若可运行,并能执 行最基本的功能,则认为通过了冒烟测试,这时,构建服务器会把程序打包成安装文件,然后上传到内部网站,第二天一早,测试人员来了以后,会收到构建服务器 发来的邮件提示昨晚是否构建成功。若构建成功,则测试人员进行相关的功能测试。所有这些功能的完成,一般是靠编写脚本完成的,目前比较常用的脚本有 TCL,Perl,Python及功能弱弱的批处理。用这些可以完成系统的每日构建。
    简单的说,就是先保证系统能跑的起来,不至于让测试工作做到一半突然出现错误导致业务中断。目的就是先通过最基本的测试,如果最基本的测试都有问题,就直接打回开发部了,减少测试部门时间的浪费


    冒烟测试准则
    软件中,“冒烟测试”这一术语描述的是在将代码更改签入到产品的源树中之前对这些更改进行验证的过程。在检查了代码后,冒烟测试是确定和修复软件缺陷的最经济有效的方法。冒烟测试设计用于确认代码中的更改会按预期运行,且不会破坏整个版本的稳定性。
    注意:“冒烟测试”这一术语源自硬件行业。该术语源于此做法:对一个硬件或硬件组件进行更改或修复后,直接给设备加电。如果没有冒烟,则该组件就通过了测试。
    下面的准则描述了冒烟测试的最佳做法。遵循准则的效果会有很大的不同,从增强团队成员之间的交流,到形成特定的使用测试和调试工具的方式等。
    与开发人员协同工作
    由于冒烟测试特别关注更改过的代码,因此必须与编写代码的开发人员协同工作。必须了解以下内容:
    •        代码中进行了什么更改。若要理解该更改,必须理解使用的技术;开发人员可以提供相关说明。
    •        更改对功能有何影响。
    •        更改对各组件的依存关系有何影响。
    在进行冒烟测试前检查代码
    在运行冒烟测试前,进行侧重于代码中的所有更改的代码检查。代码检查是验证代码质量并确保代码无缺陷和错误的最有效、最经济的方法。冒烟测试确保通过代码检查或风险评估标识的主要的关键区域或薄弱区域已通过验证,因为如果失败,测试就无法继续。
    在干净的调试版本中安装私有二进制文件
    由于冒烟测试必须侧重于仅对更新后的二进制文件中的功能更改进行验证,所以必须通过使用被测试文件的调试二进制文件来使测试在干净的测试环境中运行。

    注意
    在冒烟测试中,使用不匹配的二进制文件进行测试是一个常见错误。为了避免此错误,当两个或多个更新后的二进制文件之间存在依赖项时,请在测试版本中包括所有更新后的二进制文件。否则,测试的结果可能无效。
    创建每日构建 (Daily Build)
    每日构建要求团队成员协同工作,并鼓励开发人员彼此保持同步。如果新版本的迭代被延迟,则该延迟很容易导致具有多个依赖项的产品不同步。遵循每日构建和冒烟测试的过程,任何更改过的或新的二进制文件都可确保实现高质量。
    有关设置重复版本的更多信息,请参见 在 Team Foundation Build 中运行生成。有关验证产品版本的更多信息,请参见如何:配置和运行生成验证测试 (BVT)。


    注意
    将高质量的每日构建作为团队最重要的任务。如果由于签入代码未进行冒烟测试而导致版本中断,则需要开发人员和测试人员停止所有其他工作,直到问题被解决为止。对导致中断版本的人员的处罚不应该很重,但这个处罚一定要能强调这样一个道理:正确的每日构建是团队最重要的任务。
    不需要执行穷举测试。冒烟测试的目的不是确保二进制文件 100% 没有错误。这样需要花费太多的时间。执行冒烟测试是为了在高级别验证版本。要确保二进制文件中的更改不会破坏常规版本的稳定性,也不会导致功能中出现严重错误。
    Web 测试和负载测试
    生成 Web 测试和负载测试时,在运行任何时间长、工作量大的测试之前运行冒烟测试是一种很好的做法。在 Web 测试和负载测试中,冒烟测试时间短,工作量也小。使用冒烟测试是为了在运行性能测试压力测试之前,确保一切都已正确配置并可按预期运行。

     

  • 从程序员到测试工程师

    2008-12-07 00:50:15

    这篇是2002年底《程序员》杂志上的一篇文章,虽然时间早了点,但值得一看。
    ------------
    前言:软件测试一门非常崭新的学科,目前研究的内容还很不深入,仍然处于婴儿阶段。软件测试需要什么样的专业基础还没有定论,而且目前还没有一种很好的标准来衡量测试人员。但无可置疑,软件测试越来越受到软件公司的重视,软件测试工程师的作用也逐渐被人们所认可。这一点已经在像微软这样的国外大型软件企业中所证实,在微软,一个开发人员相对应着一至两个测试人员。现在,就让我们走近软件测试工程师,关注他们的成长之路。

    从程序员到软件测试工程师

    特别策划/本刊编辑部 撰文/闫辉

    国内软件公司对软件测试的态度令人担忧。软件测试工程师不足,开发测试人员比例不合理。据调查,最好的企业中测试人员和开发人员的比例是1:8,有的是1:20,甚至没有专职的测试工程师。

    曾经参与微软Windows95、Exchange Server4.0和4.5、Internet Explorer 4.0和5.0、SQL Server 2000开发与测试工作陈宏刚博士尽管已经升任微软亚洲研究院商务及高校关系高级经理,但仍然对国内软件测试水平的落后深有感触。

    国内很多企业还处在探索阶段,小企业的运作方式造成其主要精力是要尽快完成初始资本积累。有些企业也了解软件测试的重要性,很努力、很认真的在学,但因为很多原因而学不到精髓,不知道如何去做。于是只能局限于书本上学来的简单的黑箱、白箱测试而已。很多人知道有压力测试和性能测试,但针对产品具体如何去做就不清楚了。

    陈宏刚表示,重视测试首先需要有开放性的软件文化,而在很多公司中,测试工程师只是绝对服从的听命角色,没有开发他们的积极性和创造性。一些管理人员对软件开发的流程管理经验不足,仍然用传统企业的方法进行管理,再加上对软件质量的控制理解不对,认为编完程序经过简单的程序员自己测试就可以使用了,而没有认识到软件测试是控制质量最好的方法。

    不过,国内还是有一些大型公司和专业公司已经在软件测试方面走上正规。1994年开始接包IBM软件测试项目,1999年软件测试成为公司主体软件外包业务之一的和腾软件就是其中之一。因为客户就是IBM这样的大型软件公司,腾软件高级副总裁刘忠表示,它们在软件测试管理上,经同国外的公司相差不大,同时也研究和应用了多种软件测试技术。

    软件测试工程师

    一提到软件测试工程师,很多人就会想到那些反复使用软件,试图在频繁操作中寻找到错误发生的低层次人员或者软件用户。其实这是一种错误的概念,软件测试早已超越了用户使用来发现Bug的基本测试阶段。

    陈宏刚介绍说,微软的软件测试工程师分为三种:测试执行者(Basic Software Tester)、测试工具软件开发工程师(Software Development Engineer in Test)和高级软件测试工程师(Ad_hoc Tester)

    测试执行者负责理解产品的功能要求,然后根据测试规范和测试案例对其进行测试,检查软件有没有错误,决定软件是否具有稳定性,属于最低级的执行角色。

    测试工具软件开发工程师负责写测试工具代码,并利用测试工具对软件进行测试;或者开发测试工具为软件测试工程师服务。产品开发后的性能测试、提交测试等过程,都有可能要用到开发的测试工具。对技术要求最强的是这些人,因为它们要具备写程序的技术。“因为不同产品的特性不一样,对测试工具要求也是不同的,就像Windows的测试工具不能用于Office,office的也不能用于SQLserver,微软很多测试工程师就是负责专门为某个产品写测试程序的。”

    而Ad_hoc Testet属于比较有经验,自己会找方向并做的很好的测试工程师,这要求具有很强的创造性。刚进入微软时,老板也是只给陈宏刚一个操作流程,每天就按照这个规程去做,几天下来,一个Bug都没有发现。陈宏刚也很沮丧,觉得这样挺对不起公司,后来自己问自己:为什么非要这样做!于是换了其他的方法试试,令他吃惊的是,一下就找到很多严重的Bug,当时也不敢声张。有一天,他找到10多个非常严重的Bug,开发经理一下就惊呆了,怒冲冲的跑到陈宏刚面前问:“你是不是改变了测试方式和测试步骤?”陈宏刚有些吓住,说道:“可能改变了一点。”对方说:“我非常生气,但我不是生你的气,而是因为以前测试人员水平太差,或者以前的测试方面有问题,软件中有些Bug存在了半年甚至一年,但直到现在才发现,现在修补这些错误要困难很多!”后来陈宏刚得到了老板的赞许,可以按照自己的想法去做测试。对此,陈宏刚感受颇深:“一方面我体会到了微软非常鼓励创造的文化,同时也感到只遵守教条不是好的测试人员,就和用户一样了。做软件测试工程师同样需要开拓和创造性。”

    在开发管理上,测试不应该归属于项目管理,也不应该归属开发人员。这三个部门应该是并驾齐驱,相互协作,测试工程师最终决定产品是否能够发布。

    软件测试工程师的素质

    因为软件测试仍然处在发展阶段,还没有上升到理论层次。对人员的评测,包括微软在内,都还没有一个统一标准,因此评定软件测试工程师只能根据工作实践进行自然淘汰。

    软件测试对逻辑思维、学习能力、反应要求很高,是否有严密的思维和逆向思维也非常重要。陈宏刚介绍说,在五六个人的测试小组时,一半以上的Bug都是他找到的。他认为这同自己数学专业的背景关系密切,数学中有逻辑思维的培训,要善于找出来各方面的因素。比如要证明一个定理,各个方面都考虑到,一个条件不满足就无法证明;但如果证明其不成立,最常用的就是找到一个反例,只要有一点证明不成立就可以了,软件测试也是找这一点。

    做测试还要考虑到所有出错的可能性,还要做一些不是按常规做的、非常奇怪的事。除了漏洞检测,测试还应该考虑性能问题,也就是要保证软件运行得很好,没有内存泄漏,不会出现运行越来越慢的情况;在不同的使用环境下,考虑软件的兼容性同样重要。软件测试同产品的规模也有很大的关系,因为软件的bug往往出在大型软件的连接处。

    做软件测试工程师需要对软件抱有怀疑态度。这是因为开发人员喜欢想当然,总是找一些有利于自己程序执行的数据,有些开发人员甚至认为不利于程序执行的数据是对代码的玷污和亵渎。而软件测试却要策略性的准备各种数据,从每个细节上设计不同的应用场景,不去想当然的假定任何一个数据是可行的。

    在职业素质和交际方面方面,并不是测试工程师爱挑别人毛病才好,反而这个工作要求很强的沟通能力。经常的和开发人员进行沟通,说话办事要很得当,不能指责别人,否则会事倍功半。性格随和才能和开发人员顺畅的沟通,对人和对事是完全不同的两个问题。

    如何培养优秀的软件测试工程师

    朗川软件测试工程师张建阳从北大力学系毕业之后,曾开发流体力学分析软件,软件缺少测试而产生的问题给她留下了很深的印象。后来去大唐电信做UIM(统一消息管理系统),她发现尽管公司为了鼓励员工找bug采取了很多奖励方法,但还是很少人愿意去做系统测试。而张建阳却从那时查阅翻译了很多国内外的资料,对软件测试产生了浓厚的兴趣。

    像张建阳这样在工作中自己定位在软件测试领域的开发人员并不多见,因为程序员更愿意去做开发而不是测试,从大环境上,测试人员收入水平低也是原因之一。而在微软,测试人员和开发人员的工资水平是相同的。

    如何改变这种现状呢?有人说可以可以派人去先进的国外软件企业学习,但这种方式因为牵涉到商业秘密,可操作性不大。陈宏刚博士认为更好的方法是引进人才,把在国外大型软件公司工作过、有经验的人才引进来,甚至要高薪聘请。他表示,这不仅仅是一个人的问题,关键是能够把整个软件测试的水准提高一个层次。

    引进人才只是开始,更重要的是培养一批软件测试人才。软件开发的教育培训都是比较正规的,各个学校也都设有专业,但软件测试还没有正规的专业毕业生,而且没有评判的标准。陈宏刚博士给很多软件学院建议,开设四方面的软件测试专业基础课:软件测试基础、软件测试开发、高级软件测试案例和行业软件特色测试方法。国内现在已经有了一些软件测试基础的教材,但其他的教材还没有。高级软件测试案例主要是大型软件测试案例,大型软件出现的问题具有很强的代表性。而行业特色软件测试的课程可以开阔学生的视野。陈博士介绍说,在国外,也是极少的高等院校开设测试专业,但可以借鉴民间的培训机构课程。在有一批专业的测试人才出现之后,人们会认识到他们的重要性。

    如果你已经开始从事软件测试工作,千万不要认为软件测试没有什么发展的潜力和前途。刘忠从1995年接下IBM的OS2汉化版本的测试开始到现在,他一直工作在软件测试领域,并升到了公司高级副总裁的位置。和腾软件也培养了一批测试工程师,它们从对测试职业将信将疑到明确自己的测试方面的职业目标。刘忠介绍说:“很多人开始做测试执行工作时会说很麻烦、很枯燥,只是一味的埋怨,而不是主动的去学习,他没有看到软件测试背后所隐藏的知识。因为学习可以做这些工作,不学习也可以做这些工作,但质量是不同的。有些人自学和请教了很多测试技术和管理方面的知识,公司自然就会在下个项目中去培养他。”

    因此对于一个新手,要在各方面培养自己的能力。首先是要理解各种测试流程,并在理解的基础上转化为自己的知识,以后遇到相似的问题能自己去解决。在测试技能上,要知道测试有那些手段,比如压力测试有哪些方法,哪些工具可以辅助做测试。从专业技能上,面向不同的技术方向,像操作系统、网络、通信等都要从专业上深入了解。这三方面要同步去成长。

    软件测试工程师未来的发展

    从事软件测试有没有前途,未来的职业发展方向怎样呢?

    陈宏刚博士表示,软件测试工程师在微软的发展有几种途径:一种走技术路线,成长为高级软件测试工程师,这时他能够独立测试很多软件,再向上可以成为软件测试架构设计师。第二种就是向管理方向发展,从测试工程师到组长(Lead),再到项目经理(Manager),到更高的职位。第三种可以换职业,做项目管理,做开发人员都可以,很多测试工具软件开发工程师在写测试软件的过程中,因为开发方面积累了经验,同时对软件产品本身产生了自己的看法,很容易转去做产品编程。

    陈宏刚博士现在还带着一个测试小组,两个清华软件学院的学生,一个南开的专门做软件测试的博士生,一个北邮的学生,他们负责总部一个产品的测试。陈博士表示,在自己简单的讲讲思路,共同探讨之后,他们一星期就找出了70多个Bug,也感觉学了很多知识,并表示以后专注于软件测试专业,因为他们感觉软件测试真的是一门很深的学科,有很多可以研究的课题。其实微软的测试人员很多也都是硕士、博士,他们同样在做创造性的工作,保证着程序质量,推动着软件的进步。

    软件测试是正在快速发展,充满挑战的领域。尽管现在单机版桌面软件的测试已经成熟了很多,但对于网络时代的到临,包括微软在内的公司对基于网络的测试也没有一套完整的体系,也是处于探索中,网络中被攻击的可能性太大,这就是为什么黑客在网络上能兴风作浪的原因。网络测试是一个新环境,而且是很大的挑战。

    软件测试未来的发展空间很大,软件测试工程师的职业之路同样充满希望。

    李维谈软件测试

    记者:台湾的软件测试工程师的地位如何?

    李维:就我知道的几个案例来说, 地位很低。许多公司不是没有专职的测试机制,就是老板认为不重要。许多老板还认为直接让客户测试即可,实在不可思议。

    记者:测试工程师的人员比例也很小吗?

    李维:是的, 大概6-8位工程师配一个测试人员,不过有的是以产品线来分的。

    记者:台湾有专业的测试培训教育吗?

    李维:据我所知, 沒有。

    记者:依您的看法,软件公司如何才能重视软件测试呢?

    李维:台湾国际级的软件公司如友立、趋势才重视测试。如果是短视的软件公司,由于许多老板不是资讯出身,所以不了解软件工程的重要。要重视软件测试,负责研发的头头必须有明确的认识。许多软件人员知道使用OO或者SD的方式设计软件,却不知对于测试也同样的需要事先设计并规划测试计划,这实在好玩。

    记者:borland公司测试人员情况如何?

    李维:Borland有不同的测试人員, 针对不同的产品。专职的测试人员大约有50-60人,测试人员占研发人数的30-40%。Borland的测试人员都会规划测试计划,同时有系统和回归测试。
  • [论坛] 测试用例(格式)

    2008-12-07 00:20:44

     

    测试用例

     

                          编号:

    编制人

     

    审定人

     

    时间

     

    软件名称

     

    编号/版本

     

    测试用例

     

    用例编号

     

    参考信息(参考的文档及章节号或功能项):

     

     

     

     

    输入说明(列出选用的输入项,覆盖正常、异常情况):

     

     

     

     

     

     

    输出说明(逐条与输入项对应,列出预期输出):

     

     

     

     

     

    环境要求(测试要求的软、硬件、网络要求):

     

     

     

     

    特殊规程要求:

     

     

    用例间的依赖关系:

     

     

     

     

  • [论坛] 测试用例规程

    2008-12-07 00:18:42

     

    测试用例规程

     

    目的:

    测试用例文档化、规范化,实现软件测试的配置管理

    一、适用范围:

    同方融达系统测试

    二、规范:

    1 XX测试项目

    用例

    编号

    用例

    级别

    输入

     

    预期输出

     

    实测结果

     

    备注

     

    对该用例分配唯一的编号标识

    表明该用例的重要性

    列出执行本测试用例所须的具体的每一个输入(值)

    列出所有的

    预期指标要

    求下的具体

    预期输出(值)

     

     

    此项在测试

    时填写。指明

    该测试用例是

    否通过。如果

    不通过,需列出

    实际测试时的

    测试输出值

     

    如果有必要,则要填写“预置条件”、“特殊环境需求”、“特殊测试步骤要求”、“相关测试用例”以及“相关测试规程”等相关信息,具体见详细的注释说明

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

                               

     

     

     

     

     

     

     

     

     

     

     

     

    11 XX测试子项目

      

    注:

    测试项目:

       指明并简单描述本测试用例集是用来测试哪些软件项目,软件子项目或软件特性的。

     对于测试项目,测试子项目的划分和分类的确定,是由测试方案文档的“测试用例设计”来完成的。

    测试子项目:

       参考上述关于“测试项目”的说明。

    用例编号:

       对该测试用例分配的唯一的编号标识。

    用例级别:

       表明该用例的重要程度。用例的重要性并不对应用例可能造成的后果,而是对应用例的基本程度。测试用例分为四级:

       级别1:基本。该类用例涉及系统基本功能,用于版本提交时作为“版本通过准则”。如存在不通过的项目时可考虑重新提交版本,例如通话不计费等。1级用例的数量应受到限制。

       级别2:重要。该类用例涉及单个版本特性

       级别3:详细。该类用例仅影响某单项功能的某一细节方面。例如某业务的登记和使用正常,但和另一个新业务发生不应有的冲突。有关性能、极限等方面的测试可归入3级用例。有关用户界面的基本规范等方面的测试可归入3级用例

       级别4:生僻。该类用例对应较生僻的预置条件和数据设置。有关用户界面的优化等方面的测试可归入4级用例

    输入:

      具体的输入值,包括各输入值的先后关系等。

    预期输出:

      预期输出值,如需要,也要列出描述预期输出数值的容许范围的公差。

    实测结果:

      测试时填写,是否通过,若未通过,需列出实际测试时的测试输出值

      本次测试结果:

    OK:测试结果全部正确

    POK:测试结果大部分正确

    NG:测试结果有较大的错误

    NT:本次无法测试(特殊原因)

    预置条件:

      执行本用例前,被测试对象所需具备的预置数据,所处状态或入口条件等要求

    特殊环境要求:

      硬件环境

      软件环境

      其他

    特殊测试步骤要求:

      执行本用例时要注意的步骤要求

    相关测试用例:

    相关测试规程:

     

  • 361/212>