PHPUnit

PHPUnit

安装

全局安装:

brew install phpunit

项目安装:

composer require --dev phpunit/phpunit

推荐项目安装,这样可以使用composer的自动加载。

phpstorm配置

确保是项目安装,配置composer.json的自动加载,添加需要测试的命名空间:

{
    "autoload": {
        "psr-4": {
          "App\\": "App"
        }
      }
}

php->Test Frameworks 添加phpunit。

php->设置phpunit的composer自动加载路径。

如果是全局安装,需要指定自动加载的php文件。

编写

class UserTest extends TestCase
{
    public function testInfo()
    {
        $info = 1;
        self::assertEquals($info, 1);
        return $info;
    }
    /**
     * @depends testInfo
     */
    public function testGetInfo($info)
    {
        self::assertEquals((new User())->getInfo($info), 1);
    }
}

@depends 为声明依赖,依赖申明传递的变量为引用传递,如果需要副本而非引用,则使用 @depends clone

数据供给器

使用@dataProvider声明数据供给方法,批量提交测试数据,例如:

class UserTest extends TestCase
{

    /**
     * @dataProvider testData
     */
    public function testInfo($a, $b, $c)
    {
        self::assertEquals($c, $a + $b);
    }

    public function testGetInfo($info)
    {
        return [
            [1, 2, 3],
            [0, 0, 0],
            [-1, 1, 0],
        ];
    }
}

钩子

  1. setUp:重写此方法可以在每次执行测试之前运行,常用来初始化数据,比如初始化公共对象、初始化数据库连接、初始化文件handle等,这样一次操作,避免多次初始化。

  2. tearDown:重写此方法可以在每次测试完毕之后运行,常用来关闭资源,比如mysql、文件、socket等。

例:

class UserTest extends TestCase
{

    private $obj;

    protected function setUp()
    {
        $this->obj = new User;
    }

    /**
     * @dataProvider testData
     */
    public function testAge($a, $b, $c)
    {
        self::assertEquals($this->obj->age(1), 1);
    }
}

注意:一个类有多个测试方法时,避免每次初始化需要测试的对象,所以就会用到setUp来进行公共的初始化。但是在测试类里面禁止重写构造方法,这会导致测试结果出错!

测试异常

如果判断测试案例会抛出异常,则使用异常测试:

class ObjTest extends TestCase
{
    public function testObj()
    {
        // 此处是在断言后面的代码会抛出异常,且异常为ClassNotFoundException
        $this->expectException(ClassNotFoundException::class);
        new Abc();
    }
}

注意:异常断言需要在代码之前。

Last updated