Можно ли как-то использовать Behat в тестовом примере phpunit?

Я использовал тестовый язык Behat, похожий на английский (огурец?) для написания тестовых сценариев, но быстро обнаружил его существенные ограничения.

Если бы я мог выполнять эти тесты на PHP в тестовых сценариях phpunit, которые я настроил, я мог бы значительно расширить тесты, которые я мог бы добавить. (Я использую FuelPHP).

Я возился несколько часов, пытаясь заставить Behat выполняться внутри тестового скрипта PHPUNIT, но мне не повезло.

Это возможно?


person paullb    schedule 18.09.2014    source источник
comment
О каких ограничениях вы говорите? Behat для интеграционного тестирования, phpunit для модульного тестирования - две разные концепции.   -  person Maerlyn    schedule 18.09.2014
comment
например сравнение того, что часть данных одинакова на странице A и находится на странице B. Сравнение данных с двух разных страниц. (Я знаю, что мог бы схитрить и записать это в какие-нибудь сверхмощные файлы .feature, но я подумал, что было бы более естественным просто запустить их в PHP и сделать необходимые утверждения по мере продвижения.)   -  person paullb    schedule 18.09.2014


Ответы (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…
}

Помимо очевидного, вы можете использовать PHPUnit вместе с Behat/Mink для создания утверждений, т. е. в определениях ваших шагов. Большинство (но не все) утверждений PHPUnit являются статическими методами, их использование так же просто:

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

Вы можете использовать Selenium (возможно, и другие фреймворки) с PHPUnit, если речь идет больше о модульном тестировании, чем о функциональном тестировании, официальная документация рассказывает, как это сделать.

Если вы просто ненавидите Gherkin, то с Behat вы мало что можете сделать — это его суть. В PhpStorm 8 есть довольно хорошая поддержка, вы можете легко перемещаться по своему коду и быстро рефакторить его. Если это не поможет, есть еще одна отличная альтернатива Behat под названием Codeception, где вы используете чистый PHP для определения своих тестов. . Может быть, это то, что вы ищете.

person Ian Bytchek    schedule 18.09.2014
comment
Спасибо за ответ. Я понимаю, что их написание само по себе не будет модульным тестом, но это полезное место для размещения тестов. То, что вы написали выше, в значительной степени именно то, что я хотел сделать, но писать это как функцию кажется действительно громоздким, и я надеялся, что смогу просто написать это непосредственно на PHP (что, как я подозреваю, было бы быстрее и проще для программистов работать с ). возможно, вы правы, я не уверен, что у меня есть терминология: корнишоны, норки, бехаты... - person paullb; 19.09.2014
comment
Требуется время, чтобы разобраться с Бехатом и остальными членами семьи. И я согласен, что Gherkin не очень консервативный способ кодирования, я тоже не фанат этого. Я также некоторое время задавался вопросом, будет ли фактическое выполнение быстрее в Codeception, потому что ему не нужно выполнять весь синтаксический анализ. Есть много плюсов и минусов, если вы решаете, по какому пути пойти — попробуйте оба, если сможете. - person Ian Bytchek; 19.09.2014

Да. Вы можете использовать созданную мной библиотеку: 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);
      }
    }

Я написал сообщение в блоге, объясняющее, почему я думаю, это неплохая идея.

person Jonathan    schedule 22.02.2019