jonathanjfshaw / phpunitbehat
在PHPUnit中直接使用Behat。
0.08
2022-12-19 18:29 UTC
Requires
- php: ^7.0 || ^8.0
- behat/behat: ^3.0.0
- phpunit/phpunit: ^6.0 || ^7.0 || ^8.0 || ^9.0
- symfony/dependency-injection: ^4.0 || ^5.0 || ^6.0
README
PHPUnitBehat 提供了特性,允许开发者创建结合了PHPUnit的强大和灵活性以及Behat的可读性的测试。
通过将这些特性包含到您的PHPUnit测试类中,您可以
- 像往常一样使用PHPUnit作为测试运行器
- 解析PHPUnit测试中的(Behat) Gherkin功能
- 在PHPUnit测试类中以文本形式编写功能
- 在PHPUnit测试中执行功能
- 声明与功能步骤自动匹配的方法
- 将场景结果输出为PHPUnit测试结果
要求
- Behat 3
- PHPUnit 6+
安装
composer require jonathanjfshaw/phpunitbehat
使用
提供了一些测试特性,可以帮助您以不同程度的控制使用Behat。
最简单的方法是在测试的基类中使用 PHPUnitBehat\TestTraits\BehatTestTrait
。
namespace MyProject\Tests; use PHPUnit\Framework\TestCase; use PHPUnitBehat\TestTraits\BehatTestTrait; class MyTestBase extends TestCase { use BehatTestTrait; }
创建一个扩展基类的测试,并定义一个带有相应步骤方法的 $feature 属性。
namespace MyProject\Tests; class MyTest extends MyTestBase { protected $feature = <<<'FEATURE' Feature: Demo feature In order to demonstrate testing a feature in phpUnit We define a simple feature in the class Scenario: Success Given a step that succeeds Scenario: Failure When a step fails Scenario: Undefined Then there is a step that is undefined FEATURE; /** * @Given a step that succeeds */ public function aStepThatSucceeds() { $this->assertTrue(true); } /** * @When a step fails */ public function aStepFails() { $this->assertTrue(false); } }
像往常一样使用 phpunit 执行您的测试。您应该看到如下测试输出
Testing
Test 'MyProject\Tests\myTest::testBehatScenario with data set #0 ('Success', Behat\Gherkin\Node\ScenarioNode Object (...), Behat\Gherkin\Node\FeatureNode Object (...))' started
Test 'MyProject\Tests\myTest::testBehatScenario with data set #0 ('Success', Behat\Gherkin\Node\ScenarioNode Object (...), Behat\Gherkin\Node\FeatureNode Object (...))' ended
Test 'MyProject\Tests\myTest::testBehatScenario with data set #1 ('Failure', Behat\Gherkin\Node\ScenarioNode Object (...), Behat\Gherkin\Node\FeatureNode Object (...))' started
Test 'MyProject\Tests\myTest::testBehatScenario with data set #1 ('Failure', Behat\Gherkin\Node\ScenarioNode Object (...), Behat\Gherkin\Node\FeatureNode Object (...))' ended
Test 'MyProject\Tests\myTest::testBehatScenario with data set #2 ('Undefined', Behat\Gherkin\Node\ScenarioNode Object (...), Behat\Gherkin\Node\FeatureNode Object (...))' started
Test 'MyProject\Tests\myTest::testBehatScenario with data set #2 ('Undefined', Behat\Gherkin\Node\ScenarioNode Object (...), Behat\Gherkin\Node\FeatureNode Object (...))' ended
Time: 26.6 seconds, Memory: 54.25MB
There were 2 failures:
1) MyProject\Tests\myTest::testBehatScenario with data set #1 ('Failure', Behat\Gherkin\Node\ScenarioNode Object (...), Behat\Gherkin\Node\FeatureNode Object (...))
Scenario 'Failure' had steps:
Failed: When a step fails
Failed asserting that false is true.
/tests/myTest.php:35
2) MyProject\Tests\myTest::testBehatScenario with data set #2 ('Undefined', Behat\Gherkin\Node\ScenarioNode Object (...), Behat\Gherkin\Node\FeatureNode Object (...))
Failed asserting that scenario passed.
Scenario 'Undefined' had steps:
Undefined: Then there is a step that is undefined
You can define these undefined steps in your PHPUnit test class like this:
/**
* @Then there is a step that is undefined
*/
public function thereIsAStepThatIsUndefined() {
}
运行测试
您可以根据场景标题指定要运行的特定场景,因为场景标题作为数据提供者名称提供。例如,要测试标题为 Undefined
的场景
phpunit --filter '@Undefined'
更复杂的情况,请参阅 https://phpunit.de/manual/6.5/en/textui.html#textui.examples.filter-patterns。
失败和错误
Phpunit 会报告任何 AssertionFailedError 实例为失败,以及其他异常为错误。在某些情况下,您可能希望显示某些异常为错误。例如,如果您使用 Mink 进行网络断言,您可能希望将 Mink 的 ExpectationExpection(当网页内容与期望不符时抛出)报告为失败而不是错误。
为了实现这一点,在检查场景结果时,在测试的基类中捕获这些错误,并使用提供的 AssertionFailedWrappedError 重新抛出
use BehatTestTrait {
assertBehatScenarioPassed as assertBehatScenarioPassedTrait;
}
public static function assertBehatScenarioPassed($scenarioResults, $scenario = NULL, $stepResults = [], $snippetGenerator = NULL, $environment = NULL, $message = '', $callHandler = '')
{
try {
self::assertBehatScenarioPassedTrait($scenarioResults, $scenario, $stepResults, $snippetGenerator, $environment, $message, $callHandler);
}
catch (\Behat\Mink\Exception\ExpectationException $e) {
throw new \PHPUnitBehat\PHPUnit\Framework\AssertionFailedWrappedError($e);
}
}
许可证
MIT。