Code Coverage 代码覆盖率
我们一起通过简单的示例来看一下 PhpStorm 中代码覆盖率的测试。
依然使用 Laravel 项目框架作为代码演示。
打开 Laravel 项目在 tests/Unit/
目录下添加一个测试文件 CommandNameTranslatorTest
内容如下:
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class CommandNameTranslatorTest extends TestCase
{
//
}
然后添加一个自定义类文件,在 app/
目录下添加一个空的 CommandNameTranslator
类。
<?php
namespace App;
class CommandNameTranslator
{
//
}
CommandNameTranslator
类的功能逻辑很简单,添加一个 toValidatorName
方法,用于分析方法提供的类名参数,将其中的 Command
关键字转换成 Validator
。
首先,来到测试类 CommandNameTranslatorTest
编写一个测试用例:
<?php
namespace Tests\Unit;
use App\CommandNameTranslator;
use PHPUnit\Framework\TestCase;
class CommandNameTranslatorTest extends TestCase
{
/** @test */
// 它将命令名转换为对应的验证器
public function it_translates_a_command_name_to_its_validator_counterpart()
{
$validator_name = (new CommandNameTranslator)->toValidatorName('TaskArchivedCommand');
$this->assertEquals('TaskArchivedValidator', $validator_name);
}
}
此时右键点击选择 More Run/Debug
| Run ... With Coverage
运行之后会抛出错误,因为 CommandNameTranslator
类中当前并没有对应的 toValidatorName
方法。
我们来到 CommandNameTranslator
类中添加 toValidatorName
方法:
<?php
namespace App;
class CommandNameTranslator
{
public function toValidatorName()
{
}
}
在 Debug 面板处选择再次测试,看到编写的 toValidatorName
方法左侧的代码覆盖标识。
但是代码测试的逻辑依然失败,这里需要添加代码逻辑。
<?php
namespace App;
class CommandNameTranslator
{
public function toValidatorName(string $command_name): string
{
return str_replace('Command', 'Validator', $command_name);
}
}
添加上代码逻辑后重新执行代码覆盖测试,可以看到测试成功,并且 CommandNameTranslator
类的代码覆盖率为 100%。
下面我们将 toValidatorName
的代码逻辑修改得复杂些
<?php
namespace App;
class CommandNameTranslator
{
public function toValidatorName(string $command_name): string
{
if ($command_name === 'foo') {
return 'bar';
}
return str_replace('Command', 'Validator', $command_name);
}
}
编写完上面的代码逻辑之后,重新执行代码覆盖,可以看到新增的逻辑 return 语句处没有被覆盖。
并且当前 CommandNameTranslator
类的代码覆盖率为 75%。
这是因为我们编写的测试代码没有覆盖 if 条件的逻辑。
所以可以来到测试类中添加一个测试用例
/** @test */
public function it_returns_bar_if_foo_is_provider()
{
$validatorName = (new CommandNameTranslator)->toValidatorName('foo');
$this->assertEquals('bar', $validatorName);
}
再次运行代码覆盖测试,会发现当前单元测试全部通过并且当前代码覆盖率又回到了 100%。
再次来到 CommandNameTranslator
可以看到所有的代码均已覆盖到。
另外,如果需要修改显示颜色,可以使用快捷键 Command , 来到 Editor
| Color Scheme
| General
可以在 Line Coverage
处分别定义 Full
、Partial
和 Uncovered
的显示颜色。