Des tests fonctionnels sur votre boutique Magento grâce à Behat Mink

N’ayez plus peur des régressions grâce à ce module qui vous permettra de tester fonctionnellement votre site Magento à tout moment. Testez l’ajout au panier, l’authentification, la navigation ou n’importe quelle autre page sensible au bon fonctionnement de votre boutique.

Mink, c’est quoi ?

Mink est tout simplement une librairie qui permet de virtualiser un navigateur web en PHP. Il fonctionne grâce à des drivers (Goutte, Zombie, Selenium, …) et permet donc d’automatiser les tests de l’interface de votre site. Chaque driver a ses avantages et inconvénients qui sont très bien expliqués sur le site officiel : http://mink.behat.org/#different-browsers-drivers.

Vous n’avez pas besoin d’installer Behat Mink puisque celui-ci est inclus (via le package PHAR) dans l’extension Magento décrite dans cet article.

Aperçu

La suite de tests peut être lancée en ligne de commande ou depuis un navigateur (si le driver Mink utilisé le permet).

Voici le résultat d’une même suite de tests lancée en ligne de commande et depuis un navigateur :

Installation

L’extension est disponible sur GitHub : https://github.com/jreinke/magento-mink.

Pour l’installer, 2 solutions s’offrent à vous :

  1. Installation manuelle : téléchargez le package ici, désarchivez le à la racine de votre projet Magento, puis videz le cache.
  2. Installation via modgit :

    modgit -e README.md clone mink https://github.com/jreinke/magento-mink.git

    Exemple complet d’utilisation de modgit ici.

Ecrire des tests

app/code/local/Company/Module/Test/Mink/Catalog.php

<?php
/**
 * Pour que le test soit pris en compte, il faut :
 * - que le module se trouve dans app/code/local
 * - que la classe se trouve dans Company/Module/Test/Mink/
 * - que la classe étende JR_Mink_Test_Mink
 * - que la méthode commence par test*
 */
class Company_Module_Test_Mink_Catalog extends JR_Mink_Test_Mink
{
    public function testAddProductToCart()
    {
        $this->section('TEST ADD PRODUCT TO CART');
        $this->setCurrentStore('default');
        $this->setDriver('goutte');
        $this->context();
 
        // Go to home
        $this->output($this->bold('Go to home'));
        $url = Mage::getStoreConfig('web/unsecure/base_url');
        $this->visit($url);
        $category = $this->find('css', '#nav .nav-1-1 a');
        if (!$category) {
            return false;
        }
 
        // Go to product list
        $this->output($this->bold('Go to product list'));
        $this->visit($category->getAttribute('href'));
        $product = $this->find('css', '.category-products li.first a');
        if (!$product) {
            return false;
        }
 
        // Go to product view
        $this->output($this->bold('Go to product view'));
        $this->visit($product->getAttribute('href'));
        $form = $this->find('css', '#product_addtocart_form');
        if ($form) {
            $addToCartUrl = $form->getAttribute('action');
            $this->visit($addToCartUrl);
            $this->attempt(
                $this->find('css', '#shopping-cart-table'),
                'Product added to cart successfully',
                'Error adding product to cart'
            );
        }
    }
}

app/code/local/Company/Module/Test/Mink/Customer.php

<?php
/**
 * Pour que le test soit pris en compte, il faut :
 * - que le module se trouve dans app/code/local
 * - que la classe se trouve dans Company/Module/Test/Mink/
 * - que la classe étende JR_Mink_Test_Mink
 * - que la méthode commence par test*
 */
class Company_Module_Test_Mink_Customer extends JR_Mink_Test_Mink
{
    public function testLogin()
    {
        $this->section('TEST CUSTOMER LOGIN');
        $this->setDriver('goutte');
 
        $this->output($this->bold('Go to home'));
        $url = Mage::getStoreConfig('web/unsecure/base_url');
        $this->visit($url);
 
        $loginUrl = $this->find('css', 'ul.links li.last a');
        if ($loginUrl) {
            $this->visit($loginUrl->getAttribute('href'));
        }
 
        $login = $this->find('css', '#email');
        $pwd = $this->find('css', '#pass');
        $submit = $this->find('css', '#send2');
        if ($login && $pwd && $submit) {
            $email = '[email protected]';
            $password = 'johndoe';
            $this->output(sprintf("Try to authenticate '%s' with password '%s'", $email, $password));
            $login->setValue($email);
            $pwd->setValue($password);
            $submit->click();
            $this->attempt(
                $this->find('css', 'div.welcome-msg'),
                'Customer successfully logged in',
                'Error authenticating customer'
            );
        }
    }
}

Lancer les tests

Si vous êtes en ligne de commande :

php shell/mink.php

Si vous êtes sur votre navigateur :

http://dev.magento.local/shell/mink.php

Notez que tous les drivers Mink disponibles ne sont pas forcément compatibles avec un lancement des tests depuis le navigateur. Dans notre exemple, le driver Goutte est compatible mais ce n’est pas le cas du driver Zombie par exemple.

Affichage

L’extension vous permet d’obtenir l’affichage que vous souhaitez lors du déroulement de vos tests. Voici quelques exemples d’utilisation :

<?php
$this->section('SECTION #1'); // ---------- SECTION #1 ----------
$this->context(false); // affiche la vue magasin courante sans afficher la configuration du cache
$this->br(2); // affiche 2 lignes vides
$this->output('Go to product page'); // Affiche 'Go to product page' sans formatage
$this->output($this->bold('Go to product page')); // Affiche 'Go to product page' en gras
$this->success('Customer successfully logged in'); // Affiche le message en vert
$this->error('An error occured'); // Affiche le message en rouge

7 réponses à “Des tests fonctionnels sur votre boutique Magento grâce à Behat Mink”

  1. Very slick. Thanks for the nice tutorial.

  2. shashikant dit :

    Great post definitely useful for ecommerce companies

  3. gondo dit :

    hi
    why did you choose this file structure?
    is there any special reason behind this what am i missing?
    why do u even need etc/config.xml file?
    this is not extension and if it was you are missing app/etc/modules/*.xml file to enable it.
    wouldn’t it be better to keep it separately so you dont populate webpage repo with tests? i guess that you dont want to deploy tests to live environment

    • Johann Reinke dit :

      Hi,
      File structure respects Magento file structure but you’re right this is not a real module since it does not need to be enabled to run tests.
      Of course you can separate test files as you wish, that’s what I did with CasperJS for example.
      Take this as an example of use, not for what you must do.

  4. Hello,
    Thankyou for this tutorial. How would I click a radio button using this extension? I see a number of ways to do it w/ Mink posted, but none of them appear to work with this extension. Please advise.
    thanks!
    tk

  5. Kevin dit :

    Hi,

    I noticed the repo hasn’t been updated in 2 years. Is this still the best functional testing tool for Magento?

  6. Manuel dit :

    Hi,

    Short question…

    Scenario:
    1 Magento core has 3 websites.

    Question:
    How to test other websites? only the default website is being tested.

    Great tutorials thanks!

Laisser un commentaire

* Champs requis

Categories