Quick start

Install Behat

If you didn’t install Behat already, then you can install it with composer in the following way:

$ composer require --dev behat/behat

For alternative installation options check the Behat official documentation

Install the Extension

Similarly you can install the extension via composer:

$ composer require --dev bex/behat-magento2-extension

For more information see the the installation section of this documentation.

Setup the Behat configuration

You need to enable the extension in the Behat configuration and configure your Behat Suite to use the Magento 2 Service Container. Your behat.yml should look like this:

default:
  extensions:
    Bex\Behat\Magento2Extension: ~

  suites:
    application:
      autowire: true

      contexts:
        - FeatureContext

      services: '@bex.magento2_extension.service_container'
With the above configuration:
  • The extension is enabled
  • The application suite uses the Behat Magento 2 service container
  • The Behat Context dependencies are autowired

For more detailed information see the configuration section of this documentation.

Verify the configuration

In order to verify that the extension is configured correctly you will need a test feature. For example create a features/my_feature.feature file like this:

Feature: Magento and Behat DI connected
  As a developer
  In order to write Behat tests easily
  I should be able to inject services from the Magento DI into Behat Contexts

  Scenario: Injecting service from Magento DI to Behat Context as argument for Behat Context constructor
    Given A service has been successfully injected through the Context constructor
    When I work with Behat
    Then I am happy

Also to implement the above feature you need to add the following step definitions to your features/bootstrap/FeatureContext.php Behat Context:

<?php

use Behat\Behat\Context\Context;
use Exception;
use Magento\Sales\Api\OrderRepositoryInterface;

class FeatureContext implements Context
{
    /** @var OrderRepositoryInterface */
    private $orderRepository;

    public function __construct(OrderRepositoryInterface $orderRepository)
    {
        $this->orderRepository = $orderRepository;
    }

    /**
     * @Given A service has been successfully injected through the Context constructor
     */
    public function aServiceHasBeenSuccessfullyInjectedThroughTheContextConstructor()
    {
        if (!$this->orderRepository instanceof OrderRepositoryInterface) {
            throw new Exception('Something went wrong :(');
        }
    }

    /**
     * @When I work with Behat
     */
    public function iWorkWithBehat()
    {
        // no-op
    }

    /**
     * @Then I am happy
     */
    public function iAmHappy()
    {
        // no-op :)
    }
}

Note that here we inject the Order Repository Magento service through the Context constructor, but it is also possible to inject it through the Behat Step definition as well. For more information see the usage section of this documentation.

Run Behat and you should see the test passing.

$ bin/behat features/my_feature.feature