当前位置: 首页 > 编程日记 > 正文

测试用例设计方法基础理论知识

一、什么是测试用例

测试用例设计:将软件测试的行为活动,作为一个科学化的组织归纳。

测试用例:设计一个情况,软件程序在这种情况下,必须能够正常运行并且达到程序所设计的执行结果。

因为我们不可能进行穷举测试,为了节省时间和资源、提高测试效率,必须从数量极大的可用测试数据精心挑选出具有代表性或者特殊性的测试数据来进行测试。

二、测试用例的好处

在开始实施测试之前设计好测试用例,可以避免盲目测试并提高测试效率。

测试用例的使用令软件测试的实施重点突出、目的明确。

在软件版本更新后只修正少部分的测试用例便可展开测试工作,降低工作强度,缩短项目周期。

功能测试模块的通用化和复用化使软件易于开发,而测试用例的通用化和复用化则会使软件测试易于开展,并随着测试用例的不断精化其效率也不断攀升。

三、测试用例设计方法

1、等价类划分法

将输入(输出)划分成若干个子集合,从子集合中选取一些代表值,只要选取的值测试没有问题,就认为未被选取的数据测试也没有问题。

  • 有效等价类:有意义的合理的正确输入;
  • 无效等价类:非法的错误的异常的输入;

等价类的划分原则:

  1. 如果输入是一个取值范围或者值的个数,则划分成一个有效等价类和两个无效等价类;
  2. 如果输入是一个有限的集合或者必须如何的条件,则划分成一个有效等价类和一个无效等价类;
  3. 如果输入是一个布尔量,则划分成一个有效等价类和一个无效等价类;
  4. 如果输入已经划分等价类,针对具体的值处理方式会有所不同更加细化,则划分成多个有效等价类和一个无效等价类;
  5. 如果输入要同时满足多个条件,则划分成一个有效等价类和多个无效等价类;

等价类划分的使用步骤

  1. 将需求规格划分成需求子片段;
  2. 分析需求子片段,找出输入条件;
  3. 分析输入条件,结合等价类划分原则进行等价类划分;
  4. 对划分的等价类进行编号;
  5. 从划分的等价类中选取数据结合测试用例写作规范生成最终的测试用例;

一条测试用例尽量覆盖多个有效等价类

一条测试用例只覆盖一个无效等价类

等价类划分法例题:

(一)一个有效&两个无效

取值范围:驾照年龄18-65周岁

一个有效(18-65之间)

两个无效(17,66)

(二)一个有效&一个无效

取值范围:第三期学员

一个有效(第三期学员)

一个无效(非第三期学员)

(三)一个有效&一个无效

取值范围:男性

一个有效(男性)

一个无效(女性)

(四)多个有效&一个无效

英语考试,60以上合格(含60分)

一个有效:60分以上

60-79:合格

80-89:良好

90-100:优秀

一个无效:60分以下

(五)一个有效&多个无效

个人信息注册:身高,体重,年龄

一个有效:三个资料都填写

三个无效: 身高填写X

体重填写Y

年龄填写Z

(六)一个有效&多个无效

个人信息注册:身高,体重,年龄

一个有效:三个资料都填写

三个无效:身高填写X

体重填写Y

年龄填写Z

(七)万年历查询软件,要求用户输入以年月日表示的日期,然后系统会换算出该日期的农历表示法及相关黄历信息,假设日期限定在1900年1月1日~2049年12月31日,并规定日期由8位数字字符组成,前4位表示年,中间2位表示月,最后两位表示日期。其中4、6、9、11月只有30天,平年的2月份只有28天,闰年的2月份有29天。(备注:为简化处理,本题进行用例设计时。不考虑对平年、闰年的判断)

划分等价类并编号:

设计测试用例覆盖的有效等价类,设计的测试用例如下:

为每一个无效等价类设计一个测试用例,设计结果如下:

2、边界值分析法

边界值分析法是对等价类划分法的一种补充,经验表明边界是问题多发区;如果边界测试没有发现问题,就认为其他区域发生问题的概率较小。

相关术语:

  • 上点:边界上的点叫做上点
  • 离点:离边界最近的点叫做离点
  • 如果是闭区间,离点落在边界外
  • 如果是开区间,离点落在边界内
  • 内点:边界内任意一个点叫做内点

边界值分析法选取数据原则:

  1. 如果输入是一个取值范围或者值的个数,则以边界和边界附近的值作为测试用例数据选取;
  2. 如果输入的值的个数是一个取值范围,则以最大个数;最大个数+1;最小个数;最小个数-1作为测试用例数据选取;
  3. 如果输入是一个有序的集合,则以第一个元素和最后一个元素作为测试用例数据选取;
  4. 如果是一个内部数据结构,则以极限值作为测试数据选取;

边界值分析法使用步骤:

  1. 将需求规格划分成需求子片段;
  2. 找出需求片段中的输入条件。为每个条件划分等价类;
  3. 确定等价类的边界值;
  4. 根据边界值分析法测试用例选取原则确定测试用例的输入数据;
  5. 生成最终的测试用例;

边界值分析法例题:

(一)

取值范围:计算器计算100以内正数加减法:1-100

取值:有效:1,100

无效:0,101

值的个数(固定是几):处理三个数是否能组成三角形

有效:3个

无效:2个,4个

(二)

值的个数是取值范围:密码6-16

取值:有效:6,16

无效:5,17

(三)

有序的集合:01-12月

取值:有效:01,12

无效:00,13

(四)

内部数据结构:栈:储存10个数据

取值:有效:10

无效:11

3、因果图法

如果输入之间有关系,我们在测试时必须考虑输入条件的各种组合,那么可以考虑使用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来设计测试用例,这就需要利用因果图。

优点:因果图方法最终生成的就是判定表。它适合于检查程序输入条件的各种组合情况。

因果图法的基本思想:

使用因果图法设计测试用例时,首先从程序规格说明书的描述中,找出因(输入条件)和果(输出结果或者程序状态的改变),然后通过因果图转换为判定表,最后为判定表中的每一列设计一个测试用例。

因果图中出现的基本符号:

通常在因果图中用Ci表示原因,用Ei表示结果,各结点表示状态,可取值“0”或“1”。“0”表示某状态不出现,“1”表示某状态出现。

主要的原因和结果之间的关系有:

  • 恒等: 若c1为1,则e1也为1,否则e1为0.
  • 非: 若c1是1,则e1为0,否则e1是1.
  • 或: 若c1或c2或c3是1,则e1是1,若三者都不为1,则e1为0.
  • 与: 若c1和c2都是1,则e1为1,否则若有其中一个不为1,则e1为0.

实际问题中,输入状态之间可能存在某些依赖关系,这种依赖关系被称为”约束”.

在因果图中使用特定的符号来表示这些约束关系:

约束关系说明:

E约束(异): a,b最多有一个可能为1,不能同时为1.
I约束(或): a,b,c中至少有一个必须为1,不能同时为0.
O约束(惟一): a和b必须有一个且仅有一个为1

R约束(要求):a是1时,b必须是1,即a为1时,b不能为0

M约束:对输出条件的约束,若结果a为1,则结果b必须为0.

用因果图生成测试用例的基本步骤:

  1. 分析软件规格说明描述中,哪些是原因 (即输入条件或输入条件的等价类),哪些是结果 (即输出条件),并给每个原因和结果赋予一个标识符。
  2. 分析软件规格说明描述中的语义,找出原因与结果之间,原因与原因之间对应的是什么关系? 根据这些关系,画出因果图。
  3. 由于语法或环境限制,有些原因与原因之间,原因与结果之间的组合情况不可能出现。为表明这些特殊情况,在因果图上用一些记号标明约束或限制条件。
  4. 把因果图转换成判定表。
  5. 把判定表的每一列拿出来作为依据,设计测试用例。

应用举例:

分析问题,按照如下步骤进行:

(1)根据软件规格说明书,列出原因和结果.

(2)找出原因和结果之间的关系,原因和原因之间的约束关系,画出因果图.

(3)将因果图转化为判定表

(4)根据判定表设计测试用例.

某文件修改需求:

如想对文件进行修改,需要遵守以下规则:

输入的第一列字符必须是A或B,

第二列字符必须是一个数字,

如果第一列字符不正确,则给出信息L;

如果第二列字符不正确,则给出信息M。

如果两列字符输入正确,则修改文件

原因:

C1:第一个字符是A;

C2:第一个字符是B;

C3:第二个字符是一个数字字符.

结果:

E1:给出信息L;

E2:修改文件;

E3:给出信息M;

将因果图转化为判定表:

设计测试用例:

测试用例1: 输入数据:A3  预期输出:修改文件

测试用例2: 输入数据:AM  预期输出:给出信息M

测试用例3: 输入数据:B3  预期输出:修改文件

测试用例4: 输入数据:B*  预期输出:给出信息M

测试用例5: 输入数据:C2  预期输出:给出信息L

测试用例6: 输入数据:CM  预期输出:给出信息LM

因果图法的优点:

考虑了多个输入之间的相互组合、相互制约关系;

能够帮助我们按一定步骤,高效率地选择测试用例,同时还能为我们指出,程序规格说明描述中存在着什么问题。

转载于:https://www.cnblogs.com/yitao326/p/10343120.html

相关文章:

leetcode-155 最小栈

设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。 示例: MinStack minStack new Mi…

legend位置 pyecharts_可视化入门 | pyecharts全局配置项详解

更多文章,请见:http://mp.weixin.qq.com/mp/homepage?__bizMzIxODczMDUwOA&hid2&sn7928727456d49032f08ef1fcf0ee719e&scene18#wechat_redirect​mp.weixin.qq.com大家好,我是你们的机房老哥! 计算机绘图是老哥很早就…

查询Master下的系统表和系统视图获取数据库的信息和简单的渗透测试

在SQL中可以通过查询Master下的系统表(sys)和系统视图(information_schema)获取数据库的信息。SQL2000和SQL2005的结构略有不同。 系统表结构参考系统表详细说明。 系统信息结构图参考:http://dev.mysql.com/doc/refma…

cocos2d-x android 移植 问题

为什么80%的码农都做不了架构师?>>> 由于android系统目前没有将boost加入,这里面使用了大量的STL及C的一些语言特性,导致编译出现令人非常头痛的问题。 1、出现类似的异常函数错误 boost/exception/detail/exception_ptr.hpp:382…

python插入排序演示源码

工作闲暇时间,把写内容过程较好的内容段做个备份,下面的内容内容是关于python插入排序演示的内容,应该能对各朋友也有用处。 def insert_sort(t): for i in xrange(len(t)): key t[i] j i - 1 while j>-1 and t[j]>key:#如果当前值比…

leetcode-215 数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k 2 输出: 5 该题比较简洁的解法,我们使用堆来完成 最小堆:即堆顶为所…

c++ double 只输出五位_c 语言第四章 在控制台上数据的输入和输出

1 数据输出我们之前已经使用过printf()函数来实现数据在控制台上输出#include<stdio.h> int main(){printf("hello world");return 0; }具体的用法是printf("数据模板",数据1,数据2,...)// 数据模板表示输出数据的形式,里面包含占位符,打印的时候使用…

pyQt 每日一练习 -- 登录框

#codingutf-8#第一个练习&#xff0c;登录框import sys from PyQt4 import QtGui,QtCore#登录框 class LoginBox(QtGui.QWidget):def __init__(self):super(LoginBox, self).__init__()self.initUI()def initUI(self):vBoxLayout QtGui.QVBoxLayout()hBoxLayout_1 QtGui.QHBo…

photoshop CS5 Dreamweaver CS5序列号及完美破解方法

adobe photoshop CS5 的序列号&#xff08;任选一个&#xff09;1330-1440-1602-3671-9749-78971330-1191-2998-6712-2520-54241330-1367-4285-4928-0630-31071330-1570-9599-9499-8092-82371330-1028-1662-3206-1688-51141330-1631-5733-5042-4138-6389 Adobe Dreamweaver CS…

[原创]Android Monkey 在线日志分析工具开发

[原创]Android Monkey 在线日志分析工具开发 在移动App测试过程中,Monkey测试是我们发现潜在问题的一种非常有效手段&#xff0c;但是Android原生的Monkey有其天然的不足&#xff0c;数据不能有效的去解读&#xff0c;同时也不能提供非常清晰的信息&#xff0c;所以针对这个问题…

leetcode-295 数据流的中位数

中位数是有序列表中间的数。如果列表长度是偶数&#xff0c;中位数则是中间两个数的平均值。 例如&#xff0c; [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 3) / 2 2.5 设计一个支持以下两种操作的数据结构&#xff1a; void addNum(int num) - 从数据流中添加一个整数到数…

Servlet开发入门

Servlet是sun公司提供的一门用于开发动态web资源的技术。 Sun公司在其API中提供了一个servlet接口&#xff0c;用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据)&#xff0c;需要完成以下2个步骤&#xff1a; 编写一个Java类&#xff0c;实现servlet接口。把开…

#串口通信超时处理_简单通信协议

用C语言做物联网网关开发时&#xff0c;经常需要通过串口、485接口等从一些传感器读取数据&#xff0c;由于网关设备和传感器所处的环境复杂多样&#xff0c;电磁干扰等常常会破坏传输的数据&#xff0c;为了确保传输数据的可靠性&#xff0c;通常会采取一些策略&#xff0c;常…

在cmd的方式下,简化mysql的输入的方法

2019独角兽企业重金招聘Python工程师标准>>> 在我的电脑&#xff0c;高级系统设置&#xff0c;环境变量&#xff0c;path 添加运行的mysql.exe的路径。 转载于:https://my.oschina.net/u/779687/blog/140411

Parser Generator Tips翻译(中英对译) by Joshua Xu

You can use the ParserWizard command from the Project menu to help you create initial YACC and Lex skeleton source files.如果需要生成初始的YACC & Lex骨架源文件&#xff0c;可以在系统菜单中&#xff0c;选取Project->ParserWizard。Use the Parser Generato…

leetcode-455 分发饼干

假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i &#xff0c;都有一个胃口值 gi &#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j &#xff0c;都有一个尺寸 sj 。…

C++模板详解

参考&#xff1a;C 模板详解&#xff08;一&#xff09; 模板&#xff1a;对类型进行参数化的工具&#xff1b;通常有两种形式&#xff1a; 函数模板&#xff1a;仅参数类型不同&#xff1b;类模板&#xff1a; 仅数据成员和成员函数类型不同。目的&#xff1a;让程序员编写…

autocad2007二维图画法_cad怎样绘制简单的二维图形

CAD绘制二维图形非常的简单&#xff0c;大家经常用它来画图&#xff0c;下面是学习啦小编带来关于cad怎样绘制简单的二维图形的内容&#xff0c;希望可以让大家有所收获!cad绘制简单二维图形的方法1、绘图菜单绘图菜单是绘制图形最基本、最常用的方法&#xff0c;其中包含了Aut…

MyEclipse 中配置struts2.2.1的方法

MyEclipse中配置Struts2.2.1版本基本步骤&#xff1a;1&#xff0c;首先就是要建立一个web project项目2&#xff0c;设置jdk和servers路径&#xff0c;如果jdk和servers已经配置ok&#xff0c;跳过这一步骤。在菜单中的window选项中配置jdk和servers对于jdk&#xff0c;点击ja…

BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

BZOJLOJ洛谷 \(d_i\)不同就不用说了&#xff0c;建出树来\(DFS\)一遍。 对于\(d_i\)不同的情况&#xff1a; Solution 1&#xff1a;xxy tql! 考虑如何把这些数依次填到树里。 首先对于已解锁的节点\(x\)&#xff08;已解锁是指父节点已经处理完的点&#xff0c;刚开始就是\(fa…

leetcode-376 摆动序列

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为摆动序列。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。少于两个元素的序列也是摆动序列。 例如&#xff0c; [1,7,4,9,2,5] 是一个摆动序列&#xff0c;因为差值 (6,-3,5,-7,3…

bootstrap3中关于布局的两种样式

container&#xff1a;用.container包裹的内容即可实现居中对齐。注意&#xff0c;由于在各分辨率下面都设置了padding 和 固定宽度&#xff0c;.container不能嵌套。row&#xff1a;栏栅系统是把父容器平均分为12列。注意&#xff0c;row可以被嵌套。 通过下表可以详细查看Boo…

adg oracle 架构_云化双活的架构演进,宁夏银行新核心搭载Oracle 19c投产上线

云和恩墨顺利完成宁夏银行新数据中心数据库平台的建设&#xff0c;包括新数据中心RAC搭建、DG搭建、旧数据中心到新数据中心的数据迁移&#xff0c;以及在整个项目生命周期中的实施规范、性能测试保障、压力测试等。6月12日&#xff0c;宁夏银行数据库完成全部迁移&#xff0c;…

MFC里ON_COMMAND_RANGE消息映射的ID问题

今天在工作中遇到一个问题&#xff0c;一个动态菜单&#xff0c;每个菜单的菜单项ID是我自己定义的&#xff0c;定义如下&#xff1a; #define IDM_SEARCHRECORD0 222240 #define IDM_SEARCHRECORD1 222241 #define IDM_SEARCHRECORD2 222242 #define IDM_SEARCHRECORD3 …

反射拷贝对象的思路:

0 根据构造器创建对象 1.获取传入进来的对象的字段 2.获取字段的类型 3.拼接 set 与get方法 4 获取传入进来的对象的值 并设置给新对象转载于:https://www.cnblogs.com/classmethond/p/10362263.html

leetcode-402 移掉K位数组

给定一个以字符串表示的非负整数 num&#xff0c;移除这个数中的 k 位数字&#xff0c;使得剩下的数字最小。 注意: num 的长度小于 10002 且 ≥ k。 num 不会包含任何前导零。 示例 1 : 输入: num “1432219”, k 3 输出: “1219” 解释: 移除掉三个数字 4, 3, 和 2形成一…

c++ using 前置声明_C++ 类的前置声明

今天在研究C”接口与实现分离“的时候遇到了一个问题&#xff0c;看似很小&#xff0c;然后背后的东西确值得让人深思&#xff01;感觉在学习的过程中有太多的为什么&#xff0c;而每一个为什么背后都隐藏着一些原理和目的&#xff0c;所以得多问自己”为什么“&#xff0c;这样…

测试用的序列化方法

对于实体&#xff0c;进行底层方法测试的时候&#xff0c;经常逐一赋值很麻烦&#xff0c;网上找到序列化xml方法&#xff0c;感觉挺好用的。 前端调用方法时&#xff0c;将实体序列化写入xml文件 //xml路径string filePath "D:\1.xml";using (System.IO.StreamWrit…

HighChart学习-更新数据data Series与重绘

一&#xff1a;HighChart介绍 基于JQuery的纯JavaScript的图标库&#xff0c;支持各种图表显示&#xff0c;同时还支持Mootools 与Prototype详细版本支持在这里&#xff1a; JQuery 1.3.2 - 1.9.x. 2.0.x for modern browsers Mootools 1.2.5 - 1.4.5 Prototype 1.7 支持目…

shell代码模板

批量ssh登录机器#site_search_hosts 10.4.16.205,10.4.20.87,10.4.20.88,10.4.20.89,10.4.20.90,10.4.20.92,10.4.20.93,10.4.21.51,10.4.21.52,10.4.21.53,10.4.21.54,10.4.33.136,10.4.33.137,10.4.33.138,10.4.33.139,10.4.33.140site_search_hosts10.4.16.205,10.4.20.87,1…