XJTUSE-软件质量保证
转载部分blog,侵权请联系
前言
2023-11-28 开始复习软件质量保证
下面是老师的原话(21届):
考试相关事项: 1. 考试内容以课件为主,同学们整理的材料作为参考。 2. 考试题型应该包括:判断、简答、综合题(需实际动手)。其中:综合题和简答题,分值较大。 3. 试卷为 中文,答题可以是中文或英文。
参考资料:
MOOC上的PPT
QQ群的资料
下面我就简单地做重点,大家可以简单地看看了解一下都讲了什么。详细地可以在PPT和博客上看到
关于实操可以看这里:
软件质量保证基础知识
软件缺陷基本概念
相关术语
- 错误:人在开发软件过程中的过错。- 缺陷:错误在程序中的体现。- 故障:软件在运行过程中出现的一种不可接受或不希望的内部状态。- 失效:软件在运行过程中出现的一种不可接受或不希望的外部状态。 四个术语之间的关系。
软件缺陷产生原因 软件缺陷类型:5种原因
未实现需求规格说明书中提及的功能。- 实现了需求规格说明书中不要求的功能。- 未实现需求规格说明书中未提及但需要的功能。- 出现了需求规格说明书中指明不该出现的错误。- 用户体验差 软件缺陷产生原因:
需求规格说明书书问题(最大的)- 团队协作问题- 技术问题- 未考虑复杂的应用场景
缺陷分类
- 按开发阶段分类:需求规格说明书,编码,设计...- 按严重分类:10种.. 典型的软件缺陷
- 输入/输出缺陷- 计算缺陷- 逻辑缺陷- 数据缺陷- 缺口缺陷
软件质量
质量的定义 质量不等于需求规格说明书。
质量维度 5个维度:FURPS
- F:功能测试- U:易用性测试- R:可靠性测试- P:性能测试- S:可支持性测试 还有一些维度称之为非功能性需求
软件质量的定义(略)
软件质量模型
模型分类
- McCall质量模型- ISO质量模型 McCall质量模型 一共有11个质量因子,23个质量标准
质量分类为:
- 产品操作质量因子- 产品修复质量因子- 产品转变质量因子 了解不同质量因子的关系。
ISO质量模型 质量特性与质量子特性
6个质量特性,每个质量特性对应多个质量子特性!
两种模型的异同点(略)
软件质量保证
定义 软件质量保证(Software Quality Assurance,SQA),是确保软件产品自诞生起到消亡止的全生命周期的质量活动,即确定、达到和维护需要的软件质量而进行的所有有计划的系统性管理活动。
目标
- 保证软件开发及其维护符合功能与技术需求;- 保证软件开发及其维护符合管理需求;- 为实现前两个目标,组织一些活动来改进软件开发效率和维护效率。 活动
- 项目前质量活动:合同评审活动、制定开发计划、制定质量计划。- 软件生命周期中的质量活动:开发阶段、运维阶段。- 基础设施方面的质量活动- 管理方面的质量活动- 软件质量标准:如前面提到的McCall质量模型,ISO质量模型- SQA自身的考虑 总结
- 面向过程- 注重减少开发过程中的错误做法- 过程:怎样做事情
软件测试
定义
狭义定义:为了发现错误而执行程序的过程- 广义定义:在软件开发过程中的所有评审、确认、检验等活动 定义说明
由特定测试团队执行的一个正式过程- 按照预先计划的测试过程来执行计划的测试用例- 软件行为是可以预测的且稳定的- 软件测试不等于软件使用 目标
直接目标 发现尽可能多的缺陷- 评估软件质量- 在规定的时间和预算内,执行测试工作- 间接目标 编制软件错误记录,用于错误预防
总结
- 保证和提高软件质量的手段- 更关注软件产品- 重点在于发现软件产品中的缺陷- 对软件的质量进行量化评估
软件测试模型
模型分类
- v模型- w模型 V模型 V模型是瀑布模型的变种,实质上还是瀑布模型。
缺点:通过测试发现的缺陷,往往修复成本都很高!

W模型 W模型,双V模型。引入了确定和验证。

验证与确定(记)
- 验证(Verification):是指开发人员是否在正确地做事情,强调过程的正确性,不仅检验当前阶段是否正确,还检验当前阶段是否与上一个阶段相一致;- 确认(Validation):是指开发人员是否在做正确的事情,强调结果的正确性,不仅检验当前阶段是否正确,还检验当前阶段的工作是否与用户的需求相一致。
软件测试分类
- 按阶段分类:单元测试,集成测试,系统测试,验收测试- 按是否运行软件分类:静态测试,动态测试- 按设计方法分类:黑盒测试,白盒测试,灰盒测试- 按测试执行者分类:人工测试,自动化测试- 按需求分类:功能测试,非功能测试- 按测试对象分类:桌面程序测试,嵌入式程序测试...
软件测试原则
原则1:尽早且持续测试:比如单元测试可以尽早
原则2:全面测试:不光测试持续,还可以测试文档之类的
原则3:测试用例应该包括输入和预期输出两个部分
原则4:程序员及开发团队应避免测试自己的持续
原则5:Pareto原则:即80-20原则,百分之80的缺陷是由百分之20的程序造成的。
原则6:既要测试程序是否完成了该做的,也要测试程序是否做了不该做的。
原则7:穷尽性测试不现实。
原则8:全面检查每一个测试结果。
原则9:妥善保管测试资产
原则10:测试是一个富有挑战性的工作。
软件测试流程
RUP测试流程
软件过程(略) RUP基本术语
RUP:Rational Unified Process,统一软件开发过程。
角色:描述软件项目团队中的某人或者一个小组的行为与职责。
活动:一个有明确目的的独立工作单元。
工件:活动生成、创建或修改的一段信息。
RUP软件测试角色
我真的想吐槽,你踏马测试设计师不是设计测试用例的,是开发工具的,为什么叫设计师,不叫开发。是想不到吗?还是不喜欢啊?>=100 D:X100; X<0】
9、 问题:采用等价类技术进行测试的两个动机是()。 选项: A:期望尽可能地避免冗余测试 B:期望发现最多的程序Bug C:期望具有某种意义上的完备性 D:期望证明软件没有缺陷 答案: 【期望尽可能地避免冗余测试; 期望具有某种意义上的完备性】
10、 问题:下列关于等价类的划分原则,正确的是()。 选项: A:如果输入条件规定了取值范围,可以定义一个有效等价类和两个无效等价类 B:如果规定了输入数据的个数,可以划分出一个有效等价类和两个无效等价类 C:如规定了输入数据的一组值,且程序对不同输入值做不同处理,则每个允许的输入值是一个有效等价类,并有一个无效等价类(所有不允许的输入值的集合) D:如果规定了输入数据必须遵循的规则,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则) E:如果确知已划分的等价类中各元素在程序中的处理方式不同,则应将此等价类进一步划分成更小的等价类 答案: 【如果输入条件规定了取值范围,可以定义一个有效等价类和两个无效等价类; 如果规定了输入数据的个数,可以划分出一个有效等价类和两个无效等价类; 如规定了输入数据的一组值,且程序对不同输入值做不同处理,则每个允许的输入值是一个有效等价类,并有一个无效等价类(所有不允许的输入值的集合); 如果规定了输入数据必须遵循的规则,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则); 如果确知已划分的等价类中各元素在程序中的处理方式不同,则应将此等价类进一步划分成更小的等价类】
11、 问题:健壮性测试基于单缺陷假设,不仅考虑有效值、也考虑无效值。 选项: A:正确 B:错误 答案: 【正确】
12、 问题:采用边界值分析技术,不仅可以考虑输入域边界值测试,还可以考虑输出域边界值测试。 选项: A:正确 B:错误 答案: 【正确】
13、 问题:弱一般等价类测试基于单缺陷假设、只考虑有效等价类。() 选项: A:正确 B:错误 答案: 【正确】
14、 问题:采用等价类测试进行测试用例设计,对于有效等价类,编写一个新的测试用例,一次只包含一个还未被覆盖的有效等价类。() 选项: A:正确 B:错误 答案: 【错误】
15、 问题:强健壮等价类测试基于单缺陷假设,既考虑有效等价类也考虑无效等价类。() 选项: A:正确 B:错误 答案: 【错误】
单元作业
1、 问题:案例描述:某公司根据年终考核给员工发放年终奖,年终考核包括三个指标:本年度工作完成情况、工作能力、工作态度,根据这三个指标的得分计算出某位员工的总得分。其中:本年度工作完成情况占总成绩的50%,本年度工作完成情况最高得分为100分;工作能力总分为20分;工作态度总分为30分。根据员工的总得分,将员工分为如下等级:A–[85,100]、B–[60,85)、C–[40,60)、D–[0, 40)。对于评分等级为A的员工,其年终奖额外奖励10%;对于等级为B的员工,其年终奖正常得到;对于等级为C的员工,扣除20%的年终奖;对于等级为D的员工,则进行辞退、不发年终奖。假定该公司给每位员工的基础年终奖都相同,为Total。问题:请根据课上所学边界值测试相关知识,采用普通边界值测试技术,设计本案例的测试用例。

2、问题:案例描述:某公司根据年终考核给员工发放年终奖,年终考核包括三个指标:本年度工作完成情况、工作能力、工作态度,根据这三个指标的得分计算出某位员工的总得分。其中:本年度工作完成情况占总成绩的50%,本年度工作完成情况最高得分为100分;工作能力总分为20分;工作态度总分为30分。根据员工的总得分,将员工分为如下等级:A–[85,100]、B–[60,85)、C–[40,60)、D–[0, 40)。对于评分等级为A的员工,其年终奖额外奖励10%;对于等级为B的员工,其年终奖正常得到;对于等级为C的员工,扣除20%的年终奖;对于等级为D的员工,则进行辞退、不发年终奖。假定该公司给每位员工的基础年终奖都相同,为Total。 问题:请结合课上所学等价类测试相关知识设计测试用例。请设计弱健壮等价类测试用例。

测试方法
参考:
书本、MOOC和
软件质量保证常用测试方法---边界值测试,等价类测试,路径测试_hydrion csdn_Hydrion-Qlz的博客-CSDN博客
只做简单的梳理,具体实操请同学们看书!
边界值分析
边界值的选择 一般来说,一共有七种选择:记为min-,min,min+,norm,max-,max,max+
边界值分析分类
- 普通边界值测试:单缺陷假设,考虑5种值,4n+1个测试用例。- 健壮性测试:单缺陷假设,考虑7种值,6n+1个测试用例。- 最坏情况测试:多缺陷假设,考虑5种值,5^n个测试用例。- 健壮最坏情况测试:多缺陷假设,考虑7种值,7^n个测试用例。
等价类测试
基本思想
- 等价类是指某个输入域的子集合,在该子集合中,各个输入数据对于揭露程序中的错误都是等效的,或者进行相同的处理- 测试某等价类的一组数据就等价于对这一类其他值测试 等价类的划分
- 如果输入条件规定了取值范围,可定义一个有效等价类和两个无效等价类。- 如果规定了输入数据的个数,则类似地可划分出一个有效等价类和两个无效等价类。- 如规定了输入数据的一组值,且程序对不同输入值做不同处理,则每个允许的输入值是一个有效等价类,并有一个无效等价类(所有不允许的输入值的集合)。- 如规定了输入数据必须遵守的规则,可确定一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则)。- 如果确知已划分的等价类中各元素在程序中的处理方式不同,则应将此等价类进一步划分成更小的等价类。- 等价类的划分通常不能一步到位,需要多次尝试才能得到效果较好的等价类
有时候,为了得到好的等价类测试,可以从输入和输出两个方面进行等价类划分。
分类
- 弱一般等价类测试:单缺陷假设,只考虑有效类。- 强一般等价类测试:多缺陷假设,只考虑有效类。- 弱健壮等价类测试:单缺陷假设,考虑有效类和无效类。- 强健壮等价类测试:多缺陷假设,考虑有效类和无效类。
一般而言,考试做题达到弱健壮等价类即可。
路径测试
程序图与DD路径 程序图即根据程序的实际执行语句转化的图。
DD路径为压缩后的程序图。
一些概念:
- 决策语句是指一个节点的入度或出度大于等于2- 由一个入度为0的节点组成,对应于源节点- 由一个出度为0的节点组成,对应于汇节点- 有一个入度大于等于2或出度大于等于2的节点组成,对应于判定语句或其结束语句- 由一个入度为1且出度为1的节点组成,对应于短分支- 由长度大于等于1的最大链组成,对应于串行语句序列
覆盖率 覆盖率是用于度量测试完整性的一种手段 覆盖率=被执行到的测试项数量/总项数× 100%
覆盖率分为:
- 节点覆盖- 边覆盖- 路径覆盖 逻辑覆盖指标
- 语句覆盖- 判定覆盖- 条件覆盖- 判定-条件覆盖- 条件组合覆盖- 路径覆盖

Junit
参考:
实验课发的PPT
Junit常见的两种测试方法---基础测试与参数化测试_Hydrion-Qlz的博客-CSDN博客
注解
整理了以下重要的注解:
@Test:使用该元数据描述的方法作为测试用例。
@BeforeEach:每个测试方法前需要执行一次。
@AfterEach:每个测试方法后需要执行一次。
@Ignore:忽略该测试方法。
@BeforeAll:在所有测试方法前执行。
@AfterAll:在所有测试方法后执行。
断言
整理了部分断言:
assertEquals():判断两个是否等值(最重要的)
assertTrue():判断是否为真
assertFalse():判断是否为假
测试结果
- 测试未通过(Failure)- 测试错误(Error)
特殊处理
@Test(timeout=xxx):超过多少时间没有相应也算测试失败
上机操作
给段代码,不做过多解释:
package xjtu;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class CalculateTest {
static Calculate cal;
@BeforeAll
static void setUpBeforeClass() throws Exception {
cal = new Calculate();
System.out.println("开始测试:");
}
@AfterAll
static void tearDownAfterClass() throws Exception {
cal = null;
System.out.println("结束测试");
}
@BeforeEach
void setUp() throws Exception {
}
@AfterEach
void tearDown() throws Exception {
}
@Test
void testAdd() {
assertEquals(5,cal.add(2, 3));
}
@Test
void testSub() {
assertEquals(-1,cal.sub(2, 3));
}
@Test
void testMul() {
assertEquals(6,cal.mul(2, 3));
}
@Test
void testDiv() {
assertEquals(1,cal.div(3, 3));
}
}需要注意的是,还有一些注解形式:

参数化测试
- 给测试方法添加注解
@ParameterizedTest- 使用注解@xSource来制定测试数据,其中:x可能为Value、Enum、Method、Csv、CsvFile、Arguments等
package xjtu;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
class CalculateParamTest {
Calculate x = new Calculate();
@ParameterizedTest
@CsvSource({"10,20,30","0,0,0","10,-20,-10"})
void testAdd(int a, int b, int expected) {
assertEquals(expected,x.add(a, b));
}
}测试套件
package xjtu;
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.runner.RunWith;
@RunWith(JUnitPlatform.class)
@SelectPackages("xjtu")
class CalculateTestSuite {
}总结

十大测试
主要是上课学生讲的内容,我觉得不会有多少考题,简单梳理。课本P32
略是有的是前面讲解过了,有的是压根书上没有,我觉得不重要的。
(考后说:背一下这表吧,吃亏了)

功能测试(略)
等价类测试(略)
基于规格说明测试
系统测试覆盖指标:
端口输入事件覆盖指标- 端口输出事件覆盖指标- 端口(设备)覆盖指标- 其他覆盖指标 需考虑的问题:如果没有规格说明书,能否进行规格说明测试?(可以)
软件更新备忘录- 用户手册手稿- 基于发布的风格指南- .... 可追溯矩阵

基于风险的测试
三个层次:
- 基于风险的测试技术- 基于风险的测试管理- 基于风险的项目管理 风险分析:
风险级别 = 发生概率 * 代价
工作步骤:
- 识别风险- 分析风险发生概率- 分析风险的代价
压力测试
是什么?
也称强度测试,是指通过给系统强加巨大的工作负载,以检验系统在峰值(甚至超过峰值)使用情况下是否能够正常工作。
手段?
- 重复- 并发- 大数据量- 随机
回归测试(略)
探索性测试(略)
不过好像跟随测试是一种探索性测试来着
用户测试
测试用户的选择标准:
- 特定行业:选择丰富经验的专家- 面向大众:随机选择 测试用户的数量
公式:())
E表示错误发现率,L表示每个测试人员发现易用性问题的概率,n表示测试用户的数量
场景测试
是什么?指测试人员基于用户的实际业务和操作,构建复杂的涉及多次交互的使用场景来检验软件在复杂环境下的表现是否符合预期。
技术:肥皂剧测试。
随机测试(略)
后记
2023-12-3 考完了软件质量保证,记录一下考题和考后感想
题型:
判断10道 10分?(没细看)
简答8道(想起啥写啥) 40分:
- 回归测试 5个维度 优缺点- 软件质量,缺陷,测试关系- V模型,W模型- 测试思想,测试用例- 广义/狭义测试手段- 测试进度编写可以从什么方面展开?- ...- ....
大题 5小问 50分
和书上判断医保等级的一道题目很像。
就等价类,自己写代码实现(伪代码都可以),程序图,DD路径,几种逻辑覆盖指标的测试用例编写。
判断简单的。
感觉简答有大半没复习到,/==(艹皿艹 )。
不过,大题都是在辐射范围内,Junit写的是参数化测试来着
吐槽:后面想补充点内容,答题卡也没位置写了,多给点答题纸嘛...(合理规划的重要性...)
