我正在开发一个学习体验的个人项目,同时也要实现一个体面的代码.这种教育的一部分,并使其成为一个体面的代码,是单元测试.我最近潜入了PHPUnit及其代码覆盖工具.
我遇到了一种具有特定实现的情况,其中使用的编码标准导致代码覆盖丢失.在这个特定的例子中,打破使用的编码标准会导致代码覆盖率从88%跳到94%.
在一个方法中,我有两行,如下所示
// .. some data validation stuff
trigger_error('Error validating the stuff', E_USER_WARNING);
}
Run Code Online (Sandbox Code Playgroud)
数据验证和东西在这里并不重要,}是的.现在,当单元测试超过这行代码时,a PHPUnit_Framework_Error会抛出到该行之前},因为代码永远不会实际继续到大括号的末尾,所以代码覆盖率永远不会捕获该行.
如果我做
// .. some data validation stuff
trigger_error('Error validating the stuff', E_USER_WARNING);}
Run Code Online (Sandbox Code Playgroud)
我的代码覆盖率增加了6%.我试过设置PHPUnit_Framework_Error_Warning::$enabled到false后来我在终端得到一个丑陋的,预期的错误消息,因为我想最终被除了我自己的单元测试的错误消息的人使用这个项目是不可接受的.另外,我真的希望我的编码风格能够始终如一地实现.代码风格的违规可能会在代码的进一步删除时跳出来,这意味着我还必须添加一个可怕的注释来解释为什么大括号被移动......可能在多个地方.
我想我的问题是:
}?})我正在使用PHPUnit 3.6.7,PHP_CodeCoverage 1.1.1和Xdebug 2.1.2。当我让PHPUnit将我的代码覆盖率统计信息写入三叶草样式的XML文件时,它偶尔会显示出一个粗斜体,因为没有被测试覆盖。
我在网上看到很多关于PHPUnit何时“到达”花括号的讨论,但是我不了解发生了什么的一般概念。例如,我在一行上的覆盖范围为零:
if (is_array($foo)) {
foreach ($foo as $bar) {
if (property_exists($bar, 'baz')) {
return $bar;
}
}
} // this line has 0 coverage
return null;
Run Code Online (Sandbox Code Playgroud)
和这里:
class Foo
{
public $myProperty;
public function myMethod()
{
$this->myProperty = '1';
}
} // this line has 0 coverage
Run Code Online (Sandbox Code Playgroud)
我项目中的其他类都没有这个问题。它们的大括号根本不会显示在XML文件中,因此它们没有被列为零覆盖率。
我知道PHP_CodeCoverage 1.1.2(尚未发布)会让我在花括号后加上“ // @codeCoverageIgnore”注释,但是在此之前,我想知道正在发生什么,以便可以修复测试给我完整的报道。告诉我何时将花括号算作“被遮盖”或“未被遮盖”的拇指法则是什么?
这段代码使用PHP/Xdebug(在Windows 7 x64上使用Xdebug 2.2.1和PHP 5.4,我也添加了一个行计数器以便于阅读):
1: xdebug_start_code_coverage();
2:
3: for ($ii = 0; $ii < 3; ++$ii)
4: $x = time();
5:
6: if (false)
7: echo "Never executed.";
8:
9: echo var_dump(xdebug_get_code_coverage());
Run Code Online (Sandbox Code Playgroud)
..我得到这个输出(我修改了一些值,使其更具可读性):
array (size=1)
'..\testpage.php' =>
array (size=4)
3 => int 1
4 => int 1
7 => int 1
9 => int 1
Run Code Online (Sandbox Code Playgroud)
Xdebug网站上的文档说:
"元素中的值表示此行上已执行的执行单元总数."
资料来源:http://www.xdebug.com/docs/code_coverage
显然输出是错误的.第3行和第4行应该执行三次,而Xdebug分别执行1次.第6行应该执行一次,Xdebug完全没有说法.第7行肯定不会被执行,但Xdebug说它确实执行了一次.应该说输出在有或没有花括号的情况下保持不变.
在这个网址:http://xdebug.org/archives/xdebug-general/0377.html
.. Derick Rethans被抓住说(7年前!),不知何故文档是错误的(现在仍然是),Xdebug只返回-1,0或1.但是,正如我的例子所示,Xdebug直接返回1并且被操纵的计数器似乎使他的选择任意.即使Xdebug确实返回-1,0或1,我也不知道这些值是什么.
所以,你们中的任何一位精英编码员都有自己的想法?如果Xdebug在这里出现严重问题,这是否意味着我不能相信任何其他用于分析和代码覆盖的应用程序和插件,而这些应用程序和代码覆盖又使用Xdebug?我在想Phing和PHPUnit似乎是一个普通的婚姻.
如果你想在这个问题上详细阐述一下; 如果Xdebug有问题,所有依赖的应用程序,您在PHP中使用什么代码覆盖率报告?
编辑:如果我发送参数XDEBUG_CC_UNUSED或XDEBUG_CC_DEAD_CODE作为参数,上面列出的输出使用相同的代码示例xdebug_start_code_coverage …
我正在编写Zend Framework应用程序并使用PHPUnit对其进行单元测试.总的来说,事情正在顺利进行,但是我有一个小的,但烦人的PHPUnit和代码覆盖问题 - 它有时会告诉我一个特定的行没有经过测试,我不知道如何强制它进行测试.
例如,在下面的代码中,我启动了两个测试:一个带有GET请求,一个带有POST请求.测试通过,这一切都很好.但是,当我查看代码覆盖率时,它会向我显示"else"行未执行.
public function editAction()
{
if ($request->isPost()) {
// do actions related to POST
} else {
// do action related to GET
}
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?作为一个侧面问题,您通常坚持单元测试,直到您获得100%的代码覆盖率?或者这不是很实用吗?
非常感谢......