Tester Magento avec Behat

behat

BehatMage est une extension Behat pour Magento, fournissant un contexte Behat aux exigences de Magento spécifiques. Elle permet de définir rapidement des scénarios et des étapes pour utiliser BDD dans les projets Magento.

Objectifs

  • Créer un outil qui rend les tests d'acceptation plus faciles et simples et surtout pour tester le comportement externe de Magento.
  • Créer un outil qui donne un feedback clair lorsque des exceptions sont retournées. Ce feedback va guider le développeur sur la façon de résoudre le problème et le message va être propre à Magento.

Comment ?

  • L'outil peut être installé facilement avec le compositeur.
  • La création de scénarios standards peut être accomplie sans la nécessité de créer de nouveaux contextes.
  • Il n'y a pas d'exceptions soulevées qui ne fournissent pas les informations sur la façon de procéder ou de résoudre le problème.
  • La documentation comprend des exemples sur la manière d'utiliser chaque fonctionnalité de l'outil.

 Installation

  1. Prérequis :

BehatMage nécessite PHP 5.3.x ou plus

  1. Installation avec un composer

Pour cet article, nous supposons que la structure des répertoires est la suivante :

rep

  • Le fichier behat.yml doit être dans le répertoire où vous appelez le script à partir Behat. ( "behatMage" pour cet article )
  • Le composer.json PSR-0 autoload déclaration de chemin devra être ajusté
  • Les default.paths.features paramètre dans votre behat.yml devront être ajustés

Premièrement ajouter BehatMage à la liste des dépendances dans le fichier composer.json :

code

../../../ : c'est le chemin vers le répertoire du projet Magento.

Il suffit ensuite de l'installer avec le compositeur pour avoir les dépendances Magento :

          $php composer.phar install  --dev --prefer-dist

  1. Usage basique

Le Behat --init, créera les fichiers et les répertoires de base pour commencer.

$bin/behat --init
+d features - place your *.feature files here
+d features/bootstrap - place bootstrap scripts and static files here
+f features/bootstrap/FeatureContext.php - place your feature related code here
  1. Définir une feature

Chaque feature commence par le même format, des premières lignes qui décrivent la présentation, le rôle et la fonction. Le contenu de cette section n'est pas réellement important pour behat mais il est nécessaire pour décrire les scénarios qui seront exécutés par la suite.

Feature: Admin User can manage review visibility
         So that our Customers are not influenced by a product with bad review history,
         as an Admin User I want to disable reviews of those specific products
  1.  Définir un scénario

Ensuite, ajouter le scénario suivant :

Scenario: Turn off reviews per product
     Given the following products exist:
           |sku      | name           | accepts_reviews |
           |Ottoman1 | Ottoman        | 1               |
     And "Ottoman1" has existing reviews
     When I turn reviews off for "Ottoman1" product
     Then no review should be displayed for "Ottoman1"

On lance maintenant le test, si tout fonctionne correctement vous aurez le résultat suivant :

1 scenario (1 undefined)
4 steps (4 undefined)
0m1.836s

You can implement step definitions for undefined steps with these snippets:
    /**
     *@Given /^the following products exist:$/
     */
    public function theFollowingProductsExist(TableNode $table)
    {
        throw new PendingException();
    }
    /**
     *@Given /^"([^"]*)" has existing reviews$/
     */
    public functionhasExistingReviews($arg1)
    {
        throw new PendingException();
    }
    /**
     *@When /^I turn reviews off for"([^"]*)" product$/
     */
    public function iTurnReviewsOffForProduct($arg1)
    {
        throw new PendingException();
    }
    /**
     *@Then /^no review should be displayed for "([^"]*)"$/
     */
    public functionnoReviewShouldBeDisplayedFor($arg1)
    {
        throw new PendingException();
    }

C'est tout à fait normal, c'est que les instruction appelées dans le scénario ne sont pas encore définies dans le context appelé par défaut "FeatureContext".

Nous allons maintenant dire à Behat que nous voulons utiliser un autre context. Dans notre exemple, il s'agit de la partie admin. Pour cela, nous devons mettre à jour features/bootstrap/FeatureContext.php comme suit:

/**
 *Features context.
 */
classFeatureContext extendsBehatContext
{
    /**
     *Initializes context.
     *Every scenario gets it's own context object.
     *
     *@param array $parameters context parameters (set them up through behat.yml)
     */
    publicfunction__construct(array $parameters)
    {
        //Initialize your context here
        $this->useContext('admin_user', newAdminUserContext($parameters));
    }
}

Il faut maintenant créer le sous contexte  ''AdminUser'' étendant de la classe BehatMage, il faut également ajouter les méthodes non-définies  comme suit :

<?php
# features/bootstrap/AdminUserContext.php
use Behat\Behat\Exception\PendingException;
use Behat\Gherkin\Node\TableNode;
use MageTest\MagentoExtension\Context\MagentoContext;

class AdminUserContext extends MagentoContext
{
    /**
     * @Given /^"([^"]*)" has existing reviews$/
     */
    public function hasExistingReviews($arg1)
    {
        throw new PendingException();
    }
    /**
     * @When /^I turn reviews off for "([^"]*)" product$/
     */
    public function iTurnReviewsOffForProduct($arg1)
    {
        throw new PendingException();
    }
    /**
     * @Then /^no review should be displayed for "([^"]*)"$/
     */
    public function noReviewShouldBeDisplayedFor($arg1)
    {
        throw new PendingException();
    }
}
  1. Coté Magento

Grâce à l'extension BehatMage, des informations significatives et utiles pendant la prochaine étape à prendre pour mettre en œuvre le comportement requis. Donc, nous allons ajouter le code nécessaire pour faire la première exigence de nos étapes de test.

Il faut créer le fichier de configuration pour le module behatMage dans le répertoire : app/code/local/BehatMage/Catalog/etc/, comme suit :


<?xml version="1.0"?>
<!-- app/code/local/BehatMage/Catalog/etc/config.xml -->
<config>
    <modules>
        <BehatMage_Catalog>
            <version>0.1.0</version>
            <depends>
                <Mage_Catalog/>
            </depends>
        </BehatMage_Catalog>
    </modules>
    <global>
        <resources>
            <behatmage_catalog_setup>
                <setup>                  <module>BehatMage_Catalog</module>
                  <class>Mage_Catalog_Model_Resource_Setup</class>
                </setup>
            </behatmage_catalog_setup>
        </resources>
    </global>
</config>

Après, il faut créer une déclaration du module dans Magento. Pour ce faire, il faut créer le fichier de déclaration xml avec cette arborescence : app/etc/modules/BehatMage.xml

<?xml version="1.0"?>
<!-- app/etc/modules/BehatMage_Catalog.xml -->
<config>
    <modules>
        <BehatMage_Catalog>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog/>
            </depends>
        </BehatMage_Catalog>
    </modules>
</config>
<?php
#app/code/local/BehatMage/Catalog/data/behatmage_catalog_setup/data-install-0.1.0.php

/**
 * @var Mage_Catalog_Model_Resource_Setup $this
 */

$installer = $this;
$installer->startSetup();
$installer->addAttribute('catalog_product','accepts_reviews', array(
    'group'=>'General',
    'input'=>'boolean',
    'type'=>'int',
    'label'=>'Accept Reviews',
    'default'=>true,
    'user_defined'=>true,
    'visible_on_front'=>true,
    'visible_in_advanced_search'=>false,
    'global'=>Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
));

$installer->endSetup();

Une fois que les fichiers ont été créés, il faut vider le cache Magento pour exécuter le script de configuration et ajouter l'attribut obligatoire. Il est maintenant temps d'exécuter Behat dans un environnement Magento.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.