Come testare un componente Joomla 2.5


12

Ho fatto questa domanda su StackOverflow ed è stato suggerito di farlo qui.

Ho familiarità con i test di unità / sistema / integrazione e vorrei essere in grado di testare il mio componente Joomla. Esiste un modo standard per farlo?

Sto lavorando a questo esempio di componente Joomla mvc , che non include i test. Tutto quello che posso trovare nella documentazione di Joomla e su vari siti web sono frammenti di codice di test e file bootstrap.php. In particolare, ciò che vorrei sapere è:

  • Dove mettere il codice di prova del componente
  • Devo fornire il mio bootstrap.php o c'è un modo per 'includere joomla' ed eseguire i miei test

Idealmente qualcuno potrebbe indirizzarmi a un componente Joomla open source che ha test e istruzioni su come eseguirli (ha dato una rapida occhiata, i primi 5 o giù di lì non avevano test).

Il più vicino che ho trovato è questo , sul quale ho basato il mio test fittizio.

Quello che ho fatto finora

Struttura della directory dei componenti:

  • Ciao mondo/
    • admin /
      • ...
      • test /
        • bootstrap.php
        • phpunit.xml
        • modelHelloWorldsTest.php
    • luogo/
      • ...
    • helloworld.xml

Primo tentativo

Per eseguire i test, installo / copio il componente nella mia installazione di Joomla. Quindi eseguo il comando seguente da ~ joomla / administration / components / com_helloworld / tests:

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

da cui ricevo

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

Ho capito che questo significa che il mio bootstrap.php non è corretto e non ha caricato le classi Joomla necessarie. Lo esaminerò a un certo punto, ma questo sembra un sacco di installazione solo per ottenere alcuni test da eseguire.

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>

Secondo tentativo

Dopo aver visto questa risposta , ho messo i miei test sotto test / unità nella mia installazione di joomla, ho copiato phpunit.dist.xml e bootstrap.php dal repository joomla-cms nelle loro posizioni appropriate, e ho ancora ottenuto il

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

errore che stavo ricevendo prima.

Risposte:


3

Dove mettere il codice di prova del componente

In genere le migliori pratiche dicono:

/src/
/tests/

Ma ho saltato / src e semplicemente ma / test / nella directory dei componenti. Sul front-end, per un componente "abc", potrebbe essere simile a:

/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

Devo fornire il mio bootstrap.php

L'ho fatto. Una specie di. Ho appena copiato le chicche nel file index.php root nella parte superiore del mio script di unit test. Il tuo era vicino al mio. Il mio prossimo passo sarebbe incapsulare in un file separato che avrei richiesto_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"));

    }
...

Idealmente qualcuno potrebbe indirizzarmi a un componente Joomla open source che ha test e istruzioni su come eseguirli (ha dato una rapida occhiata, i primi 5 o giù di lì non avevano test).

Ho trovato abbastanza facile rotolare il mio. Non mi sono nemmeno preso la briga di configurare phpunit.xml.


Finalmente sono riuscito a provarlo (non uso Joomla da molto tempo ormai!). Sembra fare il trucco!
uozuAho,

Capisco Error: Call to undefined method JController::getInstance()per questo.
Olle Härstedt,

6

Ci scusiamo se la mia risposta non affronta direttamente il tuo problema, ma è importante capire cos'è il test unitario e come usarlo, non importa se stiamo parlando di Joomla o meno. Hai affrontato molti problemi ed è piuttosto difficile affrontarli tutti.

Prima di tutto è importante leggere la documentazione su PHPUnit . Costruisci una piccola classe (indipendentemente da Joomla) e prova a scrivere alcuni test per questo. Ottieni PHPUnit prima esecuzione in un tale scenario. Comprendi cosa fa. Temo che ti stai concentrando troppo sul far funzionare PHPUnit invece di capire come aiuta il tuo sviluppo.

Per far funzionare Joomla , avrai bisogno di:

  • bootstrap.php - che ti darà un'istanza di Joomla.
  • phpunit.xml - regolazione fine delle impostazioni di PHPUnit. Utile ad esempio per specificare una volta per un intero progetto dove sono le cartelle di prova in ciascun componente. In modo da poter eseguire una serie di test.

L'errore che stai riscontrando è il più chiaro possibile. "ContentController" non è chiaramente caricato automaticamente da Joomla. Verificare con un debugger se viene chiamato il caricatore automatico in Joomla e perché non riesce a caricare la classe. Lo scenario peggiore fornisce il tuo caricatore automatico e usa il file bootstrap per chiamarlo. Una soluzione rapida sta anche caricando manualmente il file richiesto con require_once.

Decidi cosa vuoi testare e usa i modelli

Nell'esempio fornito si utilizza JModel per recuperare i dati dal database. Questo è un no-go dal punto di vista TDD. Test che è possibile recuperare i dati dal database non ha alcun valore IMHO. Cosa stai testando esattamente lì?

Se devi lavorare con i dati del database, usa i mock per modellare una risposta dal database. In questo modo i test avranno un comportamento coerente nel tempo. Non vuoi avere test falliti solo perché hai cambiato qualcosa nel database.

Se hai un metodo che calcola qualcosa o qualcos'altro che ha senso testare. Questo è un test unitario: prendi una piccola unità dal tuo sistema complesso, la nutri con dati di test falsi e ne verifica il comportamento.

È necessario verificare che il sistema funzioni nel suo insieme, utilizzare i test di sistema.


Siamo spiacenti ma questa risposta non è molto pertinente. Ho già usato PHPUnit e ho capito il punto di prova. Sto solo lottando per far funzionare i miei test. Il test nella mia domanda non è importante, la parte importante è che funziona. Ho modificato la mia domanda nella speranza di renderlo più chiaro.
uozuAho il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.