Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 22-03-2014 18:39:59

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

[Résolu]Jenkins avec zf2 et PhPunit

Bonjour,
Je suis en train de configurer un assez gros projet et j'ai un problème avec Jenkins et PHPunit.

Pour mon projet j'ai fait un choix de faire les tests unitaires par module comme expliqué dans la documentation française ici :
https://github.com/zendframework/zf2-do … esting.rst

Toutefois pour monitorer les test unitaire de toute l'application avec également tous les avantages que propose un outil comme jenkins, j'aurais aimé suivre cette architecture :

Project
| - config
| - data
| - module
| | - Application
| | | - config
| | | - src
| | | - test <--------------------- Tests unitaires pour chaque modules
| | | | - ApplicationTest
| | | | - Bootstrap.php
| | | | - phpunit.xml
| | | | - TestConfig.php.dist
| | | - view
| | | - Module.php
| | - Album
| | | - config
| | | - src
| | | - test
| | | | - AlbumTest
| | | | - Bootstrap.php
| | | | - phpunit.xml
| | | | - TestConfig.php.dist
| | | - view
| | | - Module.php
| - public
| - vendor
| - tests <------------------Centraliser le lancement de tous les test pour un rapport complet sur jenkins.

le contrôle des tests en ligne de commande pour chaque module marche mais il n'y as pour l'instant aucun moyen pour moi d'automatiser les tests unitaire a la création du build sur jenkins.

Sur l'idée :
Quand je lance mon build.xml il faudrait lancer les <testsuites> de tous les modules, je ne connais pas tellement la syntaxe même si j'ai suivi plusieurs tuto et lu pas mal de doc.
Quelqu'un à-t'il déjà eu ce souci, trouvé une solution ? Si oui vos conseils sont plus que bienvenue !

Merci d'avance

Dernière modification par JGreco (24-03-2014 14:24:19)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#2 24-03-2014 12:43:06

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: [Résolu]Jenkins avec zf2 et PhPunit

Edit[24/03/2014 - 12:40] :
J'ai finalement, avancée dans mon idée pour faire cela, j'ai mit  Bootstrap.php, TestConfig.php a la racine dans tests, en ligne de commande, quand je suis dans /tests et que je lance "phpunit.bat" tous mes modules sont testé est ça marche bien. Le gros soucis, c'est que je n'arrive pas a faire la ligne de commande a exécuter par jenkins dans le build.xml.

Project
| - config
| - data
| - module
| | - moduleName1
| | | - config
| | | - src
| | | - test <---------------------unit test for each module
| | | | - ApplicationTest
| | | - view
| | | - Module.php
| | - moduleName2
| | | - config
| | | - src
| | | - test
| | | | - moduleName2Test
| | | - view
| | | - Module.php
| - public
| - vendor
| - tests
| | -phpunit.xml <-------- Jenkins fail here
| build.xml <----------------This file launch phpunit.xml in ./tests/phpunit.xml

<phpunit bootstrap="Bootstrap.php" colors="true"
    stopOnError="true"
    stopOnFailure="false"
    strict="true"
    verbose="true">
<testsuites>
    <testsuite name="All">
        <directory>../module/moduleName1/test/moduleName1Test</directory>
        <directory>../module/moduleName2/test/moduleName2Test</directory>
    </testsuite>
</testsuites>
<logging>
  <log type="coverage-html" target="../build/coverage/" charset="UTF-8"
       yui="true" highlight="false"
       lowUpperBound="35" highLowerBound="70"/>
  <log type="coverage-clover" target="../build/logs/clover.xml"/>
  <log type="junit" target="../build/logs/junit.xml" logIncompleteSkipped="false"/>
</logging>
</phpunit>

Tout marche en ligne de commande, les rapports sont mêmes générés

Jenkins m'ouvre bien le fichier phpunit.xml, mais byzarrement, ce dernier renvoie aucun tests alors qu'en ligne de commande il n'y as pas ce soucis !!
Voila ce que jenkins me retourne :
Total tests run: 0, Failures: 0, Errors: 0, Incomplete: 0, Skipped: 0, Time elapsed: 0.00100 s


Une idée ?

Cordialement,
Jonathan


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#3 24-03-2014 13:56:26

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu]Jenkins avec zf2 et PhPunit

Salut, malheureusement je maîtrise pas du tout jenkins donc pas facile de t'aider. Même si c'est du test unitaire avec le ZF2 ça reste du test unitaire. Donc pas forcément lié au ZF2.

Hors ligne

 

#4 24-03-2014 14:15:09

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: [Résolu]Jenkins avec zf2 et PhPunit

Bonjour Orkin,
Oui, au départ mon soucis était de centraliser les tests unitaires tout en gardant les tests dans chaque modules, cela concernait donc initialement zf2, maintenant que j'ai solutionné ce point, il me reste juste a faire comprendre à jenkins le lancement des tests, et il ne veux pas. C'est vrai que cela ne concerne plus trop ZF2 maintenant, mais je pensais qu'un dev ZF2 ayant bossé dessus aurait pu avoir ce genre de soucis, sais-on jamais ! :p

Merci de ta réponse en tous cas !

Edit : [Résolu]

Jenkins ne comprenait pas mon chemin relatif... bien que sur tout ce que j'ai pu voir sur le web cela aurait du fonctionner, j'ai donc mis le chemin absolu et pouf, il était tout content.

Merci quand même !

Dernière modification par JGreco (24-03-2014 14:25:25)


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#5 03-06-2015 10:33:02

amelie
Membre
Lieu: Marseille
Date d'inscription: 05-02-2013
Messages: 113
Site web

Re: [Résolu]Jenkins avec zf2 et PhPunit

Hello,

Dommage le lien pour faire le tests unitaires par module n'est plus actif sad

Hors ligne

 

#6 03-06-2015 11:25:44

Orkin
Administrateur
Lieu: Paris
Date d'inscription: 09-12-2011
Messages: 1261

Re: [Résolu]Jenkins avec zf2 et PhPunit

Hello, ça doit être celui là : https://github.com/zendframework/zf2-do … esting.rst

Hors ligne

 

#7 03-06-2015 14:11:51

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: [Résolu]Jenkins avec zf2 et PhPunit

Bonjour, j'ai mis a jour merci d'avoir remonté l'info, et merci Orkin d'avoir trouvé le bon lien.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#8 01-03-2016 10:02:04

Nirzol
Membre
Date d'inscription: 11-01-2013
Messages: 65

Re: [Résolu]Jenkins avec zf2 et PhPunit

Bonjour
je remonte un vieux topic mais j'aimerais savoir ce que tu as mis dans ton bootstrap ?

merci

Hors ligne

 

#9 01-03-2016 11:15:57

JGreco
Administrateur
Date d'inscription: 22-12-2012
Messages: 432

Re: [Résolu]Jenkins avec zf2 et PhPunit

Bonjour,

Mon bootstrap a évolué au moins 3 fois depuis ce topic, je peut malgré tout essayer de te le présenter.

Attention je l'ai rendu fonctionnel avec la version 2.5.1. Il y a en effet de grosses incompatibilités dans les autoload avec les version <= 2.4.9 Je te conseille donc de vérifier lequel il te faut.

Par défaut je te donne celui 2.5.1 :

Code:

[lang=php]

<?php
/**
 * Notre Bootstrap principal permet de factoriser tous les Bootstrap de l'application
 */
namespace ApplicationTest;

use Zend\Loader\AutoloaderFactory;
use Zend\Mvc\Service\ServiceManagerConfig;
use Zend\ServiceManager\ServiceManager;
use RuntimeException;

/**
 * Met en place l'autoloading
 */
class Bootstrap
{
    public static function getModules()
    {
        return array(
            'DoctrineModule',
            'DoctrineORMModule',
            'Application',
        );
    }

    public static function getNamespace()
    {
        return __NAMESPACE__;
    }

    public static function getDir()
    {
        return __DIR__;
    }

    public static function init()
    {
        $zf2ModulePaths = array(dirname(dirname(__DIR__)));
        if (($path = static::findParentPath('vendor'))) {
            $zf2ModulePaths[] = $path;
        }
        if (($path = static::findParentPath('module')) !== $zf2ModulePaths[0]) {
            $zf2ModulePaths[] = $path;
        }
        static::initAutoloader();
        // Utilise le ModuleManager pour charger ce module et ses dependances
        $config = array(
            'module_listener_options' => array(
                'config_glob_paths'    => array(
                    sprintf(__DIR__.'/../../../config/autoload/{,*.}{global,%s,local}.php', 'development'),
                ),
                'module_paths' => $zf2ModulePaths,
            ),
            'modules' => static::getModules(),
        );
        $serviceManager = new ServiceManager(new ServiceManagerConfig(
            isset($config['service_manager']) ? $config['service_manager'] : array()
        ));
        $serviceManager->setService('ApplicationConfig', $config);
        $serviceManager->get('ModuleManager')->loadModules();

        static::setConfig($serviceManager);
        static::setControllerConfig($serviceManager);
    }

    public static function chroot()
    {
        $rootPath = dirname(static::findParentPath('module'));
        chdir($rootPath);
    }

    protected static function initAutoloader()
    {
        $vendorPath = static::findParentPath('vendor');
        $zf2Path = getenv('ZF2_PATH');
        if (!$zf2Path) {
            if (defined('ZF2_PATH')) {
                $zf2Path = ZF2_PATH;
            } else {
                if (is_dir($vendorPath . '/zendframework')) {
                    $zf2Path = $vendorPath . '/zendframework';
                }
            }
        }
        if (!$zf2Path) {
            throw new RuntimeException('Unable to load ZF2. Run `php composer.phar install` or define a ZF2_PATH environment variable.');
        }
       
        $loader = require $vendorPath  . '/autoload.php';
        $mockeryPath = $vendorPath . '/mockery/mockery/library';

        include_once $zf2Path . '/zend-loader/src/AutoloaderFactory.php';
        AutoloaderFactory::factory(array(
            'Zend\Loader\StandardAutoloader' => array(
                'autoregister_zf' => true,
                'namespaces' => array(
                    static::getNamespace() => static::getDir() . '/' . static::getNamespace(),
                    'Mockery' => $mockeryPath . '/Mockery',
                ),
                'fallback_autoloader' => true,
            ),
        ));

        // Sans cela Mockery/Adapter/Phpunit/TestListener.php n'est pas trouvé par PHPUnit
        set_include_path(implode(PATH_SEPARATOR, array(
            $mockeryPath,
            get_include_path(),
        )));

        $mockeryLoader = new \Mockery\Loader('Mockery', $mockeryPath);
        $mockeryLoader->register();
    }

    protected static function findParentPath($path)
    {
        $dir = __DIR__;
        $previousDir = '.';
        while (!is_dir($dir . '/' . $path)) {
            $dir = dirname($dir);
            if ($previousDir === $dir) return false;
            $previousDir = $dir;
        }
        return $dir . '/' . $path;
    }

    public static function setConfig($serviceManager)
    {
        $class = new Framework\TestCase;
        $class->setServiceManager($serviceManager);
    }

    public static function setControllerConfig($serviceManager)
    {
        $class = new Framework\ControllerTestCase;
        $class->setServiceManager($serviceManager);
    }
}
Bootstrap::init();
Bootstrap::chroot();

Bon fait quand même attention, j'utilise Mockery, donc cette partie la n'est pas intérréssante si tu l'utilise pas. De plus ce boostrap est dans module/Application/tests/ApplicationBootstrap.php

Car j'ai organisé mon archi pour pouvoir lancer les tests de façon globale (pour Jenkins) et par module.
Et c'est mon application Bootstrap qui gère la configuration de base.
La méthode getModule ets réécrite dans chaque classe enfant pour le chargement de ses modules.

Framework\TestCase vaut cela :

Code:

[lang=php]
namespace ApplicationTest\Framework;

use PHPUnit_Framework_TestCase;
use Doctrine\ORM\EntityManager;
use Zend\ServiceManager\ServiceManager;
use Zend\Mvc\Service\ServiceManagerConfig;
use \Mockery as m;

class TestCase extends PHPUnit_Framework_TestCase
{
    private $toolbox;
    /**
     * @var array
     */
    protected static $config;

    public static function setServiceManager($serviceManager)
    {
        static::$config = $serviceManager;
    }

    public function getServiceManager()
    {
        return static::$config;
    }
}

Ce qui me permet de mocker tout et n'importe quoi et de mock ou non le service manager enfin bref après c'est un festival de joyeusetés.


ZF2 et doctrine addict
profil stack overflow : http://stackoverflow.com/users/3333246/ … ab=profile

Hors ligne

 

#10 01-03-2016 12:12:55

Nirzol
Membre
Date d'inscription: 11-01-2013
Messages: 65

Re: [Résolu]Jenkins avec zf2 et PhPunit

Ah merci ! Je galère beaucoup avec les test -_-

Moi j'utilisais le bootstrap qui est là : http://framework.zend.com/manual/curren … sting.html

En fait mes tests me retourne :
Failed asserting response code "200", actual status code is "404"

Je vais regarder cela + en profondeur ...

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages