如何排除某些测试的代码覆盖率

时间:2015-08-21 13:01:49

标签: php phpunit code-coverage

我正在收集PHP单元测试的代码覆盖率数据;一些是单元测试,一些是集成测试,检查所有(类和配置)是否正确连接。

我只希望在运行单元测试时收集代码覆盖率信息,因为应该显示的单元测试覆盖目标类中的所有行(理想情况下使用@covers注释)。集成测试不应该显示任何内容,但phpunit的默认位置似乎是,如果它没有任何@covers注释,那么它应该覆盖每行代码每种测试方法直接或间接调用。

请注意,使用<whitelist>中的phpunit.xml会对我有所帮助,因为两组测试都可能会触及某些文件 - 而我想记录的代码覆盖率来自一个另一个。

我已经想到了几种可能的方法,但是没有一种方法看起来很干净&#39;对我来说:

  • 向测试类添加错误的@covers声明&#39;文档块
      

    这样做有效,但如上所述,添加像@covers这样的假/** @covers \stdClass */感觉如此,那么脏。

  • 在每个测试方法的主体周围添加codeCoverageIgnoreStart / End注释(我不知道这是否有效)
      

    与下面类似,这似乎只是排除了包裹的代码行,而不是在其上调用的任何代码行

  • codeCoverageIgnore注释添加到测试类中(我怀疑这不起作用,因为只是从coverage集合中排除类中的代码,但是为任何相关代码恢复集合)
      

    对此进行了测试,因为怀疑它只是具有语义,即测试类中的任何行都不应被视为被覆盖

  • 将它们分成单独的套件,为其中一个而不是另一个套件收集代码覆盖率。 (理想情况下,所有测试都应在一次运行中执行)

有没有比上述任何可能性更清洁的方式?

1 个答案:

答案 0 :(得分:0)

到目前为止我发现的最干净的感觉方法是上面提到的第一种方法的变体:在@covers注释中将类引用给自己:

<?php

namespace FooTestSuite;

/** @covers \FooTestSuite\BarTest */
class BarTest extends \PHPUnit_Framework_TestCase {

    /* ... */

}