austp / peridot-gherkin-plugin
Peridot 插件,增加了 Gherkin 风格的 DSL。
Requires
- peridot-php/peridot: ^1.19
Requires (Dev)
- mockery/mockery: ^1.2
This package is auto-updated.
Last update: 2024-09-20 10:19:13 UTC
README
一个 Peridot 插件,增加了 Gherkin 风格的 DSL。
Gherkin 风格测试
Feature: Some Feature
In order to ...
As a ...
I want to ...
Additional text...
Background:
Given something...
And something else...
Scenario: Some Scenario
Given something...
When something happens...
Then something else happens...
这是用 Gherkin 语言编写的功能示例。它看起来不错,但如何将其转换为 PHP 测试?此插件将帮助您完成此操作。
此插件在 Peridot 周围添加了一个 DSL 包装器,因此您可以使用 Gherkin 语言的 PHP 版本编写测试。以下是对上述功能的示例
feature(
'Some Feature',
'',
'In order to...',
'As a ...',
'I want to...',
'',
'Additional text...',
background(
'Given something',
'And something else',
function () { /* setup function */ },
function () { /* optional teardown function */ }
),
scenario(
'Some scenario',
'',
'Given something',
'When something happens',
function () {},
'Then something else happens',
function () {}
)
);
这是上述测试的输出
Feature: Some Feature
In order to...
As a ...
I want to...
Additional text...
Background:
Given something
And something else
Scenario: Some scenario
✓ Given something
✓ When something happens
✓ Then something else happens
3 passing (2 ms)
DSL
此插件增加了 6 个主要函数:feature、background、scenario、isolatedScenario、stories 和 isolatedStories,以及 2 个辅助函数:focusNextStory 和 skipNextStory。
feature
- 第一个参数是功能的名称。
- 任何
''参数都将渲染为换行符。 - 任何其他字符串参数将按原样渲染。
- 可以接受其他 3 个函数的返回值作为参数。
其他可用方法
xfeature - 将功能标记为挂起。
ffeature - 关注功能。
background
- 任何
''参数都将渲染为换行符。 - 任何其他字符串参数将按原样渲染。
- 遇到的第一个可调用参数将是设置函数。
- 遇到的第二个可调用参数将是清理函数。
注意:可以在不提供任何字符串的情况下调用 background,仅添加设置/清理函数。
scenario
- 第一个参数是场景的标题。
- 任何
''参数将被忽略。 - 任何其他字符串参数将用作测试描述。
- 任何可调用参数将用作测试函数。
场景函数确定实际要测试的内容。任何跟在字符串后面的可调用函数都将是一个“测试”。所以在上面的例子中,我们有两个测试:When something happens 和 Then something else happens,因为它们后面跟着一个可调用函数。
注意,在输出中,Given something 旁边有一个勾号。此插件假设如果字符串后面没有提供可调用函数,则该字符串的逻辑将由下一个可调用函数处理。(您可以在 Given something 参数后面添加可调用函数,但通常逻辑只是一个变量赋值,这是不可测试的。)
如果您在包含字符串参数后未能包含可调用函数,它们将被标记为挂起测试。
其他可用方法
xscenario - 将场景标记为挂起。
fscenario - 关注场景。
isolatedScenario
此行为与 scenario 完全相同,但有一个关键区别。此场景将在一个单独的阻塞进程中运行。这允许场景中定义的测试与测试的其余部分隔离。
使用 isolatedScenario 的示例用例是在使用 Mockery 模拟/监视静态方法时。实现此方法的唯一方法是通过创建别名。只要类尚未被自动加载,Mockery 将加载一个假类。
如果您需要在测试的后期访问真实类,就没有方法可以加载它,因为 Mockery 已经加载了一个具有相同名称的类。但通过在隔离模式下运行测试,Mockery 将在单独的进程中加载假类。这样,您就可以在需要时加载真实类。
以下是一个用例的示例。假设我们有一个名为 SomeClass 的类,它有一个名为 makeSomethingElseHappen 的静态方法。
feature(
'Another Feature',
isolatedScenario(
'Some scenario',
'When something happens',
function () {
$this->spy = Mockery::spy('alias:SomeClass');
makeSomethingHappen();
},
'Then something else happens',
function () {
$this->spy->shouldHaveReceived('makeSomethingElseHappen');
}
)
);
feature(
'Yet another feature',
isolatedScenario(
'Another scenario',
'When something else happens',
function () {
$itHappened = SomeClass::makeSomethingElseHappen();
$this->itHappened = $itHappened;
},
'Then something else should have happened',
function () {
assert($this->itHappened === true);
}
)
);
在上面的示例中,第一个场景是独立运行的。这允许我们在测试中稍后测试 makeSomethingElseHappen 方法。(注意:每个 feature 调用都应该在自己的文件中)。
其他可用方法
xisolatedScenario - 标记场景为挂起。
fsisolatedScenario - 突出显示场景。
stories
- 任何
''参数将被忽略。 - 任何其他字符串参数将用作测试描述。
- 任何可调用参数将用作测试函数。
尽管它们不如场景那样适合Gherkin语言,但有时将测试定义为故事而不是场景会有所帮助。这个函数将帮助您做到这一点。除了不需要作为第一个参数的标题参数外,它的行为与 scenario 完全相同。
feature(
'Stories Feature',
stories(
'I want it to do something',
function () {},
'I want it to do something else',
function () {}
)
);
其他可用方法
xsstories - 标记故事为挂起。
fsstories - 突出显示故事。
isolatedStories
这的行为与 stories 完全相同,但它将在单独的进程中运行。有关在单独进程中运行的更多详细信息,请参阅 isolatedScenario。
其他可用方法
xisolatedStories - 标记故事为挂起。
fsisolatedStories - 突出显示故事。
focusNextStory
有时将单个故事集中在一个故事集中是有用的。
feature(
'Focus next story feature',
stories(
// story definitions,
focusNextStory(),
'I want this test to be focused',
function () {}
)
);
skipNextStory()
这与 focusNextStory 类似,但它标记下一个要跳过的测试。
feature(
'Skip next story feature',
stories(
// story definitions,
skipNextStory(),
'I want this test to be skipped',
function () {}
)
);
安装/设置
要安装
composer require --dev austp/peridot-gherkin-plugin
在你的 peridot.php 文件中
<?php
require('vendor/autoload.php');
use Peridot\Plugin\GherkinPlugin;
return function ($emitter) {
new GherkinPlugin($emitter);
};
这将配置Peridot
- 使用描述的DSL
- 在
features/目录中查找测试 - 在以
.feature.php结尾的PHP文件中查找测试 - 使用专门为Gherkin构建的spec报告器