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 的执行文件地址。
然后打开Run
->Edit Confiqurations
新建一个 PHPUnit。
执行
执行之后发现报错了,报错信息为Message: assert($testSuite instanceof TestSuiteForTestMethodWithDataProvider)
。
经过排查发现是因为 PhpStorm 默认加上了--teamcity
参数的原因,在命令行执行加这个参数也是报错,那就只有去掉这个参数了,可是 PhpStorm 里也没有找到怎么去掉这个默认参数。
因为我们也不需要这个参数,所以最后解决办法为,将/home/vendor/phpunit/phpunit/src/Logging/TeamCity/TeamCityLogger.php
文件的 92 - 100 行给注释掉,就可以执行成功了。