neochrome / physalis
努力使PHP代码的测试变得简单且有趣
Requires
- php: >=5.4.0
This package is not auto-updated.
Last update: 2024-09-28 15:23:40 UTC
README
Physalis
努力让使用优秀的Jasmine(从其中借鉴了语法和通用用法)使PHP代码的测试变得和其JavaScript等价物一样简单和有趣。
系统要求
由于大量使用函数闭包,Physalis需要PHP 5.4.x或更高版本才能运行。
安装
使用Composer
使用composer可能是最简单的方式。只需在您的项目文件夹中执行以下命令
$ composer require neochrome/physalis
或
$ php composer.phar require neochrome/physalis
如果您尚未全局安装composer。这将从packagist获取最新版本并将其放入您的vendor文件夹。它还将创建一个指向可执行脚本的符号链接,作为vendor/bin/physalis
。
从源代码
克隆仓库或下载最新源代码并将其放入您的vendor文件夹。可执行脚本在bin/
中。
基本用法
首先,用一组规范描述某事物,即它应该如何表现
<?php require_once 'calc.php'; describe('calculator', function () { $calc; beforeEach(function () use (&$calc) { $calc = new Calculator(); }); describe('adds', function () use (&$calc) { it('positive numbers', function () use (&$calc) { expect($calc->add(1, 2))->toBe(3); }); it('negative numbers', function () use (&$calc) { expect($calc->add(-4, -5))->toBe(-9); }); it('with zero', function () use (&$calc) { expect($calc->add(0, 10))->toBe(10); }); }); describe('divides', function () use (&$calc) { it('positive numbers', function () use (&$calc) { expect($calc->div(8, 2))->toBe(4); }); it('throws on division by zero', function () use (&$calc) { expect(function () use (&$calc) { $calc->div(1, 0); })->toThrow(); }); }); }); ?>
默认情况下,Physalis将从子文件夹spec
中名为*.spec.php
的文件中获取规范。这可以通过命令行使用--specs
开关来覆盖。要验证规范,请执行
$ vendor/bin/physalis --specs=path/to/my/specs/*.spec.php
上下文
上下文包含规范和可能的嵌套上下文。它们使用带有描述和嵌套函数范围/闭包的describe
函数定义。
describe('a context', function () { // specs goes here });
规范
使用带有描述和设置期望的嵌套函数/闭包的it
函数在上下文中定义规范。
it('has a certain behaviour', function () { // code setup and expectations goes here });
期望
期望是使用带有实际值和匹配函数的expect
函数构建的布尔断言,该匹配函数将执行断言。可以通过使用not
属性进行否定,在这种情况下,以下匹配函数的结果将被反转。
it('is negated', function () { expect(false)->not->toBe(true); });
匹配器
匹配器执行实际值和期望值的布尔比较。包含的匹配器包括
toBe
执行实际值和期望值的严格比较。
expect(42)->toBe(42); // true expect('42')->toBe(42); // false
toEqual
执行实际值和期望值的“松散”比较。
expect(42)->toEqual(42); // true expect('42')->toEqual(42); // true
toMatch
假设期望是一个perl正则表达式,并测试实际值是否匹配。
expect('aBBa')->toMatch('/B+/'); // true
toContain
假设实际值是字符串或数组。检查它是否包含期望作为子字符串或元素。
expect('hello world')->toContain('hello'); // true expect([1, 2, 3])->toContain(2); // true
toBeEmpty()
假设实际值是字符串或数组。检查它是否为空。
expect('')->toBeEmpty(); // true expect([])->toBeEmpty(); // true
toBeOfType
检查实际值的类型是否为期望类型(标准类型或类)。
expect(13)->toBeOfType('integer'); // true expect(new Exception())->toBeOfType('Exception'); // true
toThrow
假设实际值是可调用的,即函数闭包。验证在调用实际值时是否会抛出异常。如果提供了期望值,则检查抛出的异常是否与期望匹配。
expect(function () { throw new Exception(); })->toThrow('Exception'); // true
自定义匹配器
可以通过在beforeEach
块中调用带有匹配器名称和匹配器函数实现的关联数组的$this->addMatchers
函数来创建和注册自定义匹配器。
匹配函数应返回true表示匹配成功,否则返回false。实际值和期望值可以通过属性$this->actual
和$this->expected
获取。默认情况下,如果期望未满足,将构建包含当前实际值、期望值和匹配器名称的消息。
可以通过设置属性$this->message
为一个包含两个函数的数组来指定自定义消息。第一个是常规消息,第二个是取反消息(当期望被否定时)。
示例
beforeEach(function () { $this->addMatchers([ 'toBeGreaterThan' => function () { $actual = static::pp($this->actual); $expected = static::pp($this->expected); $this->message = [ function () { return "Expected {$actual} to be greater than {$expected}"; }, function () { return "Expected {$actual} not to be greater than {$expected}"; } ]; return $this->actual > $this->expected; } ]); });
beforeEach / afterEach
每个上下文可以指定任意数量的beforeEach
和afterEach
函数块。所有前置块按顺序执行(外部和内部),在每个规范之前运行,可以用来执行常见设置或注册新的匹配器。后置块按相反的顺序执行(内部和外部),在每个规范之后运行,可以用来执行常见清理等。
排除上下文和规范
通过使用xdescribe
和xit
函数,可以排除(忽略)上下文和规范,它们将不会影响结果。
报告结果
默认情况下,Physalis将使用ProgressReporter
,以紧凑的形式输出进度。除了ProgressReporter
,Physalis还包含一个DocumentReporter
,它将输出所有上下文和规范的完整结构,以及任何失败的期望。要指定要使用的报告器,请提供--reporter
命令行开关
$ vendor/bin/physalis --reporter=DocumentReporter
与其他工具集成
如果所有规范都通过,Physalis将返回退出代码零,否则返回非零。这可以用作CI构建步骤中的一步,在每个提交上连续执行规范。
最后注意
如果您觉得这个工具很有用,请随意star这个仓库,fork它并创建pull请求或注册带有新想法或需要修复的问题。然而,最重要的是——享受测试您的PHP代码的乐趣!