3 个技巧,20 步图解
D2 里要动手算的三样:McCabe 环路复杂度、逻辑覆盖的用例、关键路径和松弛时间。每一步一张像素图。
- D2-死记硬背D2 其他要背的考点,含晚间知识产权①
- 每节从上往下看:一张图一步,图下面是这一步怎么想。手机上图里的字小,点图片可以放大,再点一下关掉。
- 看完一节,先自己做最后那道练习,再点“看答案”核对。
- 学会的一节点“学会了”。测试、维护、质量这些要背的考点在配套的死记硬背页。
McCabe 环路复杂度与路径数
🔥 10/26 套 · 近年 1/12三个公式互相验算 · 路径数和 V(G) 不是一回事
这一组的考法和考频(2 个)
- 🔥 10/26 套 · 近年 1/12McCabe 环路复杂度计算
- 🔥 9/26 套 · 近年 7/12覆盖用例数与 V(G) 连考
三个公式互相验算;最容易错的是把“路径数”和 V(G) 当成一回事。
一步一步来
- 1
环路复杂度是 McCabe 提出的复杂性度量。最常用的公式:V(G) 等于有向弧数减结点数,再加二。它还等于判定结点数加一,也等于程序图把平面分成的区域数,图外面那块也要算一个。
它的含义是程序里独立路径的条数,也就是基本路径测试至少需要的用例数。
- 2
演算一个例子:这个函数对数组里的正数求和。先把代码画成程序图:1 号结点是初始化,2 号是循环条件,3 号是 if 判断,4 号是累加,5 号是 i 加一,6 号是返回。
- 3
数一数:有向弧一共七条,循环的回边也算;结点六个。七减六加二,等于三。
- 4
再用判定结点验算:循环条件和 if,两个判定结点,二加一,也是三。还可以数区域:两块封闭区域加外面一块,还是三。所以基本路径测试至少要三个用例。
- 5
一个高频陷阱:路径覆盖需要的用例数,不一定等于环路复杂度。
看两段串联的 if-else:每段两个分支,从入口到出口一共二乘二等于四条路径,路径覆盖要四个用例;而判定结点只有两个,环路复杂度是二加一,等于三。
规律:路径数按串联的判定相乘,环路复杂度按判定个数加一。
一句话V(G) 等于弧数减结点数加二,也等于判定结点数加一,也等于区域数;含义是独立路径数;别漏了开始、结束结点和回边;路径数按串联相乘,和 V(G) 不是一回事。
三个判定串联,路径数是二乘二乘二,等于八,所以(1)选 D;判定结点三个,环路复杂度是三加一,等于四,所以(2)选 B。
逻辑覆盖
🔥 9/26 套 · 近年 7/12六级覆盖由弱到强 · 用一段经典代码走一遍
这一组的考法和考频(3 个)
- ★ 8/26 套 · 近年 2/12逻辑覆盖用例数与判定
- 🔥 9/26 套 · 近年 7/12覆盖用例数与 V(G) 连考
- ◇ 5/26 套 · 近年 1/12黑盒与白盒方法辨析
用一段经典代码把六级覆盖从弱到强过一遍,每一级至少要几个用例、用例怎么挑。
一步一步来
- 1
白盒测试依据程序的内部逻辑设计用例,核心是逻辑覆盖。由弱到强六级:语句覆盖,判定覆盖,条件覆盖,判定/条件覆盖,条件组合覆盖,路径覆盖。
- 2
用一段经典代码把六级过一遍:两个判定,第一个是 A 大于 1 并且 B 等于 0,第二个是 A 等于 2 或者 X 大于 1。真分支记 a、c,假分支记 b、d。
- 3
语句覆盖最省事,一个用例就够:A=2、B=0、X=4,两个判定都为真,两条赋值语句都执行到了。
- 4
判定覆盖至少两个用例:再加一个让两个判定都为假的,比如 A、B、X 都等于 1。
- 5
条件覆盖要让四个条件各取一次真、一次假。本例中这两个用例刚好也满足,所以它们同时满足判定/条件覆盖。
- 6
条件组合覆盖要让每个判定里四种组合都出现,至少四个用例。注意,这四个用例走不到 a、d 这条路径。
- 7
路径覆盖要走遍 ac、ad、bc、bd 四条路径,也是四个用例,比如用 A=3、B=0、X=3 补上 ad。所以条件组合覆盖不能代替路径覆盖。
- 8
还有一个经典陷阱:满足条件覆盖,不一定满足判定覆盖。看这个判定:用例 A=2、B=1 和 A=1、B=0,每个条件都取过真和假,可整个判定两次都是假,判定覆盖并不满足。
同样,满足语句覆盖也不一定满足判定覆盖。
一句话六级由弱到强是语句、判定、条件、判定/条件、条件组合、路径;语句覆盖最弱;判定覆盖要真假分支各一次;条件覆盖不一定满足判定覆盖,条件组合覆盖也不能代替路径覆盖;白盒依据的是程序的内部逻辑。
两个用例让两个判定各真一次、假一次,四个条件也各真假一次,所以满足判定/条件覆盖;它们只走了 ac 和 bd 两条路径,达不到路径覆盖,选 C。
关键路径与松弛时间
🔥 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
关键路径是活动图里从起点到终点的最长路径,它的长度就是完成项目的最短工期。注意是最长,不是最短;而且关键路径可能不止一条,只有缩短关键路径上的活动,才能缩短工期。
演算一个例子:边表示活动,边上的数字是工期,圆圈是里程碑。
- 2
上午题的图不大,最稳的办法是把路径全列出来:A、C、F 是八天;A、E、H 是九天;B、D、F 是十二天;B、G、H 是十三天。
- 3
最长的是 B、G、H,十三天,这就是关键路径,项目最短工期十三天。也可以正推每个里程碑的最早时间:多条入边取最大,终点算出来也是十三。
再算松弛时间:等于关键路径长度,减去经过这个活动的最长路径。
- 4
经过 A 的路径最长是九天,所以 A 的松弛时间是四天;经过 D 的只有十二天,松弛一天;关键路径上的 B、G、H 松弛时间都是零,一推迟就影响工期。
- 5
进度图还有两种要分清。甘特图用横条,能清楚表示任务的开始、结束、持续时间和并行,但看不出依赖关系和关键任务;PERT 图能表示依赖关系和关键路径,但不能清晰描述并行情况。
一句话:甘特图缺依赖,PERT 图缺并行。
- 6
最后来一道练习:完成这个项目最少需要多少天?活动 C 的松弛时间是多少天?先暂停,把路径列出来算一算。
- 7
一共三条路径:A、C、F、H 是十四天;A、D、G、H 也是十四天;B、E、G、H 是十五天。
所以关键路径是 B、E、G、H,最少十五天;经过 C 的最长路径是十四天,松弛时间是十五减十四,等于一天。
一句话关键路径是最长路径,长度就是最短工期,可能不止一条;最早时间正推取最大;松弛时间等于关键路径长减经过它的最长路径,关键活动松弛为零;从第一天开始要加一;甘特图缺依赖,PERT 图缺并行。