无论如何在phpunit测试用例中使用Behat?

时间:2014-09-18 08:55:35

标签: php phpunit behat fuelphp mink

我一直在使用类似Behat英语的测试语言(Gherkin?)编写测试脚本,但很快就遇到了它的重大限制。

如果我可以在我设置的phpunit测试脚本中用PHP执行这些测试,那么我可以大大扩展我可以添加的测试。 (我使用的是FuelPHP)。

我一直在修补几个小时试图让Behat在PHPUNIT测试脚本中执行,但运气不好。

这可能吗?

2 个答案:

答案 0 :(得分:2)

我认为你在混淆某些东西,因为你所说的并没有多大意义。如果您很难用代码表达逻辑,那么您应该就此提出具体问题。

Behat和Mink都是用PHP编写的,你用PHP编写上下文,有一些插件可以让生活更轻松(也用php编写)。事实上,当你运行它们时,所有的测试都是用PHP执行的......是的!

如果你想比较两个页面的数据,你可以简单地创建一个这样的步骤:

/**
 * @Then /^the page "(.+)" and the page "(.+)" content should somehow compare$/
 */
public function assertPageContentCompares($page1, $page2)
{
    $session = $this->getSession();
    $session->visit($page1);
    $page1contents = $session->getPage()->getHtml();

    $session->visit($page2);
    $page2contents = $session->getPage()->getHtml();

    // Compare stuff…
}

除了显而易见之外,您可以在Behat / Mink中使用PHPUnit来进行断言,即在步骤定义中。大多数(并非所有)PHPUnit断言都是静态方法,使用它们就像这样简单:

PHPUnit_Framework_TestCase::assertSame("", "");

你可以使用Selenium(可能还​​有其他框架)和PHPUnit,如果这更多是关于单元测试而不是功能测试,the official documentation tells how

如果你只是讨厌Gherkin,那么你对Behat的关注并不多 - 它就是它的核心。有了PhpStorm 8,它有很好的支持,您可以轻松浏览代码并快速重构。如果这没有削减它,那么Behat的另一个很好的替代品叫Codeception,你可以使用纯PHP来定义你的测试。也许这就是你要找的东西。

答案 1 :(得分:0)

是的。您可以使用我创建的库:jonathanjfshaw/phpunitbehat

您的phpunit测试将如下所示:

    namespace MyProject\Tests;

    use PHPUnit\Framework\TestCase;
    use PHPUnitBehat\TestTraits\BehatTestTrait;

    class MyTestBase extends TestCase {
      use BehatTestTrait;
    }
    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);
      }
    }

我写了a blog post explaining why I think this is not a bad idea