测试用例( 二 )


测试用例

文章插图
测试用例因此测试用例的设计和编制是软体测试活动中最重要的 。测试用例是测试工作的指导 , 是软体测试的必须遵守的準则 。更是软体测试质量稳定的根本保障 。设计(一)白盒技术白盒测试是结构测试 , 所以被测对象基本上是源程式 , 以程式的内部逻辑为基础设计测试用例 。⒈逻辑覆盖程式内部的逻辑覆盖程度 , 当程式中有循环时 , 覆盖每条路径是不可能的 , 要设计使覆盖程度较高的或覆盖最有代表性的路径的测试用例 。下面根据图7-1所示的程式 , 分别讨论几种常用的覆盖技术 。⑴语句覆盖 。为了提高发现错误的可能性 , 在测试时应该执行到程式中的每一个语句 。语句覆盖是指设计足够的测试用例 , 使被测试程式中每个语句至少执行一次 。如图7-1是一个被测试程式流程图:⑵判定覆盖 。判定覆盖指设计足够的测试用例 , 使得被测程式中每个判定表达式至少获得一次“真”值和“假”值 , 从而使程式的每一个分支至少都通过一次 , 因此判定覆盖也称分支覆盖 。⑶条件覆盖 。条件覆盖是指设计足够的测试用例 , 使得判定表达式中每个条件的各种可能的值至少出现一次 。⑷判定条件覆盖 。该覆盖标準指设计足够的测试用例 , 使得判定表达式的每个条件的所有可能取值至少出现一次 , 并使每个判定表达式所有可能的结果也至少出现一次 。⑸条件组合覆盖 。条件组合覆盖是比较强的覆盖标準 , 它是指设计足够的测试用例 , 使得每个判定表达式中条件的各种可能的值的组合都至少出现一次 。⑹路径覆盖 。路径覆盖是指设计足够的测试用例 , 覆盖被测程式中所有可能的路径 。在实际的逻辑覆盖测试中 , 一般以条件组合覆盖为主设计测试用例 , 然后再补充部分用例 , 以达到路径覆盖测试标準 。⒉循环覆盖⒊基本路径测试(二)黑盒技术⒈等价类划分⑴划分等价类 。①在输入条件规定了取值範围或值的个数的情况下 , 则可以确立一个有效等价类和两个无效等价类 。②在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下 , 可确立一个有效等价类和一个无效等价类 。③在输入条件是一个布尔量的情况下 , 可确定一个有效等价类和一个无效等价类 。④在规定了输入数据的一组值(假定n个) , 并且程式要对每一个输入值分别处理的情况下 , 可确立n个有效等价类和一个无效等价类 。⑤在规定了输入数据必须遵守的规则的情况下 , 可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则) 。⑥在确知已划分的等价类中各元素在程式处理中的方式不同的情况下 , 则应再将该等价类进一步的划分为更小的等价类 。⑵确定测试用例 。①为每一个等价类编号 。②设计一个测试用例 , 使其儘可能多地覆盖尚未被覆盖过的合理等价类 。重複这步 , 直到所有合理等价类被测试用例覆盖 。③设计一个测试用例 , 使其只覆盖一个不合理等价类 。⒉边界值分析使用边界值分析方法设计测试用例时一般与等价类划分结合起来 。但它不是从一个等价类中任选一个例子作为代表 , 而是将测试边界情况作为重点目标 , 选取正好等于、刚刚大于或刚刚小于边界值的测试数据 。⑴如果输入条件规定了值的範围 , 可以选择正好等于边界值的数据作为合理的测试用例 , 同时还要选择刚好越过边界值的数据作为不合理的测试用例 。如输入值的範围是[1 , 100] , 可取0 , 1 , 100 , 101等值作为测试数据 。⑵如果输入条件指出了输入数据的个数 , 则按最大个数、最小个数、比最小个数少1、比最大个数多1等情况分别设计测试用例 。如 , 一个输入档案可包括1--255个记录 , 则分别设计有1个记录、255个记录 , 以及0个记录的输入档案的测试用例 。⑶对每个输出条件分别按照以上原则⑴或⑵确定输出值的边界情况 。如 , 一个学生成绩管理系统规定 , 只能查询95--98级大学生的各科成绩 , 可以设计测试用例 , 使得查询範围内的某一届或四届学生的学生成绩 , 还需设计查询94级、99级学生成绩的测试用例(不合理输出等价类) 。由于输出值的边界不与输入值的边界相对应 , 所以要检查输出值的边界不一定可能 , 要产生超出输出值之外的结果也不一定能做到 , 但必要时还需试一试 。⑷如果程式的规格说明给出的输入或输出域是个有序集合(如顺序档案、线形表、鍊表等) , 则应选取集合的第一个元素和最后一个元素作为测试用例 。⒊错误推测在测试程式时 , 人们可能根据经验或直觉推测程式中可能存在的各种错误 , 从而有针对性地编写检查这些错误的测试用例 , 这就是错误推测法 。⒋因果图等价类划分和边界值方法分析方法都只是孤立地考虑各个输入数据的测试功能 , 而没有考虑多个输入数据的组合引起的错误 。⒌综合策略每种方法都能设计出一组有用例子 , 用这组例子容易发现某种类型的错误 , 但可能不易发现另一类型的错误 。因此在实际测试中 , 联合使用各种测试方法 , 形成综合策略 , 通常先用黑盒法设计基本的测试用例 , 再用白盒法补充一些必要的测试用例 。设计误区·能发现到目前为止没有发现的缺陷的用例是好的用例 。首先要申明 , 其实这句话是十分有道理的 , 但我发现很多人都曲解了这句话的原意 , 一心要设计出发现“难于发现的缺陷”而陷入盲目的片面中去 , 忘记了测试的目的所在 , 这是十分可怕的 。我倾向于将测试用例当作一个集合来认识 , 对它的评价也只能对测试用例的集合来进行 , 测试本身是一种“V&AMp;V”的活动 , 测试需要保证以下两点:程式做了它应该做的事情程式没有做它不该做的事情因此 , 作为测试实施依据的测试用例 , 必须要能完整覆盖测试需求 , 而不应该针对单个的测试用例去评判好坏 。·测试用例应该详细记录所有的操作信息 , 使一个没有接触过系统的人员也能进行测试 。不知道国内有没有公司真正做到这点 , 或者说 , 不知道国内有没有公司能够将每个测试用例都写得如此详细 。在我的测试经历中 , 对测试用例描述的详细和複杂程度 也曾有过很多的彷徨 。写得太简单吧 , 除了自己没人能够执行 , 写得太详细吧 , 消耗在测试用例维护(别忘了 , 测试用例是动态的 , 一旦测试环境、需求、设计、实 现发生了变化 , 测试用例都需要相应发生变化)上的时间实在是太惊人 , 在目前国内大部分软体公司的测试资源都不足的情况下 , 恐怕很难实现 。但我偏偏就能遇到 一些这样的老总或者是项目负责人 , 甚至是测试工程师本身 , 全然不顾实际的资源情况 , 一定要写出“没有接触过系统的人员也能进行测试”的用例 。在讨论这个问题之前 , 我们可以先考虑一下测试的目的 。测试的目的是儘可能发现程式中存在的缺陷 , 测试活动本身也可以被看作是一个ProjECt , 也需要在 给定的资源条件下儘可能达成目标 , 根据我个人的经验 , 大部分的国内软体公司在测试方面配备的资源都是不足够的 , 因此我们必须在测试计画阶段明确测试的目 标 , 一切围绕测试的目标进行 。除了资源上的约束外 , 测试用例的详细程度也需要根据需要确定 。如果测试用例的执行者、测试用例设计者、测试活动相关人对系统了解都很深刻 , 那测试用例就没有必要太详细了 , 文档的作用本来就在于沟通 , 只要能达到沟通的目的就OK 。在我担任测试经理的项目中 , 在测试计画阶段 , 一般给予测试设计30% - 40%左右的时间 , 测试设计工程师能够根据项目的需要自行确定用例的详细程度 , 在测试用例的评审阶段由参与评审的相关人对其把关 。·测试用例设计是一劳永逸的事情 。这句话摆在这里 , 我想没有一个人会认可 , 但在实际情况中 , 却经常能发现这种想法的影子 。我曾经参与过一个项目 , 软体需求和设计已经变更了多次 , 但测试用例 却没有任何修改 。导致的直接结果是新加入的测试工程师在执行测试用例时不知所措 , 间接的后果是测试用例成了废纸一堆 , 开发人员在多次被无效的缺陷报告打扰 后 , 对测试人员不屑一顾 。这个例子可能有些极端 , 但测试用例与需求和设计不同步的情况在实际开发过程中却是屡见不鲜的 , 测试用例文档是“活的”文档 , 这一点应该被测试工程师牢记 。·测试用例不应该包含实际的数据 。测试用例是“一组输入、执行条件、预期结果”、毫无疑问地应该包括清晰的输入数据和预期输出 , 没有测试数据的用例最多只具有指导性的意义 , 不具有可执行 性 。当然 , 测试用例中包含输入数据会带来维护、与测试环境同步之类的问题 , 关于这一点 , 《Effective Software TeST》一书中提供了详细的测试用例、测试数据的维护方法 , 可以参考 。·测试用例中不需要明显的验证手段 。我见过很多测试工程师编写的测试用例中 , “预期输出”仅描述为程式的可见行为 , 其实 , “预期结果”的含义并不只是程式的可见行为 。例如 , 对一个订货系统 ,  输入订货数据 , 点击“确定”按钮后 , 系统提示“订货成功” , 这样是不是一个完整的用例呢?是不是系统输出的“订货成功”就应该作为我们唯一的验证手段呢? 显然不是 。订货是否成功还需要查看相应的数据记录是否更新 , 因此 , 在这样的一个用例中 , 还应该包含对测试结果的显式的验证手段:在资料库中执行查询语句进行查询 , 看查询结果是否与预期的一致 。从用例中生成用于功能性测试的测试用例来源于测试目标的用例 。应该为每个用例场景编制测试用例 。用例场景要通过描述流经用例的路径来确定 , 这个流经过程要从用例开始到结束遍历其中所有基本流和备选流 。例如 , 下图中经过用例的每条不同路径都反映了基本流和备选流 , 都用箭头来表示 。基本流用直黑线来表示 , 是经过用例的最简单的路径 。每个备选流自基本流开始 , 之后 , 备选流会在某个特定条件下执行 。备选流可能会重新加入基本流中(备选流 1 和 3) , 还可能起源于另一个备选流(备选流 2) , 或者终止用例而不再重新加入某个流(备选流 2 和 4) 。用例的事件流示例遵循上图中每个经过用例的可能路径 , 可以确定不同的用例场景 。从基本流开始 , 再将基本流和备选流结合起来 , 可以确定以下用例场景:场景 1 基本流场景 2 基本流 备选流 1场景 3 基本流 备选流 1 备选流 2场景 4 基本流 备选流 3场景 5 基本流 备选流 3 备选流 1场景 6 基本流 备选流 3 备选流 1 备选流 2场景 7 基本流 备选流 4场景 8 基本流 备选流 3 备选流 4注:为方便起见 , 场景 5、6 和 8 只描述了备选流 3 指示的循环执行一次的情况 。生成每个场景的测试用例是通过确定某个特定条件来完成的 , 这个特定条件将导致特定用例场景的执行 。例如 , 假定上图描述的用例对备选流 3 规定如下:“如果在上述步骤 2‘输入提款金额’中输入的美元量超出当前帐户余额 , 则出现此事件流 。系统将显示一则警告讯息 , 之后重新加入基本流 , 再次执行上述步骤 2‘输入提款金额’ , 此时银行客户可以输入新的提款金额 。”据此 , 可以开始确定需要用来执行备选流 3 的测试用例:测试用例ID 场景 条件 预期结果TC x 场景 4 步骤 2 - 提款金额 > 帐户余额 在步骤 2 处重新加入基本流TC y 场景 4 步骤 2 - 提款金额 < 帐户余额 不执行备选流 3 , 执行基本流TC z 场景 4 步骤 2 - 提款金额 = 帐户余额 不执行备选流 3 , 执行基本流注:由于没有提供其他信息 , 以上显示的测试用例都非常简单 。测试用例很少如此简单 。下面是一个由用例生成测试用例的更符合实际情况的示例 。示例:一台 ATM 机器的主角和用例 。下表包含了上图中提款用例的基本流和某些备用流:本用例的开端是 ATM 处于準备就绪状态 。準备提款 - 客户将银行卡插入 ATM 机的读卡机 。验证银行卡 - ATM 机从银行卡的磁条中读取帐户代码 , 并检查它是否属于可以接收的银行卡 。输入 PIN - ATM 要求客户输入 PIN 码(4 位)验证帐户代码和 PIN - 验证帐户代码和 PIN 以确定该帐户是否有效以及所输入的 PIN 对该帐户来说是否正确 。对于此事件流 , 帐户是有效的而且 PIN 对此帐户来说正确无误 。ATM 选项 - ATM 显示在本机上可用的各种选项 。在此事件流中 , 银行客户通常选择“提款” 。输入金额 - 要从 ATM 中提取的金额 。对于此事件流 , 客户需选择预设的金额(10 美元、20 美元、50 美元或 100 美元) 。授权 - ATM 通过将卡 ID、PIN、金额以及帐户信息作为一笔交易传送给银行系统来启动验证过程 。对于此事件流 , 银行系统处于在线上状态 , 而且对授权请求给予答覆 , 批准完成提款过程 , 并且据此更新帐户余额 。出钞 - 提供现金 。返回银行卡 - 银行卡被返还 。收据 - 列印收据并提供给客户 。ATM 还相应地更新内部记录 。用例结束时 ATM 又回到準备就绪状态 。备选流 1 - 银行卡无效 在基本流步骤 2 中 - 验证银行卡 , 如果卡是无效的 , 则卡被退回 , 同时会通知相关讯息 。备选流 2 - ATM 内没有现金 在基本流步骤 5 中 - ATM 选项 , 如果 ATM 内没有现金 , 则“提款”选项将无法使用 。备选流 3 - ATM 内现金不足 在基本流步骤 6 中- 输入金额 , 如果 ATM 机内金额少于请求提取的金额 , 则将显示一则适当的讯息 , 并且在步骤 6 - 输入金额处重新加入基本流 。备选流 4 - PIN 有误 在基本流步骤 4 中- 验证帐户和 PIN , 客户有三次机会输入 PIN 。如果 PIN 输入有误 , ATM 将显示适当的讯息;如果还存在输入机会 , 则此事件流在步骤 3 - 输入 PIN 处重新加入基本流 。如果最后一次尝试输入的 PIN 码仍然错误 , 则该卡将被 ATM 机保留 , 同时 ATM 返回到準备就绪状态 , 本用例终止 。备选流 5 - 帐户不存在 在基本流步骤 4 中 - 验证帐户和 PIN , 如果银行系统返回的代码表明找不到该帐户或禁止从该帐户中提款 , 则 ATM 显示适当的讯息并且在步骤 9 - 返回银行卡处重新加入基本流 。备选流 6 - 帐面金额不足 在基本流步骤 7 - 授权中 , 银行系统返回代码表明帐户余额少于在基本流步骤 6 - 输入金额内输入的金额 , 则 ATM 显示适当的讯息并且在步骤 6 - 输入金额处重新加入基本流 。备选流 7 - 达到每日最大的提款金额 在基本流步骤 7 - 授权中 , 银行系统返回的代码表明包括本提款请求在内 , 客户已经或将超过在 24 小时内允许提取的最多金额 , 则 ATM 显示适当的讯息并在步骤 6 - 输入金额上重新加入基本流 。备选流 x - 记录错误 如果在基本流步骤 10 - 收据中 , 记录无法更新 , 则 ATM 进入“安全模式” , 在此模式下所有功能都将暂停使用 。同时向银行系统传送一条适当的警报信息表明 ATM 已经暂停工作 。备选流 y - 退出 客户可随时决定终止交易(退出) 。交易终止 , 银行卡随之退出 。备选流 z - “翘起” ATM 包含大量的感测器 , 用以监控各种功能 , 如电源检测器、不同的门和出入口处的测压器以及动作检测器等 。在任一时刻 , 如果某客户做出暴力举动 , 便启用适当的措施 。编制着重介绍一些编制测试用例的具体做法 。⒈测试用例文档编写测试用例文档应有文档模板 , 须符合内部的规範要求 。测试用例文档将受制于测试用例管理软体的约束 。软体产品或软体开发项目的测试用例一般以该产品的软体模组或子系统为单位 , 形成一个测试用例文档 , 但并不是绝对的 。测试用例文档由简介和测试用例两部分组成 。简介部分编制了测试目的、测试範围、定义术语、参考文档、概述等 。测试用例部分逐一列示各测试用例 。每个具体测试用例都将包括下列详细信息:版本号、模组名称、用例编号、用例名称、用例级别、预知条件、验证步骤、期望结果(含判断标準)、测试结果、测试时间、测试人员等 。⒉测试用例的设定我们早期的测试用例是按功能设定用例 。后来引进了路径分析法 , 按路径设定用例 。演变为按功能、路径混合模式设定用例 。按功能测试是最简捷的 , 按用例规约遍历测试每一功能 。对于複杂操作的程式模组 , 其各功能的实施是相互影响、紧密相关、环环相扣的 , 可以演变出数量繁多的变化 。没有严密的逻辑分析 , 产生遗漏是在所难免 。路径分析是一个很好的方法 , 其最大的优点是在于可以避免漏测试 。但路径分析法也有局限性 。在一个非常简单字典维护模组就存在十余条路径 。一个複杂的模组会有几十到上百条路径是不足为奇的 。笔者以为这是路径分析比较合适的使用规模 。若一个子系统有十余个或更多的模组 , 这些模组相互有关联 。再採用路径分析法 , 其路径数量成几何级增长 , 达5位数或更多 , 就无法使用了 。那幺子系统模组间的测试路径或测试用例还是要靠传统方法来解决 。这是按功能、路径混合模式设定用例的由来 。⒊设计测试用例测试用例可以分为基本事件、备选事件和异常事件 。设计基本事件的用例 , 应该参照用例规约(或设计规格说明书) , 根据关联的功能、操作按路径分析法设计测试用例 。而对孤立的功能则直接按功能设计测试用例 。基本事件的测试用例应包含所有需要实现的需求功能 , 覆盖率达100% 。设计备选事件和异常事件的用例 , 则要複杂和困难得多 。例如 , 字典的代码是唯一的 , 不允许重複 。测试需要验证:字典新增程式中已存在有关字典代码的约束 , 若出现代码重複必须报错 , 并且报错文字正确 。往往在设计编码阶段形成的文档对备选事件和异常事件分析描述不够详尽 。而测试本身则要求验证全部非基本事件 , 并同时儘量发现其中的软体缺陷 。可以採用软体测试常用的基该方法:等价类划分法、边界值分析法、错误推测法、因果图法、逻辑覆盖法等设计测试用例 。视软体的不同性质採用不同的方法 。如何灵活运用各种基该方法来设计完整的测试用例 , 并最终实现暴露隐藏的缺陷 , 全凭测试设计人员的丰富经验和精心设计 。作用⒈指导测试的实施测试用例主要适用于集成测试、系统测试和回归测试 。在实施测试时测试用例作为测试的标準 , 测试人员一定要按照测试用例严格按用例项目和测试步骤逐一实施测试 。并对测试情况记录在测试用例管理软体中 , 以便自动生成测试结果文档 。根据测试用例的测试等级 , 集成测试应测试那些用例 , 系统测试和回归测试又该测试那些用例 , 在设计测试用例时都已作明确规定 , 实施测试时测试人员不能随意作变动 。⒉规划测试数据的準备在我们的实践中测试数据是与测试用例分离的 。按照测试用例配套準备一组或若干组测试原始数据 , 以及标準测试结果 。尤其像测试报表之类数据集的正确性 , 按照测试用例规划準备测试数据是十分必须的 。除正常数据之外 , 还必须根据测试用例设计大量边缘数据和错误数据 。⒊编写测试脚本的"设计规格说明书"为提高测试效率 , 软体测试已大力发展自动测试 。自动测试的中心任务是编写测试脚本 。如果说软体工程中软体编程必须有设计规格说明书 , 那幺测试脚本的设计规格说明书就是测试用例 。⒋评估测试结果的度量基準完成测试实施后需要对测试结果进行评估 , 并且编制测试报告 。判断软体测试是否完成、衡量测试质量需要一些量化的结果 。例:测试覆盖率是多少、测试合格率是多少、重要测试合格率是多少 , 等等 。以前统计基準是软体模组或功能点 , 显得过于粗糙 。採用测试用例作度量基準更加準确、有效 。⒌分析缺陷的标準通过收集缺陷 , 对比测试用例和缺陷资料库 , 分析确证是漏测还是缺陷复现 。漏测反映了测试用例的不完善 , 应立即补充相应测试用例 , 最终达到逐步完善软体质量 。而已有相应测试用例 , 则反映实施测试或变更处理存在问题 。