Comment tester un composant Joomla 2.5


12

J'ai posé cette question sur StackOverflow , et il a été suggéré de la poser ici.

Je connais les tests unitaires / système / d'intégration et je voudrais pouvoir tester mon composant Joomla. Existe-t-il une manière standard de procéder?

Je travaille sur cet exemple de composant joomla mvc , qui n'inclut pas de tests. Tout ce que je peux trouver dans la documentation Joomla et sur divers sites Web, ce sont des fragments de code de test et des fichiers bootstrap.php. Plus précisément, je voudrais savoir:

  • Où mettre le code de test des composants
  • Dois-je fournir mon propre bootstrap.php, ou existe-t-il un moyen de simplement 'inclure joomla' et d'exécuter mes tests

Idéalement, quelqu'un pourrait me diriger vers un composant Joomla open source qui a des tests et des instructions sur la façon de les exécuter (a jeté un coup d'œil, les 5 premiers environ n'ont pas eu de tests).

Le plus proche que j'ai trouvé est celui-ci , sur lequel j'ai basé mon test factice.

Ce que j'ai fait jusqu'à présent

Structure du répertoire des composants:

  • Bonjour le monde/
    • admin /
      • ...
      • tests /
        • bootstrap.php
        • phpunit.xml
        • modelHelloWorldsTest.php
    • site/
      • ...
    • helloworld.xml

Premier essai

Pour exécuter les tests, j'installe / copie le composant dans mon installation Joomla. J'exécute ensuite la commande suivante à partir de ~ joomla / administration / components / com_helloworld / tests:

php phpunit-4.2.phar --bootstrap bootstrap.php .

dont je reçois

Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5

Je suppose que cela signifie que mon bootstrap.php n'est pas correct et n'a pas chargé les classes Joomla nécessaires. J'examinerai cela à un moment donné, mais cela semble être beaucoup de configuration juste pour obtenir des tests.

bootstrap.php:

<?php
error_reporting(E_ALL);

define('_JEXEC', 1);
define('BASEPATH',realpath(dirname(__FILE__).'/../../'));
define('JOOMLA_PATH',realpath(dirname(__FILE__).'/../../../../../'));
define('JOOMLA_ADMIN_PATH',realpath(dirname(__FILE__).'/../../../../'));
$_SERVER['HTTP_HOST'] = 'localhost';
$_SERVER['REQUEST_METHOD'] = 'GET';

if (file_exists(JOOMLA_ADMIN_PATH . '/defines.php'))
{
    include_once JOOMLA_ADMIN_PATH . '/defines.php';
}

if (!defined('_JDEFINES'))
{
    define('JPATH_BASE', JOOMLA_ADMIN_PATH);
    require_once JPATH_BASE . '/includes/defines.php';
}

require_once JPATH_BASE . '/includes/framework.php';
require_once JPATH_BASE . '/includes/helper.php';
require_once JPATH_BASE . '/includes/toolbar.php';
define('JPATH_COMPONENT',JOOMLA_ADMIN_PATH.'/components/com_content');
$app = JFactory::getApplication('administrator');
include BASEPATH.'/controller.php';

modelsHelloWorldsTest.php:

<?php
class HelloWorldsTest extends \PHPUnit_Framework_TestCase {

    public function testList(){
        $c = new ContentController();
        $model = $c->getModel('helloworlds');
        $worlds = $model->getItems();
        var_dump($worlds);
        $this->assertNotEmpty($worlds);
    }
}

phpunit.xml:

<phpunit bootstrap="bootstrap.php"
    colors="true"
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="false"
    syntaxCheck="false"
    verbose="true">
</phpunit>

Deuxième essai

Après avoir vu cette réponse , j'ai mis mes tests sous test / unit sous mon installation joomla, copié phpunit.dist.xml et bootstrap.php du repo joomla-cms à leurs emplacements appropriés, et j'ai quand même obtenu le

Fatal error: Class 'ContentController' not found in C:\inetpub\wwwroot\ws_cairnstest\administrator\components\com_helloworld\tests\modelsHelloWorldsTest.php on line 5

erreur que je recevais avant.

Réponses:


3

Où mettre le code de test des composants

Les meilleures pratiques indiquent généralement:

/src/
/tests/

Mais j'ai sauté le / src et simplement mais / tests / dans le répertoire des composants. À l'avant, pour un composant "abc", il pourrait ressembler à:

/components/com_abc/
/components/com_abc/abc.php
/components/com_abc/controller.php
/components/com_abc/router.php
/components/com_abc/tests/
/components/com_abc/tests/controllerTest.php

Dois-je fournir mon propre bootstrap.php

J'ai fait. Sorte de. Je viens de copier les goodies du fichier racine index.php en haut de mon script de test unitaire. Le vôtre était proche du mien. Ma prochaine étape serait d'encapsuler dans un fichier séparé que j'aurais besoin de_once ().

<?php

error_reporting(E_ALL);

define('_JEXEC', 1);
define('_PHPUNIT', 1);
define('JPATH_BASE', "/var/www/html/abcsite");

require_once JPATH_BASE . '/includes/defines.php';
require_once JPATH_BASE . '/includes/framework.php';

// Instantiate the application.
$app = JFactory::getApplication('site');

// Include dependancies
require_once '../controller.php';

// This is specific to this component
define('JPATH_COMPONENT', JPATH_BASE . "/components/com_abc");

class controllerTest extends PHPUnit_Framework_TestCase
{
    public function testCronjob()
    {

        // Need access to the controller
        $controller = JController::getInstance('Abc');

        // Should return
        $this->assertEquals('test', $controller->execute("cronjob"));

    }
...

Idéalement, quelqu'un pourrait me diriger vers un composant Joomla open source qui a des tests et des instructions sur la façon de les exécuter (a jeté un coup d'œil, les 5 premiers environ n'ont pas eu de tests).

J'ai trouvé assez facile de rouler le mien. Je n'ai même pas pris la peine de configurer phpunit.xml.


J'ai finalement pu essayer cela (je n'ai pas utilisé Joomla depuis longtemps maintenant!). Semble faire l'affaire!
uozuAho

Je reçois Error: Call to undefined method JController::getInstance()pour ça.
Olle Härstedt

6

Désolé si ma réponse ne répond pas directement à votre problème, mais il est important de comprendre ce qu'est le test unitaire et comment l'utiliser, peu importe si nous parlons de Joomla ou non. Vous avez abordé de nombreux problèmes et il est assez difficile de les traiter tous.

Tout d'abord, il est important de lire la documentation sur PHPUnit . Construisez-vous une petite classe (indépendamment de Joomla) et essayez d'écrire des tests pour cela. Obtenez d'abord PHPUnit dans un tel scénario. Comprenez ce qu'il fait. Je crains que vous ne vous concentriez trop sur l'exécution de PHPUnit au lieu de comprendre comment cela aide votre développement.

Pour lancer Joomla , vous aurez besoin de:

  • bootstrap.php - qui vous donnera une instance de Joomla.
  • phpunit.xml - réglage fin des paramètres PHPUnit. Utile par exemple pour spécifier une fois pour un projet entier où se trouvent les dossiers de test dans chaque composant. Pour que vous puissiez exécuter une suite de tests.

L'erreur que vous obtenez est aussi claire que possible. 'ContentController' n'est clairement pas chargé automatiquement par Joomla. Vérifiez auprès d'un débogueur si l'autochargeur dans Joomla est appelé et pourquoi il ne parvient pas à charger la classe. Dans le pire des cas, fournissez votre propre chargeur automatique et utilisez le fichier d'amorçage pour l'appeler. Une solution rapide consiste également à charger manuellement le fichier requis avec require_once.

Décidez de ce que vous voulez tester et utiliser des maquettes

Dans l'exemple fourni, vous utilisez JModel pour extraire des données de la base de données. Il s'agit d'une interdiction du point de vue TDD. Tester que vous pouvez extraire des données de la base de données n'a aucune valeur à mon humble avis. Que testez-vous exactement là-bas?

Si vous devez travailler avec des données de la base de données, utilisez des simulations pour modéliser une réponse à partir de la base de données. De cette façon, vos tests auront un comportement cohérent dans le temps. Vous ne voulez pas avoir échoué aux tests simplement parce que vous avez changé quelque chose dans la base de données.

Si vous avez une méthode qui calcule quelque chose ou toute autre chose qui a du sens à tester. Il s'agit de tests unitaires: vous prenez une petite unité de votre système complexe, vous l'alimentez avec de fausses données de test et testez son comportement.

Besoin de voir que votre système fonctionne dans son ensemble, utilisez des tests système.


Désolé mais cette réponse n'est pas très pertinente. J'ai déjà utilisé PHPUnit et je comprends l'intérêt des tests. J'ai du mal à faire exécuter mes tests. Le test dans ma question n'est pas important, la partie importante est qu'il fonctionne. J'ai édité ma question dans l'espoir de rendre cela plus clair.
uozuAho
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.