苏春莉 曹新淼
摘要:测试用例是软件测试必须遵守的准则。本文从测试用例概念谈起,介绍了测试用例概念、设计目的、以及所具备的特征,通过举例说明了常用的测试用例设计方法,最后着重介绍了如何设计好的测试用例。良好的测试用例将大大减少项目执行时间,提高测试效率。
Abstract: Test case is the guideline that software testing must adhere to. This article starts with the concept of test case, introduces the concept, the design purpose and the features of test case. It illustrates the common test case design methods by examples, and finally focuses on how to design good test cases. Good test cases will greatly reduce project execution time and improve testing efficiency.
关键词:软件测试;测试用例;等价类;边界值
Key words: software testing;test case;equivalence classes;boundary value
中图分类号:TP31 文獻标识码:A 文章编号:1006-4311(2020)03-0219-02
0 引言
软件测试是软件生命周期的重要组成部分,与软件的质量密切相关,是验证软件质量特性的重要手段。测试用例作为软件测试过程的一个重要角色,它是测试执行环节的主要依据,是测试过程必须遵守的准则,更是保证软件测试质量的关键所在。
1 什么是好的测试用例
测试用例(Test Case)是指对一个特定的软件产品进行测试任务的描述,是为特定的测试目标而设计的一组数据信息,包括测试输入、执行条件和预期结果的集合,用以测试软件或程序的某个方面是否达到用户的特定需求[1]。
在测试之前,不仅要设计测试用例,还要设计“好的”测试用例。通常,人们认为“发现了软件缺陷的测试用例就是好的用例”,那么“如果说测试用例发现了缺陷就是好用例,那么在该缺陷被修复后,同样的用例难道就不是好用例了吗?”。还有人经常说“发现至今未被发现的软件缺陷的测试用例就是好用例”,那么:如何评估是否还存在未被发现的缺陷?如果软件中根本就没有错误了呢?
所以“好的”测试用例一定是一个完备的集合,它能够覆盖所有等价类以及各种边界值,而跟能否发现缺陷无关。
2 设计测试用例的目的
众所周知,软件测试的穷举往往是不可能的,局限于测试时间和所需的资源。测试用例设计就是将软件测试的行为活动,作一个科学化的组织归纳。为了提高测试效率,在具体测试过程中,通常是从众多的可用测试数据中采用不同的方法筛选出典型的和特别的测试数据来进行测试。
设计测试用例主要有以下几个目的:①在开始实施测试之前,设计好测试用例可以避免盲目测试,以便提高测试效率。②使用测试用例进行测试,使得测试的目的比较明确,重点比较突出,同时减少对软件功能的漏测现象。③在对不同版本软件进行重复测试时,测试用例会被再次用到,这时只需修正少部分的测试用例便可展开测试工作,降低工作强度,缩短项目周期。④功能模块的通用性和复用性使软件易于开发,而测试用例的通用性和复用性则会使软件测试易于开展,所以随着测试的不断精化其效率不断攀升[2]。
3 测试用例具备的特征
测试用例是测试过程中的重要参考依据,设计好的测试用例将大大减少项目执行时间,提高测试效率。好的测试用例具有以下特征:
①整体完备性:“好的”测试用例一定是一个完备的整体,是有效测试用例组成的集合,能够完全覆盖测试需求。
②等价类划分的准确性:指的是对于每个等价类都能保证只要其中一个输入测试通过,其他输入也一定测试通过。
③等价类集合的完备性:需要保证所有可能的边界值和边界条件都已经正确识别。做到了以上三点,就可以肯定测试是充分且完备的,即做到了完整的测试需求覆盖。
4 设计测试用例的方法
测试用例的设计方法比较多,通常有等价类划分法、边界值分析法、错误推测方法、判定表驱动分析法、场景设计方法、正交实验设计方法和功能图法等,但是真正具有实用价值且常用的是前三种方法。
①等价类划分方法。等价类中任意一个输入数据对于揭露程序中潜在错误都具有同等效果。划分好等价类后,只要从每个等价类中选取其中的一个值进行测试,就可以代表此等价类的数据进行测试,从而取得较好的测试覆盖结果。例如:学生信息系统中有一个“考试成绩”的输入项,成绩的取值范围是0~100之间的整数,考试成绩及格的分数线是60。为了测试这个输入项,显然不可能用0~100的每一个数去测试。在考虑了有效等价类和无效等价类后,设计的测试用例为:
有效等价类 1:0~59之间的任意整数;
有效等价类 2:60~100之间的任意整数;
无效等价类 1:小于0的负数;
无效等价类 2:大于100的整数;
无效等价类 3:0~100之间的任何浮点数;
无效等价类 4:其他任意非数字字符。
②边界值分析方法。它是对输入或输出的边界值进行测试的一种方法,不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件,同时不仅考虑输入条件,还要考虑输出空间产生的测试情况[3]。再看学生信息系统中“考试成绩”的例子,选取的边界值数据应该包括这些边界值:-1,0,1,59,60,61,99,100,101。
③错误推测方法。錯误推测方法是指基于对被测试软件系统设计的理解、过往经验以及个人直觉,推测出软件可能存在的缺陷,从而有针对性地设计测试用例的方法。错误推测法和目前非常流行的“探索式测试方法”的基本思想和理念是不谋而合的,这类方法在目前的敏捷开发模式下的投入产出比很高,因此被广泛应用。
比如,Web界面的GUI功能测试,需要考虑浏览器在有缓存和没有缓存下的表现;对于代码级的单元测试,需要考虑被测函数的输入参数为空情况下的内部处理逻辑等。类似这些都是基于曾经遇到的问题而进行的错误推测,很大程度上取决于个人能力。
5 如何设计好的测试用例
在实际的测试实践中,不同的软件项目在研发生命周期的各个阶段都会有不同的测试类型。对于每一种不同的测试类型,设计的测试用例的关注点和方法论可能会有很大的差异。要设计出好的测试用例,需要做到以下几点:
①从软件功能需求出发,全面地、无遗漏地识别出测试需求是至关重要的,这将直接关系到用例的测试覆盖率。在具体的用例设计时,先搞清楚每一个业务需求所对应的多个软件功能需求点,然后分析出每个软件功能需求点对应的多个测试需求点,最后再针对每个测试需求点设计测试用例[4]。
②对于识别出的每个测试需求点,需要综合运用等价类划分、边界值分析和错误推测方法来全面地设计测试用例。要综合运用这三种方法,并针对每个测试需求点的具体情况,进行灵活选择。
以“用户登录”的功能性测试需求为例,首先应该对“用户名”和“密码”这两个输入项分别进行等价类划分,列出对应的有效等价类和无效等价类,对于无效等价类的识别可以采用错误猜测法,然后基于两者可能的组合,设计出第一批测试用例。等价类划分完后,需要补充“用户名”和“密码”这两个输入项的边界值的测试用例,比如用户名为空(NULL)、用户名长度刚刚大于允许长度等。
③除了功能性需求以外,非功能性需求也是极其关键的。什么是非功能性需求呢?从软件测试的维度来看,非功能性需求主要涉及安全性、性能以及兼容性等三大方面。这些非功能性需求对软件系统的质量有着举足轻重的作用。
同样以“用户登录”为例,非功能性的测试用例比如有:1)安全性测试用例:用户密码后台存储是否加密;用户密码在网络传输过程中是否加密;密码输入框是否不支持复制和粘贴;用户名和密码的输入框中分别输入典型的“SQL注入攻击”字符串,验证系统的返回页面等;2)性能压力测试用例:单用户登录的响应时间是否小于3秒;单用户登录时,后台请求数量是否过多;高并发场景下服务端的监控指标是否符合预期;3)兼容性测试用例:不同浏览器下,验证登录页面的显示以及功能正确性;相同浏览器的不同版本下,验证登录页面的显示以及功能正确性;不同移动设备终端的不同浏览器下,验证登录页面的显示以及功能正确性等。
④深入理解被测试软件的架构,设计出“有的放矢”的测试用例集,去发现系统边界以及系统集成上的潜在缺陷。作为测试人员,必须对被测系统内部的架构有清楚的认识,比如数据库连接方式、数据库的读写分离、消息中间件的配置、缓存系统的层级分布、第三方系统的集成等等[5]。
⑤深入理解被测软件的设计与实现细节、以及内部的处理逻辑。单单根据测试需求点设计的用例,只能覆盖“表面”的一层,往往会覆盖不到内部的处理流程、分支处理,而没有覆盖到的部分就很可能出现缺陷遗漏。
⑥引入需求覆盖率和代码覆盖率来衡量测试执行的完备性,并以此为依据来找出遗漏的测试点。在具体实践中,通过代码覆盖率指标找出可能的测试遗漏点。同时,切忌不要以开发代码的实现为依据设计测试用例。因为开发代码实现的错误会导致测试用例也出错,所以应该根据原始需求设计测试用例。
6 结语
软件测试用例设计的质量和效果,直接关系到测试过程的开展、测试效率以及最终的测试结果。设计测试用例是为了更有效地发现缺陷,本文在测试用例概念特征的基础上,通过举例介绍了设计测试用例常用的三种方法,着重介绍了如何设计好的测试用例,这对于实际的测试分析与设计具有一定的参考意义。
参考文献:
[1]朱少民.软件测试[M].上海:人民邮电出版社,2016.
[2]张倩倩,赵星汉,高湘飞.软件测试用例设计方法[J].电子技术与软件工程,2018.
[3]陈能技.软件测试技术大全[M].北京:人民邮电出版社,2011.
[4]马均飞,郑文强.软件测试设计[M].北京:电子工业出版社,2011.
[5]柳纯录.软件测评师教程[J].清华大学出版社,2012.
[6]翟燕.探讨计算机软件测试的相关技术应用[J].价值工程,2018,37(06):181-182.