← 回笔记首页

软考 · D2 技巧图解 · 软件工程②

  1. 1McCabe 环路复杂度与路径数🔥 10/26 套
  2. 2逻辑覆盖🔥 9/26 套
  3. 3关键路径与松弛时间🔥 11/26 套
软考中级 · 软件设计师 · D2 · 软件工程② · 要按步骤推的考点

3 个技巧,20 步图解

D2 里要动手算的三样:McCabe 环路复杂度、逻辑覆盖的用例、关键路径和松弛时间。每一步一张像素图。

怎么用
  1. 每节从上往下看:一张图一步,图下面是这一步怎么想。手机上图里的字小,点图片可以放大,再点一下关掉。
  2. 看完一节,先自己做最后那道练习,再点“看答案”核对。
  3. 学会的一节点“学会了”。测试、维护、质量这些要背的考点在配套的死记硬背页。
🔥 超高频 ≥9 套★ 高频 6–8◇ 常考 3–5· 偶考 ≤2考频 = 2009–2023 的 26 套上午真题里考过几套;近年 = 2016–2023 的 12 套
1

McCabe 环路复杂度与路径数

🔥 10/26 套 · 近年 1/12

三个公式互相验算 · 路径数和 V(G) 不是一回事

这一组的考法和考频(2 个)
  • 🔥 10/26 套 · 近年 1/12McCabe 环路复杂度计算
  • 🔥 9/26 套 · 近年 7/12覆盖用例数与 V(G) 连考

三个公式互相验算;最容易错的是把“路径数”和 V(G) 当成一回事。

一步一步来

  1. 1
    一步一步来 第 1 步示意图

    环路复杂度是 McCabe 提出的复杂性度量。最常用的公式:V(G) 等于有向弧数减结点数,再加二。它还等于判定结点数加一,也等于程序图把平面分成的区域数,图外面那块也要算一个。

    它的含义是程序里独立路径的条数,也就是基本路径测试至少需要的用例数。

  2. 2
    一步一步来 第 2 步示意图

    演算一个例子:这个函数对数组里的正数求和。先把代码画成程序图:1 号结点是初始化,2 号是循环条件,3 号是 if 判断,4 号是累加,5 号是 i 加一,6 号是返回。

  3. 3
    一步一步来 第 3 步示意图

    数一数:有向弧一共七条,循环的回边也算;结点六个。七减六加二,等于三。

  4. 4
    一步一步来 第 4 步示意图

    再用判定结点验算:循环条件和 if,两个判定结点,二加一,也是三。还可以数区域:两块封闭区域加外面一块,还是三。所以基本路径测试至少要三个用例。

  5. 5
    一步一步来 第 5 步示意图

    一个高频陷阱:路径覆盖需要的用例数,不一定等于环路复杂度。

    看两段串联的 if-else:每段两个分支,从入口到出口一共二乘二等于四条路径,路径覆盖要四个用例;而判定结点只有两个,环路复杂度是二加一,等于三。

    规律:路径数按串联的判定相乘,环路复杂度按判定个数加一。

一句话V(G) 等于弧数减结点数加二,也等于判定结点数加一,也等于区域数;含义是独立路径数;别漏了开始、结束结点和回边;路径数按串联相乘,和 V(G) 不是一回事。

练习改编题
某程序依次执行三个互不嵌套的 if-else(每个判定只有一个条件)。(1)要覆盖所有路径,至少需要几个测试用例?(2)该程序的 McCabe 环路复杂度是多少?
(1)A. 3 B. 4 C. 6 D. 8
(2)A. 3 B. 4 C. 6 D. 8
2

逻辑覆盖

🔥 9/26 套 · 近年 7/12

六级覆盖由弱到强 · 用一段经典代码走一遍

这一组的考法和考频(3 个)
  • ★ 8/26 套 · 近年 2/12逻辑覆盖用例数与判定
  • 🔥 9/26 套 · 近年 7/12覆盖用例数与 V(G) 连考
  • ◇ 5/26 套 · 近年 1/12黑盒与白盒方法辨析

用一段经典代码把六级覆盖从弱到强过一遍,每一级至少要几个用例、用例怎么挑。

一步一步来

  1. 1
    一步一步来 第 1 步示意图

    白盒测试依据程序的内部逻辑设计用例,核心是逻辑覆盖。由弱到强六级:语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖,路径覆盖。

  2. 2
    一步一步来 第 2 步示意图

    用一段经典代码把六级过一遍:两个判定,第一个是 A 大于 1 并且 B 等于 0,第二个是 A 等于 2 或者 X 大于 1。真分支记 a、c,假分支记 b、d。

  3. 3
    一步一步来 第 3 步示意图

    语句覆盖最省事,一个用例就够:A=2、B=0、X=4,两个判定都为真,两条赋值语句都执行到了。

  4. 4
    一步一步来 第 4 步示意图

    判定覆盖至少两个用例:再加一个让两个判定都为假的,比如 A、B、X 都等于 1。

  5. 5
    一步一步来 第 5 步示意图

    条件覆盖要让四个条件各取一次真、一次假。本例中这两个用例刚好也满足,所以它们同时满足判定/条件覆盖。

  6. 6
    一步一步来 第 6 步示意图

    条件组合覆盖要让每个判定里四种组合都出现,至少四个用例。注意,这四个用例走不到 a、d 这条路径。

  7. 7
    一步一步来 第 7 步示意图

    路径覆盖要走遍 ac、ad、bc、bd 四条路径,也是四个用例,比如用 A=3、B=0、X=3 补上 ad。所以条件组合覆盖不能代替路径覆盖。

  8. 8
    一步一步来 第 8 步示意图

    还有一个经典陷阱:满足条件覆盖,不一定满足判定覆盖。看这个判定:用例 A=2、B=1 和 A=1、B=0,每个条件都取过真和假,可整个判定两次都是假,判定覆盖并不满足。

    同样,满足语句覆盖也不一定满足判定覆盖。

一句话六级由弱到强是语句、判定、条件、判定/条件、条件组合、路径;语句覆盖最弱;判定覆盖要真假分支各一次;条件覆盖不一定满足判定覆盖,条件组合覆盖也不能代替路径覆盖;白盒依据的是程序的内部逻辑。

练习改编题(经典例题)
对代码 if (A>1 && B==0) X=X/A; if (A==2 || X>1) X=X+1;,用例(A=2, B=0, X=4)和(A=1, B=1, X=1)能满足的最强覆盖是( )。
A. 语句覆盖    B. 判定覆盖(但不满足条件覆盖)
C. 判定/条件覆盖 D. 路径覆盖
3

关键路径与松弛时间

🔥 11/26 套 · 近年 7/12

列出全部路径 · 最长的就是关键路径

这一组的考法和考频(5 个)
  • 🔥 11/26 套 · 近年 7/12关键路径与松弛时间
  • ★ 8/26 套 · 近年 2/12求关键路径工期与里程碑
  • ◇ 5/26 套 · 近年 0/12Gantt 图与 PERT 图对比
  • · 2/26 套 · 近年 1/12活动最早与最晚开始时间
  • · 2/26 套 · 近年 1/12延误或资源冲突重算工期

上午题的图不大,最稳的办法是把路径全部列出来:最长的就是关键路径。最后一步是练习,先自己算再看答案。

一步一步来

  1. 1
    一步一步来 第 1 步示意图

    关键路径是活动图里从起点到终点的最长路径,它的长度就是完成项目的最短工期。注意是最长,不是最短;而且关键路径可能不止一条,只有缩短关键路径上的活动,才能缩短工期。

    演算一个例子:边表示活动,边上的数字是工期,圆圈是里程碑。

  2. 2
    一步一步来 第 2 步示意图

    上午题的图不大,最稳的办法是把路径全列出来:A、C、F 是八天;A、E、H 是九天;B、D、F 是十二天;B、G、H 是十三天。

  3. 3
    一步一步来 第 3 步示意图

    最长的是 B、G、H,十三天,这就是关键路径,项目最短工期十三天。也可以正推每个里程碑的最早时间:多条入边取最大,终点算出来也是十三。

    再算松弛时间:等于关键路径长度,减去经过这个活动的最长路径。

  4. 4
    一步一步来 第 4 步示意图

    经过 A 的路径最长是九天,所以 A 的松弛时间是四天;经过 D 的只有十二天,松弛一天;关键路径上的 B、G、H 松弛时间都是零,一推迟就影响工期。

  5. 5
    一步一步来 第 5 步示意图

    进度图还有两种要分清。甘特图用横条,能清楚表示任务的开始、结束、持续时间和并行,但看不出依赖关系和关键任务;PERT 图能表示依赖关系和关键路径,但不能清晰描述并行情况。

    一句话:甘特图缺依赖,PERT 图缺并行。

  6. 6
    一步一步来 第 6 步示意图

    最后来一道练习:完成这个项目最少需要多少天?活动 C 的松弛时间是多少天?先暂停,把路径列出来算一算。

  7. 7
    一步一步来 第 7 步示意图

    一共三条路径:A、C、F、H 是十四天;A、D、G、H 也是十四天;B、E、G、H 是十五天。

    所以关键路径是 B、E、G、H,最少十五天;经过 C 的最长路径是十四天,松弛时间是十五减十四,等于一天。

一句话关键路径是最长路径,长度就是最短工期,可能不止一条;最早时间正推取最大;松弛时间等于关键路径长减经过它的最长路径,关键活动松弛为零;从第一天开始要加一;甘特图缺依赖,PERT 图缺并行。

软考中级 · 软件设计师 · 两周冲刺 · D2 技巧图解(画面取自像素课逻辑推导专版)