【问题标题】:Is there anyway to use Behat within a phpunit test case?无论如何在 phpunit 测试用例中使用 Behat 吗?
【发布时间】:2014-09-18 08:55:35
【问题描述】:

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

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

我已经尝试了几个小时试图让 Behat 在 PHPUNIT 测试脚本中执行,但运气不佳。

这可能吗?

【问题讨论】:

  • 你在说什么限制? Behat 用于集成测试,phpunit 用于单元测试 - 两个不同的概念。
  • 例如比较 A 页上的一条数据与 B 页上的一条数据相同。比较来自两个不同页面的数据。 (我知道我基本上可以作弊并将其写入一些重型 .feature 文件,但我认为在 PHP 中运行并在我进行时做出必要的断言会更自然。)

标签: php phpunit behat fuelphp mink


【解决方案1】:

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

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("", "");

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

如果您只是讨厌 Gherkin,那么您对 ​​Behat 无能为力 - 它是它的核心。随着 PhpStorm 8 的推出,对它的支持非常好,您可以轻松地浏览您的代码并快速重构它。如果这不能解决问题,Behat 还有另一个很棒的替代方案,称为Codeception,您可以在其中使用纯 PHP 来定义您的测试。也许这就是你要找的。​​p>

【讨论】:

  • 感谢您的回答。我知道编写这些内容本身并不是一个“单元测试”,但它是一个放置测试的有用地方。你上面写的几乎正是我想要做的,但是把它写成一个特性似乎真的很麻烦,并且希望能够直接用 PHP 编写它(我怀疑这对程序员来说会更快更容易使用)。你可能是对的,我不确定我是否掌握了这些术语:Gherkin、Mink、Behat...
  • 与 Behat 和其他家庭成员相处确实需要时间。而且我同意 Gherkin 不是一种非常“保守”的编码方式,我也不喜欢它。我还想知道在 Codeception 中实际执行是否会更快,因为它不需要进行所有解析。有很多优点和缺点,如果你决定走哪条路——如果可以的话,都试试。
【解决方案2】:

是的。你可以使用我创建的库: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

【讨论】:

    猜你喜欢
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2014-08-21
    • 2010-12-25
    相关资源
    最近更新 更多