如何设计单元测试用例,单元测试快速入门教程四

测试人员在实际工作中根据不同覆盖要求设计面向代码的单元测试用例,运行测试用例后至少应实现如下覆盖需求:

  • 对程序模块的所有独立的执行路径至少覆盖一次;
  • 对所有的逻辑判定,真假两种情况至少覆盖一次;
  • 在循环的边界和运行界限内执行循环体;
  • 测试内部数据结构的有效性等。

至少应设计覆盖如下需求的基于功能的单元测试用例:

  • 测试程序单元的功能是否实现;
  • 测试程序单元性能是否满足要求(可选);
  • 是否有可选的其它测试特性,如边界、余量、安全性、可靠性、强度测试、人机交互界面测试等。

无论白盒、黑盒测试,每个测试用例都应包含4个关键元素:

  • 被测单元模块初始状态声明,即测试用例的开始状态(仅适用于被测单元维持了调用中间状态的情况);
  • 被测单元的输入,包含由被测单元读入任何外部数据值;
  • 该测试用例实际测试的代码,用被测单元的功能和测试用例设计中使用的分析来说明,如单元中哪一个决策条件被测试;
  • 测试用例期望的输出结果(在测试进行前测试说明中定义)。

测试用例设计步骤

步骤1:首先运行被测单元

在单元测试中应该把通过简单的方法能够执行被测单元的测试用例作为第一个测试用例,因为当这个测试用例运行成功时可以增强人的自信心。如果运行失败,最好选择一个更简单的输入对被测单元进行测试/调试。

步骤2:正面测试(Positive Testing)

验证被测单元能够执行应该完成的工作。测试设计者应该查阅相关设计说明,每个测试用例应该测试模块设计说明中一项或多项陈述。如果涉及多个设计说明,最好使测试用例的序列对应一个模块单元的主设计说明。

步骤3:负面测试(Negative Testing)

负面测试用于验证软件不执行其不应该完成的工作。这一步骤主要依赖于错误猜测,需要依靠测试设计者的经验判断可能出现问题的位置。

步骤4:模块设计需求中其它测试特性用例设计

如果需要,应该针对性能、余量、安全需要、保密需求等设计测试用例。在有安全保密需求的情况下,重视安全保密分析和验证是方便的。针对安全保密问题的测试用例应该在测试说明中进行标注。同时应该加入更多的测试用例测试所有的保密和安全问题。

步骤5:覆盖率测试用例设计

应该增加更多的测试用例到单元测试说明中以达到特定的测试覆盖率目标。覆盖率测试一般要求语句覆盖率和判断覆盖率。

步骤6:测试执行

使用上述5个步骤设计的测试说明在大多数情况下可以实现一个比较完整的单元测试。到这一步可以使用测试说明构造和执行测试过程。测试过程可能是特定测试工具的一个测试脚本。

测试过程的执行可以查出模块单元的错误,然后进行修复和重新测试。在测试过程中的动态分析可以产生代码覆盖率测量值,以指示是否已经达到了覆盖目标。

因此需要在测试设计说明中增加完善代码覆盖率的步骤。

步骤7:完善代码覆盖

由于模块单元设计文档规范不一,测试设计中可能引入人为的错误,测试执行后,复杂的决策条件、循环和分支的覆盖率目标可能并没有达到,这时需要进行分析找出原因,导致一些重要执行路径没有被覆盖的可能原因有:

①不可行路径或条件:应该标注测试说明证明该路径或条件没有测试的原因。

②不可到达或冗余代码:正确处理方法是删除这种代码。

③测试用例不足:应该重新提炼测试用例,设计更多的测试用例添加到测试说明中以覆盖没有执行过的路径。

理想情况下,覆盖完善阶段应该在不阅读实际代码的情况下进行。然而,实际上为达到覆盖率目标,阅读实际代码也是需要的。

面向对象应用程序的单元测试用例设计

对面向对象软件的类测试相当于传统软件的单元测试。但与传统软件的单元测试不同,它往往关注模块的算法细节和模块接口间流动的数据,面向对象软件的类测试是由封装在类中的操作和类的状态行为所驱动的。

因为属性和操作是被封装的,对类之外操作的测试通常是徒劳的。封装使得我们难以获得对象的状态,继承也给测试带来了难度,即使是彻底复用的,对每个新的使用语境也需要重新测试。多重继承更增加了需要测试的语境的数量,使测试进一步复杂化。

在类的生命周期中,类测试只是一个初始的测试阶段。类作为独立的成分可以多次在不同的应用系统中重复使用,这些成分的用户可要求每个类是可靠的,无须了解实现细节。

类的测试用例可以先根据其方法设计,然后扩展到方法间的调用关系。如果类中的方法都已定义了前置/后置条件,则可参考这些条件设计对各方法进行测试所需的测试用例。

类测试也采用功能性测试和结构性测试,即黑盒测试和白盒测试。功能性测试以类的规格说明为基础,它主要检查类是否符合规格说明的要求。

测试用例设计实例

例:ATM取款这个组件的功能点有:

(1)正常取款

(2)输入取款金额是否合法

(3)检查是否超出当天最大取款(假设2000RMB)

(4)余额不足(假设余额为1500RMB)

(5)打印收据功能至少一次

测试前提是银行卡和密码都有效,最多允许密码输错5次。功能覆盖测试用例如下所示:

单元最小功能点覆盖实例

用例编号 输入 预期输出 覆盖功能说明
银行卡号 卡密码 取款金额
001 111-8888 654321 500 正常取款,打印收据 (1)(5)
002 111-8888 654321 005 取款金额不合法 (2)
003 111-8888 654321 2500 超出当天最大取款 (3)
004 111-8888 654321 1800 账户余额不足 (4)

单元测试的非功能性测试一般是通过黑盒测试实现特定的功能来达到测试的目的。边界值分析是黑盒测试的经典方法,一般的用例设计都会采用,边界值用例如下图所示:

边界值法设计用例列举

用例编号 输入 预期输出 覆盖功能说明
银行卡号 卡密码 取款金额
001 111-8888 654321 0 取款金额不能为0 测试零边界
002 111-8888 123456 (错2次) 200 正常取款 密码错误次数没超边界
003 111-8888 123456 (错5次) 1000 正常取款 密码错误次数没超边界
004 111-8888 123456

(错6次)

1000吞卡密码错误次数超出边界

也可以根据单元测试中提及的“强制一些错误情况发生”通过黑盒测试来设计测试用例。如ATM系统中主动造成磁盘空间不足,内存空间不足等。如下图所示:

强制错误用例列举

用例编号 输入 预期输出 说明
  支局号  报表类型 报表日期跨度
001 000234 交易明细 7天 交易明细保存失败 报表产生后放于本地系统中,假设本地系统只有500M可用空间,而7天的交易明细有700M

总之,在使用黑盒测试技术设计测试用例时应多方面考虑,至少应该考虑以下几方面:

(1)测试程序单元的所有最小功能点是否覆盖。

(2)测试程序单元非功能性是否满足要求(安全性、可靠性等)。

(3)考虑可选的其他测试特性(接口,人机交互界面等)。

上一篇:单元测试步骤、单元测试策略,单元测试快速入门教程三

125jz网原创文章。发布者:江山如画,转载请注明出处:http://www.125jz.com/1707.html

(0)
江山如画的头像江山如画管理团队
上一篇 2018年4月18日 下午2:28
下一篇 2018年4月18日 下午3:22

99%的人还看了以下文章

  • MySQL存储过程快速入门

    什么是存储过程 创建一个简单的存储过程 存储过程中的参数 存储过程的优势和不足 一、什么是存储过程 存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。 存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能 MySQL…

    2018年12月20日
    2.5K0
  • 如何设置mysql自动更新创建时间和更新时间

    做项目时,希望:新增记录时,mysql自动将系统的当前时间set到创建时间和更新时间这两个字段中。更新记录时,mysql只update更新时间字段的时间。 设置mysql自动更新创建时间和更新时间的方法: 找到表中创建时间和更新时间的字段,将其修改为下列代码。创建时间字段 ‘creat_time’ timestamp NULL DEFAULT CURRENT…

    2018年12月24日
    4.4K0
  • 如何修改从Maven中心仓库下载到本地的jar包的默认存储位置?

    为什么要修改从Maven中心仓库下载到本地的jar包的默认存储位置? 把jar包下载到本地的好处就是,当编译时,会优先从本地的jar包去找,如果本地存在,就直接拿来用,如果不存在,就从Maven的中心仓库去下载。 第一次执行”mvn compile”和”mvn clean”这两个命令时,Maven会去中央仓库下…

    2023年1月28日 编程开发
    6390
  • 单元测试环境、过程及任务,单元测试快速入门教程二

    单元测试环境及过程 单元测试环境 单元测试环境的建立是单元测试工作进行的前提和基础,在测试过程中起到的作用不言而喻。单元测试环境并不一定是系统投入使用后所需的真实环境,可采用模拟环境。 由于一个模块或一个方法(Method)不是一个独立的程序,在测试时要考虑它和外界的联系,因此要用到一些辅助模块来模拟与所测模块相联系的其它模块。辅助模块分两种: 驱动模块:相…

    2018年4月16日
    3.8K0
  • 实用sql查询语句详解2:高级查询

    上篇文章《实用sql查询语句详解1:给列取别名、查询部分行、多列排序》介绍了简单查询语句,这节课给大家讲解基本条件查询、集合函数、分组查询、子查询、并集和交集。 基本条件查询 比较运算符:>,>=,<,<=,=,!= between a and b,in(a,b,c),not exists,is null,like ‘%_’,or,a…

    2018年2月5日
    2.8K0
  • python 初学者练手上机实操四

    1.用*打印一个如下所示的图形。(10分) * * * * * * * * * * print(‘*’) print(‘* *’) print(‘* * *’) print(‘* * * *’) 要求分别使用for和while语句实现 导入turtle包(impo…

    2023年5月5日
    3950

发表回复

登录后才能评论