Page 189 - 《软件学报》2026年第5期
P. 189
2068 软件学报 2026 年第 37 卷第 5 期
需要注意的是, 在上述 GEN 的定义中, 我们通过公式 (6) 考虑了类之间的间接耦合对类重要性的影响. 实际
上, 公式 (6) 的构建借鉴了万有引力公式 [32,33] :
Mm
F = G (11)
r 2
其中, F 是两个物体之间的引力; G 是引力常量; M 和 m 是两物体的质量; r 是两物体之间的距离. 不难发现, 为了
构建公式 (6), 我们将万有引力公式中物体的质量替换成了节点的重要性, 距离替换成了 CCN 中两节点间的最短
d i,j , G 替换成了公式 r .
d i,j
路径长度 (7) 中定义的
i,j
此外, 我们还通过公式 (9) 考虑了邻居节点度分布的多样性对类节点重要性的影响. 公式 (9) 求的是 P x 的熵,
反映了类节点 w 入度上的邻居节点的度分布情况. 节点的熵越大, 通常意味着这个节点连接了系统中更多不同的
信息流或数据流, 它在系统中发挥着更重要的作用.
综上可知, 我们提出的 GEN 指标综合考虑了类之间的间接耦合和邻居节点度分布的多样性对类重要性的影
响, 从而可以更全面地刻画软件网络中类节点的结构特征及类的重要性.
1.3 类排序及关键类识别
在得到了一个软件的 CCN 之后, 我们可以使用 GEN 指标度量每个类节点的重要性, 进而可以依据类的 GEN
值对所有类进行降序排列, 并通过设定阈值过滤非关键类, 从而得到候选的关键类. 在本文中, 降序排序过程包含
两个阶段: 1) 依据 GEN 值进行初步排序; 2) 使用动态分析对初步排序的结果进行优化. 下文将从初步排序、排序
优化和阈值设定这 3 个方面进行介绍. 同时, 因为排序优化依赖于阈值设定, 所以我们将先介绍阈值设定.
(1) 阈值设定
在识别候选关键类的时候, 我们将设置一个阈值 k, 并将排名的前 k×|V| (k 为百分比, |V|为 CCN 中的节点数)
个或前 k 个类视为从该软件中识别出的候选关键类. 在现有的研究中, 阈值 k 一般有两种取值方式.
● k 取值 15%, 即将软件中前 15%×|V|的类视为候选关键类 [5−9,14,19] . 为了更全面地评估 CDAG 方法的性能, 我
们还选取了 1%–14% (步长为 1%) 共 14 个值作为新的阈值.
● k 取值 25, 即将软件中 top-25 个类视为候选关键类 [22] . 为了更全面地评估 CDAG 方法的性能, 我们还选取
了 1–24 (步长为 1) 共 24 个值作为新的阈值.
(2) 初步排序
我们以类的 GEN 值作为排序的依据, 并使用快速排序算法对所有类进行降序排列. 尽管节点的引力熵都是小
数, 但是仍然无法避免多个节点具有相同的引力熵而无法准确排序的问题. 在本文中, 当这种情况发生时, 我们通
过“求均值位置”的方式确定它们的最终排序位置, 即: 计算这些相同值中排在第 1 的类节点的位置 (设为 a) 以及
排在最后的类节点的位置 (设为 b), 并将这些具有相同值的类节点的位置设置为 (a+b)/2.
(3) 排序结果优化
如前所述, 静态分析构建的 CCN 会存在“不准”的问题. “不准”的 CCN 会导致所识别的关键类也不准. 为了提
高关键类识别的准确性, 我们使用动态分析技术对初步排序的结果进行优化. 优化过程主要包含 5 个步骤: ① 生
成测试用例; ② 执行测试用例, 从而获得执行轨迹; ③ 分析执行轨迹, 从而获得执行过程中涉及的类的集合; ④ 对
类的集合进行扩充; ⑤ 微调排序结果. 步骤①–③是动态分析的主要过程.
① 生成测试用例
在测试用例的构建过程中, 我们需要使生成的测试用例能够尽可能全面地覆盖系统的功能. 对于 GUI (图形用
户界面) 系统, 用户操作手册通常能够较为完整地描述软件的功能和执行场景, 这为测试用例的自动生成提供了丰
富的语义信息. 在本文中, 我们通过分析用户操作手册中的文本信息来自动提取与操作相关的动宾结构 (即代表操
作的动词和代表操作对象的名词), 进而自动生成符合实际操作流程的测试用例.
我们使用 Stanford Parser [37] 工具对用户操作手册中的文本进行分析. 首先, 我们对句子进行预处理, 将其拆分
为多个子句, 并对每个子句逐词标注词性 (如动词、名词、形容词等). 其次, 根据依存关系分析句子的结构, 进而
构建句子的依赖树, 并明确句子结构中的主语、宾语、动词等核心要素, 以及它们之间的相互关系. 其中, 动词代

