一、前期准备要充分
(一)深入理解需求
在拿到软件项目后,全面掌握软件各方面需求是编写测试用例的首要环节。首先,要认真研读相关文档,包括需求规格说明书、设计文档等,通过这些文档去细致了解软件预期实现的功能,比如软件具备哪些具体操作模块、各模块之间如何交互协作等;明确软件需要达到的性能指标,像响应时间、吞吐量等要求;梳理清楚其业务逻辑,例如业务流程是怎样的走向、不同业务场景下的先后顺序等。
然而,仅依靠文档有时是不够的,还需要积极与开发团队及产品经理进行沟通。和开发团队沟通,能知晓技术实现层面的细节,例如采用了何种架构、使用了哪些关键技术等,这有助于我们从实现角度去思考测试点。与产品经理交流,则可以进一步明确产品的定位、目标用户群体以及一些隐藏在业务背后的深层次需求,避免对需求产生误解。只有通过这样多途径、全方位地去掌握软件的各项需求,才能为后续科学合理地编写测试用例打下坚实的基础。
(二)掌握相关理论
软件测试中有诸多基本理论知识以及常用的用例设计方法,熟悉并掌握它们对实际编写测试用例有着重要意义。
1、等价类划分:
其主要思路在于分类。先是根据需求,大体上划分为有效和无效两种等价类,然后再进一步细化相应的等价类,接着建立等价类表,最终生成测试用例。例如,对于一个限制输入 3 位数整数的用户 ID 输入框,可以划分出 100 - 999 这个有效等价类,以及少于 100、大于 999 这两个无效等价类。若在有效等价类 100 - 999 中,输入数据 202 通过测试,那就代表该等价类里的其他数据也能通过测试。等价类划分法适用于有数据输入(编辑框)的地方,像用户登录、注册、新建、查询等场景,它能够让我们用较少的测试用例尽可能多地覆盖功能,避免不必要的重复测试,有效减少测试用例数量的同时提高测试效率。
2、边界值分析:
边界值分析法可看作是对等价类划分法的补充。它不是从某等价类中随意挑一个作为代表,而是要使这个等价类的每个边界都作为测试条件。边界值数据本质上属于某个等价类的范围,虽然测试时有时看似冗余(比如正好等于、刚刚大于或刚刚小于边界的值),但为了保障更好的测试质量,边界值必须单独进行测试。当有数据输入且存在取值边界或长度边界时,边界值法往往会和等价类划分法一起搭配使用,从而形成一套较为完善的测试方案。比如对于输入 1 到 100 之间整数的输入框,除了用等价类划分出小于 1 的整数、1 到 100 之间的整数、大于 100 的整数这三个等价类外,还需要针对边界值 1、100 以及略超出边界的值 0、101 等进行专门测试。
3、因果图法:
当等价类法和边界值分析法只考虑了单个的输入条件,未顾及输入条件的各种组合、输入条件之间相互制约关系的场景时,因果图法就能发挥作用了。它的方法步骤包括找出所有的原因(即输入条件或输入条件的等价类)、找出所有的结果(即输出条件)、明确所有输入条件之间以及输出条件之间的制约与组合关系,确定什么样的输入条件组合会产生哪种输出结果,画出因果图后再转换为判定表 / 决策表,最后为判定表中的每一列表示的情况设计测试用例。
4、判定表法:
主要包含五部分,即条件桩(问题的所有条件)、条件项(所有条件的取值组合)、动作桩(所有可能的操作)、动作项(在每一种条件取值组合的情况下,执行动作桩中的哪些动作)以及规则(一种条件取值组合与其对应的动作组合)。其方法步骤为列出所有的条件桩和动作桩(输入和输出),填入条件项(输入项),再填入动作项得到初始判定表,最后简化判定表(合并相似规则,也就是相同动作的情况)。
5、正交试验法:
在因果图和判定表法面对变量值很多、排列组合数量极大的场景时,会生成极为庞大且冗余的测试用例,很难实现对所有组合场景进行全量测试用例覆盖,这时正交试验法就应运而生了,它可以借助相关工具(如 PICT)来生成正交试验测试用例,帮助优化测试用例的组合情况。
6、功能图法:
针对需要对被测对象的状态流转进行验证的情况,像因果图、判定表、正交试验等主要针对不同条件输入输出组合进行测试的方法就不太适用了,功能图法则可大显身手。其核心思想是抽象出待测系统的若干状态以及状态之间的转换条件和转换路径,然后从状态迁移路径覆盖的角度设计测试用例,具体会涉及分析需求明确状态节点、梳理不同状态的转换输出状态 - 条件表、画出状态迁移图、转换为状态迁移树以及从状态迁移树导出测试路径等一系列步骤。
7、场景法:
这是一种通过使用事件触发流程,对系统的功能点或业务流程进行描述的方法。从业务层面来讲,需要熟悉需求业务逻辑,并针对当前需求进行发散性思考;从技术层面看,要分析出基本流(模拟用户正确的业务操作流程)和备选流(模拟用户错误的业务操作流程),通过遍历所有基本流和备选流来覆盖完整的业务场景。不过它也有缺点,那就是只能验证业务流程,不能验证单点功能,所以一般会先采用等价类划分、边界值分析、错误推断法、判定表法等对单点功能进行验证,通过后再采用场景法进行业务流程的验证。
8、错误推测法:
在实际需求测试过程中,受到外部环境及业务逻辑的影响,比如涉及多需求耦合、浏览器缓存堆积等情况,仅针对当前需求设计出的测试用例可能会有覆盖不全的问题,此时就需要借助以往的经验进行反向错误推测,辅助其他方法对测试用例进行完善。
了解这些常见的用例设计方法的原理和适用场景后,我们就能根据具体的软件项目特点,灵活选用合适的方法运用到实际的测试用例编写工作中去了。
二、测试用例要素全解析
(一)用例编号
测试用例编号是用于唯一标识每个测试用例的,它需要具备易识别性与可追踪性,方便后续查找和管理用例。其规则设定通常会结合项目名称、测试阶段以及具体序号等来定义。
例如,常见的系统测试用例编号规则可以是 “产品编号 - ST - 系统测试项名 - 系统测试子项名 - XXX”,其中产品编号也叫项目标识,每个公司都有自己一套定义产品编号的规则,并且已有的产品编号都是既定的,可直接拿来使用。“ST” 代表系统测试阶段,后面紧跟的系统测试项名对应的是较大较系统的测试点,再后面的系统测试子项名则是对测试点更细化的划分,比如要测试用户能否成功登录这个功能,可细分为 qq 登录、邮箱登录等子项,最后的 “XXX” 可以是具体的数字序号,像 01、001、002 等等。
集成测试用例编号可以类似地按照 “产品编号 - IT - 系统测试项名 - 系统测试子项名 - XXX” 规则来制定,“IT” 表示集成测试阶段;单元测试用例编号则是 “产品编号 - UT - 系统测试项名 - 系统测试子项名 - XXX”,“UT” 代表单元测试阶段。
当然,在实际工作中,有些公司会将产品编号以及测试阶段省略,不过无论怎样设定编号规则,关键是要保证编号的唯一性,便于在众多测试用例中快速定位到特定的用例,同时也方便在测试过程中对用例执行情况进行追踪记录等操作。
(二)测试标题
测试标题的作用在于清晰准确地表达测试用例的用途,执行人员一看标题就能明白该用例主要针对的测试点是什么。所以在编写测试标题时,要避免模糊不清的表述。
比如对于功能测试用例,标题可以采用 “【功能 - 正向】验证 + 具体的某个测试点 + 预期结果” 或者 “【功能 - 反向】验证 + 具体的某个测试点 + 预期结果” 这样的格式,像 “【功能 - 正向】验证用户登录时输入正确账号密码能否成功登录”,让执行者一眼就能抓住重点是测试用户正常登录的功能情况;对于流程测试用例,可以按照流程中的节点来编写标题,例如 “登录 -> 选择商品 -> 加入购物车 -> 结算 -> 支付”,清晰呈现出是对整个购物流程的测试;其他类型的测试用例,如易用性测试、兼容性测试、性能测试等,可以写成 “【测试类型】验证 + 具体的某个测试点 + 预期结果” 的形式,像 “【兼容性】验证软件在不同浏览器下页面显示是否正常” 等。总之,测试标题要简洁明了,准确传达测试用例的核心测试内容。
(三)重要级别
测试用例的重要级别划分对于合理确定测试执行的先后顺序很关键,一般可以依据软件需求的优先级等因素,将其划分为高、中、低等不同档次。
高级别通常对应保证系统基本功能、核心业务、重要特性以及实际使用频率比较高的用例,例如手机软件中,正常通话功能、短信功能等相关测试用例就属于高级别,因为这些是手机最基础且常用的功能,若出现问题,对用户正常使用影响极大;中级别则是重要程度介于高和低之间的测试用例,像手机的拍照、联系人、MP3 等功能对应的测试用例,这些功能相对常用但对系统基础运行的影响不如高级别功能那么大;低级别对应实际使用频率不高,对系统业务功能影响比较小的模块或功能的测试用例,比如手机的计步、收音机等功能的测试用例,这些功能可能用户不是经常会用到。
另外,针对正常情况的测试用例的重要级别一般比针对异常情况的测试用例的重要级别要高。在整体的测试用例分布中,高级别的测试用例在整体用例中大概占 30%,中级别的测试用例占 60% 左右,低级别的用例占 5%-10% 左右。合理划分重要级别,有助于在测试资源有限以及时间紧张等情况下,优先保障关键功能的测试,提高测试效率和软件质量。
(四)测试输入
测试输入是根据软件需求里的输入条件,梳理出测试用例执行过程中所需的各种输入情况。它对需求有着较强的依赖性,不同的软件功能需求会对应不同的输入要求。
比如对于一个用户注册功能,测试输入可能就包括用户名、密码、确认密码、邮箱地址等信息,并且要明确这些输入信息的格式要求、长度限制等,像用户名要求是 6 - 18 位的字母数字组合,密码要求包含大小写字母、数字以及特殊字符等。如果遇到输入定义不清晰的情况,测试人员需要及时和开发团队、产品经理沟通确认,确保测试输入的准确性和完整性。
其来源可以有手工输入、文件、数据库记录等多种形式。在描述测试输入时,要禁止过多描述性语言,若涉及文件输入,最好明确提示选择路径等,做到让执行人员易懂易操作,例如测试文档导入功能,就要清晰写明测试时导入文件的具体路径及文件格式要求等,以便准确地执行测试用例开展测试工作。
(五)操作步骤
操作步骤这一要素要求按照逻辑顺序详细列出测试执行的每一个步骤,对于复杂用例还需合理拆分步骤,确保执行人员能准确无误地依照步骤进行操作测试。
以测试电商平台下单购买商品为例,操作步骤可以这样写:
- 打开浏览器,输入电商平台网址,进入平台首页。
- 在首页搜索栏中输入想要购买的商品名称,点击搜索按钮。
- 从搜索结果列表中选择合适的商品,点击进入商品详情页面。
- 在商品详情页面选择商品规格、数量等信息,点击 “加入购物车” 按钮。
- 进入购物车页面,核对购物车中商品信息无误后,点击 “去结算” 按钮。
- 在结算页面填写收货地址、联系人、联系电话等信息,选择支付方式。
- 点击 “提交订单” 按钮,完成下单操作。
通过这样详细且有条理的步骤描述,即使是不同的测试执行人员,也能按照相同的操作流程完成测试任务,并且在后续遇到问题排查或者复现问题时,也能依据清晰的操作步骤来进行,有助于提高测试的准确性和效率。
(六)预期结果
预期结果要依据软件需求中的输出内容得出,并且要保证具有可验证性,方便在实际测试时准确判断测试是否通过。
比如在测试用户登录功能时,预期结果可能有:
- 界面显示方面,若输入正确的账号和密码,点击登录按钮后,界面应显示登录成功,并跳转到相应的用户主页;若输入错误账号或密码,界面应弹出提示框,显示 “账号或密码错误,请重新输入” 等相关提示信息。
- 数据库的变化方面,登录成功后,数据库中对应的用户登录状态字段应更新为已登录状态,记录本次登录的时间、IP 地址等相关信息;若登录失败,数据库相关数据则不会有相应的更新变化。
- 相关信息的变化方面,登录成功后,原本需要登录才能访问的页面和功能此时都应能正常访问,而未登录时显示的登录入口等相关元素应相应隐藏或改变显示状态;登录失败则仍然保持未登录时的页面权限状态等。
总之,预期结果的明确设定能够让测试人员在执行完测试步骤后,直观地对比实际情况,判断测试是否符合预期,进而确定软件功能是否满足需求,有助于精准地发现软件中存在的问题和缺陷。
三、设计方法巧运用
(一)等价类划分法
在软件测试用例设计中,等价类划分法是一种常用且十分有效的方法。它的核心在于根据需求,将被测对象的输入划分为有效等价类和无效等价类。
所谓有效等价类,就是那些对于程序规格说明而言,是有意义、合理的输入数据所构成的集合,利用它能够检验程序是否达成了规格说明预先规定的功能和性能。例如,对于一个要求输入 6 - 12 位数字作为登录密码的登录界面来说,6 - 12 位数字这个范围就是有效等价类。
而无效等价类则与之相反,是指那些对于软件规格说明来讲,没有意义、不合理的输入数据集合,通过对无效等价类进行测试,可以找出程序出现异常的情况,检查程序功能和性能的实现是否不符合规格说明要求。就上述登录密码的例子,小于 6 位数字以及大于 12 位数字的输入情况就属于无效等价类。
在实际运用等价类划分法设计测试用例时,有一套基本的步骤。首先,要为每个输入划分等价类,进而得到等价类表,并为每个等价类规定一个唯一编号。接着,设计一个测试用例,使其尽可能多地覆盖所有尚未覆盖的有效等价类,然后不断重复这个步骤,直至所有有效等价类均被测试用例覆盖。之后,再设计一个测试用例,使其只覆盖一个无效等价类,同样重复操作,让所有无效等价类都能被覆盖到。
例如,程序规定输入三个正整数作为三边的边长构成三角形。我们来分析其等价类并设计测试用例:
- 需求提取:一是三条边需满足整数、数量为 3 个、非零数、正数这些条件;二是一般三角形要求两边之和大于第三边;三是等腰三角形需满足两边相等且两边之和大于第三边;四是等边三角形要求三条边相等。
- 等价类划分:符合条件的需求即是有效等价类,比如等腰三角形,要求至少有两条边相等,那有效等价类就包括 a = b、b = c、a = c 等情况,不符合这些条件的就是无效等价类,像 a!= b、b!= c、a!= c 等。
等价类划分法适用于存在数据输入(编辑框)的场景,像用户登录、注册、新建、查询等操作,它能够让我们使用相对较少的测试用例,最大程度地覆盖功能,避免不必要的重复测试,在减少测试用例数量的同时,有效提升测试效率。
(二)边界值分析法
在软件测试实践中,大家会发现大多数缺陷往往出现在输入边界的情况。这就是边界值分析法所依据的原理,它是对等价类划分法的有力补充。
先来了解几个基本概念。上点,就是边界上的点,如果该域的边界是封闭的,上点就在域范围内;要是域的边界是开放的,上点就在域范围外。离点,是离上点最近的一个点,当域的边界是封闭的,离点就在域范围外;而域的边界为开放时,离点就在域范围内。内点则顾名思义,是在域范围内的任意一个点。例如,对于整数域,上点就是 66 和 88,并且都在域内,内点是域内任意点,离点就是 65 和 89;再比如 (66, 88] 这种情况,上点是 66 和 88,其中一个在域内,一个在域外,内点依旧是域内任意点,离点则是 67 和 89;而对于 (66, 88) 这样的开区间情况,上点还是 66 和 88,不过都在域外,内点是域内任意点,离点为 67 和 87。
运用边界值分析来设计用例时,通常要先确定边界情况,这些边界一般就是输入和输出等价类的边界,然后选取正好等于、刚刚大于或刚刚小于边界的值作为测试数据,而不是像等价类划分法那样从等价类中挑选典型值或任意值作为测试数据。
比如一个文本框的可输入字符长度规定为 0 - 15,那在测试的时候,边界值就应选取 0、15,以及略超出边界的 -1(小于 0)、16(大于 15)等作为测试数据,看看程序是否会报错,因为经验表明在边界附近取值进行测试,更容易查出错误。
又比如测试计算平方根的函数,其输入为实数,输出也是实数,需求说明当输入一个 0 或比 0 大的数时,返回其正平方根;输入小于 0 的数时,显示错误信息 “平方根非法 - 输入值小于 0” 并返回 0。我们进行等价类划分后,对于输入大于等于 0 这个等价类,其边界为 0 和最大正实数;输入小于 0 这个等价类,边界为最小负实数和 0。由此可得到以下测试用例:输入最小负实数、输入绝对值很小的负数、输入 0、输入绝对值很小的正数、输入最大正实数等。
当有数据输入且存在取值边界或长度边界等情况时,边界值法往往会和等价类划分法配合使用,从而构建出一套较为完善的测试方案,使我们对软件功能的测试更加全面、准确,尽可能多地发现潜在的缺陷。
(三)其他方法
除了上述的等价类划分法和边界值分析法外,在软件测试用例设计中还有许多其他常用的方法,它们各有其适用场景和运用思路,了解这些方法能够帮助我们拓宽设计思路,使测试用例更具针对性和全面性。
- 因果图法:当软件中存在多个输入条件,并且这些输入条件之间存在各种组合以及相互制约关系,而等价类划分法和边界值分析法又只考虑了单个输入条件,无法顾及这些复杂关系时,因果图法就能发挥重要作用了。它的实施步骤包括找出所有的原因(也就是输入条件或输入条件的等价类)、找出所有的结果(即输出条件)、明确所有输入条件之间以及输出条件之间的制约与组合关系,确定什么样的输入条件组合会产生哪种输出结果,画出因果图后再转换为判定表 / 决策表,最后依据判定表中的每一列所表示的情况来设计测试用例。例如,在判断一个人是儿童、青年还是成年人的场景中,输入条件有年龄、身高、体重等,不同的输入值组合会对应不同的输出结果(属于哪个年龄段),这时就可以运用因果图法梳理清楚这些关系,进而设计出有效的测试用例。
- 流程图法:这种方法主要是通过绘制流程图来清晰呈现软件系统的业务流程或者操作步骤,便于测试人员从流程的角度去分析可能出现问题的环节,然后根据流程图中的各个节点、判断分支以及流向等来设计测试用例,确保对整个业务流程的完整性和准确性进行测试。比如在测试电商平台下单购买商品的业务流程时,就可以绘制出从打开平台、搜索商品、选择商品、加入购物车、结算到支付等一系列步骤的流程图,再基于此流程图设计相应的测试用例,验证每一个环节是否能正常执行。
- 场景法:这是一种站在用户实际使用软件的角度出发,通过使用事件触发流程,对系统的功能点或业务流程进行描述和测试的方法。从业务层面来讲,需要我们熟悉需求业务逻辑,并针对当前需求进行发散性思考;从技术层面看,要分析出基本流(模拟用户正确的业务操作流程)和备选流(模拟用户错误的业务操作流程),通过遍历所有基本流和备选流来覆盖完整的业务场景。不过需要注意的是,场景法主要侧重于验证业务流程,对于单点功能的验证能力有限,所以一般会先采用等价类划分、边界值分析、错误推断法、判定表法等对单点功能进行验证,通过后再采用场景法进行业务流程方面的测试。例如在测试 ATM 取款流程时,基本流就是正常的插卡、输入密码、选择取款金额、取款等操作,而备选流可能包括密码输入错误、余额不足等异常情况,我们要针对这些不同的流程情况设计测试用例。
- 错误推测法:在实际的软件测试过程中,受到外部环境及业务逻辑等多种因素影响,有时候仅依靠常规的测试用例设计方法,可能会出现对某些特殊情况覆盖不全的问题。错误推测法就是凭借测试人员以往的经验、知识以及直觉,推测程序中可能存在的各种错误,从而有针对性地设计测试用例进行补充完善。比如在涉及多需求耦合、浏览器缓存堆积等复杂场景下,就可以运用错误推测法,考虑一些容易被忽略但又可能出现问题的情况,辅助其他方法让测试用例更加全面。
总之,在实际编写软件测试用例时,我们不能局限于某一种方法,而是要根据软件项目的具体特点、功能需求以及复杂程度等因素,灵活选择并综合运用这些不同的用例设计方法,从而设计出高质量、全面有效的测试用例,保障软件的质量和稳定性。
四、质量保障有妙招
(一)满足质量属性
在编写测试用例时,需要确保其满足一定的质量属性,这对保障测试效果以及软件质量有着重要意义,以下是一些关键的质量属性及其含义与实现方式。
- 正确性:这要求测试标题描述部分的内容必须准确无误。也就是说,测试用例所针对的功能、测试步骤以及预期结果等内容,都要与软件实际需求相契合,不能出现描述偏差或错误引导的情况。例如在测试用户登录功能时,如果需求规定密码长度为 6 - 12 位字符,那么在测试用例中涉及密码输入的相关描述就要遵循这个要求来体现正确性,避免出现诸如写为可输入任意长度密码之类的错误描述。
- 经济性:要只为确定需要的目的设计相应的测试步骤。即避免设计一些冗余、无意义的测试操作,确保每个步骤都是为了验证软件某个特定的功能或性能指标而存在。比如对于一个简单的计算器软件的加法功能测试,只需要输入不同类型的数值进行加法运算并验证结果即可,无需去额外操作一些与加法功能无关的软件界面按钮等操作,以此来提高测试效率,合理利用测试资源。
- 可重复性:强调的是自我一致性,也就是不管谁执行此用例,结果都应该一样。这就需要测试用例在描述操作步骤时足够清晰、明确且详细,同时对测试环境等前提条件也有准确说明。例如在测试网络应用时,要明确规定网络环境是处于正常连接、特定带宽等状态下,执行人员按照既定步骤操作,如在某个固定页面输入特定数据、点击相应按钮等,最终得到的预期结果是固定的,不会因执行人不同而产生差异。
- 适应性:测试用例既要能适应短期需要,又要能考虑长远需要。在短期内,要贴合当下软件项目的功能需求、业务逻辑以及所使用的技术架构等进行设计;从长远来看,要考虑到软件后续可能出现的功能扩展、版本迭代以及不同运行环境变化等情况,使测试用例具有一定的通用性和扩展性。比如对于一款电商软件,当下可能只支持国内部分地区的配送,测试用例在设计时除了针对现有配送区域相关功能测试外,还要考虑未来拓展到其他地区甚至国外时,物流相关功能的测试如何能复用现有的部分测试用例或者方便进行修改完善来适应新情况。
- 可追踪性:意味着用例能追踪到一个具体的需求。在编写测试用例时,要明确其对应的是软件需求规格说明书中的哪一项具体需求,这样当测试结果出现问题时,可以快速定位到是哪个需求没有被正确实现,方便开发团队进行针对性的排查和修复。例如每个测试用例编号可以关联到具体的需求编号,或者在测试用例描述中清晰注明是针对某个功能模块、某个业务流程环节的需求验证等。
- 自我清理性:单个用例不会影响整个测试环境,即用例执行完了可以恢复原有的测试环境。比如在进行数据库相关功能测试时,测试用例中如果涉及对数据库的插入、修改等操作,在执行完测试后,要确保有相应的回滚或清理机制,使数据库能恢复到执行该测试用例之前的状态,避免对后续其他测试用例的执行以及整个测试环境的稳定性产生干扰。
- 结构化和可测试性:
- 含有规范的测试标题和编号:测试标题要清晰准确地传达测试用例的核心内容,编号要具备唯一性且便于管理和查找,如前面所提到的按照项目名称、测试阶段以及具体序号等来制定编号规则,方便在众多测试用例中快速定位特定用例以及后续对用例执行情况进行追踪记录等操作。
- 含有一个确定的测试某一个特定需求的目的:每个测试用例都应该聚焦于验证软件的某一项具体功能或性能指标等需求,不能模糊不清、目的不明,让执行人员清楚知道执行该用例是要测试什么内容。
- 含有关于测试方法的描述:要说明在该测试用例中运用了哪种或哪些测试方法,比如是等价类划分法、边界值分析法还是其他方法,这有助于其他相关人员理解测试思路以及后续进行测试用例的评审和完善等工作。
- 指定条件信息:像环境、数据、预置的条件测试、安全入口等条件都要明确给出。例如测试一个移动端软件在不同操作系统版本下的兼容性,就要具体指出测试时涉及的操作系统版本范围;对于需要提前准备特定测试数据的情况,要详细说明数据的内容、格式等要求;如果软件有安全验证方面的需求,要明确安全入口相关设置等内容,确保测试用例执行的前提条件完整、准确。
- 含有操作步骤和预期结果:操作步骤需按照逻辑顺序详细列出,对于复杂用例合理拆分步骤,让执行人员能准确无误地依照步骤进行操作测试;预期结果要依据软件需求中的输出内容得出,并且保证具有可验证性,方便在实际测试时准确判断测试是否通过。
- 陈述任何辅助证据,例如截图报告并确保这些东西妥善保存:在测试过程中,如果有需要通过截图、生成报告等方式来辅助说明测试情况的,要明确要求执行人员进行相应操作并妥善保存这些资料,以便后续对测试结果进行分析、追溯以及作为问题排查的依据等。
- 总之,只有保证测试用例满足这些质量属性,才能让测试工作更加科学、高效、准确地开展,从而更好地保障软件质量。
(二)考虑异常情况
在编写测试用例时,不能仅仅将目光局限于软件的正常流程测试,充分考虑各种异常情况同样至关重要,这关乎软件在复杂实际场景下的稳定性和可靠性。
软件在实际使用过程中,用户的操作往往是多种多样的,很可能出现各种不符合预期的输入或者外部环境变化等情况,从而引发异常。例如边界条件就是容易出现问题的地方,像一个文本输入框规定可输入字符长度为 0 - 100 个字符,那么正好输入 0 个字符、100 个字符以及略超出边界如 - 1 个字符、101 个字符等情况都需要作为异常情况进行测试,查看软件是否能正确处理,是提示错误信息还是进行合理的截断等操作;再比如对于数值输入框,如果要求输入正整数,那么输入负数、小数或者非数值类型的字符等异常输入情况也要考虑在内,验证软件的容错能力。
除了输入方面的异常,资源不足也是常见的异常场景之一。例如软件在运行时占用内存、CPU 等资源过多,当系统资源紧张时,是否会出现卡顿、崩溃或者功能异常等情况,需要通过设计相应的测试用例来模拟资源不足的环境进行测试。比如可以利用一些工具限制软件可使用的内存大小,然后执行各种操作,观察软件的响应情况,看是否能给出合理提示或者进行资源释放、优化等处理,确保在资源受限情况下依然能保持一定的稳定性,避免影响用户正常使用。
还有像网络异常这种在网络应用中频繁出现的情况,如断网、网络延迟过高、网络抖动、丢包等,都需要纳入测试范围。当出现网络连接中断时,软件是否能及时提示用户,并且在网络恢复后能否自动重连、继续之前未完成的操作等;对于网络延迟较高的情况,软件的响应时间是否在可接受范围内,相关功能是否会出现数据丢失、加载不完全等问题,这些都是需要通过编写针对性的测试用例去验证的,以此来保障软件在网络环境不稳定的复杂场景下也能正常运转。
此外,硬件故障、外部接口调用失败等情况也可能导致软件出现异常,同样需要考虑。例如软件依赖的某个外部设备(如打印机、扫码枪等)突然故障无法正常工作时,软件是否有相应的应对机制,是提示用户更换设备还是暂停相关功能等待设备恢复等;在调用第三方接口获取数据时,如果接口返回错误信息或者超时无响应,软件自身的容错处理和数据回滚等机制是否能正常发挥作用,都是要在测试用例中体现的异常测试内容。
只有全面考虑到这些异常情况,并编写相应的测试用例进行充分测试,才能提前发现软件潜在的问题,增强软件的健壮性,让软件在面对各种复杂多变的实际使用场景时,依然能够稳定运行,为用户提供良好的使用体验。
(三)进行用例评审
测试用例评审是软件测试过程中不可或缺的重要环节,它能够汇聚多方智慧,查漏补缺,进一步完善测试用例,从而提升测试的质量和有效性。
组织参与用例评审的人员通常包括项目负责人、测试人员、开发人员、分析设计人员,甚至还可以邀请客户代表直接参与。不同角色在评审过程中都能从各自的专业角度出发,发现不同层面的问题。项目负责人可以站在项目整体进度、质量把控以及资源协调的角度,审视测试用例是否符合项目规划和要求,是否能在规定时间和资源内完成有效的测试工作;测试人员凭借自身对测试方法、测试流程以及测试覆盖度等方面的专业知识,检查测试用例的完整性、准确性以及可执行性等;开发人员则更了解软件的技术实现细节,能够发现测试用例中是否存在对功能理解偏差、与代码实现逻辑不符或者对一些特殊技术处理情况考虑不周等问题;分析设计人员可以从软件架构、设计思路等方面,评估测试用例是否能全面覆盖各个设计环节和功能模块;而客户代表参与评审,则能从用户实际使用需求和期望的角度,反馈测试用例是否真正贴合用户在功能、易用性等方面的需求,确保最终交付的软件能让用户满意。
在评审过程中,需要重点关注以下几个方面的内容。一是测试用例的整体设计思路,要考虑其是否结合了测试环境的实际情况,根据需求的关键程度和优先级合理确定了测试的先后次序以及测试用例的数量多少,避免出现测试重点不突出或者测试资源浪费等情况。例如对于核心功能模块,相应的测试用例数量和详细程度是否足够,是否优先安排了关键功能的测试执行顺序等。
二是关注软件薄弱环节的测试用例设计情况。依据二八定理,软件缺陷往往集中在一小部分的软件构件上,也就是软件的薄弱环节,所以要仔细分析针对这些薄弱环节设计的测试用例是否充分、有效,是否能真正挖掘出潜在的问题。比如对于一些复杂的业务逻辑处理模块、频繁与外部系统交互的接口部分等容易出现问题的地方,测试用例是否进行了全面深入的覆盖测试。
三是审查测试用例对需求的覆盖率,这不仅仅是看每个需求是否都有对应的测试用例,更要考量这些测试用例有没有覆盖到产品使用中一些特别场景、特殊的边界以及接口等地方。例如对于一个具有多种用户角色权限的软件,是否针对不同角色在各个功能模块下的权限差异都有相应的测试用例进行验证;对于输入框的边界值、各种条件组合的边界情况等是否都纳入了测试范围。
四是检查测试用例的定义是否清晰、完整,像测试的前提条件是否明确给出,测试步骤是否简明扼要且不存在歧义,有没有明确的预期结果,预期结果是否符合用户需求等。例如测试步骤描述要详细到具体的操作动作、操作顺序以及操作对象等,让任何执行人员都能清楚明白如何进行测试;预期结果要具体可衡量,能够直接对比实际测试结果来判断测试是否通过。
五是核实测试环境的定义是否准确,因为测试环境会直接影响测试结果,要确保测试用例中对测试环境的描述(如硬件配置、软件版本、网络环境等)与实际执行测试时的环境相符,并且满足对应的测试用例的运行要求,避免因环境差异导致测试结果不准确或者无法复现问题等情况发生。
通过用例评审,如果发现测试用例存在问题或者有可以完善的地方,需要及时进行修改和补充。对于评审中提出的意见和建议,要安排专人负责跟进,分析哪些是需要立即调整的关键问题,哪些是可以后续优化的内容,然后对测试用例进行相应的修改完善,如补充遗漏的测试点、修正错误的描述、优化测试步骤或者调整预期结果等。在修改完成后,如果涉及重要的变动或者存在争议较大的地方,还可以再次组织相关人员进行评审,确保最终的测试用例质量过硬,为后续的软件测试工作提供坚实可靠的依据,保障测试工作顺利开展,进而提高软件整体的质量水平。
五、后期维护不可少
(一)及时更新用例
在软件的整个生命周期中,需求变更和功能更新是常有的事。随着软件的不断迭代,测试用例也需要与时俱进,进行相应的更新维护,确保其与软件的当前状态始终保持一致,这是保证测试有效性的关键环节。
比如,一款电商软件原本只支持微信支付和支付宝支付两种线上支付方式,对应的测试用例也是围绕这两种支付方式编写的,涵盖了正常支付流程、支付失败(如余额不足、密码错误等情况)的测试场景。后来,软件进行升级,新增了银行卡支付功能,这时就需要及时在测试用例中添加针对银行卡支付的相关用例,像银行卡绑定、不同银行卡类型(借记卡、信用卡)支付、银行卡支付时的安全验证等具体测试内容,确保新功能能被全面测试到。
再例如,软件某个功能模块的业务逻辑发生了改变,原本用户下单后可以直接修改收货地址,现在改为下单后的一定时间内(比如半小时内)才允许修改。那么测试用例中涉及收货地址修改功能的部分就要随之更新,把时间限制条件纳入测试步骤以及预期结果的考量范围,否则按照旧的测试用例进行测试,就可能遗漏因业务逻辑变更而产生的问题,导致测试结果不能真实反映软件的实际情况,使得一些缺陷不能被及时发现,最终影响软件上线后的使用体验和质量。
总之,软件测试工程师要时刻关注软件的变化,养成及时更新测试用例的习惯,避免因版本差异导致测试遗漏或失效,让测试用例能够持续有效地为软件质量保驾护航。
(二)定期审查优化
定期审查测试用例是一项必不可少的工作,它有助于保证测试用例的质量和有效性。由于软件项目的复杂性以及需求的动态变化,经过一段时间后,部分测试用例可能会出现与当下测试需求不符、存在冗余或者不合理的情况,所以需要对其进行优化调整。
一方面,要查看测试用例是否依然有效。例如,随着软件功能的优化,某些曾经容易出现问题的边界值情况得到了彻底解决,对应的边界值测试用例就可以适当简化或者调整,避免不必要的重复测试;又或者一些业务功能因为产品定位的改变不再使用,那相关的测试用例就可以删除,以免增加测试工作量且干扰对关键功能的测试关注。
另一方面,要考量测试用例是否符合当下的测试需求。比如,随着软件用户群体的扩大,对兼容性的要求提高了,之前只测试了软件在主流浏览器上的兼容性,现在就需要根据实际情况,增加对一些小众但仍有部分用户使用的浏览器的兼容性测试用例。再比如,软件增加了新的安全验证机制,那么就要审查原有的测试用例中是否涵盖了针对新安全机制的相关验证内容,若没有则要进行补充完善。
以一个项目管理软件为例,起初其功能主要侧重于任务分配和进度跟踪,对应的测试用例也是围绕这些核心功能编写的。后来软件新增了团队成员绩效统计、项目成本核算等功能,并且原有的任务分配功能在权限管理方面有了更细致的划分,这时就需要对测试用例进行全面审查,补充关于新功能的测试用例,同时对涉及任务分配权限的用例按照新的权限规则进行优化调整,使测试用例能够贴合软件当前的实际情况,不断提升用例质量,进而保障软件测试工作能够高效、准确地