4

目前,我们的生产系统之一由 1986 年至今编写的 3000 多个程序处理。代码库是用非标准语言编写的,遗憾的是缺乏现代测试工具。

为了提高我们的代码质量,我一直在努力整合流程和构建工具,以改进开发和测试。我刚刚拥有一个完整的行覆盖工具,这样我们就可以在开发过程中帮助识别死代码 + 未测试代码。

现在,我想开始为工具添加路径覆盖。

我该怎么办?

鉴于:

1)线路覆盖工具充当注入代码的预处理器
2)我已经有能力收集我在所述代码中设置的统计信息。

在程序执行时我应该记录哪些数据,我该如何解释它?

如何通过 HTML 表示结果?

我已经阅读了如何开始“编写”代码覆盖工具的问题?,这是关于 Java 的,但它没有帮助(包括论文“Branch Coverage for Arbitrary Languages Made Easy”)。

提前感谢您提供的任何指导!

4

2 回答 2

3

路径覆盖测量是一个棘手的主题。首先,您必须首先定义路径的含义。循环执行 3 次与循环执行 4 次的路径不同吗?如果是这样,您将拥有无限数量的路径。如果没有,即使覆盖了所有路径,也会遗漏测试用例。

可能更好的下一步是分支覆盖:测量是否每个条件都执行了真假。这可以通过记录行号序列来完成。

于 2009-08-19T00:50:05.083 回答
3

要进行路径覆盖,您需要以某种方式获得程序控制流。一个明显的方法是构建一个真实的控制流图,然后遍历它的各个部分以挑选出“路径片段”(例如,基本路径)以用于路径覆盖分析。(您可以尝试通过对源代码进行字符串破解来做到这一点,但您可能会失败;解析和流分析太复杂了)。

请参阅基路径覆盖的意义何在? 关于基础路径的良好stackoverflow讨论。

要实现所需的路径覆盖工具,您可能需要真正完全解析完整的遗留语言。对于 3000 个程序和对测试的强烈要求,使用工业强度的解析器和基础设施来做到这一点是有意义的。

我们的DMS 软件再造工具包不仅可用于构建解析器,还可用于构建控制流分析收集路径覆盖数据所需的工具。(如果您只想收集分支覆盖率数据,那么“任意语言的分支覆盖率”就提出了这一点,但 DMS 不仅仅是解析)。如果您需要,DMS 还支持构建控制(和数据流)图,就像您在这种情况下所做的那样;请参阅DMS 构造的控制流图

DMS 已用于为 C、Java 和 COBOL 构建控制和数据流分析器,并已用于为大约 30 多种语言构建解析器。如果您对此很认真,它可以处理您的遗留语言。

EDIT 10/31/2011: DMS can now compute control flow for C++, so it would be a great foundation for a C++ path coverage tool.

于 2009-08-19T07:55:41.120 回答