编写路径覆盖工具

时间:2009-08-18 21:15:50

标签: testing code-coverage multivalue

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

为了提高我们的代码质量,我一直致力于整合流程和构建工具,以改进开发和测试。我只有一个完整的线覆盖工具,以便我们可以在开发过程中帮助识别死代码+未经测试的代码。

现在,我想开始为该工具添加Path Coverage。

我应该怎么做?

鉴于:

1)线覆盖工具充当注入代码的预处理器 2)我已经能够收集我在代码中设置的统计数据。

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

如何通过HTML表示结果?

我已经阅读了关于Java的问题How to get started “writing” a code coverage tool?,但它没有帮助(包括文章“任意语言的分支覆盖范围变得容易”)。

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

要进行路径覆盖,您需要以某种方式获取程序控制流程。一种显而易见的方法是构造一个真实的控制流图,然后遍历它的一部分,以选出要在路径覆盖分析中使用的“路径片段”(例如,基础路径)。 (您可以尝试通过字符串黑客攻击源代码来执行此操作,但您可能会失败; 解析和流分析太复杂了)。

参见What's the point of basis path coverage? 在基础路径上进行良好的stackoverflow讨论。

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

我们的DMS Software Reengineering Toolkit不仅可用于构建解析器,还可用于构建控制流分析收集路径覆盖率数据所需的工具。 (“任意语言的分支覆盖范围”提出了这一点,如果你想要做的只是收集分支覆盖数据,但DMS不仅仅是解析)。 如果需要,DMS还支持构建控制(和数据流)图, 正如你在这种情况下所做的那样;见DMS constructed control flow graphs

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

EDIT 10/31/2011:DMS现在可以为C ++计算控制流,因此它将成为C ++路径覆盖工具的良好基础。