nette/tester

Nette Tester:享受PHP单元测试和代码覆盖率报告。🍏🍏🍎🍏

安装: 5,251,900

依赖项: 1,738

建议者: 6

安全性: 0

星标: 455

关注者: 38

分支: 71

开放问题: 17

v2.5.3 2024-06-18 18:44 UTC

README

Nette Tester

Downloads this Month Tests Latest Stable Version License

 

简介

Nette Tester是一个高效且令人愉悦的单元测试框架。它被Nette框架使用,并且能够测试任何PHP代码。

文档可在Nette Tester网站上找到。阅读博客获取最新信息。

 

支持Tester

你喜欢Nette Tester吗?你期待新功能吗?

Buy me a coffee

谢谢!

 

安装

推荐通过Composer安装Nette Tester

composer require nette/tester --dev

或者,你可以下载tester.phar文件。

Nette Tester 2.5与PHP 8.0至8.4兼容。收集和处理代码覆盖率信息依赖于Xdebug或PCOV扩展,或PHPDBG SAPI。

 

编写测试

想象一下,我们要测试这个简单的类

class Greeting
{
	function say($name)
	{
		if (!$name) {
			throw new InvalidArgumentException('Invalid name.');
		}
		return "Hello $name";
	}
}

因此,我们创建了一个名为greeting.test.phpt的测试文件

require 'src/bootstrap.php';

use Tester\Assert;

$h = new Greeting;

// use an assertion function to test say()
Assert::same('Hello John', $h->say('John'));

就这样!

现在,我们使用tester命令从命令行运行测试

> tester
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.5

PHP 8.2.0 | php -n | 8 threads
.
OK (1 tests, 0 skipped, 0.0 seconds)

Nette Tester用点表示成功的测试,用F表示失败的测试,用S表示跳过的测试。

 

断言

此表显示了所有断言(类Assert表示Tester\Assert

  • Assert::same($expected, $actual) - 如果$expected和$actual不相同,则报告错误。
  • Assert::notSame($expected, $actual) - 如果$expected和$actual相同,则报告错误。
  • Assert::equal($expected, $actual) - 与same()类似,但忽略对象的身份和数组键的顺序。
  • Assert::notEqual($expected, $actual) - 与notSame()类似,但忽略对象和数组的顺序。
  • Assert::contains($needle, array $haystack) - 如果$needle不是$haystack的元素,则报告错误。
  • Assert::contains($needle, string $haystack) - 如果$needle不是$haystack的子串,则报告错误。
  • Assert::notContains($needle, array $haystack) - 如果$needle是$haystack的元素,则报告错误。
  • Assert::notContains($needle, string $haystack) - 如果$needle是$haystack的子串,则报告错误。
  • Assert::true($value) - 如果$value不是true,则报告错误。
  • Assert::false($value) - 如果$value不是false,则报告错误。
  • Assert::truthy($value) - 如果$value不是truthy,则报告错误。
  • Assert::falsey($value) - 如果$value不是falsey,则报告错误。
  • Assert::null($value) - 如果$value不是null,则报告错误。
  • Assert::nan($value) - 如果$value不是NAN,则报告错误。
  • Assert::type($type, $value) - 如果变量$value不是PHP或类类型$type,则报告错误。
  • Assert::exception($closure, $class, $message = null, $code = null) - 检查函数是否抛出异常。
  • Assert::error($closure, $level, $message = null) - 检查函数$closure是否抛出PHP警告/注意/错误。
  • Assert::noError($closure) - 检查函数$closure是否没有抛出PHP警告/注意/错误或异常。
  • Assert::match($pattern, $value) - 使用正则表达式或掩码比较结果。
  • Assert::matchFile($file, $value) - 使用正则表达式或掩码比较文件中的结果。
  • Assert::count($count, $value) - 如果$value中的项数不是$count,则报告错误。
  • Assert::with($objectOrClass, $closure) - 执行一个可以通过$this访问给定对象或类的私有和受保护的成员的功能。

测试异常

Assert::exception(function () {
	$h = new Greeting;
	$h->say(null);
}, InvalidArgumentException::class, 'Invalid name.');

测试PHP错误、警告或提示

Assert::error(function () {
	$h = new Greeting;
	echo $h->abc;
}, E_NOTICE, 'Undefined property: Greeting::$abc');

测试私有访问方法

$h = new Greeting;
Assert::with($h, function () {
	// normalize() is internal private method.
	Assert::same('Hello David', $this->normalize('Hello david')); // $this is Greeting
});

 

技巧和功能

手动运行单元测试很烦人,所以让Nette Tester监视你的代码文件夹,并在代码更改时自动重新运行测试。

tester -w /my/source/codes

并行运行测试速度非常快,Nette Tester默认使用8个线程。如果您想顺序运行测试,请使用

tester -j 1

如何找到尚未测试的代码?使用代码覆盖率分析。此功能需要您已安装XdebugPCOV扩展,或者您正在使用PHPDBG SAPI。这将生成一个漂亮的HTML报告,保存在coverage.html中。

tester . -c php.ini --coverage coverage.html --coverage-src /my/source/codes

我们可以使用Composer的自动加载器来加载Nette Tester。在这种情况下,设置Nette Tester环境很重要。

require 'vendor/autoload.php';

Tester\Environment::setup();

我们还可以测试HTML页面。让模板引擎生成HTML代码或将现有页面下载到$html变量中。我们将检查页面是否包含用户名和密码的表单字段。语法与CSS选择器相同。

$dom = Tester\DomQuery::fromHtml($html);

Assert::true($dom->has('input[name="username"]'));
Assert::true($dom->has('input[name="password"]'));

更多灵感,请查看Nette Tester如何测试自己

 

运行测试

可以通过tester命令(或php tester.php)调用命令行测试运行器。查看命令行选项。

> tester

Usage:
    tester [options] [<test file> | <directory>]...

Options:
    -p <path>                    Specify PHP interpreter to run (default: php).
    -c <path>                    Look for php.ini file (or look in directory) <path>.
    -C                           Use system-wide php.ini.
    -l | --log <path>            Write log to file <path>.
    -d <key=value>...            Define INI entry 'key' with value 'val'.
    -s                           Show information about skipped tests.
    --stop-on-fail               Stop execution upon the first failure.
    -j <num>                     Run <num> jobs in parallel (default: 8).
    -o <console|console-lines|tap|junit|none>
                                 Specify output format.
    -w | --watch <path>          Watch directory.
    -i | --info                  Show tests environment info and exit.
    --setup <path>               Script for runner setup.
    --temp <path>                Path to temporary directory. Default by sys_get_temp_dir().
    --colors [1|0]               Enable or disable colors.
    --coverage <path>            Generate code coverage report to file.
    --coverage-src <path>        Path to source code.
    -h | --help                  This help.