【问题标题】:how to run php unit multiple times and concatenate the coverage report?如何多次运行php单元并连接覆盖率报告?
【发布时间】:2015-05-16 08:30:57
【问题描述】:

我的测试代码充满了最终的静态类。虽然我们无法重构它以获得更好的测试,但我有一个中间解决方案,可以在它自己的进程上运行几个小测试。一切正常。但我没有得到覆盖率报告,因为一个覆盖另一个。

我目前正在 clover 中生成报告,但我对其他报告非常开放。

我的测试仅在 phpunit 运行时有效:

/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/aTest.php
OK (1 test, 1 assertions)
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/bTest.php
OK (1 test, 1 assertions)
/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/cTest.php
OK (1 test, 1 assertions)

但这会导致每次运行都会抹去前一次的报告。所以我只得到最后一个的报告。如果我尝试按照 phpunit 期望生成完整报告的方式运行它们,我会失败,因为我的所有类都包含它们自己的静态类。

/home/y/bin/phpunit --coverage-html clover --coverage-clover clover/report.xml --include-path src/  tests/
. (first test pass)
PHP Fatal error:  Cannot redeclare class Something
make[1]: *** [phpunit_run] Error 255

(但即使使用--process-isolation --no-globals-backup,上述内容也会失败,因为它们的意思并不完全一致......)——这不是关于如何在 php 单元上正确进行进程隔离的另一个问题。我很好地运行了几次,我只想要一个完整的覆盖率报告:)

有没有办法让测试像第一个代码块一样正确运行(即在多个进程上避免污染全局类声明空间),但仍然有全面的代码覆盖率报告?

谢谢!

【问题讨论】:

    标签: php unit-testing phpunit


    【解决方案1】:

    Schleis 的回答对我不起作用。 unserialize() 方法在我的情况下会引发错误:偏移处错误...

    但是有一个非常简单的方法可以实现这一点:

    按照here的描述下载phpcov。

    让 phpunit 生成 php 覆盖率报告:

    phpunit --coverage-php coverage/cov/foo.cov tests/foo
    phpunit --coverage-php coverage/cov/bar.cov tests/bar
    

    现在您有 2 个 .cov 文件。然后在你最喜欢的 shell 中:

    phpcov merge --clover clover.xml /coverage/cov
    

    会生成一个clover.xml报告文件。

    【讨论】:

      【解决方案2】:

      您必须编写解决方案脚本,我不知道有一个选项可以让 phpunit 将其他运行的覆盖率加在一起。但是 phpunit 代码让这不会太痛苦。

      您需要使用--coverage-php 选项来获取覆盖率报告。这将更容易使用 php 脚本将它们组合在一起。此选项输出带有序列化 PHP_CodeCoverage 对象的文件。该对象有一个方法merge,可用于合并报表。然后您可以使用适当类型的报表对象为您生成输出。

      https://github.com/sebastianbergmann/php-code-coverage/tree/master/src/CodeCoverage/Report

      由于现在用于分发 PHPUnit 的 .phar 文件,我确实遇到了包含 PHPUnit 对象的问题。您可能想考虑使用这个.gist for your own autoinclude.

      您的脚本将如下所示:

      $fileList = ['file1', 'file2', 'file3']; //or read from dir, however you get the list.
      $coverageReports = [];
      foreach($fileList as $file) {
          $coverageReports[] = unserialize(file_get_contents($file));
      }
      
      $mainReport = new PHP_CodeCoverage(); //Could also use one of the other ones that were generated.
      
      foreach($coverageReports as $coverageReport) {
          $mainReport->merge($coverageReport);
      }
      
      //Change this object depending on the format you want.
      $htmlReport = new PHP_CodeCoverage_Report_HTML();  
      
      $htmlReport->process($mainReport);
      

      【讨论】:

        猜你喜欢
        • 2019-03-16
        • 1970-01-01
        • 2016-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-23
        • 2023-02-18
        • 2019-11-01
        相关资源
        最近更新 更多