composer地址:phpunit/phpunit - Packagist
官方文档:PHPUnit文档 – PHP测试框架
PHPUnit是一个框架,最为hyperf学习的补充学习,就不写这么细了。
估计写下安装和使用,具体学习内容看文档。
需安装扩展:dom、pcre、xdebug
composer require phpunit/phpunit:9.6.10
安装命令行。之所以安装命令,因为其运行方式的问题。自定义入口调用,注释好像无效。
#linux
wget https://phar.phpunit.de/phpunit-9.6.10.phar
$ chmod +x phpunit-9.6.10.phar
$ sudo mv phpunit-9.6.10.phar /usr/local/bin/phpunit
$ phpunit --version
#windows
下载 https://phar.phpunit.de/phpunit-9.6.10.phar
创建文件 d:/phpunit,将该添加到环境变量。将下载文件重命名为phpunit.phar,放到之前文件中。
进入文件并执行命令。
echo @php "%~dp0phpunit.phar" %* > phpunit.cmd
再开新命令行窗口执行phpunit可见其详细命令。
经过测试用Tortoisegit和vscode的相关命令行执行echo倒是没问题,但是输入phpunit会报错没命令行。
phpunit命令行解释
Usage:
phpunit [options] UnitTest.php
phpunit [options]
Code Coverage Options:
--coverage-clover 生成Clover XML格式的代码覆盖率报告
--coverage-cobertura 生成Cobertura XML格式的代码覆盖率报告
--coverage-crap4j 生成Crap4J XML格式的代码覆盖率报告
--coverage-html 生成HTML格式的代码覆盖率报告
--coverage-php 导出PHP_CodeCoverage对象到文件
--coverage-text= 生成文本格式的代码覆盖率报告[默认:标准输出]
--coverage-xml 生成PHPUnit XML格式的代码覆盖率报告
--coverage-cache 缓存静态分析结果
--warm-coverage-cache 静态分析缓存
--coverage-filter 在代码覆盖率分析中包括
--path-coverage 执行路径覆盖分析
--disable-coverage-ignore 禁用忽略代码覆盖的注释
--no-coverage 忽略代码覆盖配置
Logging Options:
--log-junit 以JUnit XML格式记录测试执行到文件
--log-teamcity 以TeamCity格式记录测试执行到文件
--testdox-html 以HTML格式编写敏捷文档
--testdox-text 以文本格式编写敏捷文档
--testdox-xml 以XML格式编写敏捷文档
--reverse-list 按相反顺序打印缺陷
--no-logging 忽略日志配置
Test Selection Options:
--list-suites 列出可用的测试套件
--testsuite 筛选要运行的测试套件
--list-groups 列出可用的测试组
--group 仅运行指定组中的测试
--exclude-group 从指定的组中排除测试
--covers 只运行带有“@covers ”注释的测试
--uses 只运行带有“@uses ”注释的测试
--list-tests 列出可用的测试
--list-tests-xml 以XML格式列出可用的测试
--filter 筛选要运行的测试
--test-suffix 只在带有指定后缀的文件中搜索test。默认值:Test.php .phpt
Test Execution Options:
--dont-report-useless-tests 不报告没有测试的测试结果
--strict-coverage 严格使用@covers注释
--strict-global-state 对全局状态的更改要严格
--disallow-test-output 在测试期间严格控制输出
--disallow-resource-usage 在小型测试期间严格控制资源使用
--enforce-time-limit 根据测试大小强制执行时间限制
--default-time-limit 不包含@small、@medium或@large的测试超时(以秒为单位)
--disallow-todo-tests 禁止使用带有@todo注释的测试
--process-isolation 在单独的PHP进程中运行每个测试
--globals-backup 为每个测试备份和恢复$GLOBALS
--static-backup 备份和恢复每个测试的静态属性
--colors 在输出中使用颜色("never", "auto"或"always")
--columns 用于进度输出的列数
--columns max 为进度输出使用最大列数
--stderr 写入STDERR而不是STDOUT
--stop-on-defect 第一次测试不通过时停止执行
--stop-on-error 第一次出错时停止执行
--stop-on-failure 在第一次错误或失败时停止执行
--stop-on-warning 在第一次警告时停止执行
--stop-on-risky 在第一次危险测试时停止执行
--stop-on-skipped 在第一次跳过测试时停止执行
--stop-on-incomplete 在第一次测试未完成时停止执行
--fail-on-incomplete 将不完整的测试视为失败
--fail-on-risky 将有风险的测试视为失败
--fail-on-skipped 将跳过的测试视为失败
--fail-on-warning 将带有警告的测试视为失败
-v|--verbose 输出更详细的信息
--debug 显示调试信息
--repeat 重复运行测试
--teamcity 以TeamCity格式报告测试执行进度
--testdox 以TestDox格式报告测试执行进度
--testdox-group 只包括来自指定组的测试
--testdox-exclude-group 从指定的组中排除测试
--no-interaction 禁用TestDox进度动画
--printer 使用的TestListener实现
--order-by 按顺序运行测试:默认|缺陷|持续时间|不依赖|随机|反向|大小
--random-order-seed 对于随机顺序,使用特定的随机种子
--cache-result 将测试结果写入缓存文件
--do-not-cache-result 不写测试结果缓存文件
Configuration Options:
--prepend 尽早包含的PHP脚本
--bootstrap 在测试运行之前包含的PHP脚本
-c|--configuration 从XML文件中读取配置
--no-configuration 忽略默认配置文件(phpunit.xml)
--extensions 要加载的PHPUnit扩展的逗号分隔列表
--no-extensions 不加载PHPUnit扩展
--include-path 在PHP的include_path前面加上给定的路径
-d 设置php.ini值
--cache-result-file 指定结果缓存路径和文件名
--generate-configuration 生成具有建议设置的配置文件
--migrate-configuration 将配置文件迁移到当前格式
Miscellaneous Options:
-h|--help 打印此使用信息
--version 打印版本并退出
--atleast-version 检查版本是否大于最小并退出
--check-version 检查PHPUnit是否为最新版本
/vendor/phpunit/src/Framework/Assert/Functions.php中定义namespace PHPUnit\Framework,并设置其余方法。PHPUnit\Framework命名空间下可以直接使用定义的方法,并且每个方法的具体实现由PHPUnit\Framework\Assert类负责,在composer.json中自动加载。
具体使用时继承PHPUnit\Framework\TestCase,而TestCase继承Assert类,所以使用时使用Functions中的函数十使用$this和直接使用方法都可。
#vendor\phpunit\phpunit\composer.json
"autoload": {
"classmap": [
"src/"
],
"files": [
"src/Framework/Assert/Functions.php"
]
},
#PHPUnit\Framework\Function.php
if (!function_exists('PHPUnit\Framework\assertEquals')) {
/**
* Asserts that two variables are equal.
*
* @throws ExpectationFailedException
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
*
* @see Assert::assertEquals
*/
function assertEquals($expected, $actual, string $message = ''): void
{
Assert::assertEquals(...func_get_args());
}
}
#PHPUnit\Framework\Assert
/**
* Asserts that two variables are equal.
*
* @throws \SebastianBergmann\RecursionContext\InvalidArgumentException
* @throws ExpectationFailedException
*/
public static function assertEquals($expected, $actual, string $message = ''): void
{
$constraint = new IsEqual($expected);
static::assertThat($actual, $constraint, $message);
}
#PHPUnit\Framework\TestCase
abstract class TestCase extends Assert implements Reorderable, SelfDescribing, Test
{
}
phpunit src/StackTest.php
PHPUnit 9.6.10 by Sebastian Bergmann and contributors.
F.F 3 / 3 (100%)
Time: 00:00.003, Memory: 20.00 MB
There were 2 failures:
1) app\StackTest::testPushAndPop
Failed asserting that 1 matches expected 0.
D:\workspace\php\phpunit\src\StackTest.php:14
2) app\StackTest::test2
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'foo1'
+'foo'
D:\workspace\php\phpunit\src\StackTest.php:29
FAILURES!
Tests: 3, Assertions: 5, Failures: 2.
#dir src/StackTest.php
namespace app;
use PHPUnit\Framework\TestCase;
class StackTest extends TestCase
{
public function testPushAndPop()
{
$stack = [];
$this->assertEquals(0, count($stack));
array_push($stack, 'foo');
$this->assertEquals('foo', $stack[count($stack) - 1]);
\PHPUnit\Framework\assertEquals(0, count($stack));
}
public function test1()
{
$stack = [];
$this->assertEmpty($stack);
array_push($stack, 'foo');
return $stack;
}
/**
* @depends test1
*/
public function test2(array $stack)
{
$this->assertEquals('foo1', $stack[count($stack) - 1]);
$this->assertNotEmpty($stack);
return $stack;
}
}
说明文档
可以直接下载,文档内容很详细