测试用例设计规范
1、引言
测试设计遵循与软件设计相同的工程原则。好的软件设计包含几个对测试设计进行精心描述的阶段。这些阶段是:
● 测试策略
● 测试计划
● 测试描述
● 测试过程
上述四个测试设计阶段适用于从单元测试到系统测试各个层面的测试。
测试设计由软件设计说明所驱动。单元测试用于验证模块单元实现了模块设计中定义的规格。一个完整的单元测试说明应该包含正面测试(Positive Testing)和负面的测试(Negative Testing)。正面测试验证程序应该执行的工作,负面测试验证程序不应该执行的工作。
设计富有创造性的测试用例是测试设计的关键。本文档介绍了测试说明的一般设计过程,描述了一些结构化程序设计单元测试中采用的用例设计技术,同时也增加了面向对象编程中对类进行单元测试所采用的测试用例设计技术,这些可作为软件测试人员的参考阅读资料。
2、设计单元测试说明
一旦模块单元设计完毕,下一个开发阶段就是设计单元测试。值得注意的是,如果在书写代码之前设计测试,测试设计就会显得更加灵活。一旦代码完成,对软件的测试可能会倾向于测试该段代码在做什么(这根本不是真正的测试),而不是测试其应该做什么。单元测试说明实际上由一系列单元测试用例组成,每个测试用例应该包含4 个关键元素:
被测单元模块初始状态声明,即测试用例的开始状态(仅适用于被测单元维持了调用间状态的情况);
被测单元的输入,包含由被测单元读入的任何外部数据值;
该测试用例实际测试的代码,用被测单元的功能和测试用例设计中使用的分析来说明,如:单元中哪一个决策条件被测试;
测试用例的期望输出结果,测试用例的期望输出结果总是应该在测试进行之前在测试说明中定义。
以下描述进行测试用例设计,书写测试说明的7步通用过程。
2.1 测试用例设计步骤
2.1.1 步骤1:首先使被测单元运行
任何单元测试说明的第一个测试用例应该是以一种可能的简单方法执行被测单元。看到被测单元第一个测试用例的运行成功可以增强人的自信心。如果不能正确执行,最好选择一个尽可能简单的输入对被测单元进行测试/调试。
这个阶段适合的技术有:
● 模块设计导出的测试
● 对等区间划分
2.1.2 步骤2:正面测试(Positive Testing)
正面测试的测试用例用于验证被测单元能够执行应该完成的工作。测试设计者应该查阅相关的设计说明;每个测试用例应该测试模块设计说明中一项或多项陈述。如果涉及多个设计说明,最好使测试用例的序列对应一个模块单元的主设计说明。
适合的技术:
● 设计说明导出的测试
● 对等区间划分
● 状态转换测试
2.1.3 步骤3:负面测试(Negative Testing)
负面测试用于验证软件不执行其不应该完成的工作。这一步骤主要依赖于错误猜测,需要依靠测试设计者的经验判断可能出现问题的位置。
适合的技术有:
● 错误猜测
● 边界值分析
● 内部边界值测试
● 状态转换测试
2.1.4 步骤4:设计需求中其它测试特性用例设计
如果需要,应该针对性能、余量、安全需要、保密需求等设计测试用例。
在有安全保密需求的情况下,重视安全保密分析和验证是方便的。针对安全保密问题的测试用例应该在测试说明中进行标注。同时应该加入更多的测试用例测试所有的保密和安全冒险问题。
适合的技术:设计说明导出的测试
2.1.5 步骤5:覆盖率测试用例设计
应该或已有测试用例所达到的代码覆盖率。应该增加更多的测试用例到单元测试说明中以达到特定测试的覆盖率目标。一旦覆盖测试设计好,就可以构造测试过程和执行测试。覆盖率测试一般要求语句覆盖率和判断覆盖率。
适合的技术:
● 分支测试
● 条件测试
● 数据定义-使用测试
● 状态转换测试
2.1.6 步骤6:测试执行
使用上述5个步骤设计的测试说明在大多少情况下可以实现一个比较完整的单元测试。
到这一步,就可以使用测试说明构造实际的测试过程和用于执行测试的测试过程。该测试过程可能是特定测试工具的一个测试脚本。
测试过程的执行可以查出模块单元的错误,然后进行修复和重新测试。在测试过程中的动态分析可以产生代码覆盖率测量值,以指示覆盖目标已经达到。因此需要在测试设计说明中需要增加一个完善代码覆盖率的步骤。
2.1.7 步骤7:完善代码覆盖
由于模块单元的设计文档规范不一,测试设计中可能引入人为的错误,测试执行后,复杂的决策条件、循环和分支的覆盖率目标可能并没有达到,这时需要进行分析找出原因,导致一些重要执行路径没有被覆盖的可能原因有:
不可行路径或条件——应该标注测试说明证明该路径或条件没有测试的原因。
不可到达或冗余代码——正确处理方法是删除这种代码。这种分析容易出错,特别是使用防卫式程序设计技术(Defensive Programming Techniques)时,如有疑义,这些防卫性程序代码就不要删除。
测试用例不足——应该重新提炼测试用例,设计更多的测试用例添加到测试说明中以覆盖没有执行过的路径
理想情况下,覆盖完善阶段应该在不阅读实际代码的情况下进行。然而,实际上,为达到覆盖率目标,看一下实际代码也是需要的。覆盖完善步骤的重要程度相对小一些。最有效的测试来自于分析和说明,而不是来自于试验,依赖覆盖完善步骤补充一份不好的测试设计。
适合的技术:
● 分支测试
● 条件测试
● 设计定义——试验测试
● 状态转换测试
2.2 用例设计的一般原则
注意到前面产生测试说明步骤可以用下面的方法完成:
通常应该避免依赖先前测试用例的输出,测试用例的执行序列早期发现的错误可能导致其他的错误而减少测试执行时实际测试的代码量;
测试用例设计过程中,包括作为试验执行这些测试用例时,常常可以在软件构建前就发现BUG。还有可能在测试设计阶段比测试执行阶段发现更多的BUG。
在整个单元测试设计中,主要的输入应该是被测单元的设计文档。在某些情况下,
需要将试验实际代码作为测试设计过程的输入,测试设计者必须意识到不是在测试代码本身。从代码构建出来的测试说明只能证明代码执行代码完成的工作,而不是代码应该完成的工作。
3、测试用例设计技术
广义地分为两类:
黑盒测试:使用单元接口和功能描述,不需了解被测单元的内部结构
白盒测试:使用被测单元内部如何工作的信息
灰盒测试:借助于源代码和测试工具等手段,通过黑盒和白盒测试相结合的方法进行测试的技术。
测试设计最重要的因素是经验和常识。测试设计者不应该让某种测试技术阻碍经验和常识的运用。
白盒测试用例设计:使用程序设计的控制结构导出测试用例。
采用白盒测试的目的主要是:保证一个模块中的所有独立路径至少被执行一次;对所有的逻辑值均需要测试真、假两个分支;在上下边界及可操作范围内运行所有循环;检查内部数据结构以确保其有效性。
黑盒测试用例设计:使用详细设计导出测试用例。
采用黑盒测试的目的主要是:检查功能是否实现或遗漏;检查人机界户是否错误;数据结构或外部数据库访问错误;性能等其它特性要求是否满足;初始化盒终止错误。
本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/
相关文章:
【通俗理解线性代数】 -- 矩阵的等价与相似
本微信图文通俗讲解了矩阵等价与矩阵相似的意义。

Martin Fowler对全世界程序员的建议
对全世界的程序员我都是那么几条建议。第一,每年学习并熟悉一个新的编程语言。坚持几年,你对于程序设计会有非常深刻的见解。第二,学习测试驱动开发,这种新的方法会改变你对于软件开发的看法。第三,劳逸结合࿰…

mysql 触发器死循环_请教如何避免该条触发器的死循环
setANSI_NULLSONsetQUOTED_IDENTIFIERONgoALTERTRIGGER[fetchlcf]ON[dbo].[RdRecords]FORINSERT,UPDATEASbeginSETNOCOUNTONdeclarebustypevarchar(12)/*单据类型*/declareidentityi...set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER TRIGGER [fetchlcf] ON [dbo].[RdRecor…

August 14, 2009 - Choice
转载于:https://www.cnblogs.com/gieno/archive/2009/08/14/1546232.html

深入Java虚拟机之虚拟机体系结构
工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于我这样一个追求完美的程序员来说,这是绝对不被允许的,于是除了不断优化程序结构外,内存优化和性能调优就成了我惯用的“伎俩”。 要对…
【通俗理解线性代数】 -- 内积与相关
本图文从向量内积的角度引出了概率论中的相关系数,说明向量内积是线性相似性的表征。

java modelmapper_java - 使用ModelMapper映射抽象类型的字段 - SO中文参考 - www.soinside.com...
我有以下课堂知识层次:public abstract class Base {protected Boolean baseBoolean;}public class A extends Base {private BigDecimal amount;}并且尝试将DTO映射到实体public class DTO {private Base details;}public class Entity {private Base details;}并映…

基于Dialog的MFC程序在启动时隐藏为托盘程序(四)
这部分说一下如何加menu。。如果做小气球。。mfc的menu确是不如C#活着java那么easy..首先在rc里添加menu资源。。然后在ui界面里先设置一下你的菜单。。在第(二)部分已经简单知道了怎么取得tray的鼠标左右点击事件。。下面我们就把左右点击事件分开。。C…
【通俗理解线性代数】 -- 理解二次型
本微信图文介绍了二次型的几何意义以及正定在函数极值中的应用。

《Clojure数据分析秘笈》——1.6节从JDBC数据库读取数据
本节书摘来自华章社区《Clojure数据分析秘笈》一书中的第1章,第1.6节从JDBC数据库读取数据,作者(美)Eric Rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看 1.6 从JDBC数据库读取数据从关系型数据库中读…

java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
在Java中,实现定时任务有多种方式。本文介绍4种。Timer和TimerTask、Spring、QuartZ、Linux Cron。以上4种实现定时任务的方式。Timer是最简单的。不须要不论什么框架,只JDK就能够。缺点是不过个时间间隔的定时器,调度简单。Spring和QuartZ都…

诗歌rails之如何写一个简单的Rails Plugin
生成plugin骨架代码: Ruby代码 ruby script\generate plugin MyPlugin ruby script\generate plugin MyPlugin 功能需求: 在BlogController中把所有符合条件的Post(Model)生成为xml 如果不使用插件,很easy : in BlogController Ruby代码 def export_to_xml posts Post.fin…
【通俗理解线性代数】 -- 施密特正交化与QR分解
我们介绍线性代数知识的时候,稍微扩展一点,就能演变成一个新的角度。

iOS实现tableViewCell或collectionCell中点击界面按钮跳转
//找到父类界面 - (UIViewController *)viewController { for (UIView* next [self superview]; next; next next.superview) { UIResponder *nextResponder [next nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) { return (UIViewControlle…

java web 怎么用solr_使用web过滤器增加solr后台登录验证
solr后台自带是没有登录功能的,默认访问地址是:http://localhost:8983/solr/#/(内置jetty运行)。要给sorl后台增加登录验证方法:1、使用web服务器的登录验证(例如jetty、tomcat)这种方式好处是不需要另外写代码,只需配置一下对应的…

《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并
本节书摘来自华章计算机《程序设计解题策略》一书中的第1章,第1.6节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.6 利用左偏树实现优先队列的合并 优先队列在程序设计竞赛中十分常见,在统计问题、最值问…

Jquery JQZoom Plugin 放大鏡效果 Two
Jquery JQZoom Plugin 放大鏡效果 TwoJquery1.3.2Lib下載地址:http://files.cnblogs.com/davidzhou/jquery-1.3.2.rar插件下載地址:http://files.cnblogs.com/davidzhou/jqzoom_v2.2.rarDemo下載地址:http://files.cnblogs.com/davidzhou/MagnifySol.rar…

如何建立和维护自己的“人脉”
小故事1: 她打开房门,发现自家的门口竟然多了一条死鱼,她感到十分晦气,于是马上扔到垃圾桶了,过了一会儿,又有一条死鱼躺在自家门口,她还是扔了。为了抓住那个做恶作剧的人,她选择待…

java字符串统计英文字符用什么不同_JAVA程序。输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。...
展开全部一、问题分析:输入32313133353236313431303231363533e58685e5aeb931333363373764一行字母,那么会以换行结束。所以可以存入数组,也可以逐个输入,遇到换行结束。要统计各个类的个数,就要逐个判断是哪个分类的。…

COMVariantType的Date类型
刚跟一个同事讨论通过CCADOConnection读取外部数据库数据的问题,如果读取的数据是DateTime类型,只能得到Date部分,Time部分被忽略了。查看类CCADOField的value方法找到问题所在,下面是MSDN上关于COMVariant的Date方法的Remark&…

《树莓派Python编程指南》——2.2 一个Python游戏:猫和老鼠
本节书摘来自华章计算机《树莓派Python编程指南》一书中的第2章,第2.2节,作者:(美) Alex Bradbury Ben Everard更多章节内容可以访问云栖社区“华章计算机”公众号查看。 2.2 一个Python游戏:猫和老鼠 现在ÿ…
【通俗理解线性代数】 -- 理解行列式
本微信图文主要从几何与变换的角度介绍了行列式的意义。

solr java score_Solr 按照得分score跟指定字段相乘排序
CentOS6.5 mysql 5.5安装CentOS 6 mysql5.5安装配置 1 安装所需软件 2 安装cmake 3 tar.gz形式安装mysql 4 配置与启动 MySQL自5.5版本以后,就开始使用cmake编译工具了.tar ...access数据库select查询top时无效的解决办法access数据库select查询top时有时…

Mantis 缺陷管理系统配置与安装
搭建Mantis 缺陷管理系统 By Snooper 错误必有!欢迎指正! 什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list). It is written in the PHP scripting language and works with MySQL, MS SQL, and PostgreSQL datab…
【Matlab数据的可视化】自适应绘图函数fplot
今天看到fplot这个函数,于是乎赶快整理出来放到“Matlab数据的可视化”这个板块中,以便更好的完善我们的知识结构。

大数据时代涉军网络舆情引导的“5个结合”
随着信息技术发展,大数据构成了一种新的传播技术环境,重塑了网络舆情生态,给社会舆情体系带来了重大而深刻的变化,使网络舆情在整个社会舆情体系中地位更加凸显、作用更加突出。必须从维护国家政治安全的高度,深入探索…

java http head 请求_http请求头header、请求体body、请求行介绍
HttpServletRequest对象代表客户端的请求,当客户端通过http协议请求访问服务器的时候,http请求头的所有信息都封装在这个对象中,通过这个对象,可以获取客户端请求的所有信息。http请求包含请求行/状态行、请求头、请求体。request如果是post才有请求体&a…

全球UML模型共享设计下载中心--www.euml.org上线
全球UML模型共享设计&下载中心euml.org上线euml.org是楚凡科技版权所有的公益站点,为全球UML用户和爱好者提供如下服务:1、在线UML建模工具Trufun eUML。Trufun eUML以Applet形式运行在客户的浏览器中,从而提供在线建模功能。2、模型共享…

你是否对它有一种责任感
它,指开发人员对开发出的产品;它是测试人员所面对的测试产品。你是否对它有一种责任感,是指开发人员是否对它开发出来的产品有责任感,为它骄傲,为它而开心;你是否对它有一种责任感,是指测试人员…
【机器学习】基于粒子群算法的非线性函数寻优
本微信图文介绍了基于粒子群算法的非线性函数寻优过程,并利用Matlab实现。