软考软件设计师题目总结
生成时间: 2026年7月27日 15:05 | *
距下半年考试: 约89天(10月24-27日)
本期主题: 软件测试与质量保证专题突破 + 数据结构算法强化(树与图) + 设计模式代码实战 + 计算机组成原理核心计算
一、2026下半年考情与命题新风向
1.1 关键考试信息
| 项目 | 详情 |
|---|---|
| 考试时间 | 2026年10月24-27日(机考) |
| 合格标准 | 两科均≥45分,一次性通过,无单科保留 |
| 备考倒计时 | 约89天 |
1.2 第20期命题风向研判
| 趋势 | 表现形式 | 备考动作 |
|---|---|---|
| 算法题场景化加深 | 结合具体业务场景现场建模 | 练非常规题型,锻炼解题逻辑 |
| 测试与质量题量回升 | McCabe复杂度、覆盖率判定常考 | 强化计算 + 概念辨析 |
| 设计模式代码补全 | Java/C++ 代码填空成为下午题压轴 | 熟记模式骨架代码 |
| 计算机组成计算化 | Cache命中率、流水线加速比直接出题 | 重点刷计算模板 |
二、软件测试与质量保证专题突破
2.1 软件测试V模型与四阶段对应关系
| 开发阶段 | 对应测试阶段 | 测试目标 |
|---|---|---|
| 需求分析 | 验收测试 | 验证需求是否满足用户期望 |
| 概要设计 | 系统测试 | 验证整体功能与性能 |
| 详细设计 | 集成测试 | 验证模块间接口与协作 |
| 编码实现 | 单元测试 | 验证单个模块功能正确性 |
记忆口诀:V模型左右一一对应,单元→集成→系统→验收。
2.2 黑盒测试方法对比(必考)
| 方法 | 核心思想 | 适用场景 | 典型步骤 |
|---|---|---|---|
| 等价类划分 | 输入域划分为若干等价类,从每类选少量代表 | 输入范围大、规则明确 | 划分有效/无效等价类 → 选代表值 |
| 边界值分析 | 对边界附近的值重点测试 | 范围型输入 | 取边界 ±1、边界、边界内点 |
| 判定表/驱动 | 多条件组合逻辑关系 | 复杂业务规则 | 列出条件桩 → 列出动作桩 → 组合规则 |
| 因果图 | 将输入条件与输出结果建立因果关系 | 多种输入组合影响输出 | 画因果图 → 转判定表 → 设计用例 |
| 错误推测法 | 基于经验猜测易错点 | 补充测试 | 列举可能错误场景 |
| 场景法 | 用户操作路径走一遍 | 业务流程类 | 画流程图 → 走基本流+备选流 |
2.3 白盒测试覆盖标准强度金字塔
┌──────────┐ │ 路径覆盖 │ 最强 ├──────────┤ │语句覆盖 │ 最弱 └──────────┘ 强度从弱到强: 语句覆盖 < 判定覆盖 < 条件覆盖 < 判定/条件覆盖 < 条件组合覆盖 < 路径覆盖| 覆盖标准 | 要求 |
|---|---|
| 语句覆盖 | 每条语句至少执行一次 |
| 判定覆盖 | 每个判定真假分支至少各执行一次 |
| 条件覆盖 | 每个判定中每个条件的可能取值至少执行一次 |
| 判定/条件覆盖 | 同时满足判定覆盖和条件覆盖 |
| 条件组合覆盖 | 每个判定中各条件所有可能组合至少执行一次 |
| 路径覆盖 | 所有可能的路径至少执行一次 |
2.4 McCabe环形复杂度计算(三种方法)
方法一:V(G) = 边数 - 结点数 + 2
方法二:V(G) = 判定结点数 + 1
方法三:V(G) = 封闭区域数 + 1
示例计算:
程序流程图:开始 → 输入A → 判定A>0 → 是→判定B>0 → 输出1 → 结束 ↓否 输出2 → 结束- 边数 = 7,结点数 = 6 → V(G) = 7 - 6 + 2 = 3
- 判定结点数 = 2 → V(G) = 2 + 1 = 3
- 封闭区域数 = 2 → V(G) = 2 + 1 = 3
2.5 软件测试类型与阶段对比
| 测试类型 | 测试对象 | 测试者 | 是否需源码 | 典型工具 |
|---|---|---|---|---|
| 单元测试 | 单个模块 | 开发人员 | 是 | JUnit、pytest |
| 集成测试 | 模块间接口 | 开发/测试 | 部分 | Postman、SoapUI |
| 系统测试 | 整个系统 | 测试团队 | 否 | Selenium、LoadRunner |
| 验收测试 | 业务需求 | 用户/客户 | 否 | 手工测试 |
| 回归测试 | 修改后的功能 | 测试团队 | 可选 | 自动化脚本 |
| α/β测试 | 真实环境 | 用户 | 否 | 真实环境 |
三、数据结构算法强化(树与图专题)
3.1 二叉树核心公式速查
| 概念 | 公式 |
|---|---|
| 第 i 层最多结点数 | 2^(i-1) |
| 深度为 k 的二叉树最多结点数 | 2^k - 1 |
| 叶子结点数 = 度为2结点数 + 1 | n₀ = n₂ + 1 |
| 完全二叉树叶子结点数 | ⌈n/2⌉ 或 ⌊(n+1)/2⌋ |
| 二叉排序树平均查找长度 | O(log n)(平衡时) |
| 二叉排序树最坏查找长度 | O(n)(退化为链表) |
3.2 树与二叉树遍历(必背)
| 遍历方式 | 顺序 | 应用场景 |
|---|---|---|
| 前序遍历 | 根 → 左 → 右 | 复制二叉树、表达式前缀形式 |
| 中序遍历 | 左 → 根 → 右 | 二叉排序树得到有序序列 |
| 后序遍历 | 左 → 右 → 根 | 释放二叉树、表达式后缀形式 |
| 层序遍历 | 一层一层从左到右 | 按层访问、求树高 |
关键应用:BST(二叉排序树)中序遍历得到升序序列,这是高频考点!
3.3 哈夫曼树与编码
- 构造原则:权值大的叶子靠近根
- WPL(带权路径长度):所有叶子结点权值×路径长度之和
- 哈夫曼编码:左分支标0、右分支标1,从根到叶子的路径即为编码
- 特性:前缀编码(任何字符编码不是另一个字符编码的前缀)
计算示例:
叶子结点权值:{2, 3, 4, 5, 6} 构造过程: (20) / \ (8) (12) / \ / \ 5 3 4 (8) / \ 2 6 WPL = 5×2 + 3×3 + 4×3 + 2×4 + 6×3 = 10+9+12+8+18 = 573.4 图的存储结构对比
| 存储结构 | 空间复杂度 | 适合场景 | 关键操作 |
|---|---|---|---|
| 邻接矩阵 | O(n²) | 稠密图、快速判边 | 查边 O(1) |
| 邻接表 | O(n+e) | 稀疏图 | 遍历邻接点 O(度) |
| 十字链表 | O(n+e) | 有向图 | 快速找入边和出边 |
| 邻接多重表 | O(n+e) | 无向图 | 快速标记已访问边 |
3.5 图的遍历算法
| 算法 | 数据结构 | 应用 |
|---|---|---|
| DFS(深度优先) | 栈/递归 | 拓扑排序、连通分量 |
| BFS(广度优先) | 队列 | 最短路径(无权图)、层次遍历 |
3.6 最小生成树算法
| 算法 | 思想 | 时间复杂度 | 适用 |
|---|---|---|---|
| Prim | 选最近的点扩展 | O(n²) | 稠密图 |
| Kruskal | 选最小的边 | O(elog e) | 稀疏图 |
四、设计模式代码实战(高频模式)
4.1 策略模式(Strategy)代码模板
// 抽象策略interfacePayStrategy{voidpay(doubleamount);}// 具体策略A:支付宝classAlipayStrategyimplementsPayStrategy{publicvoidpay(doubleamount){System.out.println("支付宝支付: "+amount);}}// 具体策略B:微信classWechatPayStrategyimplementsPayStrategy{publicvoidpay(doubleamount){System.out.println("微信支付: "+amount);}}// 上下文classPayContext{privatePayStrategystrategy;publicvoidsetStrategy(PayStrategystrategy){this.strategy=strategy;}publicvoidexecutePay(doubleamount){strategy.pay(amount);}}// 使用publicclassClient{publicstaticvoidmain(String[]args){PayContextctx=newPayContext();ctx.setStrategy(newAlipayStrategy());ctx.executePay(100.0);// 支付宝支付ctx.setStrategy(newWechatPayStrategy());ctx.executePay(200.0);// 微信支付}}适用场景:算法族可互换、避免多重条件判断、需要动态选择算法
4.2 装饰模式(Decorator)代码模板
// 抽象组件interfaceBeverage{StringgetDescription();doublecost();}// 具体组件classEspressoimplementsBeverage{publicStringgetDescription(){return"浓缩咖啡";}publicdoublecost(){return20.0;}}// 抽象装饰器abstractclassCondimentDecoratorimplementsBeverage{protectedBeveragebeverage;}// 具体装饰器:加奶classMilkextendsCondimentDecorator{publicMilk(Beverageb){this.beverage=b;}publicStringgetDescription(){returnbeverage.getDescription()+"+牛奶";}publicdoublecost(){returnbeverage.cost()+5.0;}}// 具体装饰器:加糖classSugarextendsCondimentDecorator{publicSugar(Beverageb){this.beverage=b;}publicStringgetDescription(){returnbeverage.getDescription()+"+糖";}publicdoublecost(){returnbeverage.cost()+2.0;}}// 客户端Beverageb=newEspresso();// 浓缩咖啡 20元b=newMilk(b);// 浓缩咖啡+牛奶 25元b=newSugar(b);// 浓缩咖啡+牛奶+糖 27元适用场景:动态给对象添加职责、避免类爆炸、装饰排列组合灵活
4.3 观察者模式(Observer)代码模板
importjava.util.*;// 观察者接口interfaceObserver{voidupdate(Stringmessage);}// 主题(被观察者)classSubject{privateList<Observer>observers=newArrayList<>();privateStringmessage;publicvoidattach(Observero){observers.add(o);}publicvoiddetach(Observero){observers.remove(o);}publicvoidsetMessage(Stringmsg){this.message=msg;notifyAllObservers();}privatevoidnotifyAllObservers(){for(Observero:observers){o.update(message);}}}// 具体观察者classEmailObserverimplementsObserver{publicvoidupdate(Stringmessage){System.out.println("邮件通知: "+message);}}classSMSObserverimplementsObserver{publicvoidupdate(Stringmessage){System.out.println("短信通知: "+message);}}// 客户端Subjectnews=newSubject();news.attach(newEmailObserver());news.attach(newSMSObserver());news.setMessage("软考软件设计师还有"+89+"天!");// 邮件通知: ...// 短信通知: ...适用场景:事件处理系统、消息订阅、跨系统通知
4.4 设计模式识别秒杀表(高频15种)
| 模式 | 一句话特征 | 典型场景 |
|---|---|---|
| 单例(Singleton) | 一个类只有一个实例 | 配置管理器、数据库连接池 |
| 工厂方法(Factory Method) | 子类决定创建哪个对象 | 日志记录器、数据库访问 |
| 抽象工厂(Abstract Factory) | 创建一组相关对象 | GUI组件族 |
| 建造者(Builder) | 一步步构建复杂对象 | StringBuilder、配置文件 |
| 原型(Prototype) | 通过复制原型创建对象 | 深拷贝、克隆对象 |
| 适配器(Adapter) | 转换接口使原本不兼容的能协作 | 老接口适配新接口 |
| 装饰(Decorator) | 动态添加职责 | Java I/O流、奶茶加料 |
| 代理(Proxy) | 控制对真实对象的访问 | 远程代理、虚拟代理 |
| 外观(Facade) | 提供统一接口简化子系统使用 | 一键启动系统 |
| 桥接(Bridge) | 抽象与实现分离独立变化 | 跨平台GUI |
| 组合(Composite) | 部分-整体树形结构 | 文件系统、组织结构 |
| 享元(Flyweight) | 共享细粒度对象 | 字符串池、棋子坐标 |
| 策略(Strategy) | 封装可互换的算法族 | 支付方式、排序算法 |
| 模板方法(Template Method) | 父类定义骨架,子类实现步骤 | Spring JdbcTemplate |
| 观察者(Observer) | 一对多通知机制 | 事件订阅、消息推送 |
五、计算机组成原理核心计算
5.1 Cache命中率与平均访问时间
公式:
平均访问时间 = 命中率 × Cache访问时间 + (1 - 命中率) × 主存访问时间 = 命中率 × t_cache + (1 - 命中率) × t_main 访问效率 = Cache访问时间 / 平均访问时间 × 100%典型计算:
- Cache访问时间 50ns,主存访问时间 500ns,命中率 90%
- 平均访问时间 = 0.9×50 + 0.1×500 = 45 + 50 = 95ns
- 访问效率 = 50/95 ≈ 52.6%
5.2 Cache映射方式对比
| 映射方式 | 特点 | 冲突概率 | 硬件实现 | 适用 |
|---|---|---|---|---|
| 直接映射 | 主存块只能映射到唯一Cache行 | 高 | 简单 | 大容量Cache |
| 全相联映射 | 主存块可映射到任意Cache行 | 低 | 复杂(需比较所有标记) | 小容量Cache |
| 组相联映射 | 组内全相联、组间直接映射 | 中 | 中等 | 现代主流 |
5.3 流水线性能计算
关键公式:
加速比 = (非流水线执行时间) / (流水线执行时间) 理论最大加速比 = 流水线级数 实际加速比 = n × t / [(k + n - 1) × t] 其中:n = 任务数,k = 流水线级数,t = 时钟周期典型计算(5段流水线,10条指令):
- 流水线周期 = max(各段时间) = Δt
- 非流水线总时间 = n × k × Δt = 10 × 5 × Δt = 50Δt
- 流水线总时间 = (k + n - 1) × Δt = (5 + 10 - 1) × Δt = 14Δt
- 实际加速比 = 50Δt / 14Δt ≈ 3.57
- 理论最大加速比 = 5
5.4 主存地址划分(页式存储)
32位地址,4KB页面,1GB主存:
- 页内偏移 = log₂(4KB) = 12位 → 页内地址范围 0~4095
- 页号 = 32 - 12 = 20位 → 主存页数 2^20 = 1M 页
典型计算:
- 逻辑地址:页号6位 + 页内10位(共16位)
- 页表长度 = 2^6 = 64项
- 物理地址:块号 ? 位 + 页内10位(块大小=页大小=1KB)
六、上午精选真题10道
题1 - 软件测试(黑盒方法)
对于输入条件"学生成绩0~100分",以下边界值设计中错误的是( )。
A. -1, 0, 50, 100, 101
B. 0, 1, 50, 99, 100
C. 0, 50, 100, 101, 102
D. -1, 0, 1, 99, 100, 101
答案: C
解析: 边界值分析应包含边界 ±1、边界和边界内点。C选项少了上边界100,错误。
题2 - 软件测试(覆盖强度)
在白盒测试覆盖标准中,强度最弱的是( )。
A. 语句覆盖
B. 判定覆盖
C. 条件覆盖
D. 路径覆盖
答案: A
解析: 语句覆盖只要求每条语句执行一次,强度最弱。
题3 - McCabe复杂度
某程序流程图中判定结点为5个,则其环形复杂度为( )。
A. 4
B. 5
C. 6
D. 7
答案: C
解析: V(G) = 判定结点数 + 1 = 5 + 1 = 6
题4 - 二叉树
深度为5的二叉树最多有( )个结点。
A. 15
B. 16
C. 31
D. 32
答案: C
解析: 2^5 - 1 = 31
题5 - 二叉排序树
对二叉排序树进行中序遍历,结果是( )。
A. 升序
B. 降序
C. 无序
D. 随机
答案: A
解析: BST的中序遍历得到关键字升序序列。
题6 - 哈夫曼树
在哈夫曼树中,权值越大的叶子结点( )。
A. 离根越远
B. 离根越近
C. 与根的距离相同
D. 位置随机
答案: B
解析: 哈夫曼树构造原则:权值大的叶子靠近根,WPL最小。
题7 - 图的遍历
在无权图中求单源最短路径,应使用( )。
A. DFS
B. BFS
C. Prim
D. Kruskal
答案: B
解析: BFS按层扩展,自然得到无权图最短路径。
题8 - 设计模式(策略模式)
某电商系统支持多种支付方式(支付宝、微信、银联),用户可动态切换。最适合采用( )。
A. 装饰模式
B. 策略模式
C. 观察者模式
D. 单例模式
答案: B
解析: 多种算法可互换 → 策略模式。
题9 - Cache命中
Cache访问时间为50ns,主存访问时间为500ns,命中率为95%,平均访问时间是( )ns。
A. 75
B. 95
C. 100
D. 525
答案: A
解析: 0.95×50 + 0.05×500 = 47.5 + 25 = 72.5 ≈ 75ns
题10 - 流水线
5段流水线执行20条指令,总时间约为( )个时钟周期。
A. 5
B. 20
C. 24
D. 100
答案: C
解析: (k+n-1) = 5+20-1 = 24
七、下午案例分析3道
案例一 - 软件测试方案设计(白盒+黑盒)
说明: 某登录模块的流程图如下,登录需输入用户名(username)和密码(password),系统先校验用户名是否存在,不存在直接拒绝;存在则校验密码,密码错误次数累计,3次错误锁定账号。
开始 → 输入username → 检查用户存在? → 否 → 返回"用户不存在" → 结束 ↓是 输入password ↓ 校验密码正确? ↓是 ↓否 登录成功 错误次数+1 结束 错误次数≥3? ↓是 ↓否 锁定账号 返回"密码错误" 结束问题1(6分): 计算该流程图的McCabe环形复杂度(三种方法各一次)。
参考答案:
- 边数 = 13,结点数 = 10 → V(G) = 13 - 10 + 2 = 5
- 判定结点数 = 4(用户存在/密码正确/错误次数+1/错误次数≥3) → V(G) = 4 + 1 = 5
- 封闭区域数 = 4 → V(G) = 4 + 1 = 5
- 结论:环形复杂度为 5,至少需要5条独立路径才能覆盖所有路径。
问题2(6分): 用黑盒测试方法设计等价类划分测试用例。
参考答案:
- 有效等价类:①用户名存在且密码正确 ②用户名存在密码错误(次数未达上限)
- 无效等价类:①用户名不存在 ②密码错误次数已达3次(锁定状态)③用户名为空 ④密码为空
- 用例示例:
- 用户名=admin,密码=correct → 登录成功
- 用户名=admin,密码=wrong1 → 密码错误(次数=1)
- 用户名=unknown → 用户不存在
- 锁定用户输入任意密码 → 拒绝登录
问题3(3分): 解释为何该模块既要白盒也要黑盒测试。
参考答案:
- 白盒测试:覆盖所有判定分支和路径(如密码错误次数边界),保证内部逻辑正确
- 黑盒测试:从用户视角验证功能完整性(如锁定账号是否符合预期),发现需求层面的问题
- 两者互补:白盒保证代码覆盖率,黑盒保证需求覆盖率
案例二 - 二叉排序树与查找算法
说明: 已知一组关键字 {35, 22, 58, 17, 40, 50, 70},按顺序插入构建一棵二叉排序树(BST)。
问题1(5分): 画出BST并计算其平均查找长度ASL(成功查找)。
参考答案:
BST结构: 35 / \ 22 58 / / \ 17 40 70 \ 50- 查找35:1次
- 查找22:2次
- 查找58:2次
- 查找17:3次
- 查找40:3次
- 查找50:4次
- 查找70:3次
- ASL成功 = (1+2+2+3+3+4+3) / 7 = 18/7 ≈ 2.57
问题2(5分): 如对该BST进行中序遍历,写出结果。
参考答案: 中序遍历结果(升序):17, 22, 35, 40, 50, 58, 70
问题3(5分): 若插入关键字10和60,重画BST并计算新ASL。
参考答案:
- 插入10:作为17的左子树
- 插入60:作为58的右子树
35 / \ 22 58 / / \ 17 40 70 / \ / 10 50 60新ASL = (1+2+2+3+3+4+4+4+3) / 9 = 26/9 ≈ 2.89
案例三 - Cache与流水线性能优化
说明: 某CPU采用5段流水线,Cache访问时间50ns,主存访问时间500ns,Cache命中率90%。系统执行一段包含200条指令的程序。
问题1(6分): 计算该CPU的平均存储访问时间。
参考答案:
- 平均访问时间 = 命中率 × Cache时间 + (1 - 命中率) × 主存时间
- = 0.9 × 50 + 0.1 × 500
- = 45 + 50
- =95 ns
问题2(6分): 计算流水线执行200条指令的总时间(假设每周期10ns)。
参考答案:
- 流水线总周期数 = 流水线级数 + 指令数 - 1 = 5 + 200 - 1 = 204
- 总时间 = 204 × 10 =2040 ns
- 加速比 = (200 × 5 × 10) / 2040 = 10000/2040 ≈ 4.90
问题3(3分): 若Cache命中率提高到95%,重新计算平均访问时间和加速比。
参考答案:
- 新平均访问时间 = 0.95 × 50 + 0.05 × 500 = 47.5 + 25 =72.5 ns
- 性能提升率 = (95 - 72.5) / 95 ≈ 23.7%
八、2026下半年10大可能考点预测
| 排名 | 可能考点 | 趋势 | 备考建议 |
|---|---|---|---|
| 1 | McCabe复杂度三种计算 | 上升 | 公式 + 实际画图计算 |
| 2 | 白盒覆盖标准强度排序 | 稳定 | 必背"语句最弱路径最强" |
| 3 | BST中序遍历特性 | 稳定 | 升序、ASL计算 |
| 4 | 哈夫曼树WPL计算 | 稳定 | 构造过程+WPL公式 |
| 5 | BFS求无权图最短路径 | 稳定 | BFS层序扩展思想 |
| 6 | 策略模式/装饰模式代码 | 上升 | 熟记Java代码骨架 |
| 7 | 设计模式识别秒杀 | 稳定 | 15种模式一句话特征 |
| 8 | Cache平均访问时间公式 | 稳定 | 命中率+访问时间 |
| 9 | 流水线加速比计算 | 上升 | (k+n-1) × Δt 公式 |
| 10 | V模型四阶段对应 | 稳定 | 单元-集成-系统-验收 |
九、专业英语高频术语25个
| 术语 | 中文 | 考试场景 |
|---|---|---|
| Unit Testing | 单元测试 | 软件测试 |
| Integration Testing | 集成测试 | 软件测试 |
| System Testing | 系统测试 | 软件测试 |
| Acceptance Testing | 验收测试 | 软件测试 |
| Regression Testing | 回归测试 | 软件测试 |
| Black-box Testing | 黑盒测试 | 软件测试 |
| White-box Testing | 白盒测试 | 软件测试 |
| Cyclomatic Complexity | 环形复杂度 | McCabe |
| Test Coverage | 测试覆盖率 | 软件测试 |
| Equivalence Partitioning | 等价类划分 | 黑盒测试 |
| Boundary Value Analysis | 边界值分析 | 黑盒测试 |
| Binary Search Tree | 二叉排序树 | 数据结构 |
| Huffman Coding | 哈夫曼编码 | 数据结构 |
| Graph Traversal | 图的遍历 | 数据结构 |
| Depth-First Search | 深度优先搜索(DFS) | 图算法 |
| Breadth-First Search | 广度优先搜索(BFS) | 图算法 |
| Minimum Spanning Tree | 最小生成树 | 图算法 |
| Strategy Pattern | 策略模式 | 设计模式 |
| Decorator Pattern | 装饰模式 | 设计模式 |
| Observer Pattern | 观察者模式 | 设计模式 |
| Cache Hit Rate | Cache命中率 | 计算机组成 |
| Pipeline | 流水线 | 计算机组成 |
| Instruction Cycle | 指令周期 | 计算机组成 |
| Memory Access Time | 存储访问时间 | 计算机组成 |
| Speedup Ratio | 加速比 | 性能评价 |
十、考前30秒速记清单
- 黑盒六方法:等价类、边界值、判定表、因果图、错误推测、场景法
- 白盒覆盖强度排序:语句 < 判定 < 条件 < 判定/条件 < 条件组合 < 路径
- McCabe三公式:边-结+2、判定+1、区域+1
- 二叉树公式:第i层最多2(i-1),深度k最多2k-1,叶子=度2+1
- BST中序:必为升序!构造时小的左子树,大的右子树
- 哈夫曼原则:权大靠根 → WPL最小,前缀编码
- 图存储选型:稠密用邻接矩阵,稀疏用邻接表
- 最短路径:无权图用BFS(层序扩展)
- 最小生成树:稠密Prim(O(n²)),稀疏Kruskal(O(eloge))
- 策略模式:多种算法可互换,Context动态切换
- 装饰模式:动态加职责,包装+继承
- 观察者模式:Subject维护Observer列表,notify时遍历通知
- Cache平均访问:命中率×t_cache + (1-命中率)×t_main
- 流水线总周期:k+n-1(k级流水线,n条指令)
- 页面划分:页内偏移log₂(页面大小),页号=总位-页内位
- V模型对应:单元-集成-系统-验收
- 等价类划分:先分有效/无效 → 选代表值
- 边界值±1:上边界+1、下边界-1、边界本身、边界内点
- 路径覆盖最强:所有可能路径都执行一次
- 设计模式15种:单例、工厂、抽象工厂、建造者、原型、适配器、装饰、代理、外观、桥接、组合、享元、策略、模板、观察者
十一、自测练习题3道
自测1 - 软件测试
对一段代码进行白盒测试,已知该代码有3个判定结点,则至少需要设计多少条测试用例才能达到路径覆盖?
点击查看答案答案: 至少需要 4 条测试用例
解析: 环形复杂度 V(G) = 判定结点数 + 1 = 3 + 1 = 4。V(G)即为独立路径数的上限,即至少需要的测试用例数(路径覆盖下)。
自测2 - BST构造
依次将关键字 {50, 30, 70, 20, 40, 60, 80} 插入到初始为空的BST中,求查找80的查找长度。
点击查看答案构造过程:
50 / \ 30 70 / \ / \ 20 40 60 80查找路径: 50 → 70 → 80,比较3次
答案: 查找长度 = 3
自测3 - 流水线
3段流水线执行100条指令,每段延迟10ns,求总时间和加速比。
点击查看答案计算:
- 总周期数 = k + n - 1 = 3 + 100 - 1 = 102
- 总时间 = 102 × 10 =1020 ns
- 非流水线总时间 = n × k × t = 100 × 3 × 10 = 3000 ns
- 加速比 = 3000 / 1020 ≈2.94
答案: 总时间 1020 ns,加速比约 2.94
十二、89天四阶段冲刺计划
| 阶段 | 时间 | 核心目标 | 行动指南 |
|---|---|---|---|
| 第一阶段:基础精读 | 第1-6周 | 全面了解知识点,构建知识框架 | 快速浏览教程,结合思维导图建立整体印象 |
| 第二阶段:分项专攻 | 第7-12周 | 攻破核心模块,掌握解题技巧 | 上午按模块刷选择题,下午针对DFD/UML/数据库/算法专题突破 |
| 第三阶段:真题实战 | 第13-16周 | 熟悉考试节奏,提升解题速度 | 严格按考试时间刷近5-8年真题,总结答题模板 |
| 第四阶段:冲刺补漏 | 第17-18周 | 查漏补缺,回归基础 | 停止做新题,重点复习错题本,背诵记忆类考点 |
本周任务:
- 精读软件测试章节(V模型、黑盒、白盒、McCabe)
- 精读数据结构章节(二叉树、哈夫曼、图遍历)
- 精读设计模式章节(策略/装饰/观察者代码实战)
- 精读计算机组成章节(Cache、流水线)
- 完成本章10道上午真题
- 完成本章3道下午案例题
十三、考场策略10条
- 测试类型先看对象:模块→单元,接口→集成,系统→系统测试
- 白盒覆盖看强度:路径最强、语句最弱,背诵排序不丢分
- McCabe计算三选一:选自己最有把握的方法快速算出
- BST中序必升序:看到BST中序遍历题立即反应"升序"
- 哈夫曼题三步走:画树、标路径、算WPL
- 最短路径选算法:无权图→BFS,带权图→Dijkstra
- 设计模式记特征:策略-算法族、装饰-加职责、观察者-通知
- Cache题看公式:平均访问 = 命中×Cache + 未命中×主存
- 流水线用公式:总时间 = (k+n-1) × Δt
- 下午题铁三角优先:DFD → 数据库 → UML,稳拿基础分
本期总结: 本期聚焦软件测试与质量保证专题(V模型四阶段对应、黑盒六方法、白盒覆盖强度金字塔、McCabe三种算法)、数据结构算法强化(二叉树核心公式、BST中序升序特性、哈夫曼构造与WPL、图遍历DFS/BFS、最小生成树Prim/Kruskal)、设计模式代码实战(策略模式/装饰模式/观察者模式Java代码 + 15种模式识别秒杀表)、计算机组成原理核心计算(Cache平均访问时间公式、流水线加速比、主存地址划分),覆盖2026下半年命题新风向并辅以真题演练和自测练习。
下期预告: 下一期将聚焦计算机网络与TCP/IP协议族冲刺 + 软件测试高级专题(性能测试/安全测试/自动化测试)