软件测试的方法

来源:互联网 发布:如何删除windows密码 编辑:程序博客网 时间:2024/04/29 17:29


参考文献
<<Software Engineer:practitioner's approach>> fifth edition
http://liligigirain.blog.sohu.com/rss



软件测试的概念


    设计软件测试的目标:能够系统的揭示不同类型的错误,并且耗费最少时间与最小工作量。
     不要指望软件测试说明错误和缺陷不存在,只应该认为软件测试可以表示软件错误和缺陷已经出现。
    我们进行系统的软件测试的目的是最大可能的发现并清除软件的错误。虽然代码评审和其他工作仍很重要(我认为Source Review是软件质量保证的核心),但没有什么能够取代软件测试。

软件测试的常用方法

    一 黑盒测试
        根据产品应提供的功能,通过测试去验证各功能是否完全实现,同时在各功能中寻找错误(不关心功能是如何实现的)
    二 白盒测试
        理解产品功能实现的内部设计,保证一个模块中所有的独立路径至少被测试一次。
    三 Web工程的测试
  
    但是由于工作量太大,资源有限(时间、人力、成泵),白盒测试不可能做到穷举所有的逻辑路径并测试,因此白盒测试不能保证程序百分之百的正确。我们应该结合使用黑盒测试和白盒测试。对重要模块使用白盒测试。

白盒测试方法

    白盒测试方法较容易被程序员接受,因为它和代码逻辑紧密相关。
    一 基本路径测试
    1)阅读完需求说明书后,程序员和白盒测试人员(也可能是程序员自己)应该绘制流图。流图就是图,用圆圈表示节点,代表一个或多个过程语句。节点间使用箭头表示控制流的方向,称为边。如果从一个节点散发出多条边(一般两条),则这个节点就包含了条件判断,被称为判定节点。由边和节点隔开的空白
称为区域,流图外部总是应该被算作一个区域。流图的绘制可以参考下图:


    2)通过图论的公式计算环复杂度。环复杂度V(G)用来表示独立路径的数目。独立路径指该图中从出发节点到某节点结束时的一条路径。两条独立路径简单合并而成的路径不算一条新的独立路径。
计算V(G)的方法有以下三种:
V(G)=区域数量
V(G)=E-N+2   边数目-节点数目+2
V(G)=P+1   判定节点数目+1
    3)此时,程序员可以去编码,白盒测试人员可以找出V(G)条独立路径,并准备测试数据。注意,有些路径可能无法独立测试,只能作为别的路径的一部分测试。

    流图可以被转换成图矩阵。图矩阵构成了将白盒测试自动化或半自动化的数据基础。这里不详述。

    二 循环测试
    尽管基本测试简单高效,但是测试覆盖并不充分,还需要其他的测试方法加以补充。循环测试专用于测试,可以进一步提高测试覆盖率。
    循环测试最基本的形式是简单循环(只有一个循环层次)。测试人员应该设计五种测试集:
    1)整个跳过循环
    2)只有一次通过循环
    3)两次通过循环
    4)m此通过循环,m<循环最大次数
    5)n-1,n,n+1次通过循环
   
    两个简单的循环串接在一起,称为串接循环。如果两个循环毫不相干,则应作为两个独立的简单循环测试。如果循环不独立,则应该使用嵌套循环方法。

    嵌套循环的测试方法:
    1)从最内层循环开始,将其他循环设置为最小值
    2)对最内层循环使用简单循环测试方法
    3)由内向外重复1)和2),里层循环取典型值测试

    下图中最右边一个为非结构循环,比如goto语句就可以造成这种循环,这种属于设计不良,应该改造成其他的循环。



黑盒测试方法

    黑盒测试用于辅助白盒测试发现其他类型的错误。比如:
1)功能不对或者遗漏
2)接口错误
3)数据结构或外部数据库访问错误
4)性能错误
5)初始化和终止错误
   

    一 基于图的测试方法

    理解软件中模块化的对象,并用节点表示。节点权值描述了节点的属性。用连接表示节点之间的关系。连接权值描述了连接的属性。
    连接有几种形式:单向连接表示一个方向,双向连接(无向连接、对称连接)用于两个方向,并行连接表示两个节点之间有多种不同的关系。
    该测试方法<'s approach>> fifth edition并没有作更详细地介绍,还待参考其他资料。
   
    图模型可能有循环,可以使用白盒测试中用于循环测试的技术。

    二 等价划分   

    如果某个输入的各种可能数据可以划分成若干个子集合,等价类是指其中一个子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,因此我们测试该等价类的代表值就等于对该等价类所有值的测试。
    因此,可以把这个输入的全部可能数据合理划分为若干等价类,在每一个等价类中取一个数据进行测试,就可以达到用少量代表性的测试数据取得较好的测试结果的目的。
   
    划分等价类的标准:
    1)完备测试、避免冗余;
    2)划分等价类重要的是:集合的划分,划分为互不相交的一组子集,而子集的并是整个集合;
    3)并是整个集合:完备性;
    4)子集互不相交:保证一种形式的无冗余性;
    5)同一类中标识(选择)一个测试用例,同一等价类中,往往处理相同,相同处理映射到"相同的执行路径"。
    6)总是考虑有效数据构成的等价类和无效等价类

    输入条件通常是一个特定值,一组相关值,一个数据域或一个布尔条件。对于不同的数据类,有不同的等价类划分方法:
输入条件
等价类划分方法
特定值
定义等于、大于、小于特定值的三个等价类
一组相关值(假设有N个)
定义属于该集合的N个有效等价类和不属于该集合的无效等价类
一个数值域
定义在域中,小于域,大于域的三个等价类,比如学生成绩作为输入条件,数值域是从0到100的闭区间
一个布尔条件
定义真或者假两个等价类

    首先应该确定输入由哪些输入条件组成,每个输入条件是哪一种输入数据类或几种输入数据类的组合,然后根据上表定义对应的等价类,最后选取测试数据。比如:
假设有一个档案管理系统,要求用户输入以年月表示的日期。假设日期限定在1990年1月~2049年12月,并规定日期由6位数字字符组成,前4位表示年,后2位表示月。现用等价类划分法设计测试用例,来测试程序的"日期检查功能"。
  1)划分等价类并编号,下表等价类划分的结果

输入条件                       有效等价类                  无效等价类

日期的类型及长度       
①6位数字字符       ②有非数字字符

                                                    ③少于6位数字字符

                                                    ④多于6位数字字符

   
年份范围               
⑤在1990~2049之间  ⑥小于1990

                                                     ⑦大于2049


   
月份范围                   ⑧在01~12之间      ⑨等于00

                                                       ⑩大于12


  2)设计测试用例,以便覆盖所有的有效等价类在表中列出了3个有效等价类,编号分别为①、⑤、⑧,设计的测试用例如下:
    测试数据    期望结果      覆盖的有效等价类
    200211      输入有效      ①、⑤、⑧
  3)为每一个无效等价类设计一个测试用例,设计结果如下:
    测试数据   期望结果     覆盖的无效等价类
    95June     无效输入          ②
    20036      无效输入          ③
    2001006   无效输入          ④
    198912     无效输入          ⑥
    200401     无效输入          ⑦
    200100     无效输入          ⑨
    200113     无效输入          ⑩
   
          经过一段时间的实践,我总结了一个比较方便使用的等价划分方法的模板:
http://spreadsheets.google.com/pub?key=pAW5RoGCUR3xclQXDOJIYcQ

    三 边界值分析(BVA)

    边界值分析补充了等价划分技术,不仅注重输入条件,而且也从输出域中导出测试案例。输入条件中,也总是选择等价类边界的测试案例。
    原则:
    1)如果输入条件的值大于a,小于b,测试案例应包含a、b的值,略大于a和略小于b的值。
    2)如果输入条件为一组相关值,应选择最大和最小值,即第二大和第二小的值。
    3)将1、2用于输出条件。测试数据要求输入能够造成运用1)和2)原则的输出数据
    4)如果内部程序数据结构有边界,要在其边界测试数据结构。(白盒测试应该关心?)
   

    四 比较测试

    有些可靠性要求很高的软件,在资源允许的情况下,可能会另外开发一套系统,用来比较。

    五 正交数组测试

    对用穷举测试过大,而输入域相对较小的情况,正交数组测试方法能够更好的获得输入域的覆盖率。具体使用尚不清楚。

   

  一 链接测试

    主要从三方面测试:有没有孤立的页面。该页面没有任何链接指向它,必须知道准确的路径才能访问;链接的目的文件是否不存在;连接的目的文件是否正确。链接测试可以采用软件来辅助,推荐使用下面的软件工具:Xenu Link Sleuth 免费 绿色免安装软件。   
    

软件测试的策略


一 定义
    把软件测试案例的设计方法集成到一系列已经周密计划过的步骤中,使软件的开发得以成功完成。
    软件测试策略定义了一个road map,描述了测试的步骤,以及当这些步骤在计划和实施的过程中,需要多少工作量、时间和资源。

二 人员组织
    软件开发人员参与测试的兴趣往往是证明他们的程序毫无错误,这些兴趣是和测试的目的相互矛盾的。但是以此为理由认为软件开发人员根本不应该参与测试,而只是应该交给独立测试组(ITG)来测试的观点也是不对的。
    通常,开发者总是负责程序的个体单元测试,保证每个单元能够完成设计的功能。很多时候,开发者也进行集成测试,ITG通常在软件体系结构完成后才开始介入。在ITG介入后,开发人员应该和ITG紧密合作,在测试中发现的错误,应由开发人员修改。
    通常,ITG应用向软件质量保证部门负责,以获得应有的独立性。

三 螺旋型测试阶段
    与螺旋形软件工程过程对应,测试也可以使用螺旋形过程。
    单元测试用于测试代码实现的各个单元;集成测试侧重于软件的体系结构的设计和构造;确认测试阶段是对需求是否实现测试;系统测试就是把软件和其他的系统元素放在一起进行测试。
    单元测试大量使用白盒测试;集成测试使用最多的是黑盒测试,也会结合一些白盒测试技术;确认测试只使用黑盒测试,系统测试已经跳出了软件工程的范围。  

四 测试完成的定义
    什么时候可以说测试完成了?永远都不可能完成。测试会最终从开发人员,测试人员身上转移到用户身上。不过我们通常会遇到另一种答案,当时间或者资金不够用时,就完成了测试。:)

五 制定测试策略的几个注意点
1)用技术评审作为测试之前的过滤器,可以减少测试的工作量
2)技术评审也应用于测试策略和测试案例本身
3)明确测试目标。比如每千行代码的出错数。





       


原创粉丝点击