PHPSpec和覆盖率报告

14

有人知道如何从 PHPSpec 测试生成覆盖率报告的方法吗?

我考虑过使用 xdebug,但据我所知它不能为 Jenkins 生成报告。

3个回答

38

当前版本(1.4.0)不支持代码覆盖率。欢迎您的反馈。以下是我对于代码覆盖率的看法。

PHPSpec是一个BDD框架。如果您在编写类之前描述了其行为,那么您就是在进行BDD。以这种方式编写代码,您的类的相关行为都将通过“测试”得到充分覆盖。

代码覆盖工具和度量标准对于旧代码(没有规格/测试的代码)非常有用。您可以使用此类工具尝试达到一个点,使您可以继续TDD,并受益于免受回归的保护。

总的来说,这种方法并不像首先描述行为(TDD)那样有效。单个方法可能足够简单,可以响应多项所需的行为。在进行TDD时,您会不断地进行重构和删除不需要的代码。最终您会拥有10个规格(测试),所有规格都命中相同的代码行,但都描述着不同所需的行为,这些规格对于理解代码都很有用。

“测试”一词的问题之一在于它让人们认为TDD是关于验证的。实际上,它是关于交流的。StoryBDD是利益相关者之间的交流,而SpecBDD是类之间的交流。简单,实时,适度的文档。

进行代码覆盖以确保您已经测试过您的代码是一种谬论,最多只是一个差劲的度量标准。不幸的是人们认为测试结构比测试行为更重要。这就是为什么BDD诞生的原因,它帮助重新将重点放回正确的轨道上。确保测试代码的某个部分是虚假的,因为该部分代码可以执行多项任务,如果进行了良好的重构,则应该如此。此外,您最终会测试访问器、修饰符和构造函数等内容。

但是我很乐意听取社区的看法。我可以看到代码覆盖率可能会有用。另外,由于Sebastian Bergmann很好地将其模块化出PHPUnit,我可以在PHPSpec中重复使用它。我更喜欢您首先编写规格。您将免费获得您相关行为的100%代码覆盖。在我看来,这才是最重要的事情。


1
您作为一位经验丰富的人,您的方法对我来说非常有价值。我正在开始在我的团队中引入BDD,这就是为什么我非常关心做得正确并收集有用的统计信息的原因 :) - spamec
这是一个很好的方法,适用于新项目,但如果我们想在现有的遗留项目中实施BDD呢?您有这方面的经验吗?为现有代码编写规范有意义吗?我认为对于旧代码应该有单元测试,而对于新代码则需要规范。 - Jacek Wysocki
1
很棒的回答,Marcello。不过,代码覆盖率可以在缺乏信心时给予保证和信仰 :) - rafi
1
当需要删除某些功能时,这也可能会非常有用。 - Mathieu
1
当您开始编写代码时,每行代码都是为了满足规范而编写的。因此,没有无用代码。但是,随着业务需求的变化,规范也必须改变。因此,生产代码也会发生变化 - 有些代码可能最终变得无用。代码覆盖率有助于追踪它。正如他们所说,为现有代码编写规范也将非常有帮助。 - Luigi
CI是这里的使用案例,您肯定希望整个团队编写测试,而不仅仅是少数看到重点的开发人员。 - FloydThreepwood

9

使用Code Coverage extension to PHPSpec生成clover。

如果您想要合并来自PHPSpec和其他工具(例如PHPUnit)的覆盖数据,则可以使用PHP_CodeCoverage输出格式,并在合并模式下使用phpcov工具。

示例:

# phpspec.yml
extensions:
    - PhpSpec\Extension\CodeCoverageExtension

code_coverage:
    output: /tmp/coverage/phpspec.phpcoverage
    format: php

# phpunit.xml
<logging>
   <log type="coverage-php" target="/tmp/coverage/phpunit.phpcoverage" />
</logging>

# from the command line
phpcov merge --clover coverage.xml /tmp/coverage

这将为您提供两个工具的覆盖率,最终以适合像Jenkins的Clover格式呈现。


6

我认为一个代码覆盖率生成器对于正在接受BDD样式测试过程的遗留系统非常有用,因为你可以知道哪些代码没有被测试。我个人会很感激PHPSpec能够提供这样的功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接