三、需求的分类
基本需求:用户明确提出了要完成的一些需求开发团队必须完成的。
期望需求:用户没明确提出,但是默认开发需要完成的。
兴奋需求:用户没提出来但是开发也做了(额外的事情涉及到成本问题风险大,要严格控制)。
功能需求:考虑系统要做些什么,在何时做,在何时以及如何修改或升级。
性能需求:考虑软件开发的技术性指标。例如,存储容量限制、执行速度、响应时间及吞吐量。
数据需求:考虑输入、输出数据的格式,接收、发送数据的频率,数据的准确性和精度,数据流量,数据需保持的时间。
真题链接
“软件产品必须能够在3秒内对用户请求作出响应”属于软件需求中的 非功能需求。
(注:下图来自前言中up主视频)
系统设计(补)
概要设计
设计软件系统总体结构(模块化,确定模块调用关系等)
数据结构及数据库设计
数据结构的设计
数据库的设计
概念设计
逻辑设计
物理设计
编写概要设计文档
评审
真题链接
确定软件的模块划分及模块间的调用关系是 概要设计 阶段的任务。
在 概要设计 阶段选择适当的解决方案,将系统分解为若干个子系统,建立整个系统的体系结构。
(注:下图来自前言中up主视频)
软件工程的基本要素包括方法、工具和 过程。
(注:下图来自前言中up主视频)
(注:下图来自前言中up主视频)
(注:下图来自前言中up主视频)
详细设计
在概要设计基础上对各模块内部进行设计等,例如模块内算法设计、数据结构设计等,了解即可。
四、结构化设计
见【软件设计师-从小白到大牛】上午题基础篇:第五章 结构化开发方法
五、软件测试
1、测试原则与类型
系统测试阶段的测试目标来自于需求分析阶段。
真题链接
一个成功的测试能发现至今未发现的错误。
在设计测试用例时,应遵循 不仅要设计有效合理输入,也要包含不合理、失效的输入 原则。
在软件开发过程中,系统测试阶段的测试目标来自于 需求分析 阶段。
一个项目为了修正一个错误而进行了变更。但这个错误被修正后,却引起以前可以正确运行的代码出错。回归测试 最可能发现这一问题。
在改正当前故障的同时可能会引入新的故障,这时需要进行 回归测试。
软件调试的任务就是根据测试时所发现的错误,找出原因和具体的位置,进行改正。其常用的方法中,归纳法 是指从测试所暴露的问题出发,收集所有正确或不正确的数据,分析它们之间的关系,提出假想的错误原因,用这些数据来证明或反驳,从而查出错误所在
2、测试用例设计
不好的测试用例:用例中每个数据都不符合测试条件,即输入的数据均是不合法的。(在设计测试用例时,应当包括合理的输入条件和不合理的输入条件)。
黑盒测试 技术:等价类划分、边界值分析、错误推测 和 因果图 等。
白盒测试(由弱到强):
语句覆盖:每条语句至少执行一次。
判定覆盖(分支覆盖):每个判定表达式至少获得一次“真”值和“假”值。
条件覆盖:每一判定语句中每个逻辑条件的各种可能的值至少满足一次(即判定表达式中的每个条件(以&&、||连接的所有条件))。
判定条件覆盖:判定中每个条件的所有可能取值(真/假)至少出现一次,并使每个判定本身的判定结果(真/假)也至少出现一次。
条件组合覆盖:每个判定中条件的各种可能值的组合都至少出现一次(每个条件的真假组合至少出现一次)。
路径覆盖:覆盖被测试程序中所有可能的路径。
伪代码转流程图:
(注:下图来自《Java语言程序设计》(陈俊杰、相洁主编,高等教育出版社))
(注:下图来自《Java语言程序设计》(陈俊杰、相洁主编,高等教育出版社))
(注:下图来自《Java语言程序设计》(陈俊杰、相洁主编,高等教育出版社))
黑盒测试:只知道输入什么,输出是什么。
白盒测试:透明的,可看到设计内部的。
边界值分析选取的数据应为4个:恰好等于边界值的两个区间端点的2个数据和稍小于边界 值、稍大于边界值的2个数据。
错误推测法:更多的是基于经验和直觉来推测可能存在的错误。
真题链接
白盒测试技术中,路径覆盖法往往能比语句覆盖发现更多的错误。
某系统重用了第三方组件(但无法获得其源代码),则应采用 黑盒测试 对组件进行测试。
使用白盒测试方法时,应根据 程序的内部逻辑 和指定的覆盖标准确定测试数据。
3 、测试阶段
自顶向下集成测试:不需要编写驱动模块,需要编写桩模块。
自底向上集成测试:不需要编写桩模块,需要编写驱动模块。
(注:下图来自前言中up主视频)
一次性组装:时间快 。
增量式组装:稳妥,但是花时间长。
Alpha测试(α测试):针对产品,实验环境,开发环境进行测试。
Beta测试(β测试):针对产品,由用户在本地计算机去使用它。
4、McCabe复杂度
三种计算方法:
线性无关的区域数等于环形时间复杂度
V(G)=E-N+2(E是流图中边的条数,N是结点数)
V(G)=P+1(P是流图中判定结点的数目)
公式可记为:V(G)=弧-节点+2(或n等于node,节点的意思,来帮助记忆或区分)。
(注:下图来自前言中up主视频)
V=弧数-结点数+2(V也等于闭合区域数+1)(使用第一个公式时注意,两个结点之间的边才算入总弧数)