Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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)
Hors ligne
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
Hors ligne
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
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)
Hors ligne
Hello, ça doit être celui là : https://github.com/zendframework/zf2-do … esting.rst
Hors ligne
Bonjour, j'ai mis a jour merci d'avoir remonté l'info, et merci Orkin d'avoir trouvé le bon lien.
Hors ligne
Bonjour
je remonte un vieux topic mais j'aimerais savoir ce que tu as mis dans ton bootstrap ?
merci
Hors ligne
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 :
[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 :
[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.
Hors ligne
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