发布新日志

  • “白盒”静动测试两齐全

    2007-02-25 14:01:38

     

    来源:赛迪网

    在通常情况下,嵌入式软件测试一般采取黑盒测试与白盒测试相结合的方法。其中,白盒测试一般分为静态测试与动态测试。静态测试不实际运行软件,主要是对软件的编程格式、结构等方面进行评估,而动态测试需要在Host环境或Target环境中实际运行软件,并使用设计的测试用例去探测软件漏洞。
      静态测试
      静态测试包括代码检查、静态结构分析、代码质量度量等。它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行。
      代码检查 代码检查包括代码走查、桌面检查、代码审查等,主要检查代码和设计的一致性,代码对标准的遵循、可读性,代码的逻辑表达的正确性,代码结构的合理性等方面;可以发现违背程序编写标准的问题,程序中不安全、不明确和模糊的部分,找出程序中不可移植部分、违背程序编程风格的问题,包括变量检查、命名和类型审查、程序逻辑审查、程序语法检查和程序结构检查等内容。
      在实际使用中,代码检查比动态测试更有效率,能快速找到缺陷,发现30%~70%的逻辑设计和编码缺陷;代码检查看到的是问题本身而非征兆。但是代码检查非常耗费时间,而且代码检查需要知识和经验的积累。代码检查应在编译和动态测试之前进行,在检查前,应准备好需求描述文档、程序设计文档、程序的源代码清单、代码编码标准和代码缺陷检查表等。
      静态结构分析 静态结构分析主要是以图形的方式表现程序的内部结构,例如函数调用关系图、函数内部控制流图。其中,函数调用关系图以直观的图形方式描述一个应用程序中各个函数的调用和被调用关系;控制流图显示一个函数的逻辑结构,它由许多节点组成,一个节点代表一条语句或数条语句,连接结点的叫边,边表示节点间的控制流向。
      代码质量度量 ISO/IEC 9126国际标准所定义的软件质量包括六个方面:功能性、可靠性、易用性、效率、可维护性和可移植性。软件的质量是软件属性的各种标准度量的组合。
      针对软件的可维护性,目前业界主要存在三种度量参数:Line复杂度、Halstead复杂度和McCabe复杂度。其中Line复杂度以代码的行数作为计算的基准。Halstead以程序中使用到的运算符与运算元数量作为计数目标(直接测量指标),然后可以据以计算出程序容量、工作量等。McCabe复杂度一般称为圈复杂度(Cyclomatic complexity),它将软件的流程图转化为有向图,然后以图论来衡量软件的质量。McCabe复杂度包括圈复杂度、基本复杂度、模块设计复杂度、设计复杂度和集成复杂度。
      动态测试
      动态测试包括功能确认与接口测试、覆盖率分析、性能分析、内存分析等。
      功能确认与接口测试 这部分的测试包括各个单元功能的正确执行、单元间的接口,包括:单元接口、局部数据结构、重要的执行路径、错误处理的路径和影响上述几点的边界条件等内容。
      覆盖率分析 覆盖率分析主要对代码的执行路径覆盖范围进行评估,语句覆盖、判定覆盖、条件覆盖、条件/判定覆盖、修正条件/判定覆盖、基本路径覆盖都是从不同要求出发,为设计测试用例提出依据的。
      性能分析 代码运行缓慢是开发过程中一个重要问题。一个应用程序运行速度较慢,程序员不容易找到是在哪里出现了问题?如果不能解决应用程序的性能问题,将降低并极大地影响应用程序的质量,于是查找和修改性能瓶颈成为调整整个代码性能的关键。目前性能分析工具大致分为纯软件的测试工具、纯硬件的测试工具(如逻辑分析仪和仿真器等)和软硬件结合的测试工具三类。
      内存分析 内存泄漏会导致系统运行的崩溃,尤其对于嵌入式系统这种资源比较匮乏、应用非常广泛,而且往往又处于重要部位的,将可能导致无法预料的重大损失。通过测量内存使用情况,我们可以了解程序内存分配的真实情况,发现对内存的不正常使用,在问题出现前发现征兆,在系统崩溃前发现内存泄露错误;发现内存分配错误,并精确显示发生错误时的上下文情况,指出发生错误的原由。
      连接方式
      在嵌入式软件测试中,测试系统Host与被测试系统Target的连接有两种方式:直接连接和通过仿真器连接。直接连接是Host与Target通过串口、并口或网口直接连接。
      白盒测试
      部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能。白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。
      “白盒”法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。“白盒”法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字,但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序;第二,穷举路径测试不可能查出程序中因遗漏路径而出错;第三,穷举路径测试可能发现不了一些与数据相关的错误。
      注意:
      由于白盒测试则只根据程序的内部结构进行测试,而不考虑外部特性,如果程序结构本身有问题,比如说程序逻辑有错误或是有遗漏,那是无法发现的。

  • 功能测试用例的书写方式

    2007-02-25 13:59:09

    功能测试用例的书写方式
    来自:51cmm.com

    功能性测试用例
    1. 测试的来源,即测试的需求
    测试用例的主要来源有:


    1) 需求说明”及相关文档 2)相关的设计说明(概要设计,详细设计等) 3)与开发组交流对需求理解的 记录(可以是开发人员的一个解释)

    4)已经基本成型的UI(可以有针对性地补充一些用例)

    简而言之,所有你能得到的项目文档,都尽量拿到。 从所得到的资料中,分解出若干小的“功能点”,理解“功能点”,编写相应的测试用例。

    2. 用例的组织方式

    不同的公司有不同的做法,原则上,只要方便管理和跟踪,怎么组织都可以的。

    用例可以按大的功能块组织,如查询功能模块的用例,可以组织在一起,打印模块的测试用例,可以另外组 织在一起。

    在没有专门的测试用例管理工具的情况下,用例执行后会产生2种状态:“通过”、“失败”——这样加上“未 执行”的用例的状态,共3种状态。

    即从“未执行”用例中执行一个用例后,该用例状态应为“失败”或“通 过”。将同一状态的用例组织在一起。

    至于用例文件格式,可以是.DOC或.XLS(如果有专门的测试用例管理工具另当别论)。

    3. 用例与其他材料的关联方式,即如何解决用例跟踪的问题 测试用例面临的比较大的风险有:

    需求的变更、设计的修改、需求的错误和遗漏等等。

    由于用例的主要来源是需求和设计的说明,所以对用例的跟踪其实就是对需求和设计的跟踪,需求和设计的 变更势必引起测试用例的变更。

    如前所说,将分解的功能点编号,与相应的用例联系起来。例如,你可以列一个表格,列出各个(编号的)功 能点和测试用例间的关联关系。

    这样,当需求和设计发生变化时,你只需要跟踪“功能点”是否变化,是否增 加了新的功能点。

    重要和困难的是,不手头的资料和信息一定要是最新的。

    4. 一个好的用例的表述要点,即用例中应当包含的信息

    一个优秀的测试用例,应该包含以下信息:

    1) 软件或项目的名称

    2) 软件或项目的版本(内部版本号)

    3) 功能模块名

    4) 测试用例的简单描述,即该用例执行的目的或方法

    5) 测试用例的参考信息(便于跟踪和参考)

    6) 本测试用例与其他测试用例间的依赖关系

    7) 本用例的前置条件,即执行本用例必须要满足的条件,如对数据库的访问权限

    8) 用例的编号(ID),如可以是 软件名称简写-功能块简写-NO.。

    9) 步骤号、操作步骤描述、测试数据描述

    10)预期结果(这是最重要的)和实际结果(如果有BUG管理工具,这条可以省略)

    11)开发人员(必须有)和测试人员(可有可无)

    12)测试执行日期

    5. 给出一个测试用例的例子该范例已经包含一个测试用例的模板。

    项目/软件 技术出口合同网络申领系统 (企业端) 程序版本 1.0.25
    功能模块名 Login 编制人   xxx
    用例编号- TC-TEP_Login_1 编制时间   2002.10.12
    相关的用例
    功能特性 用户身份验证
    测试目的 验证是否输入合法的信息,允许合法登陆,阻止非法登陆
    预置条件 特殊规程说明 如数据库访问权限
    参考信息 需求说明中关于“登陆”的说明
    测试数据 用户名=yiyh 密码=1
    操作步骤 操作描述 数 据 期望结果 实际结果 实际结果

    测试状态

    1 输入用户名称,按“登陆”按钮。 用户名=yiyh,密码为空 显示警告信息“请输入用户名和密码!”
    2 输入密码,按“登陆”按钮。 用户名为空,密码=1 显示警告信息“请输入用户名和密码!”
    3
    输入用户名和密码,按“登陆”按钮。
    用户名=yiyh,密码=2
    显示警告信息“请输入用户名和密码!”

    4
    输入用户名和密码,按“登陆”按钮。
    用户名=xxx,密码=1
    显示警告信息“请输入用户名和密码!”
    5
    输入用户名和密码,按“登陆”按钮。
    用户名=xxx,密码=2
    显示警告信息“请输入用户名和密码!”
    6
    输入用户名和密码,按“登陆”按钮。
    用户名=空,密码=空
    显示警告信息“请输入用户名和密码!”
    7
    输入用户名和密码,按“登陆”按钮。
    用户名=yiyh,密码=1
    进入系统页面。
    8
    输入用户名和密码,按“登陆”按钮。
    用户名=Admin,密码=admin
    进入系统维护页面。
    9
    输入用户名和密码,按“登陆”按钮。
    用户名=yiyh',密码=1
    显示警告信息“请输入用户名和密码!”
    10 输入用户名和密码,按“登陆”按钮。
    用户名=yiyh,密码=1'
    显示警告信息“请输入用户名和密码!”
    11 输入用户名和密码,按“重置”按钮。 用户名=yiyh,密码=1 清空输入信息
    测试人员 开发人员 项目负责人


    备注:本用例未考虑“企业代码”的输入情况;测试用例并未涵盖所有的非法输入,如非法输入中可能会有

    “user=*,pw=*”的组合,对回车的默认操作,空格输入,对输入上溢的处理的处理(可能会跳过身份验证) 等等。

    如果你有兴趣,至少可以再补充5-10条左右的输入组合

    (当然,如果步骤超过15步,用例的易操作 性就降低,你可以再创建一个测试用例如TC-TEP_Login_2)。

  • 用NUnit自动测试.NET代码

    2007-01-11 13:36:41

    NUnit可以使你很快、很容易地对代码进行单元测试。而且它是免费的。
    by Bill Wagner
    NUnit是一组类,你可以用它在你的.NET类上创建和执行自动的单元测试。作为对本篇文章的补充材料,你可以到NUnit网站上查看关于单元测试的价值的白皮书和文章(见资源)。

    你可以下载NUnit的已创建的类,或源代码。我更喜欢下载源代码。当我访问这个站点时,NUnit最新的版本是beta 2,我需要做些修改,这样NUnit就可以在RC1下创建和运行单元测试了。

    首先,你需要为NUnit生成你自己的密钥文件(key file),因为源代码中不包含一个密钥文件。按下面的方式生成正确类型的keyfile:sn -k NUnit.key



    接下来,你需要改变几个原形(prototype),因为NUnit项目包含Dispose的旧版本。新的原形应该是: virtual void Dispose (bool Disposing);




    现在你就可以构建NUnit,运行它,并运用样例测试了。运行NUnitGUI项目来加载测试,选择Browse按钮来载入一个程序集。如果要用样例,就需要选择SampleMoney.dll程序集。一旦你加载了一个程序集,TypeName框就会显示已经定义了测试的程序集的类型。点击Run按钮,执行所有的测试,并在窗口底部查看结果。

    运行样例很有用,但你可能想知道如何用你自己的代码来创建和执行测试。为了说明如何运用NUnit,我将为前面写的Source Count程序编写一个测试包(test suite)。NUnit用reflection在你的单元测试代码中找到测试方法。为了创建一个测试包,我们只需要创建一个执行测试的类。你必须从TestCase继承这个类,TestCase是NUnit的一部分。你的新类中的任何测试方法必须是公有的并以“test”开头。测试方法也应该包含一个空的返回类型,并不用任何参数。下面是我的测试包中的两个测试方法:public void testComments () {
        Assert ("Checking Comment lines",
            testObj.SingleLineComments == 2);
    }

    public void testDocs () {
        Assert
        ("Testing Documentation lines",
        testObj.DocumentationComments == 3);
    }




    Assert方法(是NUnit的一部分)对测试结果进行检查。你可以用一个字符串来说明哪个测试失败了。一些测试包在运行前需要设置或拆分代码;TestCase类为此提供了虚拟的函数。在我的测试中,我用了SetUp方法来初始化源代码计数器:protected override void SetUp () {
        testObj = new CountStats ();
        StringReader reader = new
            StringReader (theTest);
        testObj.ProcessFile(reader);
    }




    最后,你需要一个静态的方法来返回ITest接口。NUnit用了一个构造器使这项工作变得很简单。你可以用类型信息为任何测试包创建ITest接口:public static ITest createSuite  {
        get {
            return new TestSuite (typeof
                (MySuite));
        }
    }




    这就可以了。在列表1中你可以看到整个测试类。这并不是一个完整的测试包,但通过它,你仍可以对如何在你自己的项目中运用NUnit有一定的了解。
  • IP网络的测试方法

    2007-01-09 10:20:17

    随着IP附应用时及和深入,IP网络的建设、维护和故障诊断面临着巨大的挑战:网络的规模越来越大、组成网络的设备越来越复杂、在网络中运行的软件系统越来越庞大、网络承载的业务越来越多.

      网络测试是保证网络高性能、高可靠性和高可用率的基本手段,它在IP网络建设和发展中的重要意义正得到日益广泛的认可。

    网络测试

      网络是一个很复杂的系统,通常人们把网络分为不同的层次予以简化。在网络测试中,我们可以把网络分为3个不同的层次:设备层、系统层和应用层,因此网络测试正是轩对这3个层次来进行的。

      网络设备测试主要包括功能测试、性能测试、一致性和互通性测试等几个方面。网络系统测试包括物理连通性、基本功能和一致性的测试、网络系统的规划验证测试、性能测试、流量测试和模型化等。网络应用测试是测试网络系统支持各种应用的能力。完整的网络测试包含完成上述3个层次的所有测试。

      网络测试主要包括测试方法、
    测试工具和测试经验等3个方面的内容。无论是测试方法的设计、测试工具的发明和运用还是测试经验的积累,都有很高的技术要求,其中测试方法是核心。网络测试的方法和手段因测试的目的而有所不同。典型的网络设备测试的方法有2 种:第一种方法是使用网络测试设备单独对产品进行测试;第二种方法是将设备放在具体的网络环境中,通过分析该产品在网络中的行为对其进行测试,这种网络环境多数是用仿真的方式实现的。测试工具主要有线缆测试仪、协议分析仪和网络智能分析仪等。实际的网络在设备、拓扑、管理维护等各方面千差万别,可能出现的问题也是五花八门的,测试人员除了要掌握必须的网络知识外,还需要有丰富的系统集成和现场测试的经验。

      网络系统的建设一般经历规划、设计、部署、运行和升级五个阶段。网络测试应贯穿其中的每个阶段。由于技术或者经济的原因,实际网络测试的应用和理论上还有较大的差距。无论从经济的角度还是从时间的角度来看,用户都很难自己来完成所有的测试。用户在选购设备时可以参照由设备提供商提供的第三方测试机构对其设备的测试报告,依据测试报告和自身的需求选择设备。在网络设计施工完成之后,应该由施工单位以外的测试机构对网络进行网络系统测试,以检验工程质量。最后在试运行阶段对网络承载业务和应用的能力进行测试,即进行网络的应用测试。但是, 我国网络测试起点较低,虽然已经成立,了多家开展网络测试的机构,但至今还没有形成相对比较权威的网络测试机构,我国的网络
    测试技术和市场都有待发展。

    IP网络的
    测试技术

      IP网络测试和上述所有的网络测试一样,包括对网络设备层、系统层和应用层的测试。与其它网络测试不同的是:(1)IP网络中的设备与电信网中的设备在性能、安全性和稳定性方面有较大的区别,它们原先更多的是用于计算机互联的设备;(2)IP网络是IP网络测试的目标,它的网络层协议采用IP协议,IP 协议并不保证网络数据的可靠性,它采用“尽力而为”的方式转发数据包;(3)IP网络以传输数据业务为主,业务高很高的突发性,IP网络几乎可以承载任何业务,因此网络应用层的测试比较复杂。

    IP网络设备测试

      我们就以太网交换机的测试为例说明具体的网络设备测试。

      首先要分析交换机的物理特性,即对诸如外观(包括颜色、重量、尺寸和包装等)、端口配置、扩展能力等用户可以直接了解的设备信息的测试,主要的测试方法是目测。这些参数和交换机本身的功能和性能没有关系,但是对用户来说则很重要,将直接影响用户对设备的评价。一款颜色:搭配不和谐、尺寸很大的交换机,显然不会成为用户优先选择的目标。

      进一步的测试需要一台带有收发端口的测试仪。测试仪与被测交换机有两种连接方法。

      在第二种连接方式下,如果测试仪(发送)和测试仪(接收)之间没有计算机的控制,则无法完成部分精度要求较高的测试项和在发送与接收之间有时间或逻辑关系要求的测试顶,如流量测试等。

      在测试仪与被测设备连接完成以后,在开始测试之前,还要首先配置被测的交换机,包括对软件和硬件的配置,特别是配置交换机支持的协议并予以激活。

      首先是对交换机进行功能测试,目的是检测设备是否能够完成交换机这类设备所应具备的功能,如帧的转发、过滤、流量控制、VLAN、生成树协议等。

      接着进行性能测试,目的是了解交换机完成各项功能时的性能情况。交换机性能测试的参数包括吞吐量、时延、帧丢失率、处理背靠背数据帧的能力、地址缓冲容量、地址学习速率等。RFC1242和RFC2285分别定义了网络互联设备和LAN交换设备测试的基准术语,RFC2544和RFC2889则分别定义了网络互联设备和LAN交换设备测试的基准方法。这几个RFC是测试网络设备时参考的标准。

      完成上述测试之后,需要进行一致性和互通性测试,以验证交换机是否符合各项规范的要求,包括协议的一致性,确保交换机和其他的网络设备进行互联时不会出现问题。

      对交换机设备的测试最终应提供一份完整的测试报告,测试报告对在这次测试中的测试对象、
    测试工具、测试环境、测试内容、测试结果等进行详细论述。测试报告中包括对各测试项目的测试结果,应以数字、图形、列表等方式记录下来。完整、客观的设备测试报告是购买设备的重要参考。

    IP网络系统测试

      IP网络系统测试的第一步是了解所测网络的状况,包括网络所属单位的情况、网络设备情况、网络主要应用、使用该网络的人员情况、网络中存在的问题等等。对网络状况的调查可以明确测试的对象、目的、要求等,为制定详细的测试方案做好准备,对网络设备的调查可以为所测网络建立详细的网络文档。网络文档的内容包括网络拓扑结构图,路由器和交换机的生产厂家、型号、内部参数配置,服务器和工作陆的生产厂家、型号、内存、硬盘、网卡的序列号和MAC地址等,IP地址、防火墙和操作系统参数配置等。

      了解了网络基本状况后,就可以根据测试要求拟定详细的测试方案。

      物理连通性、基本功能和一致性的测试是最基本的网络系统测试内容,其中主要是线缆测试,用以查明所测线缆及布线是否符合设计要求和国际标准。如果线缆的安装不符合各类标准,就应该绘出具体的各种类型电缆管脚的连接图。

      模拟和仿真是规划验证测试的两个基本手段。模拟即用软件的方法建立虚拟的网络系统及其运行模型,通过设置配置参数模拟实际环境下的网络运行,并给出对该网络的评价。仿真则是建立真实的试验环境来模拟实际的网络运行。模拟和仿真对大型网络的规划设计很有意义,它可以在网络实际建设之前了解网络的特性,或者发现规划设计中的缺陷,大大降低网络建设的风险。但是模拟和仿真本身需要许多资金和时间,因此在网络建设中各单位会参照具体情况来决定是否要做这项测试。

      性能测试可以分为被动测试和主动测试。被动测试就是用仪表监测网络中的数据,通过分析采集到的数据判断网络性能状况。被动测试在不影响网络正常工作的情况下测试。主动测试通过向网络中发送特定的数据包来分析网络系统的性能。不论是被动测试还是主动测试,都需从网络中采集数据。一个IP网络系统可以分为物理层、数据链路层、网络层和应用层。IP网络系统的性能测试应该分别针对物理层、数据链路层和网络层进行。如以太网,物理层的测试包括碰撞分析、错误统计和是否有随机能量、无格式的帧和信号回波等,数据链路层的测试包括流量分析、错误帧(FCS错误帧、长帧、短帧和延迟碰撞)统计等,网络层的测试包括响应时间测试、网络层协议分析、IP路由分析等。

      流量测试和模型化的工作有利于提高整个网络的运行效率,其中涉及到运用一些很深的数学工具和丰富的网络经验,许多关键技术还有待研究。

    IP网络应用测试

      完成IP网络设备测试和系统测试之后就可以在网络上加载各种应用,各种网络应用的性能水平与网络的类型、网络本身的性能有直接关系。IP网络应用测试是 IP网络测试中最高层次的测试内容,主要测试IP网络对应用的支持水平,如网络应用的性能和服务质量的测试等。另外,IP网络应用测试和网络应用本身直接相关,对于不同的网络应用,有不同的测试内容和测试方法。在部署VoIP时,需要测试网络中的交换机和路由器设备能否有效地支持语音流量和语音QoS等, 在测试用于视频传输的网络时,需要测试视频传输在IP网络中的性能以及网络用户是否能够得到满意的视频质量等。
  • 提高测试覆盖度

    2007-01-09 09:28:24

       软件测试覆盖率常用的计算公式:

    1. 功能覆盖率= 至少被执行一次的测试功能点数/ 测试功能点总数 功能点)
    2. 需求覆盖率= 被验证到的需求数量 /总的需求数量 (需求)
    3. 覆盖率= 至少被执行一次的测试用例数/ 应执行的测试用例总数 (测试用例)
    4. 语句覆盖率= 至少被执行一次的语句数量/ 有效的程序代码行数
    5. 判定覆盖率= 判定结果被评价的次数 / 判定结果总数
    6. 条件覆盖率=  条件操作数值至少被评价一次的数量 / 条件操作数值的总数
    7. 判定条件覆盖率= 条件操作数值或判定结果至少被评价一次的数量/(条件操作数值总数+判定结果总数)
    8. 上下文判定覆盖率= 上下文内已执行的判定分支数和/(上下文数*上下文内的判定分支总数)
    9. 基于状态的上下文入口覆盖率= 累加每个状态内执行到的方法数/(状态数*类内方法总数)
    10. 分支条件组合覆盖率= 被评测到的分支条件组合数/分支条件组合数
    11. 路径覆盖率=  至少被执行一次的路径数/程序总路径数

     除此之外,覆盖率还包括类覆盖率、函数覆盖率、代码块覆盖率等,如EMMA

    测试评估可以说贯穿整个软件测试过程,可以在测试每个阶段结束前进行,也可以在测试过程中某一个时间进行,目的只有一个,提高测试覆盖度,保证测试的质量。通过不断的测试覆盖度评估或测试覆盖率计算,及时掌握测试的实际状况与测试覆盖度目标的差距,及时采取措施,就可以提高测试的覆盖度。

    测试覆盖度的评估依赖于不同的测试阶段或不同的测试方法。如在单元测试中,测试覆盖率是建立在被测试的代码行、程序分支和程序路径等的度量之上,从软件质量保证的要求出发,单元测试的覆盖率要达到80%之上。白盒测试方法主要以程序语句、判定-条件、条件组合和(基本)路径等覆盖率来衡量,和单元测试是吻合的。而在系统功能测试中,则以功能点、测试用例、需求数等覆盖率来衡量。

    要获得、提高测试覆盖率,常常需要借助测试工具。下面就以两个测试工具为例。

    1. EMMA

        EMMA 是一个用于检测和报告 JAVA 代码覆盖率的开源工具,支持许多种级别的覆盖率指标:包,类,方法,语句块(basic block)和行,特别是能测出某一行是否只是被部分覆盖,如条件语句短路的情况。EMMA能生成 textxmlhtml 等形式的报告,以满足不同的需求,其 html 报告提供逐层细化查询功能,能够从 package 开始一步步链接到我们所关注的某个方法。EMMA 能和 Makefile Ant 集成,效率很高,便于应用于大型项目。

        EMMA 是通过向 .class 文件中插入字节码的方式来跟踪记录被运行代码信息的。EMMA 支持两种模式:On the fly Offline 模式。On the fly 模式往加载的类中加入字节码,相当于用 EMMA 实现的 application class loader 替代原来的 application class loaderOn the fly 模式比较方便,缺点也比较明显,如不能为被 boot class loader 加载的类生成覆盖率报告,也不能为像 J2EE 容器那种自己有独特 class loader 的类生成覆盖率报告。这时,必须求助于 Offline 模式,Offline 模式是在类被加载前,加入字节码。EMMA 也支持两种运行方式:Command line Ant

         2. Rational PureCoverage

    PureCoverage 是一个面向VC, VB 或者Java 开发的测试覆盖程度检测工具,可以自动检测测试完整性和未被测试的范围,在每一个测试阶段生产详尽的测试覆盖程度报告。PureCoverage 将在一个对话框中列出所有应用程序模块,开发人员只需针对每个应用程序构件,就可以简单地设置基于代码行或函数的代码覆盖级别。不仅可以查看每次程序运行的图形化覆盖数据,还可以直接地、实时地控制覆盖数据的记录。对于最关心或最重要的功能模块,可以详细地收集覆盖数据;而对于不太重要的模块,只收集较常规的覆盖数据,帮助开发人员进行有效地测试。

             系统的测试活动,依据测试目标,建立在至少一个测试覆盖策略基础上,而覆盖策略帮助进行测试覆盖度的有效评估。覆盖策略有

    1. 基于需求的测试覆盖评估,依赖于对已执行/运行的测试用例的核实和分析,所以基于需求的测试覆盖评测就转化为评估测试用例覆盖率:测试的目标是确保100%的测试用例全部成功地执行。
    2. 基于代码的测试覆盖评估,是对被测试的程序代码语句、路径或条件的覆盖率分析。如果应用基于代码的覆盖,则测试策略是根据测试已经执行的源代码的多少来表示的。这种测试覆盖策略类型对于安全至上的系统来说非常重要。

        如果测试需求已经完全分类,则基于需求的覆盖策略可能足以生成测试完全程度评测的量化指标。例如,如果已经确定了所有性能测试需求,则可以引用测试结果来得到评测,如已经核实了90%的性能测试需求。除此之外,如果测试软件的数量较大,还要考虑数据量。
  • 浅谈软件测试之技巧

    2006-12-29 09:54:25

    软件测试虽然辛苦,但是掌握了一定的技巧之后将使你事半功倍。 

      (1) 边界测试,测试用户输入框中的数值的最大数和最小数,以及为空时的情况。 

      (2) 非法测试,例如在输入数字的地方输入字母。 

      (3) 跟踪测试,跟踪一条数据的流程,保证数据的正确性。 

      (4) 在开始测试时应保证数据的正确性,然后在从系统中找出各种BUG。 

      (5) 接口测试,程序往往在接口的地方很容易发生错误,要在此模块测试勿掉以轻心。 

      (6) 代码重用测试,在开发过程中有些模块功能几乎相同,程序员在重用代码时可能忘记在原有代码上修改或修改不全面,而造成的错误。 

      (7) 突发事件测试,服务器上可能发生意外情况的测试。 

      (8) 外界环境测试,有些系统在开发时依赖于另外一个系统,当另外一个系统发生错误时, 这个系统所受到的影响的情况。 

      (9) 在程序员刚修复Bug之后的地方,再找一找,往往程序员只修复报告出来的缺陷而不去考虑别的功能在修改时可能会重新造成错误。 

      (10) 认真做好测试记录在做完一天的测试记录之后,第二天再根据第一天的测试记录重复测试你会发现有未修正的错误。 

      (11) 文字测试,如果在系统中有用词不当的地方,我想这是不应该的。 

      (12) 系统兼容测试,例如有些程序在IE6能运行正常,到IE5下不能运行。有些程序在WIN2000下能运行,而到WIN98却不能运行。像一些很特别的用户去使用系统,你很有可能发现BUG。 

      (13) 用户的易用性测试,往往用户的需求是不断的变化的,而其中的一部份变化的原因,是有用户操作上不方便引起的。 

      软件测试是软件开发中的重中之重,没有一点可以马虎的,在项目管理过程,我强调的时是每个过程的每一个环节都要进行测试,保证系统在每个阶段可以控制。因为软件测试中考虑的问题基本上是项目管理中考虑的问题。 

      在项目管理中考虑的一些问题应该是在软件测试时有些体现,体现的内容是软件测试的一些侧重点,具体说,软件测试是事务性的,而项目管理是策略性,一些策略性的东西必须在一些事务性的事务上来实现。 

  • 软件测试基本内容之四

    2006-12-29 09:51:44

     

    第 31 贴【 2004 - 6 - 16 】: CMM 2 级 KPA 的目标 

    CMM 2 级:可重复级 
            Requirement Management 
            需求管理 
            Goal 1  System requiremnets allocated to software are controlled to establish a baseline for software engineering and management use. 
            目标 1 :分配到软件部分的系统需求通过建立基线受控。 
            Goal 2   Software plans, products, and activities are kept consistent with the system requirements allocated to software. 
            目标 2 :软件计划、产品和活动与分配到软件部分的系统需求一致。 
            
            Software Project Planning 
            软件项目计划 
            Goal 1   Software estimates are documented for use in planning and tracking the software project. 
            目标 1 :用来计划和跟踪软件项目的软件估计文档化。 
            Goal 2   Software project activities and commitments are planned and documented. 
            目标 2 :制定了软件项目活动和任务书的计划,并且有文档记录。 
            Goal 3   Affected groups and individuals agree to their commitments related to the software project. 
            目标 3 :受影响的小组和个人接受和软件项目相关的任务书。 

            Software Project Tracking and Oversight 
            软件项目跟踪及监控 
            Goal 1  Actual results and performances are tracked against the software plans. 
            目标 1 :按照软件计划跟踪实际结果和性能。 
            Goal 2  Corrective actions are taken and managed to closure when actual results and performance deviate significantly from the software plans. 
            目标 2 :当实际的结果和性能严重偏离软件计划时,采取了正确的行动终止这种状况。 
            Goal 3  Changes to sofware commitments are agreed to by the affected groups and individuals. 
            目标 3 :受影响的小组和个人接受软件任务书的变化。 

            Software Subcontract Management 
            软件子合同管理 
            Goal 1  The prime contractor selects qualified software subcontractors. 
            目标 1 :主签约人挑选有资格的子签约人。 
            Goal 2  The prime contractor and the software subcontractor agree to their commitments to each other. 
            目标 2 :主签约人和子签约人互相接受他们的任务书。 
            Goal 3  The prime contractor and the software subcontractor maintain ongoing communications. 
            目标 3 :主签约人和子签约人保持持续的沟通。 
            Goal 4  The prime contractor tracks the software subcontractor's actual results and performance against its commitments. 
            目标 4 :主签约人按照任务书跟踪子签约人的实际结果和效能。 

            Software Quality Assurance 
            软件质量保证 
            Goal 1  Software quality assurance activities are planned. 
            目标 1 :制定了软件质量保证计划。 
            Goal 2  Adherence of software products and activities to the applicable standards, procedures, and requirements is verified objectively. 
            目标 2 :客观地检验软件产品和活动是否符合适用的标准、过程和需求。 
            Goal 3  Affected groups and individuals are informed of software quality assurance activities and results. 
            目标 3 :软件质量保证的活动和结果通知了受影响的小组和个人。 
            Goal 4  Noncompliance issues that cannot be resolved within the software project are addressed by senior management. 
            目标 4 :高层管理着手解决在软件项目内部不能解决的不符合项。 

            Software Configuration Management 
            软件配置管理 
            Goal 1  Software configuration management activities are planned. 
            目标 1 :制定了软件配置管理活动的计划。 
            Goal 2  Selected software work products are identified, controlled, and available. 
            目标 2 :选定的软件工作产品是被标识的、受控的和可利用的。 
            Goal 3  Changes to identified software work products are controlled. 
            目标 3 :被标识的软件工作产品的变化是受控的。 
            Goal 4  Affected groups and individuals are informed of the status and content of software baselines. 
            目标 4 :软件基线的状态和内容通知受影响的小组和个人。 

    第 32 贴【 2004 - 6 - 17 】: Logiscope 的功能 

    LOGISCOPE 是为软件的全面质量控制而开发的强大工具,可以用在编程、测试和维护阶段。 LOGISCOPE 五个模块的功能: 
      (1) 阅读器 (Viewer) :以文件调用图 ( 各部件文件之间的关系 ) 及组件调用图 ( 函数和程序间的调用关系 ) 的形式进行可视化应用软件设计。可以在各种各样的抽象级别上分析应用程序,在不同级别上的引导有助于整个应用程序的理解。 
      (2) 效果检查器 (ImpactChecker) :允许用户检查使用的资源 ( 文件、函数、用户定义类型、全局变量、结构成员常量 ) 。它有助于我们理解函数间的信息流 ( 参数传递 ) ,以及数据和其它应用程序资源间的关系。 
      (3) 规则检查器 (RuleChecker) :软件公司应该定义自己的编程规则和质量目标。这样做的好处是公司编程行为保持一致性、易于维护、提高可靠性、易于移植到其它机器上。我们可以用规则检查器 (RuleChecker) 确立编程标准,保证质量控制。 
      (4) 测试检查器 (TestChecker) :实时度量测试覆盖率、显示未覆盖路径原始数据、生成测试报告、帮助管理测试实例。测试检查器 (TestChecker) 和动态分析器 (Dynamic Analyzer) 通过阅读器产生用于应用程序分析的数据。 
      (5) 代码检查器 (CodeChecker) :验证应用程序与质量模型的一致性。代码检查器和静态分析器 (Static Analyzer) 通过阅读器 (Viewer) 产生用于应用程序分析的数据。代码检查器 (CodeChecker) 可以使我们尽早发现和修改质量缺陷。这对质量控制尤为重要。 

    第 33 贴【 2004 - 6 - 18 】: α 测试 

    α 测试是由一个用户在开发环境下进行的测试,也可以是开发机构枘部的用户在模拟实际操作环境下进行的测试。软件在一个自然设置状态下使用。开发者坐在用户旁边,随时记下错误情况和使用中的问题。这是在受控制的环境下进行的测试, α 测试的目的是评价软件产品的 FLURPS( 即功能、局域化、可使用性、可靠性、性能和支持 ) 。尤其注重产品的界面和特色。 α 测试人员是除开产品开发人员之外首先见到产品的人,他们提出的功能和修改意见是特别有价值的。 α 测试可以从软件产品编码结束之时开始,或在模块(子系统)测试完成之后开始,也可以在确认测试过程中产品达到一定的稳定和可靠程序之后再开始。有关的手册(草稿)等应事先准备好。 

    第 34 贴【 2004 - 6 - 19 】: β 测试 

    β 测试是由软件的多个用户在一个或多个用户的实际使用环境下进行的测试。这些用户是与公司签定了支持产品预发行合同的外部客户,他们要求使用该产品,并愿意返回有关错位错误信息给开发者。与 α 测试不同的是,开发者通常不在测试现场。因而, β 测试是在开发者无法控制的环境下进行的软件现场应用。在 β 测试中,由用户记下遇到的所有问题,包括真实的以及主观认定的,定期向开发者报告,开发者在综合用户的报告之后,做出修改,最将软件产品交付给全体用户使用。 β 测试主要衡量产品的 FLURPS 。着重于产品的支持性,包括文档、客户培训和支持产品生产能力。只有当 α 测试达到一定的可靠程度时,才能开始 β 测试。由于它处在整个测试的最后阶段,不能指望这时发现主要问题。同时,产品的所有手册文本也应该在此阶段完全定稿。 
        由于 β 测试的主要目标是测试可支持性,所以 β 测试应尽可能由主持产品发行的人员来管理。 

    第 35 贴【 2004 - 6 - 20 】:面向对象的集成测试 

      传统的集成测试,是通过各种集成策略集成各功能模块进行测试,一般可以在部分程序编译完成的情况下进行。而对于面向对象程序,相互调用的功能是散布在程序的不同类中,类通过消息相互作用申请和提供服务。类的行为与它的状态密切相关,状态不仅仅是体现在类数据成员的值,也许还包括其他类中的状态信息。由此可见,类相互依赖极其紧密,根本无法在编译不完全的程序上对类进行测试。所以,面向对象的集成测试通常需要在整个程序编译完成后进行。此外,面向对象程序具有动态特性,程序的控制流往往无法确定,因此也只能对整个编译后的程序做基于黑盒子的集成测试。 
       面向对象的集成测试能够检测出相对独立的单元测试无法检测出的那些类相互作用时才会产生的错误。基于单元测试对成员函数行为正确性的保证,集成测试只关注于系统的结构和内部的相互作用。面向对象的集成测试可以分成两步进行:先进行静态测试,再进行动态测试。 
       静态测试主要针对程序的结构进行,检测程序结构是否符合设计要求。现在流行的一些测试软件都能提供一种称为 " 可逆性工程 " 的功能,即通过原程序得到类关系图和函数功能调用关系图,例如 International Software Automation 公司的 Panorama-2 、 Rational 公司的 Rose C++ Analyzer 等,将 " 可逆性工程 " 得到的结果与 OOD 的结果相比较,检测程序结构和实现上是否有缺陷。换句话说,通过这种方法检测 OOP 是否达到了设计要求。 
       动态测试设计测试用例时,通常需要上述的功能调用结构图、类关系图或者实体关系图为参考,确定不需要被重复测试的部分,从而优化测试用例,减少测试工作量,使得进行的测试能够达到一定覆盖标准。测试所要达到的覆盖标准可以是:达到类所有的服务要求或服务提供的一定覆盖率;依据类间传递的消息,达到对所有执行线程的一定覆盖率;达到类的所有状态的一定覆盖率等。同时也可以考虑使用现有的一些测试工具来得到程序代码执行的覆盖率。 
       具体设计测试用例,可参考下列步骤: 
    1. 先选定检测的类,参考 OOD 分析结果,仔细出类的状态和相应的行为,类或成员函数间传递的消息,输入或输出的界定等。 
    2. 确定覆盖标准。 
    3. 利用结构关系图确定待测类的所有关联。 
    4. 根据程序中类的对象构造测试用例,确认使用什么输入激发类的状态、使用类的服务和期望产生什么行为等。 
       值得注意,设计测试用例时,不但要设计确认类功能满足的输入,还应该有意识的设计一些被禁止的例子,确认类是否有不合法的行为产生,如发送与类状态不相适应的消息,要求不相适应的服务等。根据具体情况,动态的集成测试,有时也可以通过系统测试完成。 

    第 36 贴【 2004 - 6 - 21 】:面向对象的系统测试 

    通过单元测试和集成测试,仅能保证软件开发的功能得以实现。但不能确认在实际运行时,它是否满足用户的需要,是否大量存在实际使用条件下会被诱发产生错误的隐患。为此,对完成开发的软件必须经过规范的系统测试。换个角度说,开发完成的软件仅仅是实际投入使用系统的一个组成部分,需要测试它与系统其他部分配套运行的表现,以保证在系统各部分协调工作的环境下也能正常工作。   
           系统测试应该尽量搭建与用户实际使用环境相同的测试平台,应该保证被测系统的完整性,对临时没有的系统设备部件,也应有相应的模拟手段。系统测试时,应该参考 OOA 分析的结果,对应描述的对象、属性和各种服务,检测软件是否能够完全 " 再现 " 问题空间。系统测试不仅是检测软件的整体行为表现,从另一个侧面看,也是对软件开发设计的再确认。 
       这里说的系统测试是对测试步骤的抽象描述。它体现的具体测试内容包括: 
    · 功能测试:测试是否满足开发要求,是否能够提供设计所描述的功能,是否用户的需求都得到满足。功能测试是系统测试最常用和必须的测试,通常还会以正式的软件说明书为测试标准。 
    · 强度测试:测试系统的能力最高实际限度,即软件在一些超负荷的情况,功能实现情况。如要求软件某一行为的大量重复、输入大量的数据或大数值数据、对数据库大量复杂的查询等。 
    · 性能测试:测试软件的运行性能。这种测试常常与强度测试结合进行,需要事先对被测软件提出性能指标,如传输连接的最长时限、传输的错误率、计算的精度、记录的精度、响应的时限和恢复时限等。 
    · 安全测试:验证安装在系统内的保护机构确实能够对系统进行保护,使之不受各种非常的干扰。安全测试时需要设计一些测试用例试图突破系统的安全保密措施,检验系统是否有安全保密的漏洞。 
    · 恢复测试:采用人工的干扰使软件出错,中断使用,检测系统的恢复能力,特别是通讯系统。恢复测试时,应该参考性能测试的相关测试指标。 
    · 可用性测试:测试用户是否能够满意使用。具体体现为操作是否方便,用户界面是否友好等。 
    · 安装 / 卸载测试( install/uninstall test )等等。 
       系统测试需要对被测的软件结合需求分析做仔细的测试分析,建立测试用例。 

    第 37 贴【 2004 - 6 - 22 】: TMM 介绍 

    测试是软件开发的重要过程之一,但是 CMM 没有充分的定义测试,没有提及测试成熟度的概念,没有对测试过程改进进行充分说明,在 KPA 中没有定义测试问题,与质量相关的测试问题如可测性,充分测试标准,测试计划等方面也没有满意的阐述。 

       TMM 是受 CMM 模型启发产生的,关注于测试的成熟度模型。它描述了测试过程,是项目测试部分得到良好计划和控制的基础。 TMM 测试成熟度分解为 5 级别,关注于 5 个成熟度级别递增: 

        Phase 0 :测试和调试没有区别,初了支持调试外,测试没有其他目的 
        Phase 1 : 测试的目的是为了表明软件能够工作 
        Phase 2 :测试的目的是为了表明软件不能够能够正常工作 
        Phase 3 : 测试的目的不是要证明什么,而是为了把软件不能正常工作的预知风险降低到能够接受的程度 
        Phase 4 : 测试不是行为,而是一种自觉的约束 (mental discipline) ,不用太多的测试投入产生低风险的软件上的 

    第 38 贴【 2004 - 6 - 23 】:软件测试自动化的概念 

    软件测试自动化,是一项让计算机代替测试人员进行软件测试的技术。他可以让测试人员从繁琐和重复的测试活动中解脱出来,专心从事有意义的测试设计等活动。如果采用自动比较技术,还可以自动完成测试用例执行结果的判断,从而避免人工比对存在的疏漏问题。设计良好的自动化测试,在某些情况下可以实现 “ 夜间测试 ” 和 “ 无人测试 ” 。在大多数情况下,软件测试自动化可以减少开支,增加有限时间内可执行的测试,在执行相同数量测试时节约测试时间。 

    软件测试自动化通常借助测试工具进行。测试工具可以进行部分的测试设计、实现、执行和比较的工作。通过运用测试工具,可以达到提高测试效率的目的。所以测试工具的选择和推广使用应该给予重视。部分的测试工具可以实现测试用例的自动生成,但通常的工作方式为人工设计测试用例,使用工具进行用例的执行和比较。 

    软件测试自动化的设计并不能由工具来完成,必须由测试人员进行手工设计,但是在设计是却必须考虑自动化的特殊要求,否则无法实现利用工具进行用例的自动执行。为此,就必须在测试的设计和内容的组织方面采取一些特殊的方法。 

    对于软件测试自动化的工作,大多数人都认为是一件非常容易的事。其实,软件测试自动化的工作量非常大,而且也并不是在任何情况下都适用,同时软件测试自动化的设计并不比程序设计简单 

    第 39 贴【 2004 - 6 - 24 】:自动化测试的优点 

    通过自动化测试,可以使某些任务提高执行效率。除此之外,还有其它优点: 

    ① 对程序的回归测试更方便。这可能是自动化测试最主要的任务,特别是在程序修改比较频繁时,效果是非常明显的。由于回归测试的动作和用例是完全设计好的,测试期望的结果也是完全可以预料的,将回归测试自动运行,可以极大提高测试效率,缩短回归测试时间。 

    ② 可以运行更多更繁琐的测试。自动化的一个明显的好处是可以在较少的时间内运行更多的测试。 

    ③ 可以执行一些手工测试困难或不可能进行的测试。比如,对于大量用户的测试,不可能同时让足够多的测试人员同时进行测试,但是却可以通过自动化测试模拟同时有许多用户,从而达到测试的目的。 

    ④ 更好地利用资源。将繁琐的任务自动化,可以提高准确性和测试人员的积极性,将测试技术人员解脱出来投入更多精力设计更好的测试用例。有些测试不适合于自动测试,仅适合于手工测试,将可自动测试的测试自动化后,可以让测试人员专注于手工测试部分,提高手工测试的效率。 

    ⑤ 测试具有一致性和可重复性。由于测试是自动执行的,每次测试的结果和执行的内容的一致性是可以得到保障的,从而达到测试的可重复的效果。 

    ⑥ 测试的复用性。由于自动测试通常采用脚本技术,这样就有可能只需要做少量的甚至不做修改,实现在不同的测试过程中使用相同的用例。 

    ⑦ 可以让产品更快面向市场。自动化测试可以缩短测试时间,加快产品开发周期。 

    ⑧ 增加软件信任度。由于测试是自动执行的,所以不存在执行过程中的疏忽和错误,完全取决于测试的设计质量。一旦软件通过了强有力的自动测试后,软件的信任度自然会增加。 

    总之,通过较少的开销获得更彻底的测试,提高软件质量,这是测试自动化的最终目的。

  • 软件测试基本内容之三

    2006-12-29 09:33:41

    第 16 贴【 2004 - 6 - 1 】:软件质量 

    “ 每一个程序都能正确地做某件事,但是这并不是我们想要它作的事情。 ” 这样的软件不能算一个质量好的软件。 

    我们如何定义软件质量呢?可以从不同的角度来看待软件质量并对其定义,它们有一些共同点:强调软件与得到了清晰描述的功能和性能需求的符合度、明显的文档标准以及被认为是所有专业开发的软件所具备的隐式特征。 

    ISO9126 从如下几个方面来衡量软件质量:功能性、可靠性、可用性、可维护性、效率、可移植性。 

    如下三个方面应该尤其被重视: 
    1 、软件需求是质量测度的基础。需求符合性的缺乏也就是缺乏质量; 
    2 、特定的过程定义了一套开发标准,用以指导软件开发的方式。如果标准未能遵守,那么缺少质量就几乎是肯定的结论; 
    3 、除了功能需求等显示的需求外,要对非功能的隐式需求重视(例如,对好的可维护性的期望)。如果软件符合其他显式的需求,但是未能满足隐式需求,软件质量仍然是值得怀疑的。 

    软件质量是一个多因素的复杂混合,这些因素随着不同的应用和需要它们的用户而变化。测试时需要根据一定的质量标准有针对性的进行测试。 


    第 17 贴【 2004 - 6 - 2 】系统测试方法之恢复测试 

    Roger S. Pressman 

    许多基于计算机的系统必须在一定的时间内从错误中恢复过来,然后继续运行。在有些情况下,一个系统必须是可以容错的,这就是说,运行过程中的错误不能使整个系统的功能都停止。在其他情况下,一个系统错误必须在一个特定的时间段之内改正,否则就会造成严重损失。 

    恢复测试是通过各种手段,让软件强制性地发生故障,然后来验证恢复是否能正常进行的一种系统测试方法。如果恢复是自动的(由系统本身来进行的),重新初始化、检查点机制、数据恢复和重启动都要进行正确验证。如果恢复是需要人工干预的,那么要估算修复的平均时间是否在可以接受的范围之内。 

    第 18 贴【 2004 - 6 - 3 】:系统测试方法之安全测试 

    Roger S. Pressman 

    任何管理敏感信息或者能够对个人造成不正当伤害的计算机系统都是不正当或非法侵入的目标。侵入包括了范围很广的活动:只是为练习而试图侵入系统的黑客;为了报复而试图攻破系统的有怨言的雇员;还有为了得到非法的利益而试图侵入系统的不诚实的个人。 

    安全测试用来验证集成在系统内的保护机制是否能够在实际中保护系统不受到非法的侵入。引用 Beizer 的话来说: “ 系统的安全当然必须能够经受住正面的攻击 —— 但是它也必须能够经受住侧面的和背后的攻击。 ” 

    在安全测试过程中,测试者扮演着一个试图攻击系统的个人角色。测试者可以尝试去通过外部的手段来获取系统的密码,可以使用可以瓦解任何防守的客户软件来攻击系统;可以把系统 “ 制服 ” ,使得别人无法访问;可以有目的地引发系统错误,期望在系统恢复过程中侵入系统;可以通过浏览非保密的数据,从中找到进入系统的钥匙;等等。 

    只要有足够的时间和资源,好的安全测试就一定能够最终侵入一个系统。系统设计者的任务就是要把系统设计为想要攻破系统而付出的代价大于攻破系统之后得到的信息的价值。 

    第 19 贴【 2004 - 6 - 4 】:系统测试方法之压力测试 

    Roger S. Pressman 

    在较早的软件测试步骤中,白盒和黑盒技术对正常的程序功能和性能进行了详尽的检查。压力测试( Stree Testing )的目的是要对付非正常的情形。在本质上说,进行压力测试的人应该这样问: “ 我们能够将系统折腾到什么程度而又不会出错? ” 

    压力测试是在一种需要反常数量、频率或资源的方式下运行系统。例如, 
    ( 1 )当平均每秒出现 1 个或 2 个中断的情形下,应当对每秒出现 10 个中断的情形来进行特殊的测试; 
    ( 2 )把输入数据的量提高一个数量级来测试输入功能会如何响应; 
    ( 3 )应当执行需要最大的内存或其他资源的测试用例; 
    ( 4 )运行一个虚拟的操作系统中可能会引起大量的驻留磁盘数据的测试用例。 
    从本质上来说,测试者是想要破坏程序。 

    压力测试的一个变种是一种被成为是敏感测试的技术。在有些情况(最常见的是在数学算法中)下,在有效数据界限之内的一个很小范围的数据可能会引起极端的甚至是错误的运行,或者引起性能的急剧下降,这种情形和数学函数中的奇点相类似。敏感测试就是要发现在有效数据输入里可能会引发不稳定或者错误处理的数据组合。 

    第 20 贴【 2004 - 6 - 5 】:系统测试方法之性能测试 

    Roger S. Pressman 

    在实时系统和嵌入式系统中,提供符合功能需求但不符合性能需求的软件是不能被接受的。性能测试就是用来测试软件在系统中的运行性能的。性能测试可以发生在各个测试阶段中,即使是在单元层,一个单独模块的性能也可以使用白盒测试来进行评估,然而,只有当整个系统的所有成分都集成到一起之后,才能检查一个系统的真正性能。 

    性能测试经常和压力测试一起进行,而且常常需要硬件和软件测试设备,这就是说,常常有必要的在一种苛刻的环境中衡量资源的使用(比如,处理器周期)。外部的测试设备可以监测测试执行,当出现情况(如中断)时记录下来。通过对系统的检测,测试者可以发现导致效率降低和系统故障的原因。 

    第 21 贴【 2004 - 6 - 6 】:回归测试 

    Roger S. Pressman 

    每当一个新的模块被当作集成测试的一部分加进来的时候,软件就发生了改变。新的数据流路径建立起来,新的 I/O 操作可能也会出现,还有可能激活了新的控制逻辑。这些改变可能会使原本工作得很正常的功能产生错误。在集成测试策略的环境中,回归测试是对某些已经进行过的测试的某些子集再重新进行一遍,以保证上述改变不会传播无法预料的副作用。 

    在更广的环境里,(任何种类的)成功测试结果都是发现错误,而错误是要被修改的,每当软件被修改的时候,软件配置的某些方面(程序、文档、或者数据)也被修改了,回归测试就是用来保证(由于测试或者其他原因的)改动不会带来不可预料的行为或者另外的错误。 

    回归测试可以通过重新执行所有的测试用例的一个子集人工地进行,也可以使用自动化的捕获回放工具来进行。捕获回放工具使得软件工程师能够捕获到测试用例,然后就可以进行回放和比较。回归测试集(要进行的测试的子集)包括三种不同类型的测试用例: 
    · 能够测试软件的所有功能的代表性测试用例。 
    · 专门针对可能会被修改影响的软件功能的附加测试。 
    · 针对修改过的软件成分的测试。 

    在集成测试进行的过程中,回归测试可能会变得非常庞大。因此,回归测试应当设计为只对出现错误的模块的主要功能进行测试,每当进行一个修改时,就对每一个程序功能都重新执行所有的测试是不实际的而且效率很低的。 

    第 22 贴【 2004 - 6 - 7 】:测试与调试 

    测试的目的是显示存在错误,而调试的目的是发现错误或导致程序失效的错误原因,并修改程序以修正错误。调试是测试之后的活动。 [Beizer, 1984] 认为,测试和调试在目标、方法和思路上都有所不同,如下: 

    1 、测试从一个已知的条件开始,使用预先定义的过程,有预知的结果。调试从一个未知的条件开始,结束的过程不可预计。 

    2 、测试过程可以实现设计,进度可实现确定。调试不能描述过程或持续时间。 

    3 、测试是显示错误的行为。调试是推理的过程。 

    4 、测试显示开发人员的错误。调试是开发人员为自己辩护。 

    5 、测试能预期和可控。调试需要想象,经验和思考。 

    6 、测试能在没有详细设计的情况下完成。没有详细设计的信息调试不可能进行。 

    7 、测试能由非开发人员进行。调试必须由开发人员进行。 

    第 23 贴【 2004 - 6 - 8 】:系统测试方法之功能测试 

    功能测试又称正确性测试,它检查软件的功能是否符合规格说明。由于正确性是软件最重要的质量因素,所以其测试也最重要。 

    基本的方法是构造一些合理输入,检查是否得到期望的输出。这是一种枚举方法。测试人员一定要设法减少枚举的次数,否则测试投入太大。关键在于寻找等价区间,因为在等价区间中,只需用任意值测试一次即可。等价区间的概念可表述如下:记( A , B )是命题 f(x) 的一个等价区间,在( A , B )中任意取 x1 进行测试。如果 f (x1) 错误,那么 f (x) 在整个( A , B )区间都将出错。如果 f (x1) 正确,那么 f (x) 在整个( A , B )区间都将正确。上述测试方法称为等价测试,来源于人们的直觉与经验,可令测试事半功倍。 

    还有一种有效的测试方法是边界值测试。即采用定义域或者等价区间的边界值进行测试。因为程序员容易疏忽边界情况,程序也 “ 喜欢 ” 在边界值处出错。例如测试平方根函数的一段程序。凭直觉输入等价区间应是( 0 , 1 )和( 1 , +∞ )。可取 x=0 。 5 以及 x=2 。 0 进行等价测试。再取 x=0 以及 x=1 进行边界值测试。 

    有一些复杂的程序,我们难以凭直觉与经验找到等价区间和边界值,这时枚举测试就相当有难度。 

    第 24 贴【 2004 - 6 - 9 】:黑盒测试的端口测试模型 

    端口测试模型侧重于对被测对象的抽象,它阐明的是我们要测试什么。它将被测试者间的共性抽象出来,使测试者和被测者可以最大程度地分离开来。其主要思想是:被测试者可以用测试端口集来表达。测试功能体现在测试端口对外协议(称为端口协议)的实现,对不同系统的测试或对同一系统中不同子系统的测试都表现为对不同端口的测试。端口协议一般是非确定的有限自动机( NFA) ,它可以分解成确定的有限自动机( DFA) 的集合(对应于功能迁移路径集),并可以用结构化语言描述在测试用例中。这样,端口协议的差异就不会影响测试者的内部实现(与被测者的接口除外)。 

    第 25 贴【 2004 - 6 - 10 】:黑盒测试的对象测试模型 

    对象测试模型注重于测试内容的表达,它 阐明的是如何表达我们的测试内容。它把分散的功能测试单元有机地组合起来,使实际测试更逼近真正的系统测试。其主要思想是:测试内容及测试的实现方法(指对测试数据的处理)可以被封装在一个个的测试对象中。测试对象有三个层次:数据对象、业务对象和事务对象,它们的关系是逐级被包含。简单来说, 数据对象是指业务(或功能)数据的载体,它通常有物理对应,其主要测试内容是一个状态迁移图;业务对象指共同实现一种业务(或功能)的数据对象集合,它一般都只有逻辑对应,其主要测试内容是一个时间追踪图;事务对象是指一组业务相关的业务对象的有序组合,其主要测试内容是业务间的关系图,准确地说是业务结果间的布尔关系图。 

    第 26 贴【 2004 - 6 - 11 】:黑盒测试的分层设计模型 

    分层设计模型侧重于黑盒自动测试工具的实现,它阐明的是我们如何设计测试工具。它将测试工具的功能进行抽象和分层,使测试工具的积木化开发现实可行。其主要思想是:测试工具可划分为五个不同的层次,从低到高依次是:端口驱动层、测试执行层、测试表达层、测试管理层、测试设计层。通过规范这五个层次间的接口,可以使按照这个设计模型设计的测试工具或提供相同的接口的其它测试工具无缝地集成在一起,从而实现理想的积木式开发。 

    第 27 贴【 2004 - 6 - 12 】: QA 的职责 

    QA 到底应该在企业里起什么作用呢?下面是 QA 职责的总结: 

    1 、保障软件组织流程体系得到遵守; 
    2 、促使软件组织过程改进 ; 
    3 、 指导项目实施流程,; 
    4 、增加开发活动透明度; 
    5 、评审项目活动; 
    6 、审核工作产品; 
    7 、协助工作产品问题解决; 
    8 、度量数据采集、分析,提供决策参考; 
    9 、进行缺陷预防; 
    10 、实现质量目标。 

    第 28 贴【 2004 - 6 - 13 】:软件走读 

    软件走读的目的是为了对软件产品进行评价,软件走读也可以是为给参与走读的人员培训有关软件产品知识而举行,软件走读的主要目的是: 
    1 )发现软件产品中的软件异常,缺陷、遗漏和自相矛盾的地方,以改进产品并提出可供选择的实现方案; 
    2 )改进软件产品; 
    3 )考虑可选项方案的实现方法; 
    4 )评价与标准和规格的符合性; 
    5 )进行技术交流,人员培训。 

    在软件走读中可以指出各种缺陷,例如软件产品中的效率和可读性问题,设计或编码中模块化问题,或者规格书中的可测试问题等等。 

    要求进行软件走读的软件产品,包括但不限于: 
    1 )软件需求规格, 
    2 )软件设计文档, 
    3 )源代码, 
    4 )软件测试文档, 
    5 )软件用户文档, 
    6 )维护手册, 
    7 )安装过程 

    第 29 贴【 2004 - 6 - 14 】: TCL 简介 

    TCL 是一脚本解释器,具有基本的语言特性,支持整型和字符串变量,支持循环等控制结构;同时它具有灵活的扩展性和跨平台的特性,后者是它最主要的特性。通过 TCL 脚本可以编写测试用例,通过扩展功能,可以扩展你想要的测试动作。最终目的是将测试的自动化和 灵活性(可扩展性)结合在一起。       

         TCL 提供以下接口: 
         1 、用户接口 
          对用户提供语言特性,如循环、条件判断等控制结构,通过它用户可以灵活的书写测试用例;当然只 提供语言特性远远不够,因为业务千差万别,所以用户需要业务接口,从而完成特定的测试任务。 而业务接口,是通过下面的程序员接口实现。 
          2 、程序员接口 
           用户可以编写自己命令,它包括用户层(即名字)和实现层(通过 C 语言实现),然后用 TCL 提供的注册 函数登记,以后命令就可灵活的嵌入到脚本中了。 

          TCL 测试模型分三部分: 
           被测试程序(由开发人员编写) ---- 测试人员应搞清楚程序结构和业务功能,指导扩展命令的设计。 
           测试代码(由测试设计人员编写)   --- 通过程序员接口,提供给脚本扩展命令。 
           测试用例( TCL 脚本形式,由测试执行人员编写) --- 通过脚本对扩展命令进一步组合。 

    第 30 贴【 2004 - 6 - 15 】: CMM 的五级简介 

    CMM 为企业的软件过程能力提供了一个阶梯式的进化框架,阶梯共有五级。第一级只是一个起点,任何准备按 CMM 体系进化的企业都自然处于这个起点上,并通过它向第二级迈进。除第一级外,每一级都设定了一组目标,如果达到了这组目标,则表明达到了这个成熟级别,可以向下一级别迈进。 
    第一级、初始级: 
          初始级的软件过程是未加定义的随意过程,项目的执行是随意甚至是混乱的。也许有些企业制定了一些软件工程规范,但若这些规范未能覆盖基本的关键过程要求,且执行没有政策、资源等方面的保证时,那么它仍然被视为初始级。 
    第二级、重复级: 
          根据多年的经验和教训,人们总结出软件开发的首要问题不是技术问题而是管理问题。因此,第二级的焦点集中在软件管理过程上。一个可管理的过程则是一个可重复的过程,可重复的过程才能逐渐改进和成熟。可重复级的管理过程包括了需求管理、项目管理、质量管理、配置管理和子合同管理五个方面;其中项目管理过程又分为计划过程和跟踪与监控过程。通过实施这些过程,从管理角度可以看到一个按计划执行的且阶段可控的软件开发过程。 
    第三级、定义级:         
           在可重复级定义了管理的基本过程,而没有定义执行的步骤标准。在第三级则要求制定企业范围的工程化标准,并将这些标准集成到企业软件开发标准过程中去。所有开发的项目需根据这个标准过程,裁剪出与项目适宜的过程,并且按照过程执行。过程的裁剪不是随意的,在使用前必须经过企业有关人员的批准。 
    第四级、管理级:         
           第四级的管理是量化的管理。所有过程需建立相应的度量方式,所有产品的质量(包括工作产品和提交给用户的最终产品)需要有明确的度量指标。这些度量应是详尽的,且可用于理解和控制软件过程和产品。量化控制将使软件开发真正成为一种工业生产活动。 
    第五级、优化级:         
          优化级的目标是达到一个持续改善的境界。所谓持续改善是指可以根据过程执行的反馈信息来改善下一步的执行过程,即优化执行步骤。如果企业达到了第五级,就表明该企业能够根据实际的项目性质、技术等因素,不断调整软件生产过程以求达到最佳。 

  • 软件测试基本内容之二

    2006-12-29 09:27:18

    第 8 贴【 2004 - 5 - 17 】:软件测试策略 

    Roger S. Pressman 
    测试是一系列可以事先计划并且可以系统地进行管理的活动。正是由于这个原因,应当为软件工程过程定义一个软件测试的模板-我们可以把特定的测试用例方法放置进去的一系列步骤。 

    人们已经提出了许多软件测试策略,所有这些策略都为如开发人员提供了一个供测试用的模板,而且它们都包含下列的类属特征: 
    · 测试开始于模块层,然后 “ 延伸 ” 到整个基于计算机的系统集合中。 
    · 不同的测试技术适用于不同的时间点。 
    · 测试是由软件的开发人员和(对于大型系统而言)独立的测试组来管理的。 
    · 测试和调试是不同的活动,但是调试必须能够适应任何的测试策略。 

    软件测试策略必须提供可以用来检验一小段源代码是否得以正确实现的低层测试,同时也要提供能够验证整个系统的功能是否符合用户需求的高层测试。一种策略必须为使用者提供指南,并且为管理者提供一系列的重要的里程碑。因为测试策略的步骤是在软件完成的最终期限的压力已经开始出现的时候才开始进行的,所以测试的进度必须是可测量的,而且问题要尽可能早的暴露出来。 

    第 9 贴【 2004 - 5 - 18 】:白盒测试 

    Rex Black 
    白盒测试,也称为结构化测试、基于代码的测试,是一种测试用例设计方法,它从程序的控制结构导出测试用例。用白盒测试产生的测试用例能够: 
    1 )保证一个模块中的所有独立路径至少被使用一次; 
    2 )对所有逻辑值均需测试 true 和 false ; 
    3 )在上下边界及可操作范围内运行所有循环; 
    4 )检查内部数据结构以确保其有效性。 

    “ 我们应该更注重于保证程序需求的实现,为什么要花费时间和精力来担心(和测试)逻辑细节? ” 答案在于软件自身的缺陷: 
    1 、逻辑错误和不正确假设与一条程序路径被运行的可能性成反比。当我们设计和实现主流之外的功能、条件或控制时,错误往往开始出现在我们工作中。日常处理往往被很好地了解,而 “ 特殊情况 ” 的处理则难于发现。 
    2 、我们经常相信某逻辑路径不可能被执行,而事实上,它可能在正常的基础上被执行。程序的逻辑流有时是违反直觉的,这意味着我们关于控制流和数据流的一些无意识的假设可能导致设计错误,只有路径测试才能发现这些错误。 
    3 、笔误是随机的。当一个程序被翻译为程序设计语言源代码时,有可能产生某些笔误,很多将被语法检查机制发现,但是,其他的会在测试开始时才会被发现。笔误出现在主流上和不明显的逻辑路径上的机率是一样的。 

    正如 Beizer 所说的: “ 错误潜伏在角落里,聚集在边界上 ” ,而白盒测试更可能发现它。 

    第 10 贴【 2004 - 5 - 19 】:黑盒测试 

    黑盒测试注重于测试软件的功能性需求,也即黑盒测试使软件工程师派生出执行程序所有功能需求的输入条件。黑盒测试并不是白盒测试的替代品,而是用于辅助白盒测试发现其他类型的错误。黑盒测试试图发现以下类型的错误: 
    1 )功能错误或遗漏; 
    2 )界面错误; 
    3 )数据结构或外部数据库访问错误; 
    4 )性能错误; 
    5 )初始化和终止错误。 

    白盒测试在测试的早期采用,而黑盒测试主要用于测试的后期。黑盒测试故意不考虑控制结构,而是注意信息域。黑盒测试用于回答以下问题: 
    1 )如何测试功能的有效性? 
    2 )何种类型的输入会产生好的测试用例? 
    3 )系统是否对特定的输入值尤其敏感? 
    4 )如何分隔数据类的边界? 
    5 )系统能够承受何种数据率和数据量? 
    6 )特定类型的数据组合会对系统产生何种影响? 

    运用黑盒测试方法,可以导出满足以下标准的测试用例集: 
    1 )所设计的测试用例能够减少达到合理测试所需的附加测试用例数; 
    2 )所设计的测试用例能够告知某些类型错误的存在或不存在,而不是仅仅与特定测试相关的错误。 

    第 11 贴【 2004 - 5 - 20 】:软件测试充分性准则 

    ( 1 )空测试对任何软件都是不充分的。 
    ( 2 )对任何软件都存在有限的充分测试集合。 
    ( 3 )如果一个软件系统在一个测试数据集合上的测试是充分的,那么再多测试一些数据也应该是充分的。这一特性称为单调性。 
    ( 4 )即使对软件所有成分都进行了充分的测试,也并不意味着整个软件的测试已经充分了。这一特性称为非复合性。 
    ( 5 )即使对一个软件系统整体的测试是充分的,也并不意味着软件系统中各个成分都已经充分地得到了测试。这个特性称为非分解性。 
    ( 6 )软件测试的充分性应该与软件的需求和软件的实现都相关。 
    ( 7 )软件越复杂,需要的测试数据就越多。这一特性称为复杂性。 
    ( 8 )测试得越多,进一步测试所能得到的充分性增长就越少。这一特性称为回报递减率。 

    第 12 贴【 2004 - 5 - 21 】:静态测试 

    在软件开发过程中,每产生一个文档,都必须对它进行测试,以确定它的质量是否满足要求。这样的检查工作与全面质量管理的思想是一致的,也与项目管理过程相一致。每当一个文档通过了静态测试,就标志着一项开发工作的总结,标志着项目取得了一定的进展,进入了一个新的阶段。 

    静态测试的基本特征是在对软件进行分析、检查和测试时不实际运行被测试的程序。它可以用于对各种软件文档进行测试,是软件开发中十分有效的质量控制方法之一。在软件开发过程中的早期阶段,由于可运行的代码尚未产生,不可能进行动态测试,而这些阶段的中间产品的质量直接关系到软件开发的成败与开销的大小,因此,在这些阶段,静态测试的作用尤为重要。在软件开发多年的生产实践经验和教训的基础上,人们总结出了一些行之有效的静态测试技术和方法,如结构化走通、正规检视等等。这些方法和测试技术可以与软件质量的定量度量技术相结合,对软件开发过程进行监视、控制,从而保障软件质量。 

    第 13 贴【 2004 - 5 - 22 】:什么是测试需求? 

    Brian Marick 
    测试需求的概念比较简单。例如,比方说一个计算平方根的程序,如果输入一个大于或等于零的数,程序可以给出一个结果;如果输入一个小于零的数,程序将指出输入错误。读过《软件测试的艺术》一书的工程师都会立即联想到边界值。对数值零进行测试;对零非常接近的负数进行测试,这就是两个具体的测试需求。 

    在一个更加复杂的程序中,你可以将打算测试的项目做成一个列表。但是,这些测试需求都不会确定具体的测试数据。例如,一个银行交易程序,一个测试需求是试图支付客户的金额为负数,另一个测试需求是交易中的客户并不存在,等等。你有一系列这样的测试需求,它们并没有指出具体的数值或数据,如客户的姓名。 

    测试的下一步是选择满足这些测试需求的输入值 / 测试数据。一个简单的测试用例可能会同时满足好几个测试需求。一个用例能同时满足好几个测试需求,当然是最理想的情况,但是这样做的代价较高。另外一种方法是为每一个测试需求设计一个单独的测试用例,就可以不必考虑那些复杂的测试用例,但是这些相对简单的测试用例发现缺陷的能力就会有所下降。 

    这里有一个测试需求的实例:对一个哈希表的插入操作进行测试,有以下这些测试需求: 
    1 )插入一个新的条目 
    2 )插入失败-条目已经存在 
    3 )插入失败-表已满 
    4 )哈希表在插入前为空 
    这些就是测试需求,而非测试用例,因为它们没有对被插入元素进行描述。另外你也不能马上就着手书写用例,就好象软件需求完成后不能立即进行编码一样。还需要对测试需求进行评审,确保正确和没有需求遗漏。 

    第 14 贴【 2004 - 5 - 30 】: GUI 测试 

    Roger S. Pressman 

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

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

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

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

    第 15 贴【 2004 - 5 - 31 】: Client/Server 测试 

    Roger S. Pressman 

    通常,客户 / 服务器软件的测试发生在三个不同的层次: 
    ( 1 )个体的客户端应用以 “ 分离的 ” 模式被测试 —— 不考虑服务器和底层网络的运行; 
    ( 2 )客户端软件和关联的服务器端应用被一起测试,但网络运行不被明显的考虑; 
    ( 3 )完整的 C/S 体系结构,包括网络运行和性能,被测试。 

    下面的测试方法是 C/S 应用中经常用到的: 
    应用功能测试 —— 客户端应用被独立地执行,以揭示在其运行中的错误。 
    服务器测试 —— 测试服务器的协调和数据管理功能,也考虑服务器性能(整体反映时间和数据吞吐量)。 
    数据库测试 —— 测试服务器存储的数据的精确性和完整性,检查客户端应用提交的事务,以保证数据被正确地存储、更新和检索。 
    事务测试 —— 创建一系列的测试以保证每类事务被按照需求处理。测试着重于处理的正确性,也关注性能问题。 
    网络通信测试 —— 这些测试验证网络节点间的通信正常地发生,并且消息传递、事务和相关的网络交通无错的发生。

  • 软件测试基本内容之一

    2006-12-29 09:25:45

    第 1 帖【 2004 - 5 - 10 】:软件测试的理想模式是什么? 

    Brian Marick :我不认为存在什么理想模式。我觉得让开发人员承担某些测试也许会更加有效,而其他测试则由独立测试组来进行。因为如果你把所有测试都交给独立测试组,他们不可能有时间把所有测试都做好。所以,最佳的方式是让开发人员承担一定量的测试,独立测试组给予他们支持。独立测试组主要承担整个系统的测试,去寻找开发人员还没有发现的缺陷,如子系统间的交互、运行条件、内存使用等。 

    如何更有效地开展系统测试呢?让测试人员在项目初期就参与进去,让他们看到第一版的系统需求、用户手册和系统原型,在系统实现前就对需求进行捕获和跟踪。在该过程中,他们从这些文档构造最初的测试设计。这也可以通过检视或评审的形式进行,并且在该过程中会发现一些缺陷。大家都知道,这个阶段,问题发现是非常 “ 便宜 ” 的。 

    这样,系统测试工程师在项目早期就介入,产生测试设计及基本的需要测试的项目列表。这时不可能产生一个绝对完备的测试设计,因为书写完整测试的条件还不成熟,但这却是构建完整测试的基础。 

    注: Brian Marick 是 Reliability Software 公司的专职测试技术顾问。 

    第 2 帖【 2004 - 5 - 11 】:测试经理角色定位 

    Johanna Rothman :测试经理服务于两种完全不同的客户:测试工程师和高层管理者。对于测试工程师,测试经理帮助他们开发产品测试策略,积累产品测试经验并在测试组内充分共享。对于高层管理者,测试经理搜集尽可能全面的产品信息,供其就产品是否可以发布进行决策。但是有一点是相同的:无论是对于测试工程师还是高层管理者,测试经理将帮助其定义和校验产品发布标准。 

    产品发布标准的定义和校验:作为一个测试经理,应该找机会与市场、开发人员商讨产品发布标准,并根据客户的反馈对该标准进行修正和校验。开发部门的工作是如何达到公司对产品的期望,要用客户需求为开发人员勾画出客户眼中的产品以及产品应如何工作。一旦产品被清楚地定义,就可以通过测试去验证产品在多大程度上满足了客户需求。 

    对于测试工程师而言有一点非常重要:将测试任务按优先级划分,使产品发布标准得以满足。由于只有极少数的项目有充足的时间去完成所有事情,所以告诉测试工程师关于 “ 测什么和何时测 ” 测试经理的一个重要职责。 

    高层管理者需要充分理解产品发布标准,以决定产品是否可以按时发布。我不认为测试组有权利裁决产品是否应该被发布,该权利在组织高层管理者那里。在有了一个通过讨论、达成一致的产品发布标准后,项目组也可以更清楚地了解和认识产品质量。 

    第 3 贴【 2004 - 5 - 12 】:测试的基本原则 

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

    第 4 贴【 2004 - 5 - 13 】:什么是 “ 好 ” 的测试? 

    什么是 “ 好 ” 的测试? Kaner , Falk & Nguyen 
    1 、一个好的测试发现错误的可能性很高 
    为了达到这个目标,测试者必需理解软件、并尝试设想软件如何才能失败,例如:在 GUI (图形用户界面)中有一种潜在的错误,即错误识别鼠标位置,那么就应该设计一个测试集来验证是否存在鼠标位置识别的错误。 
    2 、一个好的测试并不冗余 
    测试的时间和资源是有限的,没有必要构造一个与其他测试用例完全相同的测试,每一个测试都应该有不同的用途〔哪怕是细微的差异〕。例如,软件 SafeHome 中有一个模块被用来识别用户密码以决定是否启动系统,为了测试密码输入的错误,测试者设计了一系列的输入密码。在不同的测试中输入有效与无效密码( 4 个数字),然而,每一个有效 / 无效密码将只检测一种不同错误模式,例如一个将 8080 作为有效密码的系统将不会接受非法密码 1234 ,如果接受 1234 ,将产生错误,另一个测试输入 1235 ,与 1234 的测试意图相同,因此是冗余的,然而,非法输入 8081 或 8180 就有些细微的差异,即对与有效密码相近但并不相同的密码应该进行测试。 
    3 、一个好的测试应该是 “ 最佳品种 ” 
    在一组目的相似的测试中,时间和资源的限制可能只影响其某个子集的执行,此时,应该使用最可能找到所有错误的测试。 
    4 、一个好的测试既不会太简单,也不会太复杂 
    虽然有时会将一组测试组合到一个测试用例中,其副作用可能屏蔽错误,通常每一个测试应该独立执行。 

    第 5 贴【 2004 - 5 - 14 】:软件可测试性 

    Roger S. Pressman 
    理想情况下,软件工程师在设计计算机程序、系统或产品时应该考虑可测试性,这就使得测试工程师能够更容易地设计有效的测试用例。 

    什么是 “ 可测试性 ” ?软件的可测试性是指软件发现故障并隔离、定位其故障的能力特性,以及在一定的时间和成本前提下,进行测试设计、测试执行的能力。 James Bach 这样描述可测试性:软件可测试性就是一个计算机程序能够被测试的容易程度。 

    以下是一个常见的软件可测试性检查表: 
    · 可操作性- “ 运行地越好,被测试的效率越高。 ” 
    · 可观察性- “ 所看见的,就是所测试的。 ” 
    · 可控制性- “ 对软件的控制越好,测试越能够被自动执行与优化。 ” 
    · 可分解性- “ 通过控制测试范围,能够更好地分解问题,执行更灵巧的再测试。 ” 
    · 简单性- “ 需要测试的内容越少,测试的速度越快。 ” 
    · 稳定性- “ 改变越少,对测试的破坏越小。 ” 
    · 易理解性- “ 得到的信息越多,进行的测试越灵巧。 ”

    第 6 贴【 2004 - 5 - 15 】:实时系统测试 

    Roger S. Pressman 

    很多实时系统的时间依赖性和异步性给测试带来新的困难--时间!测试用例的设计者考虑的不仅是白盒和黑盒测试用例,而且包括事件处理(如中断处理)、数据的时间序列以及处理数据的任务(进程)的并发性。很多情况下,提供的测试数据有时使得实时系统在某状态下可以正常运行,而同样的数据在系统处于不同状态时有时又会导致错误。 

    另外,实时系统的软件和硬件之间的密切关系也会导致测试问题,软件测试必须考虑硬件故障对软件处理的影响,这种故障很难实时仿真。由于实时系统的特殊性和复杂性,还没有一个完善的综合性的测试用例设计方法,但是,大致可以分为以下四个步骤: 

    1 、任务测试。测试实时系统的第一步是独立的测试各个任务。对每一个任务设计白盒和黑盒测试用例,并在测试时执行每个任务。任务测试能够发现逻辑和功能错误,但是不能发现时间和行为错误。 

    2 、行为测试。利用 CASE 工具创建软件模型,就可能仿真实时系统,并按照外部事件的序列检查其行为,这些分析活动可作为创建实时系统时设计测试用例的基础。 

    3 、任务间测试。在隔离了任务内部和系统行为错误以后,测试就要转向时间相关的错误。用不同的数据率和处理负载来测试与其他任务通讯的异步任务,看任务间的同步是否会产生错误。另外,测试通过消息队列和数据存储进行通讯的任务,以发现这些数据存储区区域大小方面的错误。 

    4 、系统测试。集成软件和硬件,并进行大范围的系统测试,以发现软件 / 硬件接口间的错误。

    第 7 贴【 2004 - 5 - 16 】:单元测试、集成测试、系统测试、验收测试、回归测试 

    Software Research 
    单元测试:单元测试是对软件中的基本组成单位进行的测试,如一个模块、一个过程等等。它是软件动态测试的最基本的部分,也是最重要的部分之一,其目的是检验软件基本组成单位的正确性。一个软件单元的正确性是相对于该单元的规约而言的。因此,单元测试以被测试单位的规约为基准。单元测试的主要方法有控制流测试、数据流测试、排错测试、分域测试等等。 

    集成测试:集成测试是在软件系统集成过程中所进行的测试,其主要目的是检查软件单位之间的接口是否正确。它根据集成测试计划,一边将模块或其他软件单位组合成越来越大的系统,一边运行该系统,以分析所组成的系统是否正确,各组成部分是否合拍。集成测试的策略主要有自顶向下和自底向上两种。 

    系统测试:系统测试是对已经集成好的软件系统进行彻底的测试,以验证软件系统的正确性和性能等满足其规约所指定的要求,检查软件的行为和输出是否正确并非一项简单的任务,它被称为测试的 “ 先知者问题 ” 。因此,系统测试应该按照测试计划进行,其输入、输出和其他动态运行行为应该与软件规约进行对比。软件系统测试方法很多,主要有功能测试、性能测试、随机测试等等。 

    验收测试:验收测试旨在向软件的购买者展示该软件系统满足其用户的需求。它的测试数据通常是系统测试的测试数据的子集。所不同的是,验收测试常常有软件系统的购买者代表在现场,甚至是在软件安装使用的现场。这是软件在投入使用之前的最后测试。 

    回归测试:回归测试是在软件维护阶段,对软件进行修改之后进行的测试。其目的是检验对软件进行的修改是否正确。这里,修改的正确性有两重含义:一是所作的修改达到了预定目的,如错误得到改正,能够适应新的运行环境等等;二是不影响软件的其他功能的正确性。 

302/2<12
Open Toolbar