jonathanjfshaw/phpunitbehat

在PHPUnit中直接使用Behat。

0.08 2022-12-19 18:29 UTC

This package is auto-updated.

Last update: 2024-09-19 22:44:30 UTC


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。