PHPUnit 是什么

PHPUnit 是一个面向 PHP 程序员的测试框架,这是一个 xUnit 的体系结构的单元测试框架。

PHPUnit 的官网地址为:https://phpunit.de/,中文镜像网站:http://www.phpunit.cn/

安装 PHPUnit

PHPUnit 有两种安装方式,一种是下载 PHAR 发行包进行全局安装,一种是使用 composer 来为某一个项目安装。

推荐使用 composer 安装,本文也是使用这种安装方式。

首先以上一篇文章创建的空的 composer 包为基础,执行以下命令即可。

root@d63b4f236f0c:/home# composer require --dev phpunit/phpunit

编写 PHPUnit 测试

  • 首先在项目下面新建一个tests文件夹,用来存放单元测试文件。
  • 然后编辑 composer.json 文件为 tests 文件夹增加一个命名空间"Chance\\Log\\Test\\": "tests/"并执行composer dump-autoload更新 composer 的命名空间与文件夹映射关系。
  • 在 tests 目录创建 StackTest.php 文件,使用官网的一个例子来测试。

StackTest.php

<?php

    namespace Chance\Log\Test;

use PHPUnit\Framework\TestCase;

class StackTest extends TestCase
{
    public function testPushAndPop()
    {
        $stack = [];
        // 断言方法 assertEquals 判断两值是否相等
        $this->assertEquals(0, count($stack));

        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertEquals(1, count($stack));

        $this->assertEquals('foo', array_pop($stack));
        $this->assertEquals(0, count($stack));
    }
}

命令行执行单元测试

运行./vendor/phpunit/phpunit/phpunit --verbose --colors ./tests/命令执行tests目录下所有单元测试。

root@7608e16a4e0a:/home# ./vendor/phpunit/phpunit/phpunit --verbose --colors ./tests/
PHPUnit 10.0-dev by Sebastian Bergmann and contributors.

Runtime:       PHP 8.1.0

.                                                                   1 / 1 (100%)

Time: 00:00.156, Memory: 6.00 MB

OK (1 test, 5 assertions)

可以看到执行成功并且没有错误,然后我们将倒数第二个断言的第一个变量字符串改成foo1再次执行单元测试。

root@7608e16a4e0a:/home# ./vendor/phpunit/phpunit/phpunit --verbose --colors ./tests/
PHPUnit 10.0-dev by Sebastian Bergmann and contributors.

Runtime:       PHP 8.1.0

F                                                                   1 / 1 (100%)

Time: 00:00.266, Memory: 6.00 MB

There was 1 failure:

1) Chance\Log\Test\StackTest::testPushAndPop
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'foo1'
+'foo'

/home/tests/StackTest.php:23

FAILURES!
Tests: 1, Assertions: 4, Failures: 1.

可以看到断言验证失败,单元测试未通过。

更多的命令选项与断言方法可自行查看文档。

PhpStorm 执行单元测试

配置

打开File->Settings->PHP->Test Frameworks根据自己的安装方法配置 PHPUnit 的执行文件地址。

image-20211220183743437

然后打开Run->Edit Confiqurations新建一个 PHPUnit。

image-20211220184707328

image-20211220190515032

执行

image-20211220190555597

执行之后发现报错了,报错信息为Message: assert($testSuite instanceof TestSuiteForTestMethodWithDataProvider)

image-20211220190705856

经过排查发现是因为 PhpStorm 默认加上了--teamcity参数的原因,在命令行执行加这个参数也是报错,那就只有去掉这个参数了,可是 PhpStorm 里也没有找到怎么去掉这个默认参数。

因为我们也不需要这个参数,所以最后解决办法为,将/home/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php文件的 92 - 100 行给注释掉,就可以执行成功了。