PHPStorm是PHP开发利器,PHPUnit可以算得上是PHP中单元测试利器。

PHPStorm产品网址:https://www.jetbrains.com/zh-cn/phpstorm/promo/
PHPUnit产品网址:https://phpunit.de/
PHPUnit产品帮助文档:https://phpunit.readthedocs.io/zh_CN/latest/

举例来看如何在PhpStorm中应用到PHPUnit来完成单元测试。

1、在PHPStorm中创建一个空白项目
PhpStorm中创建空白项目

2、创建src、tests目录,创建项目的composer.json文件,并在require区域添加对phpunit的依赖
Add composer.json

3、执行Composer下的Install,安装PhpUnit
Composer Install PHPUnit

4、撰写业务程序,模拟一个消费者买苹果的行为

namespace BoxFun;

class Apple
{
    public function getPrice()
    {
        return 6;
    }

    public function buy($number)
    {
        return $number * $this->getPrice();
    }
}
namespace BoxFun;

class Consumer
{
    private $totalMoney;

    public function __construct($money)
    {
        $this->totalMoney = $money;
    }

    public function buy(Apple $apple, $number)
    {
        $needMoney = $apple->buy($number);
        if ($needMoney > $this->totalMoney) {
            return false;
        } else {
            $this->totalMoney -= $needMoney;
            return true;
        }
    }
}

5、编写单元测试代码

namespace BoxFun;

use PHPUnit\Framework\TestCase;

class ConsumerTest extends TestCase
{
    protected $custom;

    /**
     * 测试前初始化消费者手里多少钱
     */
    protected function setUp():void
    {
        $this->custom = new Consumer(50);
    }

    /**
     * 测试超过金额的购买是否返回False
     */
    public function testBuy()
    {
        $result = $this->custom->buy(new Apple(), 10);
        $this->assertFalse($result);
    }
}

6、执行单元测试
Run PHPUnit
会显示无法找到BoxFun\Consumer这个类
Class Not Found

7、解决这个问题,既然缺少这个类文件,那我们就在单元测试代码中加上。
更新后的单元测试代码是:

namespace BoxFun;

use PHPUnit\Framework\TestCase;

require __DIR__."/../../src/BoxFun/Apple.php";
require __DIR__."/../../src/BoxFun/Consumer.php";

class ConsumerTest extends TestCase
{
    protected $custom;

    /**
     * 测试前初始化消费者手里多少钱
     */
    protected function setUp():void
    {
        $this->custom = new Consumer(50);
    }

    /**
     * 测试超过金额的购买是否返回False
     */
    public function testBuy()
    {
        $result = $this->custom->buy(new Apple(), 10);
        $this->assertFalse($result);
    }
}

再次执行单元测试,显示成功。
PHPUnit running OK

8、采用Composer的Autoload机制来自动加载所需的类,去除掉单元测试中的require代码。
在tests目录下创建bootstrap.php文件,代码如下:

include_once __DIR__.'/../vendor/autoload.php';

$classLoader = new \Composer\Autoload\ClassLoader();
$classLoader->addPsr4("BoxFun\\", __DIR__."/../src/BoxFun/", true);
$classLoader->register();

调整运行测试代码的配置,设置bootstrap对应的文件。
Edit configuration
去除掉单元测试代码中require部分代码,再次运行单元测试,测试通过。

发表评论