26

有没有办法用 DUnit 测量代码覆盖率?或者有没有免费的工具可以做到这一点?你有什么用?你通常追求什么代码覆盖率?

Jim McKeeth:感谢您的详细回答。我说的是 TDD 方法意义上的单元测试,而不仅仅是发生故障后的单元测试。我对通过一些基本的预写单元测试可以实现的代码覆盖率感兴趣。

4

6 回答 6

27

我刚刚使用 Delphi 2010 的基本代码覆盖工具在 Google Code 上创建了一个新的开源项目。 https://sourceforge.net/projects/delphicodecoverage/

现在它可以测量线路覆盖率,但我也计划添加类和方法覆盖率。

它生成带有摘要的 html 报告以及标记的源代码,向您显示哪些行被覆盖(绿色),哪些行未被覆盖(红色)以及没有为它们生成任何代码的其余行。

更新:从Delphi 代码覆盖率 0.3 版开始,您可以生成与 Hudson EMMA 插件兼容的 XML 报告,以显示Hudson中的代码覆盖率趋势。

更新: 0.5 版带来了错误修复、增强的可配置性和清理报告

更新: 1.0 版支持 emma 输出、类和方法的覆盖以及 DLL 和 BPL 的覆盖

于 2010-06-25T05:08:29.390 回答
12

我不知道任何免费工具。 AQTime几乎是分析 Delphi 的事实标准。我没用过,但是快速搜索发现了Discover for Delphi,它现在是开源的,但只是进行代码覆盖。

这些工具中的任何一个都应该让您了解单元测试的代码覆盖率。

于 2009-02-10T11:34:50.840 回答
7

您是指单元测试的代码覆盖率还是陈旧的代码?一般来说,我认为只有失败的可测试代码才应该被单元测试覆盖(是的,我意识到这可能会开始一场圣战,但这就是我的立场)。所以这将是一个相当低的百分比。

另一方面,现在陈旧的代码是另一回事。陈旧的代码是不被使用的代码。对于很多代码,您很可能不需要工具来告诉您这一点,只需在 Delphi 中编译后查找小蓝点即可。任何没有蓝点的东西都是陈旧的。一般来说,如果代码没有被使用,那么它应该被删除。所以这将是 100% 的代码覆盖率。

陈旧代码还有其他情况,例如如果日期是 2 月 31 日,您需要处理特殊代码。编译器不知道它不会发生,所以它编译它并给它一个蓝点。现在您可以为此编写一个单元测试,并对其进行测试,它可能会起作用,但是您只是第二次浪费了时间(第一次是编写代码,第二次是测试它)。

有一些工具可以跟踪程序运行时使用了哪些代码路径,但这只是比较可靠的,因为并非每次都会使用所有代码路径。就像您必须处理闰年的特殊代码一样,它只会每四年运行一次。所以如果你把它拿出来,那么你的程序每四年就会被打破一次。

我想我并没有真正回答你关于 DUnit 和代码覆盖率的问题,但我想我可能给你留下了比你开始时更多的问题。您正在寻找什么样的代码覆盖率?

更新: 如果您采用 TDD 方法,那么在您为其编写测试之前不会编写任何代码,因此本质上您有 100 个测试覆盖率。当然,仅仅因为每个方法都被测试执行并不意味着它的整个行为范围都被执行了。 SmartInspect提供了一种非常简单的方法来测量哪些方法被调用以及时间等。它比 AQTime 少一点,但不是免费的。通过您的更多工作,您可以添加工具来测量每个代码路径(“if”语句的分支等)。当然,您也可以将自己的日志记录添加到您的方法中以获得覆盖率报告,这是免费的(好吧,期待您的时间,这可能比工具更有价值)。如果您使用 JEDI Debug,那么您也可以获得调用堆栈。

如果不进行大量重构,TDD 确实不能轻易地追溯应用到现有代码。尽管较新的 Delphi IDE 能够为每个公共方法生成单元测试存根,从而为您提供 100% 的公共方法覆盖率。您在这些存根中放入的内容决定了覆盖范围的有效性。

于 2009-02-10T09:55:39.417 回答
5

我使用Discover for Delphi,它可以完成工作,用于使用 DUnit 进行单元测试和使用 TestComplete 进行功能测试。

Discover 可以配置为从命令行运行以实现自动化。如:

Discover.exe Project.dpr -s -c -m
于 2009-02-10T15:04:41.413 回答
2

Discover 非常适合我。与 AQTime 不同,它几乎不会减慢您的应用程序的速度。当然,这对你来说可能不是问题。我认为最近版本的 AQTime 在这方面表现更好。

于 2009-02-10T22:40:57.353 回答
1

我已经使用 Discover 多年了,在 BDS2006 之前(包括我使用并仍在使用的最后一个预 XE* 版本的 Delphi)工作得非常出色,但它目前的开源状态,尚不清楚如何使它与XE* 版本的 Delphi。真的很遗憾,因为我喜欢这个工具,几乎在所有方面都快速方便。所以现在我正在转向 delphi-code-coverage...

于 2013-09-05T13:00:03.543 回答