【愚公系列】软考高级-架构设计师 079-测试用例的设计
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
测试用例的设计是软件测试过程中至关重要的一部分,其目的是为了验证软件系统的特定功能或特性是否符合预期需求。测试用例的设计需要系统地考虑各种可能的输入、操作、执行条件及预期结果,从而确保软件的质量和可靠性。以下是测试用例设计的主要步骤和方法:
🔎1.确定测试需求
- 分析需求文档、设计文档,明确需要测试的功能、性能及其他特性。
- 确定测试覆盖的范围和重点,明确哪些部分需要详细测试,哪些部分可以简化测试。
🔎2.确定测试目标
- 明确测试的具体目标,比如验证某个功能是否正确实现,检测性能是否达标等。
- 根据测试目标制定测试策略。
🔎3.选择测试方法
- 黑盒测试方法:不考虑程序内部逻辑结构,关注输入输出。
- 等价类划分:将输入数据划分为等价类,从每个类中选取代表性数据进行测试。
- 边界值分析:选择输入数据的边界值进行测试。
- 决策表:用表格形式列出各种输入情况及其对应的输出,确保覆盖所有可能的情况。
- 白盒测试方法:关注程序内部逻辑结构,进行详细测试。
- 语句覆盖:确保每个语句至少执行一次。
- 分支覆盖:确保每个分支条件的真假情况至少执行一次。
- 路径覆盖:确保程序的所有独立路径至少执行一次。
🔎4.设计测试用例
- 输入:确定测试输入数据或操作步骤。
- 前置条件:明确执行测试前必须满足的条件。
- 预期结果:明确测试执行后期望的输出结果或系统状态。
- 后置条件:测试执行后需要恢复的环境或状态。
- 优先级:根据测试用例的重要性和影响程度进行优先级划分。
🔎5.编写测试用例
- 编写详细的测试用例文档,包括测试用例编号、描述、步骤、预期结果等。
- 确保测试用例清晰、简洁、可复用,并且易于理解和执行。
🔎6.评审和优化
- 对测试用例进行评审,确保其覆盖率和有效性。
- 根据评审结果对测试用例进行优化,修正错误,增加遗漏的测试场景。
🔎7.常见测试用例设计方法
-
等价类划分:
- 将所有可能的输入数据划分为若干个等价类,每个等价类中的数据被认为是等效的。
- 从每个等价类中选取代表性数据进行测试。
-
边界值分析:
- 选择输入数据的边界值进行测试,因为边界值往往是系统发生错误的地方。
-
决策表:
- 用表格形式列出各种输入情况及其对应的输出,确保覆盖所有可能的情况。
-
因果图:
- 使用因果图表示输入条件与输出结果之间的逻辑关系,帮助设计有效的测试用例。
-
状态迁移测试:
- 针对系统状态的变化设计测试用例,确保系统在各种状态迁移下的正确性。
-
用例图:
- 根据用户需求和业务场景设计测试用例,确保所有用户操作路径都被覆盖。
测试用例的设计是保证软件质量的关键步骤,通过系统、全面的测试用例设计,可以有效发现软件中的潜在问题,确保软件在各种条件下都能稳定、可靠地运行。
🚀一、测试用例的设计
🔎1.黑盒测试用例
黑盒测试将程序看作一个黑盒子,只知道输入和输出,不了解内部代码的实现。通过这种方式,可以设计出以下几类测试用例:
🦋1.1 等价类划分
等价类划分是一种通过将输入值分成不同类别,从而减少测试用例数量,同时确保测试覆盖各种可能情况的方法。
- 目的:提高测试效率,减少测试用例数量,同时确保覆盖所有可能的输入情况。
- 举例:假设你在测试一个在线订餐系统,用户需要输入送餐地址的街道。
- 等价类1:合法的街道名,如 “Main Street” 或 “Maple Avenue”。
- 等价类2:数字街道名,如 “123rd Street”。
- 等价类3:包含特殊字符的街道名,如 “Main St!” 或 “%Maple Ave”。
- 等价类4:空白输入。
在这个例子中,你可以为每个等价类设计一个测试用例,以确保系统能够正确处理不同类型的输入情况。例如:
- 测试一个合法的街道名来确保订单可以成功提交。
- 测试一个数字街道名和特殊字符,以验证系统是否能够正确拒绝无效的输入。
通过代表不同等价类的测试用例,可以有效地覆盖各种可能的情况。
🦋1.2 边界值分析
边界值分析通过测试输入数据的边界值,验证系统在边界条件下的行为是否正确。
-
目的:检测系统在输入范围的边界值和临近边界值上的表现。
-
方法:将每类的边界值作为测试用例,边界值通常包括范围的两端值以及在此范围之外的最小值和最大值。
-
举例:假设测试年龄范围为0-150。
- 边界值:0, 150
- 临近边界值:-1, 151
🦋1.3 错误推测
错误推测基于经验和直觉来推测可能产生问题的地方,并设计相应的测试用例。
- 目的:通过经验和直觉来发现潜在错误。
- 方法:没有固定的方法,通常由测试人员凭经验进行推测。
🦋1.4 因果图分析
因果图分析通过分析输入条件(原因)和输出结果(结果)之间的逻辑关系来设计测试用例。
- 目的:通过因果关系来设计测试用例,确保测试覆盖各种输入条件组合和对应的输出结果。
- 方法:分析输入条件和输出结果之间的关系,设计覆盖所有组合情况的测试用例。
通过使用等价类划分、边界值分析、错误推测和因果图分析等方法,可以有效地设计黑盒测试用例,确保系统在各种输入情况下的正确性和稳定性。这些方法不仅可以提高测试效率,还可以确保测试覆盖全面,有助于发现潜在的系统问题。
🔎2.白盒测试用例
白盒测试用例的设计基于对程序代码逻辑的了解,按照程序的代码语句设计覆盖代码分支的测试用例。覆盖级别从低到高分为以下几种:
🦋2.1 语句覆盖 (Statement Coverage, SC)
- 定义:确保逻辑代码中的所有语句至少被执行一次。
- 覆盖层级:最低,因为执行了所有的语句,不代表执行了所有的条件判断。
- 目的:检测代码中每条语句是否都能执行。
- 示例:如果有以下代码段:
为了实现语句覆盖,需要设计两个测试用例:if (a > b) { c = a - b; } else { c = b - a; }
- 测试用例1:
a = 5, b = 3
,执行c = a - b
- 测试用例2:
a = 2, b = 4
,执行c = b - a
- 测试用例1:
🦋2.2 判定覆盖 (Decision Coverage, DC)
- 定义:确保逻辑代码中的所有判断语句的条件的真假分支都要覆盖一次。
- 覆盖层级:中等,较语句覆盖更严格,因为不仅要执行所有语句,还要确保每个判断条件的所有可能分支都被测试到。
- 目的:检测代码中每个条件判断的分支是否都能执行。
- 示例:对于上述代码段,需要设计的测试用例:
- 测试用例1:
a = 5, b = 3
,判断a > b
为真,执行c = a - b
- 测试用例2:
a = 2, b = 4
,判断a > b
为假,执行c = b - a
- 测试用例1:
🦋2.3 条件覆盖 (CC)
🦋2.4 路径覆盖
路径覆盖:逻辑代码中的所有可行路径都覆盖了,覆盖层级最高。
🚀二、练习
🔎1.题目一
题目:
招聘系统要求求职的人年龄在20岁到60岁之间(含),学历为本科、硕士或者博士,专业为计算机科学与技术、通信工程或者电子工程。其中( )不是好的测试用例。
选项:
A. (20, 本科,电子工程)
B. (18, 大专,电子工程)
C. (18, 本科,通信工程)
D. (25, 硕士,生物学)
解析:
我们需要找出哪个选项不是好的测试用例。好的测试用例应该覆盖各种可能的情况,包括合法和非法输入,以验证系统是否正确处理这些情况。我们来看每个选项:
-
选项A:(20, 本科,电子工程)
- 年龄:20(合法)
- 学历:本科(合法)
- 专业:电子工程(合法)
- 这是一个合法的测试用例,用于验证系统能够正确接受符合要求的输入。
-
选项B:(18, 大专,电子工程)
- 年龄:18(不合法)
- 学历:大专(不合法)
- 专业:电子工程(合法)
- 这是一个非法的测试用例,用于验证系统能否正确拒绝不符合年龄和学历要求的输入。
-
选项C:(18, 本科,通信工程)
- 年龄:18(不合法)
- 学历:本科(合法)
- 专业:通信工程(合法)
- 这是一个非法的测试用例,用于验证系统能否正确拒绝不符合年龄要求的输入。
-
选项D:(25, 硕士,生物学)
- 年龄:25(合法)
- 学历:硕士(合法)
- 专业:生物学(不合法)
- 这是一个非法的测试用例,用于验证系统能否正确拒绝不符合专业要求的输入。
从以上分析可以看出:
- 选项A是一个合法的测试用例。
- 选项B、C和D都是非法的测试用例,但它们分别验证了不同的非法输入条件。
结论:
所有选项中的测试用例都可以验证系统不同方面的输入合法性,但根据题目要求选择“不是好的测试用例”,需要分析每个选项是否有测试价值。选项B和C的年龄都是18,选项B的学历是大专,选项C的学历是本科。这两项都验证了非法年龄输入的情况,但选项B还验证了非法学历的情况,所以选项B比选项C更全面。
因此,选项C (18, 本科,通信工程) 不是好的测试用例,因为它和选项B相比,缺少了非法学历的验证,不能有效覆盖所有非法输入条件。
答案:C. (18, 本科,通信工程)
🔎2.题目二
题目:
以下关于测试的叙述中,正确的是( )。
选项:
A. 实际上,可以采用穷举测试来发现软件中的所有错误
B. 错误很多的程序段在修改后错误一般会非常少
C. 测试可以用来证明软件没有错误
D. 白盒测试技术中,路径覆盖法往往能比语句覆盖法发现更多的错误
解析:
我们需要选择正确的描述。逐一分析每个选项:
-
选项A:实际上,可以采用穷举测试来发现软件中的所有错误
- 错误:穷举测试指的是测试所有可能的输入和路径,这在实践中是不可行的,因为输入组合和路径可能非常多,穷举测试会耗费大量时间和资源。通常,测试是通过设计合理的测试用例来覆盖主要的功能和边界条件,而不是穷举所有可能的情况。
-
选项B:错误很多的程序段在修改后错误一般会非常少
- 错误:错误很多的程序段在修改后不一定会错误很少,修改代码时可能会引入新的错误。这需要通过仔细的测试和代码审查来确保修复后的代码质量。因此,错误多的程序段即使经过修改,也需要进行严格的回归测试。
-
选项C:测试可以用来证明软件没有错误
- 错误:测试的目的是发现软件中的错误,而不是证明软件没有错误。即使经过详细测试,仍可能存在未发现的缺陷。因此,测试不能证明软件没有错误,只能提高对软件质量的信心。
-
选项D:白盒测试技术中,路径覆盖法往往能比语句覆盖法发现更多的错误
- 正确:路径覆盖法是白盒测试的一种方法,它比语句覆盖法更严格。路径覆盖要求测试每一个可能的执行路径,而语句覆盖只要求测试每一个语句。路径覆盖能发现更多的错误,因为它考虑了程序的逻辑流和条件组合,而不仅仅是单个语句的执行。
结论:
只有选项D是正确的描述。
答案:D. 白盒测试技术中,路径覆盖法往往能比语句覆盖法发现更多的错误
🔎3.题目三
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)