北航 软件测试技术与实践(3)
- 格式:pps
- 大小:278.00 KB
- 文档页数:7
实验三网络层实验2. 分析2.6.1步骤6中截获的报文,统计“Protocol”字段填空:有2个ARP报文,有8个ICMP 报文。
在所有报文中,ARP报文中ARP协议树的“Opcode”字段有两个取值1,2,两个取值分别表达什么信息?答:1表示request,即请求报文,2表示reply,即回复报文。
3.根据2.6.1步骤6分析ARP报文结构:选中第一条ARP请求报文和第一条ARP应答报文,将答:少了ARP报文。
主机的ARP Cache存放最近的IP地址与MAC地址的对应关系,一但收到ARP应答,主机将获得的IP地址和MAC地址的对应关系存到ARP Cache中,当发送报文时,首先去ARP Cache中查找相应的项,如果找到相应的项则将报文直接发送。
(2)按照图-4重新进行组网,并确保连线正确。
修改计算机的IP地址,并将PC A的默认网关修改为192.168.1.10,PC B的默认网关修改为192.168.2.10。
考虑如果不设置默认网关会有什么后果?答:如果不设置默认网关则无法访问不同网段的主机。
5.根据2.6.2步骤12分析ARP报文结构:选中第一条ARP请求报文和第一条ARP应答报文,将ARP请求报文和ARP应答报文中的字段信息与上表进行对比。
与ARP协议在相同网段内解析的过程相比较,有何异同点?答:请求报文中,相同网段网络层中的Target IP address为PCB的IP192.168.1.21,而不同网段网络层中的Target IP address为PCA的默认网关的IP 192.168.1.10;应答报文中,相同网段链路层的Source和网络层的Sender MAC address都是PCB的MAC地址00:0c:29:99:cb:04,而不同网段链路层的Source和网络层的Sender MAC address都是PCA默认网关S1 e0/1的MAC地址3c:e5:a6:45:6b:bc,相同网段网络层的Sender IP address为PCB的IP192.168.1.21,而不同网段网络层的Sender IP address为PCA的默认网关的IP 192.168.1.10。
实验报告实验名称多媒体关系型数据库的建立班级学号姓名成绩图片OleObject)Create Table 客户数据(客户ID char(3) primary key,公司名称varchar(20),联系人姓名varchar(20),联系人头衔varchar(10),城市varchar(15),地区char(15),邮政编码char(6),电话char(8),传真char(8))Create Table 订单数据(订单ID char(4) primary key,客户ID char(3),雇员ID varchar(3),产品ID varchar(4),数量int,订购日期datetime,发货日期datetime,备注varchar(40))运行结果:关联数据库SQL语言建表雇员数据商品数据客户数据订单数据2.查询:(1)查询“客户数据”中在杭州或武汉的联系人姓名、电话、城市SELECT 联系人姓名,电话,城市FROM 客户数据WHERE (城市='杭州' OR 城市='武汉')运行结果:(2)查询“商品数据”中类别为光盘、耳机和外放设备的产品的产品名称、单价和库存量并根据单价递减顺序排列SELECT 产品名称,单价,库存量FROM商品数据WHERE 类别IN('光盘','耳机','外放设备')ORDER BY 单价DESC运行结果:3.插入:(1)在“雇员数据”中插入性别列,只能输入男或女ALTER TABLE 雇员数据ADD 性别char(1)运行结果:插入前插入后(2)在“商品数据”中插入一种产品名称为MP3的产品INSERT INTO商品数据(产品ID,产品名称,类别,单价,库存量)VALUES (‘150’,’MP3’,’外放设备’,’’260,’30’)运行结果:插入前插入后4.删除:(1)从“客户数据”中删除E商店的信息DELECT FROM 客户数据WHERE 公司名称=’E商店’运行结果:删除前删除后5.更改:(1)在“订单数据”中将订单ID为140810的订单的数量加3 UPDATE 订单数据SET 数量= 数量+ 3 WHERE 订单ID='140810'运行结果:更改前更改后实验三:在ACCESS数据库管理系统平台上建立查询表(视图)源代码:1.查找出三种最贵的商品SELECT TOP 3 * FROM 商品数据ORDER BY 单价DESC实验结果:2.统计某一雇员的销售额SELECT 雇员ID,SUM(数量*单价) AS 总销售额FROM 订单数据INNER JOIN 商品数据ON 订单数据.产品ID=商品数据.产品ID WHERE 雇员ID=[请输入要查询的雇员ID:] GROUP BY 雇员ID实验结果:【结论】(结果)1.由实验结果可知,利用SQL语句进行数据库的创建和维护是简洁高效的。
软件测试方法与实践随着信息技术的快速发展和普及,软件逐渐成为了人们生活、工作中不可或缺的一部分。
与此同时,软件的质量也越来越受到关注。
软件出现缺陷或故障不仅会给企业带来损失,也会对用户造成困扰和安全风险,因此软件测试越来越成为软件开发过程中不可或缺的一环。
本文将探讨软件测试的方法与实践。
一、软件测试方法1.黑盒测试:黑盒测试是一种软件测试方法,即测试人员不需要了解软件内部结构和代码,只需输入一组数据输出结果检查是否符合预期要求。
黑盒测试方法的优点是测试人员不需要了解软件内部实现细节,可以从用户的角度进行测试。
2.白盒测试:白盒测试是一种软件测试方法,即测试人员需要了解软件的内部结构和代码,检查软件的各个部分是否正常运行。
白盒测试方法的优点是可以检查软件的各个部分是否符合设计要求,也可以针对性地寻找软件中的缺陷。
3.灰盒测试:灰盒测试是综合了黑盒测试和白盒测试的软件测试方法,即测试人员不完全了解软件的内部细节,但可以通过一些方式获取一些内部信息进行测试。
灰盒测试方法的优点是可以检查软件的各个部分是否正常运行,同时也可以从用户的角度进行测试。
二、软件测试实践1.测试计划:测试计划是测试工作的重要组成部分,它包括测试的目标、测试方法、测试时间安排、测试人员的角色和职责等。
测试计划的制定对于推动测试工作的进行具有很大的意义,可以提高测试工作质量和效率。
2.测试用例设计:测试用例的设计是测试工作的关键环节。
测试用例是对所测试软件运行所需输入数据、前提条件、期望的输出结果等的描述。
测试用例设计要注意测试用例的完整性、可重复性和易于管理性。
3.自动化测试:自动化测试是利用计算机程序对所测试软件进行自动化检测和测试的一种方法。
自动化测试不仅可以提高测试效率,而且可以减少测试人员的工作量,提高软件测试的准确性和稳定性。
4.缺陷管理:缺陷管理是软件测试过程中的一个重要环节,主要用于记录、追踪、分析和修复软件中的缺陷。
软件测试技术及实践第一章:前言随着计算机技术的不断发展,软件已经渗透到各个领域中,软件的质量直接关系到用户的体验和产品的市场竞争力。
而软件测试技术作为保障软件质量的一项重要手段,在软件开发过程中扮演了重要的角色。
本篇文章将为大家介绍软件测试技术及其实践。
第二章:软件测试技术概述2.1 测试及其定义测试是指在实验室环境下或真实生产环境下,对软件质量进行评估和改进的过程。
具体来说,测试是指通过运行软件,在尽可能的场景下检测软件的bug,以验证软件设计的正确性和质量是否达到规定的标准。
2.2 软件测试的基本原则软件测试是一个独立的过程,计划、执行和评估都应该执行独立的过程。
此外,软件测试应该考虑到以下几个方面:1. 细致地计划测试过程,保证测试过程的高效性和覆盖率的完整性。
2. 根据需求进行测试用例的编写,尽可能地覆盖所有可能的使用场景。
3. 选择合适的测试工具,进行有效的测试过程,不断提高工作效率和测试质量。
4. 在测试过程中,要及时记录和报告bug,并要进行反馈和修改。
5. 要遵循国际标准,如ISO/IEC12207、IEEE829。
第三章:软件测试的种类软件测试的种类主要包括以下几个方面:3.1 测试分类1. 黑盒测试:不考虑软件内部结构,只关心输入及输出的正确性。
2. 白盒测试:基于软件内部结构进行测试。
3. 灰盒测试:同时关注软件的内部结构和外部表现,是黑盒与白盒测试的结合。
3.2 测试方法1. 静态测试:静态分析源码,包括代码审核和其他形式的检查。
2. 动态测试:动态运行代码,能检测到未曾发现的问题,包括黑盒和白盒测试。
3.3 测试层次1. 单元测试:针对软件的最小测试单元(如函数或方法)进行的测试。
2. 集成测试:测试不同单元之间的交互是否正常。
3. 系统测试:将所有模块组合起来测试整个系统。
4. 验收测试:由用户进行的测试,确认系统设计确实符合需求。
第四章:软件测试的实践软件测试的实践包括了多种测试活动,如测试计划、测试用例设计、测试执行、缺陷报告和回归测试等。
一、实训背景随着我国软件产业的快速发展,软件测试作为保证软件质量的重要环节,其重要性日益凸显。
为了提高自身在软件测试领域的专业技能,我们开展了软件测试实训课程。
本次实训旨在通过实际操作,使学生掌握软件测试的基本理论、方法和工具,提高软件测试的实际操作能力。
二、实训内容1. 软件测试基础知识(1)软件测试的定义、目的和原则(2)软件测试的类型和方法(3)软件测试的生命周期2. 软件测试工具的使用(1)Selenium自动化测试工具(2)JMeter性能测试工具(3)缺陷管理工具(如Bugzilla、Jira)3. 实际项目测试案例(1)选择一个实际项目,分析其测试需求和测试用例(2)根据测试用例,编写测试脚本(3)执行测试脚本,记录测试结果(4)分析测试结果,提出改进意见三、实训过程1. 理论学习在实训初期,我们通过查阅相关资料,对软件测试的基本理论、方法和工具进行了系统学习。
主要包括软件测试的定义、目的、原则、类型、方法、生命周期以及常用测试工具的使用方法。
2. 实践操作(1)Selenium自动化测试工具我们通过编写测试脚本,实现了对Web应用的自动化测试。
具体步骤如下:①安装Selenium WebDriver②编写测试脚本,模拟用户操作③运行测试脚本,验证测试用例(2)JMeter性能测试工具我们使用JMeter对Web应用进行了性能测试,主要测试内容包括:①安装JMeter②配置测试计划③添加测试线程组、监听器等组件④运行测试计划,收集测试数据⑤分析测试结果,找出性能瓶颈(3)缺陷管理工具我们使用Bugzilla和Jira等缺陷管理工具,对项目中的缺陷进行跟踪和管理。
具体操作如下:①注册用户,创建项目②创建缺陷,分配给相关开发人员③跟踪缺陷状态,直至修复3. 项目测试案例我们选择了一个实际项目进行测试,具体步骤如下:(1)分析测试需求,确定测试用例(2)编写测试脚本,模拟用户操作(3)执行测试脚本,记录测试结果(4)分析测试结果,提出改进意见四、实训成果通过本次实训,我们取得了以下成果:1. 掌握了软件测试的基本理论、方法和工具2. 提高了软件测试的实际操作能力3. 增强了团队协作和沟通能力4. 对软件测试有了更深入的认识五、实训总结本次软件测试实训,使我们受益匪浅。
软件测试技术与实践指南软件测试是软件开发过程中的重要环节,它能够帮助开发团队以及客户消除潜在的风险和错误。
而软件测试技术和实践则是进行高质量测试的关键。
本文将介绍一些常用的软件测试技术和实践,以指导测试工程师进行有效的测试工作。
首先,我们将介绍一些常用的软件测试技术。
其中之一是黑盒测试(Black Box Testing),这是一种基于软件功能和需求规格的测试方法。
黑盒测试不关心程序的内部结构和实现细节,而是通过输入和预期输出来验证软件的功能是否符合要求。
这种方法能够从用户的角度出发,测试软件是否能够正确地响应各种输入。
另一个常用的测试技术是白盒测试(White Box Testing),它关注软件的内部逻辑和结构,以测试程序中的每一条路径。
白盒测试可以帮助测试人员发现代码中的潜在错误和漏洞,并对其进行修复。
除了黑盒测试和白盒测试,还有其他一些补充的测试技术也非常有用。
例如,灰盒测试(Grey Box Testing)是介于黑盒测试和白盒测试之间的一种测试方法,它既关注功能也关注内部结构。
另外,性能测试(Performance Testing)和压力测试(Stress Testing)可以用来评估软件在各种负载和压力条件下的性能表现。
安全测试(Security Testing)则是测试软件的安全性和抵御各种恶意攻击的能力。
这些测试技术的综合应用可以提高软件质量,并帮助开发人员和测试团队发现和解决潜在的问题。
除了测试技术,测试实践也是软件测试过程中的关键因素。
首先,测试计划是测试项目的基石。
测试计划应该清晰地规定测试的目标、范围、进度、资源和质量要求等,以确保测试工作能够按照计划进行。
其次,测试用例设计是测试的核心。
测试用例应该覆盖软件的各个功能以及各种可能的输入和边界条件。
测试用例应该是可重复执行的,并且能够准确地反映软件的实际运行情况。
同时,测试用例应该具有可读性和可维护性,以便测试人员能够容易地理解和修改。
实验三:差动放大器分析与设计一、实验目的(1)通过使用Multisim来仿真电路,测试差分放大电路的静态工作点、差模电压放大倍数、输入电阻、输出电阻;(2)加深对差分放大电路工作原理的理解;(3)通过仿真,体会差分放大电路对温漂的抑制作用二、实验步骤(1)请对该电路进行直流工作点分析,进而判断电路的工作状态。
(2)请利用软件提供的电流表测出电流源提供给差放的静态工作电流。
(3)请利用软件提供的各种测量仪表测出该电路的输入、输出电阻。
(4)请利用软件提供的各种测量仪表测出该电路的单端出差模放大倍数。
(5)请利用软件提供的各种测量仪表测出该电路的幅频、相频特性曲线。
(6)请利用交流分析功能给出该电路的幅频、相频特性曲线。
(7)请利用温度扫描功能给出工作温度从0℃变化到100℃时,输出波形的变化。
*(8)根据前面得到的静态工作点,请设计一单管共射电路,使其工作点和图3电路的静态工作点一样。
利用温度扫描功能,给出单管共射电路工作温度从0℃变化到100℃时,输出波形的变化,比较单管共射电路与共射差分电路的区别。
三、实验问题(1)根据直流工作点分析的结果,说明该电路的工作状态。
(2)请画出测量电流源提供给差放的静态工作电流时,电流表在电路中的接法,并说明电流表的各项参数设置。
(3)详细说明测量输入、输出电阻的方法(操作步骤),并给出其值。
(4)详细说明测量差模放大倍数的方法(操作步骤),并给出其值。
(5)详细说明两种测量幅频、相频特性曲线的方法(操作步骤),并分别画出幅频、相频特性曲线。
*(6)对比实验步骤(7)和(8)的结果,你有何结论?(7)对比实验步骤(4)和(9)的结果,你有何结论?(8)请分析并总结仿真结论与体会。
四、实验结果0)实验电路图根据实验要求,画出实验电路图如下所示1)直流静态工作点分析其中,V(2)=-2.11726mV,V(3)=11.63205V,V(4)=-585.02429mV。
实验报告实验名称二叉树班级学号姓名成绩栈,将根结点入栈。
每次弹出栈顶元素,并判断左右子树的值。
如果头元素中存放的结点的左/右子树不为空,则入栈,直到栈顶指针为空。
4. 用栈结构来实现查找并交换子树的值。
先创建一个包含数据区域、顶部指针的栈,将根结点入栈。
每次弹出栈顶元素,并交换栈顶元素指向的结点的左右子树指针。
如果头元素中存放的结点的左/右子树不为空,则入栈,直到栈顶指针为空。
5.整理实验结果,写出实验报告【实验过程】(实验步骤、记录、数据、分析)实验一:源代码:/*实验内容:1:对给定二叉树用链式链式存储结构,利用队列与栈对二叉树进行运算。
2:按层次输出所有结点。
3:输出所有叶子结点。
4:将所有左右子树值交换。
*/#include<stdio.h>#include<stdlib.h>#define MAXSIZE 31//定义二叉树结构体,用一维数组模拟数据域,用两个一维数组模拟左、右链域typedef struct BinaryTree{int data[MAXSIZE];int leftChild[MAXSIZE];int rightChild[MAXSIZE];int head;}BTree;int main(){//声明及调用相关函数struct BinaryTree initBinaryTree(struct BinaryTree);struct BinaryTree createBinaryTree(struct BinaryTree);void levelOrder(struct BinaryTree);void leafNode(struct BinaryTree);void exchangeBranch(struct BinaryTree);printf("Exercise 1\n");BTree bt;bt = initBinaryTree(bt);bt = createBinaryTree(bt);printf("A binary tree has been created!\n\n\n");printf("Exercise 2\n");levelOrder(bt);printf("Exercise 3\n");leafNode(bt);printf("Exercise 4\n");exchangeBranch(bt);return 0;}//实验1:初始化二叉树struct BinaryTree initBinaryTree(struct BinaryTree bt) {int i;//数据域认为0为空,左右链域认为-1为空for (i = 0; i<MAXSIZE; i++){bt.data[i] = 0;bt.leftChild[i] = -1;bt.rightChild[i] = -1;}bt.head = -1;return bt;}//创建含有数据的二叉树struct BinaryTree createBinaryTree(struct BinaryTree bt) {int i;printf("Please enter all nodes:\n");//将数据放入数据域for (i = 0; i<MAXSIZE; i++)scanf("%d", &bt.data[i]);//形成链式存储for (i = 0; i < (MAXSIZE - 1) / 2; i++){if (bt.data[2 * i + 1] != 0)bt.leftChild[i] = 2 * i + 1;if (bt.data[2 * i + 2] != 0)bt.rightChild[i] = 2 * i + 2;}bt.head = 0;return bt;}//实验2:按层次输出各节点void levelOrder(struct BinaryTree bt){//创建一个空队列,包含存放二叉树结点地址的一维数组和头尾指针int queue[MAXSIZE];int front = -1, rear = -1, i = bt.head;int addQueue(int[MAXSIZE], int, int);int delQueue(int);//判定二叉树是否为空if (i == -1)printf("This tree is empty!Please create one!");//根结点入队rear = addQueue(queue, i, rear);printf("All existed nodes are as follows:\n");//当队列不为空时(队列不满的前提下)while (front != rear){//头元素出队,并将其中地址值赋给ifront = delQueue(front);i = queue[front];printf("%d ", bt.data[i]);//如果头元素中存放的结点的左/右子树不为空,则入队if (bt.leftChild[i] != -1)rear = addQueue(queue, bt.leftChild[i], rear);if (bt.rightChild[i] != -1)rear = addQueue(queue, bt.rightChild[i], rear);}printf("\n\n\n");}//元素入队int addQueue(int queue[MAXSIZE], int i, int rear){rear++;//循环队列指针处理方法if (rear == MAXSIZE) rear = 0;queue[rear] = i;return rear;}//元素出队int delQueue(int front){front++;//循环队列指针处理方法if (front == MAXSIZE) front = 0;return front;}//实验3:查找所有叶子结点void leafNode(struct BinaryTree bt){//新建一个空栈,包含存放二叉树结点地址的一维数组和栈顶指针int stack[MAXSIZE];int top = -1, i = bt.head;int pushStack(struct BinaryTree, int[MAXSIZE], int, int);int popStack(int);//判定二叉树是否为空if (i == -1)printf("This tree is empty!Please create one!");//根结点入栈top = pushStack(bt, stack, top, i);printf("All leaf nodes are as follows:\n");while (top != -1){//栈顶元素出栈top = popStack(top);//取出存放的地址值i = stack[top + 1];//判断是否为叶子结点if (bt.leftChild[i] == -1 && bt.rightChild[i] == -1) printf("%d ", bt.data[i]);//如果头元素中存放的结点的左/右子树不为空,则入栈else{if (bt.rightChild[i] != -1)top = pushStack(bt, stack, top, bt.rightChild[i]);if (bt.leftChild[i] != -1)top = pushStack(bt, stack, top, bt.leftChild[i]);}}printf("\n\n\n");}//入栈操作int pushStack(struct BinaryTree bt, int stack[MAXSIZE], int top, int i){top++;stack[top] = i;return top;}//出栈操作int popStack(int top){top--;return top;}//实验4:交换左右子树的值void exchangeBranch(struct BinaryTree bt){//新建一个空栈,包含存放二叉树结点地址的一维数组和栈顶指针int stack[MAXSIZE];int top = -1, i = bt.head, temp;//判定二叉树是否为空if (i == -1)printf("This tree is empty!Please create one!");//根结点入栈top = pushStack(bt, stack, top, i);printf("All branches have been changed!\n");printf("The results are as follows:\n");while (top != -1){//栈顶元素出栈top = popStack(top);//取出存放的地址值i = stack[top + 1];//判断存放的结点的左右子树是否均不为空,是则入栈if (bt.leftChild[i] != -1 && bt.rightChild[i] != -1){top = pushStack(bt, stack, top, bt.rightChild[i]);top = pushStack(bt, stack, top, bt.leftChild[i]);}//将所有非叶子结点的左右子树指针交换temp = bt.leftChild[i];bt.leftChild[i] = bt.rightChild[i];bt.rightChild[i] = temp;}//层次遍历输出交换后的二叉树levelOrder(bt);}运行结果:(从键盘输入15 98 6 20 10 45 0 30 40 0 0 0 60 0 0 0 0 0 0 0 0 0 0 0 0 70 0 0 0 0 0)实验二:自行设计的二叉树如下运行结果:(从键盘输入24 30 6 5 17 63 4 0 26 1 0 0 0 31 10 0 0 16 27 0 0 0 0 0 0 0 0 50 0 13 9)【结论】(结果)。
软件测试技术与实践(3)1.William E.Perry 著,兰雨晴,高静译,软件测试的有效方法,机械工业出版社,2004年2.郑人杰等, 实用软件工程, 清华大学出版社, 1997年3.郑人杰, 计算机软件测试技术, 清华大学出版社, 1992年4.G.J. Myers, 周之英,郑人杰译,计算机软件测试技巧,1987年5.G.M. Weinberg, The Psychology of Computer Programming, New York: Van NostrandReinhold 1971.6.朱鸿,金凌紫著,软件质量保障与测试,科学出版社,1997年7.William Perry, Effective Methods for Software Testing, New York, NY: John Wiley &Sons, Inc., 19958.Tim Koomen and Martin Pol, Test Process Improvement, Addison –Wesley 1999.9.Cem Kaner, Jack Falk and Hung Quoc Nguyen, Testing Computer Software, John Wiley& Sons, Inc. 199910.Rick D. Craig and Stefan P. Jaskiel, Systematic Software Testing, Artech HousePublishers, 200211.Ron Patton, 周予滨, 姚静译, 软件测试, 机械工业出版社, 2001三.黑盒测试方法黑盒测试主要注重于软件的功能性测试,主要用于发现下列软件错误:(1)功能不对或遗漏(2)界面错误(3)数据结构或外部数据库访问错误(4)性能错误(5)初始化和终止错误三.黑盒测试方法黑盒测试与白盒测试分别用于软件测试的不同阶段:•白盒测试主要用于软件测试的早期。
•黑盒测试主要用于软件测试的后期。
黑盒测试与白盒测试互为补充三.黑盒测试方法黑盒测试方法用于解决下列问题:(1)如何测试软件功能的有效性?(2)如何设计好的测试用例?(3)如何设计特殊的测试用例?(4)如何划分程序输入的边界?(5)程序能承受何种数据量?三.黑盒测试方法l等价类划分l因果图l边值分析l判定表驱动测试l功能测试3.1等价类划分等价类划分是一种典型的黑盒测试方法,也是一种非常实用的重要测试方法,使用这一方法时,完全不考虑程序的内部结构,只依据程序的规格说明来设计测试用例。
3.1等价类划分什么是等价类?等价类是指程序的某个输入域的子集,在这个子集中,各个输入数据对于发现程序中的错误的作用都是等效的。
3.1等价类划分什么是等价类划分?等价类划分的方法就是把程序的输入域划分成若干部分,然后从每个部分中选取少部分具有代表性的数据作为测试用例,应用于测试过程中。
3.1等价类划分等价类划分的步骤:♦仔细分析规格说明书的各项功能需求♦把程序的输入和输出分开♦对程序的输入进一步分解,划分出等价类♦设计测试用例3.1等价类划分(1)划分等价类:由于等价类是程序的某个输入域的子集,所以在我们划分等价类时,♦对某等价类的代表值的测试等价于对这一类其它值的测试。
♦如果某个等价类中的一个输入条件作为测试数据进行测试查出了错误,那么使用这一等价类中的其它输入条件进行测试也会查出同样的错误,反之亦然。
采用等价类划分测试可以大大减少测试工作量。
3.1等价类划分一般情况下,等价类可以分为两种:有效等价类:指对于程序的规格说明来说,是合理的、有意义的输入数据集合。
无效等价类:指对于程序的规格说明来说,是不合理的、无意义的输入数据集合。
3.1等价类划分等价类划分原则:(1)如果输入条件规定了取值范围或值的个数,则可以确立一个有效等价类和两个无效等价类。
例如:输入从1到99,则有效等价类为:1〈= n <= 99; 两个无效等价类为:n < 1和n > 99。
(2)如果输入条件规定了输入值的集合,或者是规定了“必须如何”的条件,这时可确立一个有效等价类和一个无效等价类。
例如:程序为“统计学生本学期平均成绩”,则有效等价类为“本学期所有课程的成绩”;无效等类为:“非本学期所有课程的3.1等价类划分等价类划分原则:(3)如果输入条件是一个布尔量,则可以确定一个有效等价类和一个无效等价类。
(4)如果规定了输入数据的一组值,而且程序要对每个输入值分别处理,这时可为每个输入值确立一个有效等价类。
此外,还要为这组值确立一个无效等价类,它是所有不允许的输入的集合。
3.1等价类划分等价类划分原则:(5)如果规定了输入数据必须遵守的规定,则可以确立一个有效等价类(符合规则)和若干无效等价类(从不同角度违反规则)。
(6)如果知道已划分的等价类中各个元素在程序中的处理方式不同,则应将此等价类进一步划分成更小的等价类。
3.1等价类划分等价类划分完成后,产生等价类表,列出所有划分出的等价类:3.1等价类划分(2)设计测试用例按以下原则从等价类中选择测试用例:(1)为每一个等价类规定一个唯一的编号;(2)设计一个测试用例,使其尽可能多地覆盖尚未覆盖的有效等价类。
重复这一步,直到所有的有效等价类都被覆盖为止。
(3)设计一个测试用例,使其仅覆盖一个尚未被覆盖的无效等价类。
重复这一步,直到所有的无效等价类都被覆盖为止。
3.1等价类划分(3)等价类划分应用实例:例如,某程序规定:“输入三个整数作为三角形的三个边的,判断此三角形为合法三角形,即一般三角形、等腰三角形及等边三角形。
”3.1等价类划分首先对程序需求进行分析:♦输入条件首先要满足:(1)整数(2)三个数(3)非零数♦输入条件还要分别满足:(4)两边长之和大于第三边边长(一般三角形)(5)三个边中有两边边长相等(等腰三角形)(6)三个边边长相等(等边三角形)3.1等价类划分然后,划分等价类3.2因果图等价类划分方法并没有考虑到输入情况的各种组合,也没有考虑到各个输入情况之间的相互制约关系。
采用因果图方法(Cause-Effect Graphing)能够考虑到各个输入情况之间的相互制约关系,同时还能指出程序规格说明中存在着什么问题。
3.2因果图1.使用因果图的基本步骤:(1)分析软件规格说明中,哪些是原因(即输入条件或输入条件的等价类),哪些是结果(即输出条件),并给每个原因和结果赋予一个标识符。
(2)分析软件规格说明中的语义,找出原因与结果之间、原因与原因之间对应的关系,根据这些关系,画出因果图。
3.2因果图1.使用因果图的基本步骤:(3)由于语法或环境限制,有些原因与原因之间、原因与结果之间的组合情况不可能出现,可在因果图上用一些记号标明约束或限制条件。
(4)把因果图转换成判定表。
(5)按判定表的每一列表示的情况生成测试用例。
3.2因果图2.因果图中的基本符号:(1)恒等:表示原因与结果之间一对一的对应关系。
若原因出现,则结果出现,若原因不出现,则结果也不出现。
(2)非:表示原因与结果之间的一种否定关系。
(3) 或:表示若几个原因中有一个出现,则结果出现,只有当这几个原因都不出现时,结果才不出现。
(4)与:表示若几个原因都出现,结果才出现,若几个原因中有一个不出现,结果就不出现。
3.2因果图3.因果图中的约束关系:♦输入的约束条件:(1)E(异):表示a,b两个原因不会同时成立,两个中最多有一个可能成立。
(2)I(或):表示a,b,c三个原因中至少有一个必须成立。
(3)O(唯一):表示a,b当中必须有一个,且仅有一个成立。
(4)R(要求):表示当a出现时,b必须也出现。
不可能a出现,b不出现。
♦输出结果的约束条件:(5)M(屏蔽):表示当a是1时,b必须是0,而当a为0时,b值不定。
3.2因果图3.因果图中的约束关系:3.2因果图4.因果图应用举例:有一个处理单价为5角钱的饮料自动售货机,当投入5角或1元钱硬币,并按下[橙汁]或[啤酒]按钮,则相应的饮料就送出来。
若没有零钱找,则[零钱找完]红灯亮,这时投入1元硬币并按下饮料按钮后,饮料不送出来,且退还1元硬币;若有零钱找,则[零钱找完]红灯灭,送出饮料的同时退还5角硬币。
3.2因果图4.因果图应用举例:3.2因果图4.因果图应用举例:3.2因果图4.因果图应用举例:3.3边值分析♦在软件设计和程序编写中,常常对边界区域不够重视,容易形成差错,因此为边界附近专门设计测试用例,能取得良好的测试效果。
♦边界是指相对于输入等价类和输出等价类而言,稍高于其边界值及稍低于其边界值的一些特定情况。
3.3边值分析例如,在作三角形计算时,要输入三个边的边长:A,B,C。
♦条件: A+B>C, A+C>B, B+C>A♦但是, 如果错误的将“>”写成“>=”, 就不能构成三角形.3.3边值分析选择测试用例的原则:1.如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据。
2.如果输入条件规定了值的个数,则用最大个数,最小个数,比最大个数多1,比最小个数少1的数作为测试数据。
3.3边值分析选择测试用例的原则:3.根据规格说明和每个输出条件,使用前面的原则1。
4.根据规格说明和每个输出条件,使用前面的原则2。
5.如果程序的规格说明给出的输入域或输出域是有序集合(如有序表,顺序文件等),则应选取集合的第一个元素和最后一个元素作为测试用例。
3.3边值分析选择测试用例的原则:6.如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例。
7.分析程序规格说明,找出其它可能的边界条件。
3.3边值分析使用边值分析的例子:例1,“重量在10公斤至50公斤范围内的邮件,其记费公式为…”下边界值: 9.99, 10.01上边界值: 49.99, 50.013.3边值分析使用边值分析的例子:例2,“每月保险金扣除额为0至1165.25”下边界值: -0.01上边界值: 1165.263.4判定表驱动测试在一些数据处理问题中,某些操作是否实施取决于多个逻辑条件的取值,即在这些逻辑条件取值的组合所构成的多种情况下,分别执行不同的操作。
处理这类问题的一个非常有力的工具是判定表(Decision Table)。
3.4判定表驱动测试判定表通常由4个部分组成:条件桩(Condition Stub)动作桩(Action Stub)条件项(Condition Entry)动作项(Action Entry)3.4判定表驱动测试条件桩:列出了问题的所有条件,除了某些问题对条件的先后次序有特定的要求外,通常在这里列出的条件,其先后次序无关紧要。