软件工程复习
题型
黑盒测试(等价类划分)
黑盒测试
这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。
等价类
等价类是指输入域的某个子集,该子集中的每个输入数据对揭露软件中的错误都是等效的,测试等价类的某个代表值就等价于对这一类其他值的测试。
-
等价类划分:把输入划分为有效输入和无效输入。
(1)有效的输入域:指符合规格说明要求的合理的输入数据,主要用年来检验程序是否实现了规格说明中的功能。
(2)无效输入:指不符合规格说明要求的不合理或非非阿德输入数据,主要用来检验程序是否做了规格说明以外的事。
(3)再决定输入数据等价类时,还要分析输出数据的等价类,以便根据输出数据等价类导出输入数据等价类。
-
确定等价类:根据规格说明,对每一个输入条件确定若干个有效等价类和若干个无效等价类。
确定等价类的规则:
(1)输入条件规定了取值范围:确定一个有效等价类(符合范围),两个无效等价类(超出上界,超出下界)。
(2)输入条件规定了值的个数:确定一个有效等价类(符合范围),两个无效等价类(超出上界,超出下界)。
(3)输入条件规定了输入值的集合(离散值),同时程序对不同输入值做不同处理:每个允许的值都分别确定为一个有效等价类,一个无效等价类(任意一个不允许的值)。例如——成绩分为:优、良、及格、不及格,则可以确定4个有效等价类和一个无效等价类。
(4)输入条件规定输入数据是整形:确定三个有效等价类(正整数、零、负整数),一个无效等价类(非整数)。
(5)输入条件规定处理的对象是表格:确定一个有效等价类(表格有一项或多项),一个无效等价类(空表)。
-
设计测试用例
输入条件 有效等价类 无效等价类 利用等价类设计测试用例的步骤:
(1)设计一个新的测试用例,使其尽可能多的覆盖尚未覆盖的有效等价类,重复这一步,知道所有的等价类都被覆盖为止。
(2)为每个无效等价类设计一个新的测试用例。
黑盒测试例题
1.在某一语言版本中规定:“标识符是由字母开头,后跟字母或数字的任意组合构成。最大字符数为80个。” 并且规定:“标识符必须先说明,再使用。” “在同一说明语句中,标识符至少必须有一个。”
步骤1:用等价类划分的方法,建立输入等价类表
输入条件 | 有效等价类 | 无效等价类 |
---|---|---|
标识符个数 | 1个(1),多个(2) | 0个(3) |
标识符 | 1~8个(4) | 0个(5),>8个(6),>80个(7) |
标识符组成 | 字母(8),数字(9) | 非字母数字字符(10),保留字(11) |
开头字符 | 字母(12) | 非字母(13) |
标识符使用 | 先说后使用(14) | 未说明使用(15) |
步骤2:选取测试用例
测试数据 | 测试范围 | 测试结果 |
---|---|---|
-
某城市的电话号码由3部分组成。地区码(空白或3位数);前缀(非“0”或“1”开头的3位数字);后缀(4位数字)
划分等价类
输入条件 | 有效等价类 | 无效等价类 |
---|---|---|
地区码 | (1)空白,(2)三位数 | (5)>三位数,(6)<三位数,(7)有非数字字符 |
前缀 | (3)200~999 | (8)0开头的数字,(9)1开头的数字,(10)少于3位数,(11)多余3位数,(12)有非数字字符 |
后缀 | (4)0000~9999 | (13)有非数字字符,(14)少于4位数字(15)多于4位数字 |
测试用例
测试数据 | 测试范围 | 测试结果 |
---|---|---|
200-0000 | 等价类1,3,4 | 有效 |
111-888-9999 | 等价类2,3,4 | 有效 |
2000-200-0000 | (5)>三位数 | 无效 |
20-200-0000 | (6)<三位数 | 无效 |
ab-200-0000 | (7)有非数字字符 | 无效 |
010-0000 | (8)0开头的数字 | 无效 |
100-0000 | (9)1开头的数字 | 无效 |
1-0000 | (10)少于3位数 | 无效 |
1111-0000 | (11)多余3位数 | 无效 |
abc-0000 | (12)有非数字字符 | 无效 |
200-abc | (13)有非数字字符 | 无效 |
200-200 | (14)少于4位数字 | 无效 |
200-20000 | (15)多于4位数字 | 无效 |
-
某一8位微机,其十六进制常数定义为:以0x或0X开头的是十六进制整数,其值的范围是-7f~7f(表示十六进制的大小写字母不加区别),如0X13,0X6A,-0X3c
等价类划分
输入条件 有效等价类 无效等价类 16进制数的组成 (1)0x或0X开头的1-2位串,(2)-0x或-0X开头的1-2位串 (4)非0x,0X,-0x,-0X开头,(5)含有abcdef以外的字符,(6)开头后多余2字符 值 (3)-7f~7f (7)小于-7f,(8)大于7f 测试用例
测试数据 测试范围 测试结果 0x3 等价类1,3 有效 -0x3 等价类2,3 有效 0f3 (4)非0x,0X,-0x,-0X开头 无效 0fg3 (5)含有abcdef以外的字符 无效 0x345 (6)开头后多余2字符 无效 -0x8f (7)小于-7f 无效 0x9f (8)大于7f 无效 -
输入三角形的三个边A,B,C,输出为”不是三角形”,”等边三角形”,”等腰三角形”任意三角形”。设计一组测试用例。
等价类划分
输入条件 有效等价类 无效等价类 输入数据 (1)正整数 (4)0(5)负整数(6)非整数(7)非数字字符 输入个数 (2)3个 (8)大于3个(9)小于3个 两数之和>第三数 (3)三个数相等(4)两个数相等(5)三个数都不等 (10)两数之和=第三数(11)两数之和<第三数 测试用例
测试数据 测试范围 测试结果
数据流程图转NS、PAD图
程序流程图
当箭头返回到判断框则为DoWhile语句,返回到操作框的为DoUntil
N-S图
N-S图也叫做盒图。五种基本控制结构由五种图形构件表示。
N-S图的嵌套定义形式
PAD图(问题分析图)
-
PAD也设置了五种基本控制结构的图式,并允许递归使用
-
PAD图所描绘的程序结构十分清晰。图中最左面的竖线是程序的主线,即第一层结构。随着程序层次的增加,PAD图逐渐向右延伸,每增加一个层次,图形向右扩展一条竖线
-
PAD图中竖线的总条数就是程序的层次数
PAD基本结构
PAD描述示例
数据流程图转NS、PAD图例题
例1:
s1;
if (x<=5)
s2;
i: =1;
while(i>=3)
{undefined s3;
i:=i+i;
}
if(y<0)
s4;
else
s5;
程序流程图:
N-S图:
PAD图:
例2
N-S图
PAD图
例3
例4
伪代码:
GET(a[1],a[2],…a[10])
max=a[1];
max2=a[2];
FOR i=2 TO 10
IF a[i]>max
max2=max;
max=a[i];
ELSE
IF a[i]>max2
max2=a[i];
ENDIF
ENDIF
ENDFOR
PUT(max,max2)
END
N-S:
例5:
伪代码:
定义变量:i=7,S=0
DO WHILE i<=1000
IF(i被7整除)
THEN
S=S+i
输出:i
ENDIF
i=i+1
ENDDO
输出:S
N-S:
PAD:
例6
流程图:
N-S图:
PAD图:
需求 判定表
判定表介绍
在对软件进行需求分析时,市场部人员需要跟用户进行不断的沟通,这时可能会根据软件功能的期望让用户填一些调查表格,用户会根据条件选择自己期望达到的效果。如果将条件称为输入,将期望效果称为输出,这就非常接近于软件测试中的测试用例。如果由于条件的不同组合会得到不同的一些输出,那么这样的问题就适合使用判定表来进行测试用例的设计。
判定表通常由四个部分组成
-
条件:列出一组条件的对象;
-
条件取值:列出各种可能的条件取值组合;
-
列出所有的操作;
-
操作条目:列出对应的条件组合下所选的操作。
判定表的一般结构
条件1 | 条件1取值 | 条件1取值 | … |
---|---|---|---|
条件2 | 条件2取值 | 条件2取值 | … |
… | … | … | … |
操作1 | 操作1取值 | 操作1取值 | … |
操作2 | 操作2取值 | 操作2取值 | … |
… | … | … | … |
建立判定表的步骤
-
列出与一个具体加工 (或过程)有关的所有处理
-
列出过程执行期间的所有条件(或所有判断)
-
将特定条件取值组合与特定的处理相匹配,消去不可能发生的条件取值组合
-
将右部每一纵列规定为一个处理规则,即对于某一条件取值组合将有什么动作
需求 判定表例题
例1
“对功率大于50马力的机器、维修记录不全或已运行10年以上的机器,应给予优先的维修处理……”。这里假定,“维修记录不全”和“优先维修处理”均已在别处有更严格的定义;请建立判定表。
步骤:
1.确定规则的个数:这里有3个条件,每个条件有两个取值,故应有222=8种规则。
2.列出所有的条件桩和动作桩:
3.填入条件项
4.填入动作桩和动作项,这样便得到形如图的初始判定表
5.化简,合并相似规则后得到图
例2:
某校对于各种不同职称教师,根据是本校专职教师还是外聘兼职教师决定其讲课的每课时津贴标准。本校专职教师每课时津贴费:教授50元.副教授40元。讲师30元,助教20元。外聘兼职教师每课时津贴费:教授60元,副教授50元,讲师40元,助教30元。
例3
毕业证、学位证书授予判定表
消去不可能情况后
1 | 2 | 3 | 4 | 5 | |
---|---|---|---|---|---|
没有未通过的必修课程 | Y | N | N | N | N |
未通过的必修课程学分总数小于等于12 | Y | N | N | Y | Y |
通过的课程学分数大于等于30 | Y | Y | N | Y | N |
授予毕业证书 | √ | ||||
授予结业证书 | √ | ||||
授予肄业证书 | √ | ||||
不授予任何证书 | √ | √ |
例4
某单位工资制度规定如下:
-
技术干部的职务工资规定: 技术员5k元;助理工程师7k元; 工程师9k元;高级工程师12k元; 工龄<10年并受聘为高级工程师职务工资为14k元。
-
工龄补助: 10年以下:补助1k元; 10到20年:补助2k元; 20年以上:补助3k元。
用例图与类图、开发语言与开发工具选择
用例图
用例图介绍
用例图,描述系统和外部环境的关系和系统所能提供的服务。
包含关系:基用例必须和包含用例一起使用才够完整,包含用例也必然被执行。包含关系在用例图中使用带箭头的虚线表示(在线上标注<<include>>),箭头从基用例指向包含用例。
扩展关系:扩展用例是对基用例的扩展,即使没有扩展用例的参与,也可以完成一个完整的功能。扩展在用例图中使用带箭头的虚线表示(在线上标注<<extend>>),箭头从扩展用例指向基用例。
泛化关系:是一种继承关系,泛化关系在用例图中用实线+空心三角形表示,空心三角形指向父参与者,子参与者可以继承父参与者所有的行为。子用例可以使用父用例的一段行为,也可以重载它。父用例通常是抽象的,子用例中的特殊行为都可以作为父用例中的备选流存在。
关系类型 | 说明 | 表示符号 |
---|---|---|
关联 | 参与者与用例间的关系 | ![]() |
泛化 | 参与者之间或用例之间的关系 | ![]() |
包含 | 用例之间的关系 | ![]() |
扩展 | 用例之间的关系 | ![]() |
用例图例题
例1
例2
学生注册课程系统
(1)某大学准备开发一个学生课程注册系统,学生可以使用该系统查询新学期将开设的课程和讲课教师情况,选择自己要学习的课程进行登记注册,并可以查询成绩单;
(2)教师可以使用该系统查询新学期将开设的课程和选课学生情况,并可以登记成绩单;
(3)注册管理员使用该系统进行注册管理,包括维护教师信息、学生信息和课程信息等。
(4)在每个学期的开始,学生可以获得该学期的课程目录表,课程目录表列出每门课程的所有信息,诸如基本信息、教师、开课系和选课条件等。
(5)新学期开始前两周为选课注册时间,在此期间学生可以选课注册,并且允许改变或取消注册申请。每个学生可以选择不超过4门课程,同时指定2门侯选课程以备主选课程未选上。每门课程最多不能超过10人,最少不能低于3人。
(6)开学两周后注册管理员负责关闭课程注册,低于3人选课的课程将被取消,一旦学生的注册过程完毕,注册系统将有关信息提交收费系统以便学生付费。如果在实际注册过程中名额已满,系统将通知学生在提交课程表之前予以更改。
(7)在学期结束时,学生可以存取系统查看电子成绩单。由于学生成绩属于敏感信息,系统必须提供必要的安全措施以防非法存取。
-
解题步骤1:发现角色
在上述例子中,学生和教师使用系统完成课程注册和成绩登记等,注册管理员维护和管理教师、学生和课程的信息。另外,收费系统存取已有的课程目录数据库,获得课程列表。
-
解题步骤2:发现用例
与教师有关的用例
选择课程——选择所教的课程,并获得学生名册;
登记成绩——在学期结束时,提交学生的课程成绩。
与学生有关的用例
注册课程——在学期开始进行选课注册,允许在一段时间内更改或删除,课程目录系统提供当前学期的所有可选课程列表;
查看成绩单——学生可以查看以前学期的电子成绩单。
与注册管理员有关的用例
维护课程信息--在系统中增加、修改和删除课程信息;
维护学生信息--在系统中增加、修改和删除学生信息;
维护教师信息--在系统中增加、修改和删除教师信息;
关闭注册--删除少于3人的课程,并由付费系统通知学生缴费。
与安全性要求有关的用例
登录——使用此系统的人员需要进行登录,以验证其身份和权限。
-
解题步骤3:选课系统用例图
**例3
例4
⽹络的普及带给了⼈们更多的学习途径,随之⽽来的管理远程⽹络教学的“远程⽹络教 学系统”诞⽣了。 “远程⽹络教学系统”的功能需求如下:
-
学⽣登录⽹站后,可以浏览课件、查找课件、下载课件、观看教学视频。
-
教师登录⽹站后,可以上传课件、上传教学视频、发布教学心得、查看教学心得、修改教学心得。
-
系统管理员负责对⽹站页⾯的维护、审核不合法课件和不合法教学信息、批准用户注册。
-
学⽣、教师、系统管理员都需要登录“远程⽹络教学系统”后才能正常使⽤该系统 的所有功能。如果忘记密码,可与通过“找回密码”功能恢复密码。
请画分别画出参与者(ACTOR)——学⽣、教师的⽤例图。
类图
类图介绍
类图用来表示系统中的类以及类与类之间的关系。
使用三层矩形框表示。 第一层显示类的名称,如果是抽象类,则就用斜体显示。 第二层是字段和属性。 第三层是类的方法。
注意前面的符号,‘+’表示public,‘-’表示private,‘#’表示protected。
关联关系(Association)
建立另一个类的成员变量
一个类的对象作为另一个类的对象的成员变量时,两个类之间有关联关系。
【特性】
⑴多重性(Multiplicity)
-
类A的一个对象->类B的对象个数
-
1 仅有一个
-
0..* 0或者更多
-
1..* 一个或者更多
-
0..1 0个或者1个
-
5..8 特定的范围内(5,6,7或8)
-
4..7,9 符合的(4,5,6,7或9)
public class 丈夫 {
private 妻子 the妻子;
public 丈夫() {
}
}
public class 妻子 {
private 丈夫 the丈夫;
public 妻子() {
}
}
public class 麻雀 {
private 腿 the腿[2];
}
⑵ 访问方向(Navigability)
-
表示类A的对象能够“访问”类B的对象。
-
两端都没有箭头的连线表示双向关联关系
public class 小公司总裁 {
private 小公司职员 the小公司职员[20];
}
public class 小公司职员 {
private 小公司总裁 the小公司总裁;
}
public class 大公司总裁 {
public 大公司核心职员 the大公司核心职员[20];
}
public class 大公司普通职员 {
public 大公司总裁 the大公司总裁;
}
public class 大公司核心职员 {
private 大公司总裁 the大公司总裁;
}
⑶角色(role)
-
表示类A的对象对类B的对象的具体含义。
public class 金融机构 {
public 企业 经济来源;//把对象写到对应类中
}
public class 企业 {
public 金融机构 股东;
}
聚合关系(Aggregation)
另一个类的成员对象作为setter方法或构造方法的参数注入到整体对象方法中
-
“整体”的对象消失不会导致“部分”的对象的消失。
-
“部分”的对象可以被多个“整体”的对象共享。
public class 球队 {
private Vector the球员;
}
public class 球员 {
private 球队 the球队;
}
“整体”的对象消失不会导致“部分”的对象的消失。球队解散了,球员还在一个球员可以是俱乐部球队的球员,同时也可以是国家队的球员。
组合关系(Composition)
在整体类的构造方法中实例化成员类
-
“整体”与“部分”间有“皮之不存,毛将焉附”的语义。
-
“部分”不能被“整体”共享。
public class 活人{
private 跳动的心脏 the心脏 = new 跳动的心脏();
public 活人(){};
}
public class 跳动的心脏 {
private 活人 the活人;
public 跳动的心脏(){};
}
依赖关系(Dependency)
一个类的对象作为另一个类方法的参数
两个对象之间由于通信而形成的关系,表示
-
对象A发送消息到另一个对象B
-
由对象B完成某些处理。
对象收到消息后执行的操作称为它提供的服务
泛化关系(Generalization)
extend继承
类A(特殊)到类B(一般)的泛化关系表示“类A是类B的一种”。
【泛化关系 .VS.继承】
泛化关系是一种关系的名称,用在分析、设计。
继承是一种实现泛化关系的机制,用在实施。
public class 球类运动员 extends 运动员 {}
public class 大球运动员 extends 球类运动员 {}
public class 足球运动员 extends 大球运动员 {}
public class 交通工具 {
public int 旅客容量;
public int 最大速度;
public float 百公里耗油量;
public abstract void 启动();
public abstract void 驾驶();
}
public class 汽车 extends 交通工具 {
public float 排气量;
public void 刹车() {}
public void 启动() {}
public void 驾驶() {}
}
实现关系(Realization)
implement接口
-
描述类实现接口。
-
接口——作为要求被提出,一组操作(服务);
-
类——具体履行接口中声明的操作(服务)。
-
public interface 照顾学龄前儿童 {
public void 喂饭();
public void 陪护();
public void 保洁();
}
public class 家庭保姆 implements 照顾学龄前儿童 {
public void 喂饭();
public void 陪护();
public void 保洁();
}
public class 幼儿园 implements 照顾学龄前儿童 {
public void 喂饭();
public void 陪护();
public void 保洁();
}
类图例题
例1
例2(接上文用例图例题)
例3
【员工报账系统——提交报账申请】
员工通过报帐系统填写报销申请,输入相关活动产生的费用,在一次或者多次填写后提交,经过验证之后,以电子邮件的方式通知经理批复。
⑴员工employee:公司的正式雇员。
⑵经理manager:公司的正式雇员。
⑶报销单Claim_report:员工在一个(自然)月内的所有报销记录的集合。
⑷报销记录Claim_record:与业务有关的某一项具体的花费,包括业务活动发生的时间、地点、客户名称(可选)、原因以及费用金额和种类(交通、餐饮、会议、通讯和杂项)。
⑸验证规则valid_rule:验证为合理的报销记录必须满足几种条件:
第一,不同种类的费用不超过相应的限额;
第二,报销费用的类型要和员工的职能匹配。
例4
图书管理系统功能性需求说明如下:
-
图书管理系统能够为⼀定数量的借阅者提供服务。每个借阅者能够拥有唯⼀标识其存 在的编号。图书馆向每⼀个借阅者发放图书证,其中包含每⼀个借阅者的编号和个⼈ 信息。提供的服务包括:提供查询图书信息、查询个⼈信息服务和预定图书服务等。
-
当借阅者需要借阅图书、归还书籍时需要通过图书管理员进⾏,即借阅者不直接与系统交互,⽽是通过图书管理员充当借阅者的代理和系统交互。
-
系统管理员主要负责系统的管理维护⼯作,包括对图书、书⽬、借阅者的添加、删除 和修改。并且能够查询借阅者、图书和图书管理员的信息。
-
可以通过图书的名称或图书的 ISBN/ISSN 号对图书进⾏查找。
回答下⾯问题:
-
该系统中有哪些参与者(ACTOR)?
借阅者、图书管理员、系统管理员
-
确定该系统中的类,找出类之间的关系并画出类图
选择编程语言的经验准则
(1) 选择适合应用领域的语言
(2)系统用户的要求
(3)可以使用的编译程序编译程序是否可以运行在目标系统的环境中
(4)可以得到的软件工具是否有支持某种语言程序开发的软件工具可以利用
(5)软件可移植性要求:如果目标系统将在不同类型的设备上运行,或者预期的使用寿命很长,那么选择一种标准化程序高、程序可移植性好的语言就是很重要的
(6)人的因素:尽量选用程序员和系统维护人员熟悉的语言环境,以节省开发时间,也有利于将来使用和维护工作
(7)工程规模
需求 DFD图
DFD图简介
-
数据流名是名词,不是动词
-
加工是处理,是动作,由动词+及物宾语组成
-
加工的过程要参考的数据文档和要形成的数据数据文档,需要通过详细分析得到
画分层DFD图的基本原则
-
数据守恒与数据封闭原则
数据守恒是指加工的输入出数据流是否匹配,即每一个加工既有输入数据流又有输出数据流。数据封闭是对整个系统而言。
-
子图与父图的“平衡”
父图中某个加工的输入输出数据流应该同相应的子图的输入输出相同(相对应),分层数据流图的这种特点称为子图与父图“平衡”。
-
加工编号规则
顶层加工不编号;第二层的加工编为1,2,…,n号;第三层编为1.1,1.2,…,n.1,n.2,…等号,依此类推。
DFD图例题
例1
案例:医院病房监护系统
在医院ICU病房里,将病症监视器安置在每个病床,对病人进行监护。监视器将病人的组合病症信号实时地传送到中央监护系统进行分析处理。在中心值班室里,值班护士使用中央监护系统对病员的情况进行监控,监护系统实时地将病人的病症信号与标准的病诊信号进行比较分析,当病症出现异常时,系统会立即自动报警,并打印病情报告和更新病历。根据医生的要求随时打印病人的病情报告,系统还定期自动更新病历。
顶层DFD图
第一层
第二层
例2
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下