Cómo probar un componente de Joomla 2.5

12

He hecho esta pregunta en StackOverflow , y se sugirió que la haga aquí.

Estoy familiarizado con las pruebas de unidad / sistema / integración, y me gustaría poder probar mi componente Joomla. ¿Hay una forma estándar de hacer esto?

Estoy trabajando en este ejemplo de componente joomla mvc , que no incluye pruebas. Todo lo que puedo encontrar en la documentación de Joomla y en varios sitios web son fragmentos de código de prueba y archivos bootstrap.php. Específicamente, lo que me gustaría saber es:

  • Dónde poner el código de prueba del componente
  • ¿Necesito proporcionar mi propio bootstrap.php, o hay alguna forma de 'incluir joomla' y ejecutar mis pruebas?

Idealmente, alguien podría dirigirme a un componente de código abierto de Joomla que tenga pruebas e instrucciones sobre cómo ejecutarlas (echó un vistazo rápido, los primeros 5 más o menos no tenían pruebas).

Lo más cercano que he encontrado es esto , en el que he basado mi prueba ficticia.

Lo que he hecho hasta ahora

Estructura de directorio de componentes:

  • Hola Mundo/
    • administración/
      • ...
      • pruebas /
        • bootstrap.php
        • phpunit.xml
        • modelHelloWorldsTest.php
    • sitio/
      • ...
    • helloworld.xml

Primer intento

Para ejecutar las pruebas, instalo / copio el componente en mi instalación de Joomla. Luego ejecuto el siguiente comando desde ~ joomla / administration / components / com_helloworld / tests:

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

de donde recibo

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

Entiendo que esto significa que mi bootstrap.php no es correcto y no ha cargado las clases necesarias de Joomla. Investigaré esto en algún momento, pero parece una gran cantidad de configuraciones solo para ejecutar algunas pruebas.

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>

Segundo intento

Después de ver esta respuesta , puse mis pruebas bajo prueba / unidad bajo mi instalación de joomla, copié phpunit.dist.xml y bootstrap.php del repositorio de joomla-cms en sus ubicaciones apropiadas, y aún obtuve el

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

error que estaba recibiendo antes

uozuAho
fuente

Respuestas:

3

Dónde poner el código de prueba del componente

Por lo general, las mejores prácticas dicen:

/src/
/tests/

Pero salté el / src y simplemente pero / tests / dentro del directorio de componentes. En el extremo frontal, para un componente "abc", podría verse algo así como:

/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

¿Necesito proporcionar mi propio bootstrap.php

Yo hice. Algo así como. Acabo de copiar los extras en el archivo raíz index.php en la parte superior de mi script de prueba de unidad. La tuya estaba cerca de la mía. Mi próximo paso sería encapsular en un archivo separado que requeriría_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, alguien podría dirigirme a un componente de código abierto de Joomla que tenga pruebas e instrucciones sobre cómo ejecutarlas (echó un vistazo rápido, los primeros 5 más o menos no tenían pruebas).

Me resultó bastante fácil rodar el mío. Ni siquiera me molesté en configurar phpunit.xml.

Tono Garot
fuente
Finalmente pude probar esto (¡no he usado Joomla en mucho tiempo ahora!). ¡Parece funcionar!
uozuAho
Lo consigo Error: Call to undefined method JController::getInstance()por esto.
Olle Härstedt
6

Lo siento si mi respuesta no aborda directamente su problema, pero es importante comprender qué es la prueba de unidad y cómo usarla, sin importar si estamos hablando de Joomla o no. Has abordado muchos problemas y es bastante difícil lidiar con todos ellos.

En primer lugar, es importante leer la documentación en PHPUnit . Construya una clase pequeña (independientemente de Joomla) e intente escribir algunas pruebas para ello. Obtenga PHPUnit primero ejecutándose en tal escenario. Entiende lo que hace. Me temo que se está centrando demasiado en hacer que PHPUnit se ejecute en lugar de comprender cómo ayuda a su desarrollo.

Para que Joomla funcione , necesitará:

  • bootstrap.php: que te dará una instancia de Joomla.
  • phpunit.xml: ajuste de la configuración de PHPUnit. Útil, por ejemplo, para especificar una vez para todo un proyecto dónde están las carpetas de prueba en cada componente. Para que pueda ejecutar un conjunto de pruebas.

El error que está recibiendo es lo más claro posible. 'ContentController' claramente no está cargado automáticamente por Joomla. Verifique con un depurador si se llama al autocargador en Joomla y por qué no puede cargar la clase. En el peor de los casos, proporcione su propio cargador automático y use el archivo de arranque para llamarlo. Una solución rápida también es cargar manualmente el archivo requerido con require_once.

Decide qué quieres probar y usa maquetas

En el ejemplo proporcionado, está utilizando JModel para obtener datos de la base de datos. Esto es un no-go desde el punto de vista TDD. La prueba de que puede obtener datos de la base de datos no tiene valor en mi humilde opinión. ¿Qué estás probando exactamente allí?

Si necesita trabajar con datos de la base de datos, use simulacros para modelar una respuesta de la base de datos. De esta manera, sus pruebas tendrán un comportamiento constante con el tiempo. No desea tener pruebas fallidas solo porque cambió algo en la base de datos.

Si tiene un método que computa algunas cosas o cualquier otra cosa que tenga sentido para probar. Esta es una prueba unitaria: toma una pequeña unidad de su sistema complejo, la alimenta con datos de prueba falsos y prueba su comportamiento.

Necesita ver que su sistema funciona como un todo, use pruebas del sistema.

Valentin Despa
fuente
Lo siento, pero esta respuesta no es muy relevante. He usado PHPUnit antes y entiendo el punto de prueba. Solo estoy luchando para que mis pruebas incluso se ejecuten. La prueba en mi pregunta no es importante, la parte importante es que se ejecuta. He editado mi pregunta con la esperanza de aclarar esto.
uozuAho