草庐IT

单独运行时,PHPUnit 报告同一测试的不同代码覆盖率百分比

coder 2024-04-17 原文

首先,让我说我已经通过了Reaching 100% Code Coverage with PHPUnitSO以及How to get 100% Code Coverage with PHPUnitSO .我无法借助其中任何一个解决问题。

我的问题是,与运行整个测试套件时相比,PHPUnit 在单独运行时报告同一测试的不同代码覆盖率百分比。因此,当我使用 phpunit test/src/artax/UsesRequestTraitTest 仅运行有问题的特定测试时,我得到以下覆盖率:

但是,如果我在未指定特定测试的情况下使用 phpunit 运行我的全套测试,我将收到同一文件的以下信息:

这是测试的源代码:

<?php

class UsesRequestTraitTest extends PHPUnit_Framework_TestCase
{
  public function testIsInitiallyEmpty()
  {
    $traitObj = $this->getObjectForTrait('artax\UsesRequestTrait');
    $this->assertAttributeEmpty('request', $traitObj);
    return $traitObj;
  }

  /**
   * @depends testIsInitiallyEmpty
   * @covers artax\UsesRequestTrait::setRequest
   * @covers artax\UsesRequestTrait::getRequest
   */
  public function testSetterAssignsRequestProperty($traitObj)
  {
    $r = new artax\blocks\http\HttpRequest();
    $traitObj->setRequest($r);
    $this->assertEquals($r, $traitObj->getRequest());
  }
}

如果您注意的话,您会发现我正在测试 PHP5.4 特性。我正在使用 PHP5.4RC6 和最新的 2.2 xdebug 主干版本,因为 xdebug 的发布版本还不支持 PHP5.4。

这可能(可能?)这是 xdebug 或 phpunit 中的一个错误,由于对新 PHP 版本的支持仍在不断发展,因此尚未解决,但我想在浪费相关各方之前获得其他意见' 不必要的错误报告时间。有谁知道是什么原因造成的,或者如何纠正它,这样我的极客强制症就不会因为 100% 覆盖率的差距而让我发疯吗?

附言这是 60% 覆盖率版本的实际图形覆盖率报告。当测试单独运行时,下面显示的未覆盖线为绿色(覆盖):

更新

我还尝试为特征方法添加 @covers 注释以测试使用 特征的具体类,但这也没有帮助 ...

最佳答案

这似乎与 PHPUnit 的新 getObjectForTrait 方法如何报告特征文件的代码覆盖率有关。你可以read about getObjectForTrait over at Sebastian Bergmann's blog.

当我使用具体的实现类代替内置的 getObjectForTrait 方法来测试特征时,错误消失了。因此,对上面发布的代码进行以下更改可以解决问题:

<?php

class UsesRequestTraitTest extends PHPUnit_Framework_TestCase
{
  public function testIsInitiallyEmpty()
  {
    // trait code coverage not reported correctly using getObjectForTrait
    //$traitObj = $this->getObjectForTrait('artax\UsesRequestTrait');

    // use a concrete implementation instead (see bottom for class definition)
    $traitObj = new TraitImplementationClass();
    $this->assertAttributeEmpty('request', $traitObj);
    return $traitObj;
  }

  /**
   * @depends testIsInitiallyEmpty
   * @covers artax\UsesRequestTrait::setRequest
   * @covers artax\UsesRequestTrait::getRequest
   */
  public function testSetterAssignsRequestProperty($traitObj)
  {
    $r = new artax\blocks\http\HttpRequest();
    $traitObj->setRequest($r);
    $this->assertEquals($r, $traitObj->getRequest());
  }
}

// using this class to test instead of getObjectForTrait resolves the issue
class TraitImplementationClass
{
  use artax\UsesRequestTrait;
}

关于单独运行时,PHPUnit 报告同一测试的不同代码覆盖率百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9098807/

有关单独运行时,PHPUnit 报告同一测试的不同代码覆盖率百分比的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  5. ruby-on-rails - 如何在 ruby​​ 中使用两个参数异步运行 exe? - 2

    exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby​​中使用两个参数异步运行exe吗?我已经尝试过ruby​​命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何ruby​​gems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  8. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  9. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  10. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

随机推荐