PHPUnit代码覆盖率报告foreach内部存在误报

时间:2018-11-22 09:28:30

标签: php phpunit php-code-coverage

PHPUnit代码覆盖率报告以下功能的100%覆盖率,这显然是错误的:

public function run(){
    foreach ([1] as $value) {                    
        if($value === 1 ){
            echo "Is called\n";             // TRUE positive
        }
        else{
            echo "Not called\n";            // TRUE negative
            echo "Not called either\n";     // FALSE positive
        }
    }
}

最后一行echo "Not called either"没有运行,但是报告说是这样!

如果我将foreach循环的主体重构为另一个函数,报告将正确:

public function run(){
    foreach ([1] as $value) {                    
        $this->run2($value);
    }
}

public function run2($value){
    if($value === 1 ){
        echo "Is called\n";             // TRUE positive
    }
    else{
        echo "Not called\n";            // TRUE negative
        echo "Not called either\n";     // TRUE negative
    }
}

使用PHP 7.2.10-0ubuntu0.18.04.1,Xdebug 2.6.0和PHPUnit 7.3.2在php-code-coverage 6.0.7中进行了测试

我尝试了一些较旧的phpunit版本,并获得了相同的结果。

这是一个错误还是我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

这是由于herehere中所述的PHP当前未解决的错误引起的。

使用标准for loop而不是foreach loop可以避免此问题。或者,通过将foreach主体移动到问题中所述的另一个功能中。